Full Picture Load - FancyboxV5

supports 1,000+ websites for photos, h-comics, and comics, fully loaded images, simple image viewing function, comic infinite scroll read mode, and compressed and packaged downloads.

// ==UserScript==
// @name               圖片全載-FancyboxV5
// @name:en            Full Picture Load - FancyboxV5
// @name:zh-CN         图片全载-FancyboxV5
// @name:zh-TW         圖片全載-FancyboxV5
// @version            2.2.8
// @description        支持寫真、H漫、漫畫的網站1000+,圖片全量加載,簡易的看圖功能,漫畫無限滾動閱讀模式,下載壓縮打包,如有下一頁元素可自動化下載。
// @description:en     supports 1,000+ websites for photos, h-comics, and comics, fully loaded images, simple image viewing function, comic infinite scroll read mode, and compressed and packaged downloads.
// @description:zh-CN  支持写真、H漫、漫画的网站1000+,图片全量加载,简易的看图功能,漫画无限滚动阅读模式,下载压缩打包,如有下一页元素可自动化下载。
// @description:zh-TW  支持寫真、H漫、漫畫的網站1000+,圖片全量加載,簡易的看圖功能,漫畫無限滾動閱讀模式,下載壓縮打包,如有下一頁元素可自動化下載。
// @author             tony0809
// @match              *://*/*
// @connect            *
// @exclude            *.youtube.com*
// @exclude            *docs.google.com*
// @exclude            *google*/maps/*
// @exclude            *mail.google.com*
// @exclude            *accounts.google.com*
// @icon               data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAAtFBMVEVEREAAAABEREBEREAuuaIzqpkvr58yiHgzhnY6kYM7mYI4kog4s6A2tpo0r544ooo2nY40sJw0sp00rZg1sJw0sZ0zsp01sZw0sZw0rZk1sJw1sZw1rZk0sp00rpk1sp01sZs1rpk1rpk0sp01spw1sJ00rZo1rZk1rpo0r5k0sJw0sZ01r5o0sZw0rpk0sp01sZ01sJw1spw1r5k1sp01sZw0sZ01sZw1rpk1sp01sZw1r5pUzpTcAAAAOXRSTlMAAAUGCw8QERIUFxgbHB0hIieqq6yvtLa3vb/AwMHCxMXFxsfIyc3Oz+zt7vDx8fL4+Pn5+vr7/v7AEFI4AAABR0lEQVR42qWT11bDMAxApbhsmm5KKVD2KiUQwpD1///FkZcSmh4e8FOsex3LsgymPy6ISkRyA4FlWMRXomIyQOg/SbyKAmSOE2Ip02UOYxf/DILNjOOEWLnAEAqio0MMAzJjTAZh1p0SrYCIuu0cMZc9JbENXLa1NWGdI1nWeQuXGPzBTdzC8ws52UI5MwchrA/VTOuTEP9fFyTG7E+R9q8JLsbW1UHzU8HHrCuU1fyToDlB43xRqMUgfc+/KA77fZrWSH/47zPlzOcpJxG8u32r/OEg5SRCqO/WTeT3+5oTuP4LxrXnd5F7waZ+wM5c+NVeujMRrDYMYueE+VK5E5r3uzOb7TbvHH7f/1pP/L8nU9u38Nwyy8OZdjfwY+ZnmPinp28y3mglNeERDJYy/9A3GYVS+GMPMB+uyL67/qO68Mb8MurBD7foVTtvIbtnAAAAAElFTkSuQmCC
// @license            MIT
// @namespace          https://greasyfork.org/users/20361
// @grant              GM_xmlhttpRequest
// @grant              GM.xmlHttpRequest
// @grant              GM_registerMenuCommand
// @grant              GM.registerMenuCommand
// @grant              GM_openInTab
// @grant              GM.openInTab
// @grant              GM_getValue
// @grant              GM.getValue
// @grant              GM_setValue
// @grant              GM.setValue
// @grant              GM_listValues
// @grant              GM.listValues
// @grant              GM_deleteValue
// @grant              GM.deleteValue
// @grant              GM_getResourceText
// @grant              GM.getResourceText
// @grant              GM_addElement
// @grant              GM.addElement
// @grant              unsafeWindow
// @noframes
// @require            https://update.greasyfork.org/scripts/473358/1237031/JSZip.js
// @require            https://cdn.jsdelivr.net/npm/jquery@3.7.1/dist/jquery.min.js
// @require            https://cdn.jsdelivr.net/npm/@fancyapps/ui@5.0.31/dist/fancybox/fancybox.umd.js
// @resource JqueryJS https://cdn.jsdelivr.net/npm/jquery@3.7.1/dist/jquery.min.js
// @resource FancyboxV5JS https://cdn.jsdelivr.net/npm/@fancyapps/ui@5.0.31/dist/fancybox/fancybox.umd.js
// @resource FancyboxV5Css https://cdn.jsdelivr.net/npm/@fancyapps/ui@5.0.31/dist/fancybox/fancybox.css
// @resource FancyboxV3JS https://cdn.jsdelivr.net/npm/@fancyapps/fancybox@3.5.7/dist/jquery.fancybox.min.js
// @resource FancyboxV3Css https://cdn.jsdelivr.net/npm/@fancyapps/fancybox@3.5.7/dist/jquery.fancybox.min.css
// @resource ViewerJs https://cdn.jsdelivr.net/npm/viewerjs@1.11.6/dist/viewer.min.js
// @resource ViewerJsCss https://cdn.jsdelivr.net/npm/viewerjs@1.11.6/dist/viewer.min.css
// ==/UserScript==

(async (JSZip, Fancybox, jQuery) => {
    "use strict";

    if (document.querySelector("body.no-js")) return; //Cloudflare檢測連線安全性時,不運行腳本

    let options = { //預設選項基本上不要改動,如果改動了最好透過UI選項設定或按/,重置儲存在localStorage的設定
        enable: 0, //!!!維持0不要改!!!
        icon: 1, //是否顯示左下圖示,1:開啟、0:關閉
        threading: 32, //最大下載線程數
        zip: 1, //1:圖片下載後壓縮打包,0:批量下載圖片,無法全自動下載
        file_extension: "zip", //zip or cbz
        autoDownload: 0, //!!!維持0不要改!!!建議透過UI選項設定來開啟,需要customData也有autoDownload
        autoDownloadCountdown: 5, //有NEXT時自動下載的倒數秒數
        comic: 0, //1,忽視漫畫站點開關選項,啟用漫畫規則
        doubleTouchNext: 1, //觸控裝置雙擊前往下一頁,1:開啟、0:關閉
        zoom: 0, //1 ~ 10 腳本插入的圖片縮放比例,10 = 100%,9 = 90%,0 = auto
        column: 4, //圖片並排顯示的數量 2 ~ 6
        viewMode: 0, //0:置中、1:並排
        fancybox: 1 //Fancybox圖片燈箱展示功能,1:開啟、0:關閉
    };
    const $ = jQuery;
    const _unsafeWindow = unsafeWindow ?? window;
    const language = _unsafeWindow.navigator.language;
    let siteUrl = _unsafeWindow.location.href.replace(/#FullPictureLoad.+$|#gallery.+$|#lightbox.+$/i, "");
    let frameWindow = _unsafeWindow;
    let siteData = {};
    let _this = {};
    let siteJson = null;
    let displayLanguage = {};
    let globalImgArray = [];
    let captureSrcArray = [];
    let thumbnailsSrcArray = [];
    let videosSrcArray = [];
    let promiseBlobArray = [];
    let captureLinksArray = [];
    let customTitle = null;
    let isDownloading = false;
    let isFetching = false;
    let isAutoScrolling = false;
    let fetchErrorArray = [];
    let fastDownload = false;
    let currentDownloadThread = 0;
    let downloadNum = 0;
    let errorNum = 0;
    let getImgFn = "";
    let doc = document;
    let autoPager = true;
    let httpFetchError = false;
    let currentPageNum = 0;
    let nextLink = null;
    let tempNextLink = null;
    const PCUA = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36";
    const MobileUA = "Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Mobile Safari/537.36";
    let loading_bak = "data:image/gif;base64,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83uGje9+g7TK7znAs/1N/3BQTmbMt6lvwRde10/Xu89+ZrjEJ07xilv84hjPuMY3zvGOe/zjIA+5yEdO8pKb/OQoT7nKV87ylrv85TCPucxnTvOa2/zmOM+5znfO8577/OdAD7rQh070ohv96EhPutKXzvSmO/3pUI+61KdO9apb/epYz7rWt871rnv962APu9jHTvaym/3saE+72tfO9ra7/e1wj7vc5073utv97njPu973zve++/3vgA+84AdP+MIb/vCIT7ziF8/4xjv+8ZCPvOQnT/nKW/7ymM+85jfP+c57/vOgD73oR0/60pv+9KhPvepXz/rWu/71sI+97GdP+9rb/va4z73ud8/73pH7/vfAD77wh0/84hv/+MhPvvKXz/zmO//50I++9KdP/epb//rYz772t8/97nv/++APv/jHT/7ym//86E+/+tfP/va7//3wj7/850//+tv//vjPv/73z//++///ABiAAjiABFiABniACJiACriADNiADviAEBiBEjiBFFiBFniBGJiBGriBHNiBHviBIBiCFxEIACH5BAUKAGgALCwBjAACATABAAf/gGiCg4SFhoeIiYqLjI2JAQYGHhgaEC8FHBQfOhaOnp+goaKjpKWmp6iKAausra0GNDEUJ52ptre4ubq7vGiuv8CrGCksG2e9yMnKy8yOwc/ABjgsHc3W19jZo9DcwCsiJ9ri4+TW3ee/IyI65e3u76Xo8q4YLtXw+Pn6gvP9rS8Dju0bSBCbv4PCKCwoyLAhL4QQDXCQ4LCixXgQIT6YeLGjx0UZQz7wUeujyY8hUxpQwOCkS4spY6748LJmwZg4SdyzyfMdTpwPXLTsSXTcz58oMhRdavAozgY+hjKdiszpURoIqGrdlaJECRIQNHhoYBXhAyBb0yKTkOGDghgQ/wyURRdDqtq7vDp8EEGD7NxgNC7gHYxsgQwRK/7+8mCDsONeHShAUMyqAYjHmHd1UJCYso/MoHOdKPBAcQm7oVOXsrDDw18SC1XLLsUABIa5EErO3g2q9m2rKCjyHv6JAQXXTjUIJ86ckQQYfpHqbk790IbJRyHErs690BkKpX/mQN29+wUSR1OUXz/ojILoKTmwn5+hc0wW89lbwPG0cf71O8AHkQc7/cfdAOGFhMJ2BlaXwQgxFdBgeR3YlxFaE+pTQgExiLADCwNkwKA1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";
    let autoPagerLoading_gif = "data:image/gif;base64,R0lGODlh8ADwAPcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAICAgUFBQgICAoKChAQEBUVFRwcHCEhISQkJCcnJywsLC8vLzIyMjQ0NDU1NTc3Nzk5OTo6Ojw8PD09PT8/P0FBQUJCQkNDQ0VFRUZGRkhISEpKSk1NTVBQUFdXV1xcXGFhYWVlZWxsbHJycnl5eYCAgJ6enrGxsbGxsbGysbGysbGysbKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrOysrOzs7Ozs7Ozs7S0tLS0tLS0tLS0tLS0tLW1tbW1tbW1tba2tra2tre3t7e3t7i3uLi4uLi4uLm5ubu7u728vL6+vsDAwMLBwsPDw8PDw8PDw8TEw8TExMTExMTExMTExMXFxcXFxcbGxsfHxsfHx8fHx8fHx8fHx8jIyMjIyMjIyMjIyMnJycrKysrLysvMy8zMzM7Ozs/Pz9HR0dLS0tLS0tPT09TU1NXV1dfX19nZ2dra2tvb29vc3N3d3d7e3uDg4OHh4eLi4uTk5Obm5ubm5ujo6Onp6erq6urq6urq6uvr6+vr6+zs7Ozs7Ozt7e3t7e3t7e3u7e7u7u/v7/Dw8PHx8fHy8fLz8vP08/T09PT09PX19fX19fb29vb39vf39/f39/j4+Pn5+fv7+/z8/P7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////yH/C05FVFNDQVBFMi4wAwEAAAAh+QQJBwDsACwAAAAA8ADwAAAI/gDZCRxIsKDBgwgTKlzIsKHDhxAjSpxIsaLFixgzatzIsaPHjyBDihxJsqTJkyhTqlzJsqXLlzBjyuTo7NerVKM2PQLUZ86TWQpnpZnTB5Cj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srKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKzsrKzsrKzs7O0s7O0tLS1tLS1tbW2tra4uLi5ubm6urq7uru8u7u9vL2+vr7BwMHCwsLDwsLDw8PDw8PDw8PDw8PDw8PEw8PExMTExMTExMTFxcXFxcXGxsbGxsbHx8fHx8fHx8fHx8fHyMfIyMjIyMjIyMjIyMjIyMjIyMjKysrMzczPz8/Q0NDR0dHS0tLS0tLT09PU1NTV1dXW1tbX19fX2NjZ2dnb29vb29vc3Nzd3d3d3d3e3t7f39/g4ODi4uLk5OTm5ubn5+fo6Ojp6enq6urq6urr6+vs7Ozs7Ozs7Ozs7Ozs7Ozs7e3t7e3t7e3t7e3t7u3u7u7v7+/w8PDw8fDx8vHy8/Lz8/Pz9PP09PT19fT19vX29vb29/b39/f3+Pf4+Pj4+Pj5+vn6+vr7+/v7+/v8/Pz8/Pz9/f3+/v7+/v7+/v7+/v7+/v7+/v7///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8I/gDRCRxIsKDBgwgTKlzIsKHDhxAjSpxIsaLFixgzatzIsaPHjyBDihxJsqTJkyhTqlzJsqXLlzBjyuRYrNaoTpQYBXrDxsyPUwpPgTHD5s0fRpQ6jbJVbKbTpyyFoeLkSE+aH1izZv3yY5TCUVjB/OCq9UeaPI44oSIGta3bjKswKWojlmzZuz9EKQyFt+/YNooyrXpLuDBCVJb2iPHLGCsohaDENi5LVgwfS6gMa37q65Min2IlT777xZNCT6Pxkv0yVNEnX5tjq8yVqc4PMKztpiatSeEm0bvLSgYDpk6mXLKTgxzWKc/W4JMxKcSkG/pd3FjzdBKm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urq6uru7u7u7u729vb+/v8DAwMHBwcLCwsLCwsPDw8PDw8PDw8PDw8PDw8TExMTExMTExMTExMXFxcXFxcbGxsbGxsfHx8fHx8fIx8jIyMjIyMjIyMjIyMnJycrLys3Nzc/Pz9DQ0NHR0dLS0tPT09PU1NTU1NbW1tfX19jZ2dra2tvb29zc3N3d3d7e3t7f3+Dg4OHh4ePj4+Tk5OXl5ebm5ufn5+jo6Onp6erq6urq6urq6uvr6+vr6+zs7Ozs7e3t7e3t7e3u7e7u7u7u7u/v7+/w7/Dw8PDx8PHx8fLy8vPz8/T09PT19PX19fX19fb29vb29vf39/f39/f49/j4+Pj4+Pn5+fr6+vv7+/7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wj+ANMJHEiwoMGDCBMqXMiwocOHECNKnEixosWLGDNq3Mixo8ePIEOKHEmypMmTKFOqXMmypcuXMGPK5FiM1qhNlBoRkvMGDZNTCk8xQfNGzqBGlDaNqlVsptOnLImp0vTIDxsmWLNmNcNklMJRWrlqZbKmzyNNqohBXcs24ypMi+BgFTu2LpNQCkPZ3cvEDJxFmFi1HUwYoSpLf87wXYz1k8JPjO2KPQPIkqrCmJ/66rTIZ2TGZjgp3PRZ8tyhizr5ysxaJS5MeE7TLV3XTCaFmmiXxoMJV+vfIIdx6rNVd+RLCi/NNm6aSZ9NwoBLvzhqEdflzPeaqaSwUvbP1xf+eZ1OvqGwS3Kxf9dOSSGl9eCxwrk0rLz9grIczVUPvzYkhZD0Z5wjstxXHiqKCMhcIwo1omBpYikClIGtlULIaQ+WxohCjGQIIVaElEJhYakMgqGHny2i0CIofsgEIZeNCJUtjPDXIl+HKHTIjbRxxYgtMspUTCQ8MpdjQonYWKRdkTQVZEucqNHXkrQdidCOVNKmhmhPpuTKH1NmWZqVB2EpZmmAuNKlSZOEeWZkZpBpkJlvLiZWe2uGdEocbtbJWCIKJeInbXFM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kJ3SeaH9t4AQBgcgoJ06mBDJ9yYwYmVp8AHKKQIc0ighcmlvAJe0OQINMigS4mqLMAKrSQIAUicEImujYALRmZg+mhB/eCPzoXuvBgM0Kpcl0B1UIh66JhCkkAIHSowmkBzJBB1VahCWcAIcsJWlKBAg9yC8AYpf6gkqEAIOGpEqoBAnCB9okBrA+KUFAQcl4AEUsI8r8BjrQRmWgaddGFEMc3ACIVCksugCeWEcf4EJykioG3EKcIACI9ABqkmHMdBvi8EGZoEWYSmpIkELjQADKVACIvABGoABDtoGQTEURUEISKEUtFCCogoTxRCqt7qrvNqrvvqrHRUQACH5BAkHAOoALAAAAADwAPAAhwAAAAAAAAAAAAAAAAAAAAAAAAAAAAEBAQQEBAoKChYWFiUlJTQ0NJKSkqqqqrGxsbGysbGysbGysbGysbGysbGysbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbGxsbKysrGxsrGxsrGxsrGxsrGxsrGxsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrOysrOysrOysrOysrSzs7Szs7S0tLS0tLW1tbW1tba2tre3t7i3uLm4ubm5ubq6uru7u7y8vL6+vsDAwMLCwsLCwsPCwsPDw8PDw8PDw8PDw8PDw8TExMTExMTExMTExMTExMXFxcbFxcbGxsfHx8fHx8fHx8fIx8fIx8fIx8jIyMjIyMjIyMjIyMnJycrKysvMzM3Nzc/Pz9DQ0NLS0tLS0tPT09PT09XV1djY2Nra2tvb29zd3N3d3d7e3uDg4OLi4uPk5OXl5efn5+jo6Onp6enp6erq6urq6uvr6+vr7Ozs7Ozs7O3t7e3t7e3u7e7u7u7v7u/v7/Dw8PHx8fHy8fLy8vPz8/P08/T09PX19fX29fb29vf39/f39/f49/j4+Pn5+fn5+fz8/P39/f7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wj+ANUJHEiwoMGDCBMqXMiwocOHECNKnEixosWLGDNq3Mixo8ePIEOKHEmypMmTKFOqXMmypcuXMGPK5Khs1ypToDQ12oMnzhJYCmGhiYNnDyNNoEyt2qVsptOnLJPFKsUJkZ0lWLNmPbNklcJVWNEs4ap1iR1DnErFagq1rVuMtEZhyiOWbNm7S1QpVIW379g8mEbReku4MMJYoRK18csYKyqFqMQ2Lku2TaJQsQxrfkrs1CWfYiVPvnvGlEJTo/GSPTP00ilim2Or/DUq0BI0rO2mJk1KYSnRu8tKRoMm0KhfspODRGbK0Nbgk0UpFKUb+l3cWA2ZQqa8+8VVmLj+Vrfe90wohaHIT8Z+5pJX7/AbIhOVZyxw9X7PgFIICv9osnmIwl18BBKkyyZYnTGef6p1olAnDAaHxia6FBgfLJZECB0amiikiYapkWUJUBbK5kojty0IYl+ZKJTJiiES14grJRoWCyPEqQgjXpcodMl9O5aHVSOZ1QgVL5mwFuRuaEiikCRL7sZVJrwYKZMyn0RpnZMJVaKjlnh9wpaVLJkyx1hg7sYlQlCmmRoac5xCpkq2JGKfm6mteZAkQOLZFxqJ2DKnSaBg5+d/ehrU5qGNkbXfoCHBsgeajI5WiUKV9FmpcEvoQSKkHPV326ajJVoQn6Q2KtajoGKESx/+o6baWJOYaiprWX3g0qpFpVB6a2OmEpTpr6qWsutEL35JLFbBDiSJsssu0eKxDuGiR6zR+tWsQM9m29geulILmbelPknuZHKKe5Co5/qFxqUJdduuakuwqq5AL87LGLxs6ssYJveqI0wgCvqLF63xQntuccKIiwsetvqLMEKVGMwYHuG2WssbFjO2rToVd0zaEm8IuitqIuPF754RG2wataL4mvISHy86M1bSqcvuzGfUfPOo9orbiaEpr6zoz0s4GDC+RHf8sZcp4zbt0gJZonC0E7M8syVUE6RMIi1763PKiYw5p8kMKWPI1cSObbBYhpitENqy5fLG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5Fqu5nqu6Jqu6joQAQEAIfkECQcA7AAsAAAAAPAA8ACHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBBQUFCQkJEBAQFxcXISEhIyMjJSUlKCgoKysrLy8vODg4QEBARkZGTk5OVlZWW1tbYGBgZGRkZ2dna2trbm5ucXFxdHR0d3d3e3t7fX19hISEi4uLkpKSl5eXnJycn5+foaKho6OjpKSkpKSkpaWlpaWlpaalpqampqemp6enp6inqKioqaqpqquqrK2sra6trq+ur7CvsLGwsbGxsbKxsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKys7OztLS0tLS0tbW1tbW1tba1tra2uLi4urq6vLy8v7+/wMDAwcLBw8PDw8PDw8PDw8PDw8PDw8PDxMTDw8TDxMTExMTExMTExcXFxcXFxsbGx8fHx8fHx8fHyMfIyMfIyMfIyMfIyMjIyMjIyMjIyMjIyMnJycnJysrKy8vLzM3Nzs/P0NDQ0dHR0tLS09PT1NTU1dXV19fX2dnZ29vb3Nzc3d3d3t7e39/f4ODg4+Pj5eXl5+fn6Ojo6enp6unq6urq6urq6+vr6+vr7Ozs7Ozs7e3t7e3t7e7t7u7u7+/v8PDw8PDw8fHx8fLx8vPy8/Pz9PT09PX09fX19vb29vf29/f39/f3+Pj4+fn5+fn5/Pz8/f39/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////CP4A2QkcSLCgwYMIEypcyLChw4cQI0qcSLGixYsYM2rcyLGjx48gQ4ocSbKkyZMoU6pcybKly5cwY8rk2OzXK1WlPEHys+fOF1oKaX25s8cPJE+lVL361Wym06csm9lKBQqR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srKysrKysrKysrKysrKysrKysrKysrOysrOysrOys7Ozs7SztLS0tbW1tra2t7e3uLi4ubq5uru6u7u7vLy8vL28vb29vr6+v7+/v7+/wcDBwsLCwsLCw8PDw8PDw8PDw8PDw8PDw8PDw8PDxMTExMTExMTExMTExMTExMTExMXExcXFxcXFxsbGxsbGxsfGx8fHx8fHx8fHx8fHx8fHx8jHyMjIyMjIyMjIyMjIysrKzMzMzs7O0NDQ0dHR0tLS09PT09PT1NTU1dXV1tbW2NfX2tra29vb3Nzc3Nzc3d3d3t7e39/f4eHh4uLj5OPk5eXl5ubm6Ojo6enp6enp6urq6urq6+vr6+vr7Ozs7Ozs7ezs7e3t7e3t7e3t7u7u7u7u7+/v8PDw8fHx8fHx8vLy8/Pz8/Pz9PT09PT09fX19vb29vb29/f39/f39/f3+Pj4+fn5+vr6+vr6+vr6+/v7+/v7+/v7/Pz8/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////CP4A2wkcSLCgwYMIEypcyLChw4cQI0qcSLGixYsYM2rcyLGjx48gQ4ocSbKkyZMoU6pcybKlSWfMXMqcSdNkr0sZLlioQGFCBAcG2iiMRQaNmzqNLn0yxaqXs5pQo8qMBUcnBQgLFhgwoFUrVwMcFLIiE6SsWbJl2QjKVGpWTKlw42p0VudCBQlfs27dy3cvBoWrzAoWjJYsmTeVRNmSy7jxwjgWKDDY67WvZcp/E6YazLlzWTJlDIGa5bh0XFR2gV5ezfqCwlOeYxMmQxZNJVTHTOtmGeoCBb2sg1te4DphKdnIPeMRFWy3c5GtfFcWTr1vcYShkmvvLMjUsufgM/5mqDC9uvm9FhSC2s5+MJlKrcLLh8jqgoTy5/OnT+ipvX/BcITy3XwEGmRJBfkleNl+CGny339oBYEJLwUW6AaC+CmYXwUKXfLgh2ZVEkuF4KVBgYYo9sVhQh6CCCIZjbxComlxnJjijVutiFAlLr5YViOkzRgXJuThaCQFCknS45JBWPKLkFDtYoGRVBqAZEJKMtkj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9vb39/f39/f4+Pj4+Pj5+fn5+fn6+vr7+/v8/Pz+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8I/gDVCRxIsKDBgwgTKlzIsKHDhxAjSpxIsaLFixgzatzIsaPHjyBDihxJsqTJkyhTqlzJsqVLgsmWvZxJs6bFZbtaqSr16ZKhP3SsxFLY54EIEidSqGDxYsanXTajSmWpTFaqUJL2WHHjxorXr15bKZzB4UGHB2jLPihLAsWKF4GGTp1LFyOtU54Cbd3LFyxYVgplqEVLuHDasyVUvDgks67jxwZlmZoEp6/fy34BJ4RhuHNnDmU5fEDRQhDk01KJreo0p6tlzLC3rlLI2bNtw6DLilABYzbq3yl9nWLE9XXs41ZQKXxxu7ntDhxQvDAFvDpIZKokeXWNvDvYUwpd/jgf/1y6K+voL7by5L097FIKWwwmT39tWRUz0ut3iOxUIO7uBegVfAmxcFZ9CBZWggti7ecgQbqAIuCEfomi0AoJZmgWYSt48uB+sXBiHIXufXKhhigSpsIfH1b3yiUjkliiQiocmGKGoKVgR4uQyQIjgDJS2AmNNxb5QAqm8TgVL+wVF6SMbmiiUApG3giaCqAoWdMyo8T4pIBSJkRllSmC9sAKuWjpkip4fOmmV5tMSaaRHIwAg5oq3TKJl28GGCZCKcw3Z4ooRIKnSaU42eeXfx4U6KB0dsDCoSLFUsiiizZq0JiQFtlBByboQalHpACJ6ZOaFsRpp1VOOmpG/rkkcuqibsQpJquDnmDrqxSlouisbqZK0Kq40vkCrxN9Auypwg5EbLFGqgAMsg7lcumymDYr0LPQFmkCJdQutAq2s2qrDrfdWnlnuAeVQm65cqYLqavsDtTku9lOKai8RXKggjL1BsMIvvDeyi+kJ6QSbi5/EFwwoPseXGYHJEyCbC1yOHxqlFPaKDGZIByCrCoaMxvvx2RycCy1ppTcJ8cGo9wvBy7U667LwZ4s8430sisKzk/CDOjOVq5QL0GfmAp0e0I7SnSKKiBzNEEiLj1h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ACH5BAkHAOwALAAAAADwAPAAhwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAICAgsLCxcXFyYmJi4uLjMzMzc3Nzg3ODk5OTk5OTo6Ojs7Ozw8PD09PT4+Pj8/P0BAQEFBQUJCQkREREVFRUZGRkdHR0dHR0dHR0hISEhISElJSUpKSktLS01NTVBQUFNTU1ZWVlpaWl5eXmZlZW1tbXR0dHl5eXx8fIGBgYSEhIeHh4mJiY2NjZKSkpaWlpuamqCfn6SkpKuqqrCvr7KxsbKxsbKxsbKxsbKxsbKxsbKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKzsrKzsrOzs7S0tLS1tLW1tba2tre3t7i4uLm6uru7u72+vr/Av8HBwcPDw8PDw8PDw8PDw8PEw8TExMTExMTFxMXFxcbGxsfHx8fHx8fHx8jHyMjHyMjIyMjIyMrKysvMzM3Nzc/Pz9HR0dHR0dLS0tPT09TU1NXV1djY2Nra2tvb29zc3N7e3t/f3+Hh4eTk5OXl5ebm5ufn5+np6enp6erp6erq6uvr6+vr6+zs7Ozs7O3t7O3t7e3t7e7u7u7v7u/v7/Dw8PHx8fHx8fLy8vPz8/T09PX19fX19fb29vf49/r6+vv7+/z8/Pz8/P39/f7+/v7+/v7+/v7+/v7+/v7+/v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wj+ANkJHEiwoMGDCBMqXMiwocOHECNKnEixosWLGDNq3Mixo8ePIEOKHEmypMmTKFOqXMmypcuXMGPK5OiMWK1XqkhxesTokJxcCnPJOcToESdSql7VIuZsptOnLJ3temWqkiI5WLEOyrq1lsJaWcNy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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA";
    const MutationObserverConfig = {
        childList: true,
        subtree: true
    };
    //自定義站點規則
    const customData = [{
        name: "小黃書/8色人體攝影",
        host: ["xchina.co", "xchina.biz", "xchina.fun", "xchina.life", "8se.me"],
        reg: /(xchina\.(co|biz|life|fun)|8se\.me)\/photo\/id-\w+\.html/,
        include: ".photos>a",
        init: () => fun.remove("//div[@id='tab_1']/div[contains(text(),'推')] | //div[@class='rules']/ul/li[contains(text(),'推')]"),
        imgs: async () => {
            const _mp4 = fun.ge("video[src$='mp4']");
            if (!!_mp4) {
                const {
                    videos,
                    domain
                } = _unsafeWindow;
                videosSrcArray = videos.map(e => domain + e.url);
            }
            const [, album_id] = /id-([^.]+)/.exec(fun.lp);
            let [numP] = fun.gt("//i[@class='fa fa-picture-o']/parent::div").match(/\d+/);
            numP = Number(numP);
            const thumb = fun.ge("img.cr_only");
            const srcArrFn = (total, photoUrl = "https://img.xchina.biz/photos/", mode = 1) => {
                let suffix = ".jpg";
                if (mode === 2) {
                    suffix = "_600x0.webp";
                }
                const srcs = [];
                for (let i = 1; i <= total; i++) {
                    let num = String(i).padStart(4, "0");
                    let src = photoUrl + album_id + "/" + num + suffix;
                    srcs.push(src);
                }
                return srcs;
            };
            if (!!thumb) {
                const thumb_src = thumb.src;
                const OOOI = thumb_src.includes("/0001_600x0.webp");
                const [photoUrl] = /^https?:\/\/[^\/]+\/[^\/]+\//.exec(thumb_src);
                if (OOOI) {
                    thumbnailsSrcArray = srcArrFn(numP, photoUrl, 2);
                    return srcArrFn(numP, photoUrl);
                } else {
                    let max;
                    try {
                        let pageUrls = fun.gau(".pager a[href]");
                        pageUrls = [...new Set(pageUrls)];
                        let lastUrl = pageUrls.at(-1);
                        let [, lastNum] = lastUrl.match(/\/(\d+)\.html$/);
                        max = Number(lastNum);
                    } catch {
                        max = 1;
                    }
                    if (max > 1) {
                        await fun.getNP(".photos>a", ".pager a[current=true]+a:not(.next)", null, ".pager", 1500);
                    }
                    thumbnailsSrcArray = fun.getImgSrcArr("img.cr_only");
                    if (numP != thumbnailsSrcArray.length) {
                        setTimeout(() => {
                            fun.hideMsg();
                            fun.showMsg("圖片數量不符合,請反饋", 5000);
                        }, 1500)
                    }
                    return thumbnailsSrcArray.map(e => e.replace("_600x0", "").replace(".webp", ".jpg"));
                }
            } else {
                const srcArr = srcArrFn(numP);
                const [first] = srcArr;
                const check1 = await fun.checkImgStatus(first);
                if (check1.ok) {
                    return srcArr;
                } else {
                    const test_src = first.replace("/photos/", "/photos2/");
                    const check2 = await fun.checkImgStatus(test_src);
                    if (check2.ok) {
                        return srcArr.map(src => src.replace("/photos/", "/photos2/"));
                    } else {
                        return [];
                    }
                }
            }
        },
        button: [4, "24%", 1],
        insertImg: [
            ["//div[div[@class='photos']]/*[last()]", 2, ".pager,.photos"], 2
        ],
        customTitle: () => {
            let s = document.title.split("-");
            let title = "";
            if (/未分/.test(s[1])) {
                title += s[0].trim()
            } else {
                title += s[1].trim() + " - ";
                title += s[0].trim()
            }
            return title;
        },
        css: "body{overflow:unset!important}.photos>div.item,.jquery-modal.blocker.current,.push-top,.push-bottom,.slider-ad,.article.ad,.pager>.tips,body>footer~*:not([id^='pv-']):not([class^='pv-']):not(.pagetual_tipsWords):not(#comicRead):not(#fab):not(.FullPictureLoadMsg):not(.FullPictureLoadFixedBtn):not(#FullPictureLoadOptions):not(#FullPictureLoadFixedMenu):not(a):not(*[class^=fancybox]),.photoMask,.banner_ad{display: none!important;}",
        topButton: true,
        downloadVideo: true,
        category: "nsfw2"
    }, {
        name: "紳士会所",
        host: ["www.hentaiclub.net"],
        reg: /^https?:\/\/www\.hentaiclub\.net\/r\d+\/\d+\.html$/,
        imgs: "div[data-fancybox]",
        button: [4],
        insertImg: [
            ["#masonry", 2, "#masonry"], 2
        ],
        customTitle: ".post-info-text",
        fancybox: {
            v: 3,
            css: false
        },
        css: ".banner-top{display:none!important;}",
        category: "nsfw2"
    }, {
        name: "NLegs/HoneyLeg/Lady Lap/Nuyet/LegBabe", //需搭配專用腳本 https://greasyfork.org/scripts/463123
        host: ["www.nlegs.com", "www.honeyleg.com", "www.ladylap.com", "www.nuyet.com", "www.legbabe.com"],
        reg: [
            /^https?:\/\/www\.nlegs\.com\/girls\/\d+\/\d+\/\d+\/\d+\.html$/,
            /^https?:\/\/www\.honeyleg\.com\/article\/\d+\/\d+\/\d+\/\d+\.html$/,
            /^https?:\/\/www\.ladylap\.com\/show\//,
            /^https?:\/\/www\.nuyet\.com\/gallery\//,
            /^https?:\/\/www\.legbabe\.com\/hot\/[^\.]+\.html$/
        ],
        imgs: ".col-md-12.col-xs-12 img[src^=blob],.col-md-12.col-lg-12 img[src^=blob]",
        repeat: 1,
        button: [4],
        insertImg: ["//div[img[starts-with(@src,'blob')]]", 0],
        go: 1,
        customTitle: "strong",
        fetch: 1,
        category: "nsfw2"
    }, {
        name: "雅拉伊", //免VIP僅支援PC版和圖片命名是簡單數字遞增的。
        host: ["www.yalayi.com"],
        reg: /https?:\/\/www\.yalayi\.com\/gallery\/\d+\.html/i,
        imgs: async () => {
            await fun.waitEle(".bigimg>img");
            let max = fun.ge(".tishiwenzi-box").innerText.match(/\d+/)[0];
            let firstImg = fun.ge(".bigimg>img");
            let path = firstImg.dataset.original.match(/.+\//)[0];
            let testArr = [path + "1.jpg", path + "01.jpg", path + "001.jpg", path + "0001.jpg"];
            let ok = false;
            let padStart;
            for (let i = 0; i < testArr.length; i++) {
                let obj = await fun.checkImgStatus(testArr[i]);
                console.log(`確認圖片[${i}]`, obj);
                if (obj.ok) {
                    ok = true;
                    padStart = i + 1;
                    break;
                }
            }
            let arr = [];
            if (ok) {
                arr.push(firstImg.src);
                for (let i = 1; i <= max; i++) {
                    let src = path + String(i).padStart(padStart, "0") + ".jpg";
                    arr.push(src);
                }
                return arr;
            } else {
                return arr;
            }
        },
        button: [4, "24%", 4],
        insertImg: [".bigimg", 2],
        customTitle: () => fun.title(" - ", 3),
        threading: 4,
        category: "nsfw1"
    }, {
        name: "JKF",
        host: ["www.jkforum.net"],
        reg: /www\.jkforum\.net\/(p\/)?thread/,
        init: async () => await fun.waitEle("img[id^=aimg]"),
        imgs: () => {
            if (hasTouchEvents) {
                return fun.gae("img[id^=aimg]:not([style])");
            } else {
                return fun.gae("img[id^=aimg][zoomfile]");
            }
        },
        capture: () => _this.imgs(),
        customTitle: () => fun.gt(".title-hd h1,.post-title").replace(/\(\d+[\w\s\\.+-]\)/, "").trim(),
        category: "nsfw2"
    }, {
        name: "草榴",
        host: ["www.t66y.com", "cl.6962x.xyz"],
        reg: () => /\/htm_data\/\d+\/\d+\/\d+\.html$/.test(siteUrl) && fun.ge("img[ess-data]"),
        imgs: "img[ess-data]",
        customTitle: () => fun.gt("h4.f16").replace(/\[\d+P\]$/i, ""),
        category: "nsfw2"
    }, {
        name: "优丝库HD", //免VIP
        reg: () => {
            let hosts = ["yskhd.com", "yskhd.me"];
            return fun.indexOf(hosts, fun.lh) && /\/archives\/\d+/i.test(fun.lp);
        },
        exclude: "#erphpdown",
        init: () => fun.gae(".gallery-blur-item").forEach(e => (e.className = "gallery-item gallery-fancy-item")),
        imgs: () => {
            thumbnailsSrcArray = fun.getImgSrcArr(".article-content img[src*='-285x285']");
            fun.showMsg("fun.xhrHEA(check)...", 0);
            let xhrNum = 0;
            return thumbnailsSrcArray.map(e => e.replace("-285x285", "")).map(async (src, i, arr) => {
                let res = await fun.xhrHEAD(src);
                fun.showMsg(`fun.xhrHEAD(${xhrNum+=1}/${arr.length})`, 0);
                let status = res.status;
                return status == 404 ? src.replace(/(\.[a-z]+)$/i, "-scaled$1") : src;
            });
        },
        button: [4],
        insertImg: [
            [".article-content", 0, ".gallery-login,.gallery"], 2
        ],
        autoDownload: [0],
        next: ".article-nav-prev>a",
        prev: ".article-nav-next>a",
        customTitle: ".article-title",
        fancybox: {
            v: 3,
            css: false
        },
        category: "nsfw1"
    }, {
        name: "24FA",
        host: ["www.24fa.com"],
        link: "https://www.24fa.com/c49.aspx",
        reg: /(www\.)?\d{2,3}(m|w|faw|fa|aa|xx)?\.[a-z]{2,4}\/m?n\w+\.aspx/,
        init: "document.onkeydown=null",
        imgs: () => fun.getImgA("#content img", ".pager a:not([title])"),
        button: [4],
        insertImg: ["#content", 1],
        autoDownload: [0],
        next: ".prevNews>a",
        prev: ".nextNews>a",
        customTitle: "h1",
        css: "body>section[id],#footer~*:not([id^='pv-']):not([class^='pv-']):not(.pagetual_tipsWords):not(#comicRead):not(#fab):not(.FullPictureLoadMsg):not(.FullPictureLoadFixedBtn):not(#FullPictureLoadOptions):not(#FullPictureLoadFixedMenu):not(*[class^=fancybox]){display:none!important}",
        category: "nsfw2"
    }, {
        name: "Hit-x-Hot/Hitxhot Album Archive II/dongojyousan.com",
        host: ["www.hitxhot.org", "hitxhot.com", "www.dongojyousan.com"],
        reg: [
            /^https?:\/\/www\.hitxhot\.org\/(gallerys|articles|photos)\/(?!\?page=|\?m=|hot|top|tag)\w+\.html(\?m=1)?$/i,
            /^https?:\/\/hitxhot\.com\/blog\/\w+\.html(\?m=1)?$/i,
            /^https?:\/\/www\.dongojyousan\.com\/articles\/\w+\.html/i
        ],
        init: async () => await fun.clearElementEvent(),
        imgs: async () => {
            let max;
            try {
                max = fun.gt(".entry-title").match(/\d+$/)[0];
            } catch (e) {
                max = 1;
            }
            return /\?m=1/.test(siteUrl) ? await fun.getImg(".entry-content img", max, "8") : await fun.getImg(".entry-content img", max);
        },
        button: [4],
        insertImg: [".entry-content", 2],
        customTitle: () => fun.title(/^[a-z-\s\.I]+:/i).split("|")[0].trim(),
        category: "nsfw2"
    }, {
        name: "www.depvailon.com crimejunkiespodcast.com pic.yailay.com nungvl.net www.kaizty.com lootiu.com depday.info thismore.fun cosxuxi.club baobua.com cn.looives.com redseats.org",
        reg: [
            /^https?:\/\/(www\.depvailon\.com|crimejunkiespodcast\.com)\/(?!\?page=|\?m=).+\.html/i,
            /^https?:\/\/(pic\.yailay\.com|www\.kaizty\.com)\/(gallerys|articles|photos)\/(?!\?page=|\?m=|hot|top|tag)\w+\.html/i,
            /^https?:\/\/nungvl\.net\/gallerys\/\d+\.cg/i,
            /^https?:\/\/lootiu\.com\/gallery\/.+\.cfg/i,
            /^https?:\/\/depday\.info\/v2\/\w+\.html/i,
            /^https?:\/\/thismore\.fun\/view\/[^\.]+\.php/i,
            /^https?:\/\/cosxuxi\.club\/[^\.]+\.html/i,
            /^https?:\/\/baobua\.com\/post\/[^\.]+\.html/i,
            /^https?:\/\/cn\.looives\.com\/view\/[^\.]+\.cfg/i,
            /^https?:\/\/redseats\.org\/gallery\/[^\.]+\.cfg/i
        ],
        init: async () => {
            await fun.clearElementEvent();
            await fun.waitVar("jQuery");
            fun.run("jQuery(document).off();jQuery('body').off();");
            fun.createImgBox(".contentme,.contentme2", 2);
            fun.remove(".mobiletop");
            fun.css("#FullPictureLoadEnd{color:rgb(255, 255, 255)}");
        },
        imgs: async () => {
            let max;
            try {
                max = fun.gt("h1,h2").match(/\d+$/)[0];
            } catch (e) {
                max = 1;
            }
            return /\?m=1/.test(siteUrl) ? await fun.getImg(".contentme img,.contentme2 img", max, "8") : await fun.getImg(".contentme img,.contentme2 img", max);
        },
        button: [4],
        insertImg: [
            ["#FullPictureLoadMainImgBox", 0, ".contentme,.contentme2"], 2
        ],
        customTitle: () => document.title.split("|")[0].replace(/^[a-z-\s\.]+:/i, "").replace("NứngVL.net:", "").replace(/【\d+P】|\[\d+[\w\s\+\.]+\]/i, "").trim(),
        category: "nsfw2"
    }, {
        name: "TGStat Show more",
        reg: /^https?:\/\/([a-z]{2}\.)?tgstat\.com\//,
        observerClick: "//button[contains(text(),'Show more')]",
        category: "autoPager"
    }, {
        name: "Telegram Web",
        host: ["telegra.ph"],
        reg: /^https?:\/\/telegra\.ph\/.+/,
        imgs: ".figure_wrapper img",
        customTitle: () => fun.gt("h1").replace(/\|/g, "").replace(/(\s?-\s?)?\d+P/i, "").replace(/\[\d+[\w\s\.\+-]+\]/i, ""),
        category: "nsfw2"
    }, {
        name: "Rentry.co",
        host: ["rentry.co"],
        reg: () => /^https?:\/\/rentry\.co\/\w+$/.test(fun.url) && fun.ge("img"),
        imgs: "img",
        customTitle: "h1",
        category: "nsfw2"
    }, {
        name: "新闻吧/新娱乐在线/新娱乐网/福建热线/山东热线/广西热线/武汉热线/天津热线/云南热线/甘肃热线",
        link: "https://www.xinwenba.net/web/meinv/",
        reg: () => {
            let hosts = ["www.xinwenba.net", "www.xwbar.com", "m.xwbar.com", "www.dv67.com", "m.dv67.com", "www.xinent.net", "m.xinent.net", "www.fjrx.org", "m.fjrx.org", "www.sdrx.org", "m.sdrx.org", "www.gxrx.org", "m.gxrx.org", "www.whrx.org", "m.whrx.org", "www.tjrx.org", "m.tjrx.org", "www.ynrx.org", "m.ynrx.org", "www.gsrx.org", "m.gsrx.org"];
            return hosts.includes(fun.lh) && /\/plus\/view-\d+-\d+\.html$/.test(fun.lp);
        },
        include: ".main img",
        imgs: () => {
            let max;
            try {
                max = fun.gt(".paging>li>a,.tags>li>a,.pre_next>li>a").match(/\d+/)[0];
            } catch (e) {
                max = 1;
            }
            return fun.getImg(".main img", max, "5");
        },
        button: [4],
        insertImg: [".view_img", 2],
        autoDownload: [0],
        next: "//li[contains(text(),'上一篇')]/a",
        prev: "//li[contains(text(),'下一篇')]/a",
        customTitle: ".title>h1",
        css: "div.web{display:none!important;}",
        category: "nsfw1"
    }, {
        name: "四海资讯/娱乐吧/娱乐屋/美女图片库",
        link: "https://www.shzx.org/b/12-0.html",
        reg: () => {
            let hosts = ["www.shzx.org", "m.shzx.org", "www.yuleba.org", "m.entba.net", "www.entwu.com", "m.entwu.com", "www.xwbzx.com", "m.xwbzx.com"];
            return hosts.includes(fun.lh) && /\/a\/[\d-]+\.html$/.test(fun.lp);
        },
        imgs: () => {
            let max;
            try {
                max = fun.gt(".paging>a").match(/\d+/)[0];
            } catch (e) {
                max = 1;
            }
            return fun.getImg(".main img", max, "5");
        },
        button: [4],
        insertImg: [".main", 2],
        autoDownload: [0],
        next: ".pre_next li:last-child a",
        prev: ".pre_next li:first-child a",
        customTitle: ".title>h1",
        css: ".a_img .main img{max-width:100%!important}",
        category: "nsfw1"
    }, {
        name: "留园酷",
        host: ["www.cool18.com"],
        reg: /(www\.cool18\.com\/bbs\d*\/index\.php\?app=forum&act=threadview&tid=\d+|wap\.cool18\.com\/index\.php\?app=index&act=view&cid=\d+)/,
        imgs: "img[mydatasrc],#shownewsc img,.show_content img",
        customTitle: () => fun.gt(".show_content b,h1.article-tit").replace(/(\s?\.?)?\s?\(\d+P\)\s?/i, ""),
        css: ".img_ad_list{display:none!important}",
        category: "nsfw2"
    }, {
        name: "秀人集",
        host: ["www.123781.xyz"],
        reg: () => /\/\w+\/\d+\.html$/.test(siteUrl) && fun.ge("//div[@class='item_info']//a[text()='秀人集']"),
        init: () => {
            let pag = fun.gae(".page");
            if (pag.length > 0) pag[0].remove();
        },
        imgs: () => fun.getImg(".content>p img[alt]", fun.gt(".page a:last-child", 2), 3, null, 200),
        button: [4],
        insertImg: ["//div[p[img[@alt and @title]]]", 2],
        autoDownload: [0],
        next: "//span[contains(text(),'下一篇')]/a[contains(@href,'html')]",
        prev: "//span[contains(text(),'上一篇')]/a[contains(@href,'html')]",
        customTitle: ".item_title>h1",
        //threading: 4,
        css: ".content br{display:none!important}",
        category: "nsfw1"
    }, {
        name: "秀人美女網",
        host: ["www.xrmn09.top", "xrmn9.ooov.bf"],
        reg: () => /\/\w+\/\d+\/\d+\.html$/.test(siteUrl) && fun.ge("//div[@class='single-cat']/a[text()='秀人美女网']"),
        imgs: () => fun.getImg(".content p img[alt]", fun.gt(".page a:last-child", 2), 3, null, 200),
        button: [4],
        insertImg: ["//div[p[img[@alt]]]", 2],
        autoDownload: [0],
        next: "//span[contains(text(),'下一篇')]/a[contains(@href,'html')]",
        prev: "//span[contains(text(),'上一篇')]/a[contains(@href,'html')]",
        customTitle: ".item_title>h1",
        //threading: 4,
        css: ".item_info>a,p[align='center']:has(>img),.item_title>div[id],.item_title>a,.content br,.bottom_fixed,.update_area_lists>div[id],body>div[id]:not([id^='pv-']):not([class^='pv-']):not(.pagetual_tipsWords):not(#comicRead):not(#fab):not(.FullPictureLoadMsg):not(.FullPictureLoadFixedBtn):not(#FullPictureLoadOptions):not(#FullPictureLoadFixedMenu):not(*[class^=fancybox]){display:none!important}",
        category: "nsfw1"
    }, {
        name: "极品性感美女",
        host: ["www.12356787.xyz", "x006.nnnq.bf", "尤物网.Com"],
        reg: () => /\/\w+\/\w+\.html$/.test(siteUrl) && fun.ge("//div[@class='toptip']/a[text()='极品性感美女']"),
        init: () => {
            let pag = fun.gae(".pagination");
            if (pag.length > 0) pag[0].remove();
            let p = fun.gae("//article/p[not(img)]");
            if (p.length > 0) {
                let te = fun.ge(".article-content");
                p.forEach(e => te.parentNode.insertBefore(e, te));
            }
        },
        imgs: () => fun.getImg(".article-content img[alt]", fun.gt("a.current~*:last-child", 2), 3, null, 200),
        button: [4],
        insertImg: [
            ["//div[@class='pagination'][last()]", 1, "//p[img[@alt]]"], 2
        ],
        go: 1,
        autoDownload: [0],
        next: ".article-nav-next>a[href$=html]",
        prev: ".article-nav-prev>a[href$=html]",
        customTitle: ".article-title",
        //threading: 4,
        css: ".article-header>div[id],.article-header>a,.article-content br,img[src*='zz1.gif'],.bottom_fixed,.article-content~a,#bottom-banner,.content>div[id],body>.footer~*:not([id^='pv-']):not([class^='pv-']):not(.pagetual_tipsWords):not(#comicRead):not(#fab):not(.FullPictureLoadMsg):not(.FullPictureLoadFixedBtn):not(#FullPictureLoadOptions):not(a):not(#FullPictureLoadFixedMenu):not(*[class^=fancybox]){display:none!important}",
        category: "nsfw1"
    }, {
        name: "爱美女网",
        host: ["www.imn5.vip"],
        reg: /^https?:\/\/www\.imn5\.\w+\/\w+\/\w+\/\d+\.html/i,
        imgs: () => fun.getImg(".imgwebp p img[alt]", fun.gt(".page a:last-child", 2), 3, null, 200),
        button: [4],
        insertImg: ["//div[p[img[@alt]]]", 2],
        autoDownload: [0],
        next: "//span/b[contains(text(),'下一篇')]/a[contains(@href,'html')]",
        prev: "//span/b[contains(text(),'上一篇')]/a[contains(@href,'html')]",
        customTitle: ".focusbox h1+div",
        //threading: 4,
        css: ".imgwebp br,img[src*='zz2.gif']{display:none!important}",
        category: "nsfw1"
    }, {
        name: "漂亮美女网",
        host: ["www.plmn5.cc", "plmn.cc"],
        reg: () => /^https?:\/\/www\.plmn5\.cc\/\w+\/\d+\.html/i.test(siteUrl) && fun.ge(".page>a"),
        imgs: () => fun.getImg(".newstext p img[alt]", fun.gt(".page a:last-child", 2), 3, null, 200),
        button: [4],
        insertImg: ["//div[p[img[@alt]]]", 2],
        autoDownload: [0],
        next: "//span/b[contains(text(),'下一篇')]/a[contains(@href,'html')]",
        prev: "//span/b[contains(text(),'上一篇')]/a[contains(@href,'html')]",
        customTitle: ".news-title-h1",
        //threading: 4,
        css: ".newstext br,img[src*='zz2.gif']{display:none!important}",
        category: "nsfw1"
    }, {
        name: "爱看美女网",
        host: ["www.ikmn05.top"],
        reg: () => /^https?:\/\/www\.ikmn(\d+)?\.\w+\/\w+\/\d+\.html$/.test(siteUrl) && fun.ge(".info-pagebar>a"),
        init: () => {
            let pag = fun.gae(".pagebar");
            if (pag.length > 0) pag[0].remove();
        },
        imgs: () => fun.getImg(".info-imtg-box img[alt]", fun.gt(".pagebar>*:last-child", 2), 3, null, 200),
        button: [4],
        insertImg: ["//p[img[@alt]]", 2],
        autoDownload: [0],
        next: ".info-next li:last-child a",
        prev: ".info-next li:first-child a",
        customTitle: "h1",
        //threading: 4,
        category: "nsfw1"
    }, {
        name: "美人图",
        reg: () => {
            let hosts = ["meirentu.me", "meirentu.cc", "meirentu.top", "meirentu.icu"];
            return hosts.includes(fun.lh) && /\/pic\/\d+\.html$/.test(fun.lp);
        },
        imgs: () => fun.getImg(".content_left img[alt]", fun.gt(".page a:last-child", 2), 5),
        button: [4],
        insertImg: [".content_left", 2],
        autoDownload: [0],
        next: "//span[contains(text(),'下一篇')]/a[contains(@href,'html')]",
        prev: "//span[contains(text(),'上一篇')]/a[contains(@href,'html')]",
        customTitle: ".item_title>h1",
        //threading: 4,
        css: "img[alt]~br{display:none!important}",
        category: "nsfw1"
    }, {
        name: "美女秀",
        host: ["www.22mm.net"],
        reg: /www\.22mm\.net\/a\/\w+\.html$/i,
        imgs: () => fun.getImgO(".content img", fun.gu(".page>li:last-child>a").match(/_(\d+)/)[1], 9),
        button: [4],
        insertImg: [".content", 2],
        autoDownload: [0],
        next: "//span[contains(text(),'上一篇')]/a",
        prev: "//span[contains(text(),'下一篇')]/a",
        customTitle: ".item_title>h1",
        css: "union,.update_area_lists>li:nth-child(n+3):nth-child(-n+4){display:none!important}",
        category: "nsfw1"
    }, {
        name: "卡卡美女网",
        host: ["www.kaka234.cc", "m.kaka234.cc"],
        reg: () => /^https?:\/\/(www|m)\.kaka234\.cc\/HTM\/\w+\/(\w+\/)?\d+\/\d+\/\d+\.html$/.test(siteUrl) && fun.ge(".Title>h1,.PsBox"),
        init: () => {
            let ele = fun.ge(".PsBox");
            if (ele) {
                let eleParent = ele.parentNode;
                eleParent.parentNode.insertBefore(ele.cloneNode(true), eleParent);
            }
        },
        imgs: () => {
            let max;
            try {
                max = fun.gt(".dede_pages li>a,.article_page li>a").match(/\d+/)[0];
            } catch (e) {
                max = 1;
            }
            return fun.getImg(".content img,.ArticleImageBox img", max, 9);
        },
        button: [4],
        insertImg: ["//div[@class='content'] | //div[div[@class='ArticleImageBox']]", 2],
        autoDownload: [0],
        next: () => {
            let next = fun.ge("//li[contains(text(),'上一篇')]/a");
            return next ? next.href : null;
        },
        prev: 1,
        customTitle: ".Title>h1,.PsBox",
        css: ".m_adv{display:none!important}",
        category: "nsfw1"
    }, {
        name: "高清图片吧",
        host: ["www.pic88.cc"],
        reg: /^https?:\/\/www\.pic88\.cc\/\w+\/\d+\/\d+\.html$/,
        imgs: () => {
            let max = fun.gt(".page>*:last-child");
            return fun.getImg(".content img,.ArticleImageBox img", max, 9);
        },
        button: [4],
        insertImg: [".content", 2],
        customTitle: "//div[@class='Title111']/h3[not(a)]",
        css: ".center:has(>.dibu1),.center:has(>.dibu2){display:none!important}",
        category: "nsfw1"
    }, {
        name: "高清图片吧M",
        host: ["m.pic88.cc"],
        reg: /^https?:\/\/m\.pic88\.cc\/\w+\/\d+\/\d+\.html$/,
        init: () => fun.createImgBox(".PsBox", 2),
        imgs: ".ArticleImageBox>img",
        button: [4],
        insertImg: [
            ["#FullPictureLoadMainImgBox", 0, ".ArticleImageBox,.m_adv,.m_kanp"], 2
        ],
        customTitle: ".PsBox",
        css: ".m_adv,.m_kanp{display:none!important}",
        category: "nsfw1"
    }, {
        name: "雅拉图",
        host: ["www.yalatu.com"],
        reg: /^https?:\/\/www\.yalatu\.com\/big-image\.html\?type=\d+&imageId=\d+$/,
        init: async () => {
            await fun.waitVar("mImageWebsite");
            const {
                mServerUrl,
                mRequestType,
                mImageId
            } = _unsafeWindow;
            fun.showMsg(displayLanguage.str_05, 0);
            let type = Number(mRequestType);
            let imageId = Number(mImageId);
            let fetchJson = await fetch(mServerUrl + "/Image/ImageUrl", {
                "headers": {
                    "content-type": "application/json;charset=UTF-8"
                },
                "body": `{"type":${type},"imageId":${imageId}}`,
                "method": "POST"
            }).then(res => res.json());
            siteJson = fetchJson;
            fun.remove("#costom-page-control");
            _unsafeWindow.document.onkeydown = null;
            _unsafeWindow.document.oncontextmenu = null;
            _unsafeWindow.document.onselectstart = null;
        },
        imgs: () => JSON.parse(siteJson.data).map(e => _unsafeWindow.mImageWebsite + e),
        button: [4],
        insertImg: ["#custom-row-0", 2],
        customTitle: () => siteJson.title.replace(/\[\d+[\w\s\\\/\.+-/]+\]?/i, "").trim(),
        css: "#FullPictureLoadEnd{color:rgb(255, 255, 255)}",
        category: "nsfw1"
    }, {
        name: "美女目录网 列表模式",
        host: ["www.girldir.com"],
        reg: /^https?:\/\/www\.girldir\.com\/photos\/\w+_list\/$/i,
        imgs: async () => {
            await fun.getNP(".list-page-box>.item", "li.active+li>a", null, ".pagination");
            thumbnailsSrcArray = fun.getImgSrcArr(".list-page-box img");
            return thumbnailsSrcArray.map(e => e.replace(".medium.", ".big."));
        },
        button: [4],
        insertImg: [".list-page-box", 2],
        category: "nsfw1"
    }, {
        name: "ROSI写真",
        host: ["www.rosipic.com", "rosipic.com"],
        reg: /^https?:\/\/(www\.)?rosipic\.com\/rosi\/\d+\.html$/i,
        imgs: () => fun.gau("a.spotlight").map(u => u.replace("https://wsrv.nl/?url=", "").replace(/&blur=\d+/, "")),
        button: [4],
        insertImg: [
            ["#waterfall-container", 2], 2
        ],
        go: 1,
        category: "nsfw1"
    }, {
        name: "ROSI美女写真",
        host: ["www.rosixiezhen.cc", "rosixiezhen.cc", "www.rosi985.com", "www.rosi365.cc", "www.rosi360.cc", "www.2meinv.cc", "www.silk-necktie.com"],
        reg: /^https?:\/\/((www\.)?rosixiezhen\.\w+|(www\.)?rosi\d{3}\.\w+|(www\.)?\dmeinv\.cc|www\.silk-necktie\.com)\/\w+\/\w+\.html/i,
        exclude: "//span/a[text()='ROSI视频']",
        init: () => {
            let pag = fun.gae(".pagination2");
            if (pag.length > 0) pag[0].remove();
            fun.remove(".content>b,.content>br,.asst");
        },
        imgs: () => {
            let max;
            try {
                max = fun.gt("//a[contains(text(),'共')]").match(/\d+/)[0];
            } catch (e) {
                max = 1;
            }
            return fun.getImg(".article-content img", max, 9);
        },
        button: [4],
        insertImg: [".article-content", 2],
        autoDownload: [0],
        next: ".article-nav-prev>a",
        prev: ".article-nav-next>.a",
        customTitle: ".article-title",
        category: "nsfw1"
    }, {
        name: "ROSI小莉最新写真",
        host: ["www.rosi211.cc"],
        reg: /^https?:\/\/(www\.)?rosi\d{3}\.cc\/\d+$/i,
        init: () => {
            let pag = fun.gae(".wp-pagenavi");
            if (pag.length > 0) pag[0].remove();
            let ele = fun.ge(".entry-header");
            if (ele) {
                let x = fun.ge("article.post");
                x.parentNode.insertBefore(ele, x);
            }
        },
        imgs: () => {
            let links = fun.gau(".wp-pagenavi a");
            links = [...new Set(links)];
            return fun.getImgA("article img", links);
        },
        button: [4],
        insertImg: ["article.post", 2],
        autoDownload: [0],
        next: ".nav-previous>a",
        prev: ".nav-next>a",
        customTitle: ".entry-title",
        css: "@media only screen and (max-width:480px){#primary{padding:6px !important}.col-md-12{padding:0px !important}}",
        category: "nsfw1"
    }, {
        name: "新老友图社",
        host: ["m.xtushe.com"],
        reg: /^https?:\/\/m\.xtushe\.com\/photo\/\d+\.html$/i,
        imgs: async () => {
            const error = async doc => {
                let ele = fun.ge("#content-photo>img", doc);
                if (!ele) {
                    await alert("遇到驗證");
                    location.reload();
                    return true;
                } else {
                    return false;
                }
            };
            await fun.getNP("#content-photo>img", "li.next>a", error, ".pagebreak");
            return fun.gae("#content-photo>img");
        },
        button: [4],
        insertImg: ["#content-photo", 2],
        insertImgAF: () => fun.remove(".pagebreak"),
        customTitle: "#content-title>h1",
        category: "nsfw1"
    }, {
        name: "闺秀网",
        host: ["www.guixiu.org", "guixiu.org"],
        reg: /^https:\/\/(www\.)?guixiu\.org\/post\/\d+\.html/i,
        imgs: () => fun.getImgA("#lightgallery img", "#ipage a[href*=ipage]"),
        button: [4],
        insertImg: ["#lightgallery", 2],
        customTitle: ".focusbox-title",
        category: "nsfw1"
    }, {
        name: "福利图",
        host: ["fulitu.me"],
        reg: /fulitu\.me\/pic\/\d+\.html/i,
        imgs: () => fun.getImg(".content_left img", fun.gt("//a[text()='下页']", 2), 5),
        button: [4],
        insertImg: [".content_left", 2],
        autoDownload: [0],
        next: "//span[contains(text(),'下一篇')]/a",
        prev: "//span[contains(text(),'上一篇')]/a",
        customTitle: ".item_title>h1",
        css: ".content br{display:none!important}",
        category: "nsfw1"
    }, {
        name: "爱图门",
        host: ["aitu.men"],
        reg: /^https:\/\/aitu\.men\/[^\/]+\/\d+\.html/i,
        imgs: async () => {
            await fun.getNP(".context img", ".pagelist span+a", null, ".pagelist", 0, null, 0);
            return fun.gae(".context img");
        },
        button: [4],
        insertImg: [".context", 1],
        autoDownload: [0],
        next: ".post-previous a",
        prev: ".post-next a",
        customTitle: "#content h1",
        category: "nsfw1"
    }, {
        name: "K55",
        host: ["k55.net"],
        link: "https://k55.net/arttype/2.html",
        reg: () => /^https?:\/\/k55\.net\/artdetail-\d+\.html/.test(siteUrl) && fun.ge(".photo_box"),
        imgs: () => fun.gae(".photo_box img").map(e => e.src).sort((a, b) => a.match(/(\d+)\.\w+$/)[1] - b.match(/(\d+)\.\w+$/)[1]),
        button: [4],
        insertImg: [".photo_box", 2],
        autoDownload: [0],
        next: ".item_prev_next>.item_right>a",
        prev: ".item_prev_next>.item_left>a",
        customTitle: () => fun.gt(".title-box>.h3-md.mb-1").replace(/\s?\[\d+P\].+$/i, ""),
        fancybox: {
            v: 3,
            css: false
        },
        category: "nsfw1"
    }, {
        name: "Hotgirl.biz",
        host: ["hotgirl.biz"],
        reg: /^https?:\/\/hotgirl\.biz\/[^\/]+\/$/i,
        imgs: ".entry-content img",
        button: [4],
        insertImg: [".entry-content", 2],
        customTitle: ".entry-title",
        category: "nsfw1"
    }, {
        name: "AsupanPenyegar",
        host: ["asupanpenyegar.com"],
        reg: /^https?:\/\/asupanpenyegar\.com\/[^\/]+\/$/i,
        imgs: ".s-post-content img,.entry-content img",
        button: [4, "23%"],
        insertImg: [".s-post-content,.entry-content", 2],
        customTitle: ".entry-title",
        category: "nsfw1"
    }, {
        name: "XLUST.ORG",
        host: ["xlust.org"],
        reg: /^https?:\/\/xlust\.org\/[^\/]+\/$/i,
        imgs: ".rl-gallery-item a",
        button: [4],
        insertImg: [
            [".entry-content", 0, ".rl-gallery-container"], 2
        ],
        customTitle: () => fun.gt(".entry-title").replace(/\([\d\s]+pics\)\s?/, ""),
        fancybox: {
            blacklist: 1
        },
        category: "nsfw1"
    }, {
        name: "秀人网",
        host: ["xiurenwang.me"],
        reg: /^https?:\/\/xiurenwang\.me\/photo\.php\?id=\w+/i,
        imgs: () => {
            thumbnailsSrcArray = fun.getImgSrcArr(".intro>img");
            return thumbnailsSrcArray.map(e => e.replace("_600x0", "").replace(".webp", ".jpg"));
        },
        button: [4],
        insertImg: [".intro", 2],
        customTitle: () => fun.gt("h1").replace(/\(\d+P\)/i, "").trim(),
        css: "@media only screen and (max-width:640px){.paragraph .intro img{width:100%!important}}.banner_ad,.push-top,.push-bottom{display:none!important;}",
        category: "nsfw1"
    }, {
        name: "秀人图",
        host: ["www.xiurento.com", "www.aixiuren.com", "www.aixiurentu.com"],
        reg: /^https?:\/\/www\.(xiurento|aixiuren(tu)?)\.com\/\d+\.html/i,
        exclude: "//button[contains(text(),'登录购买')]",
        imgs: () => fun.getImgA("a[data-fancybox],.entry-content img", ".fenye a"),
        button: [4],
        insertImg: [".entry-content", 2],
        autoDownload: [0],
        next: ".article-nav-prev a",
        prev: ".article-nav-next a",
        customTitle: ".entry-title",
        fancybox: {
            v: 3,
            css: false
        },
        category: "nsfw1"
    }, {
        name: "8E资源站",
        host: ["8ezy.com"],
        reg: () => /^https?:\/\/8ezy\.com\/[^\/]+\/$/.test(siteUrl) && fun.ge(".entry-content"),
        init: () => fun.clearAllTimer(),
        imgs: async () => {
            if (fun.ge("//div[contains(text(),'分页阅读')]")) {
                fun.showMsg(displayLanguage.str_05, 0);
                let links = fun.gau("//div[contains(text(),'分页阅读')]/a");
                links = [fun.url].concat([...new Set(links)]);
                let resArr = links.map(url => fun.fetchDoc(url).then(doc => fun.gae(".entry-content img", doc).map(e => e.dataset.srcset ?? e.src)));
                return Promise.all(resArr).then(data => data.flat()).then(srcs => srcs.filter(i => !/jzfi4j-0\.gif|k0j1um-0\.gif/.test(i)));
            } else {
                return fun.gae(".entry-content img").map(e => e.dataset.srcset ?? e.src).filter(i => !/jzfi4j-0\.gif|k0j1um-0\.gif/.test(i));
            }
        },
        button: [4],
        insertImg: [".entry-content", 2],
        autoDownload: [0],
        next: ".article-nav-prev a",
        prev: ".article-nav-next a",
        customTitle: () => fun.gt(".entry-title").replace(/\d+p(\d+v)?$|\(\d+[\w\s\.\+-]+\)|\[\d+[\w\s\.\+-]+\]|“\d+ photos.*/i, "").replaceAll("/", "").trim(),
        fancybox: {
            v: 3,
            insertLibrarys: 1
        },
        category: "nsfw1"
    }, {
        name: "8E资源站",
        host: ["8ezy.com"],
        reg: () => /^https?:\/\/8ezy\.com\//.test(siteUrl) && fun.ge(".infinite-scroll-button"),
        init: () => fun.clearAllTimer(),
        observerClick: ".infinite-scroll-button",
        category: "autoPager"
    }, {
        name: "牛牛美图",
        host: ["www.uyn8.cn"],
        reg: /^https?:\/\/www\.uyn8\.cn\/archives\/\d+/i,
        init: "fun.clearAllTimer();",
        imgs: ".entry-content img",
        button: [4],
        insertImg: [".entry-content", 2],
        customTitle: ".entry-title",
        fancybox: {
            v: 3,
            css: false
        },
        category: "nsfw1"
    }, {
        name: "图片屋",
        host: ["www.tupianwu.com", "tupianwu.com"],
        reg: /^https?:\/\/(www\.)?tupianwu\.com\/post\/\d+\//i,
        init: "fun.clearAllTimer();",
        autoClick: ".readmore>a",
        imgs: ".LightGallery_Item",
        button: [4],
        insertImg: [
            [".umBody", 0, ".LightGallery_Item"], 2
        ],
        autoDownload: [0],
        next: ".prev>a",
        prev: ".next>a",
        customTitle: ".postTitle>h1",
        css: "@media only screen and (max-width:480px){.container{padding:0px !important}}",
        category: "nsfw1"
    }, {
        name: "微密猫",
        host: ["wememiao.com", "wememao.com", "weme.su", "weme2.com", "weme4.com", "weme5.com", "weme6.com", "weme7.com", "weme9.com"],
        reg: /(wememiao\.com|wememao\.com|weme\.su|weme\d\.com)\/archives\/\d+/i,
        imgs: "figure.wp-block-image a[data-fancybox]",
        button: [4],
        insertImg: [
            [".article-content", 0, "figure.wp-block-image,.code-block"], 2
        ],
        autoDownload: [0],
        next: ".article-nav-prev a",
        prev: ".article-nav-next a",
        customTitle: ".article-title",
        go: 1,
        fancybox: {
            v: 3,
            css: false
        },
        css: ".code-block{display:none!important;}",
        category: "nsfw1"
    }, {
        name: "优美图录",
        host: ["umei.net"],
        reg: /umei\.net\/\w+\/\d+\.html/i,
        imgs: () => fun.getImg(".image_div img", fun.gt(".item_info span"), 9, null, 200),
        button: [4],
        insertImg: [".image_div", 2],
        customTitle: ".item_title>h1",
        css: ".content_left img{cursor:unset}.affs,.xg_content>li:nth-child(n+1):nth-child(-n+2){display:none!important}.image_div a img{cursor:unset}",
        category: "nsfw1"
    }, {
        name: "秀人图集",
        host: ["xiuren0.com"],
        reg: () => /xiuren\d\.com\/\d+\.html$/.test(siteUrl) && fun.ge(".article-paging>*:last-child"),
        init: () => fun.remove("//p[img[@decoding and not(contains(@src,'/pic/'))]]"),
        imgs: () => fun.getImg(".article-content img:not([src*='/pic/'])", fun.gt(".article-paging>*:last-child"), "4"),
        button: [4],
        insertImg: [
            [".article-paging", 1], 1
        ],
        next: ".article-nav-prev>a",
        prev: 1,
        customTitle: ".article-title",
        css: ".modown-ad{display:none!important}",
        category: "nsfw1"
    }, {
        name: "秀人图集",
        host: ["xiuren0.com"],
        reg: /xiuren\d\.com\/\d+\.html/i,
        imgs: ".article-content img:not([src*='p.xiurenb.top'])",
        next: ".article-nav-prev>a",
        prev: 1,
        customTitle: ".article-title",
        category: "nsfw1"
    }, {
        name: "Xiutaku/Kiutaku",
        host: ["xiutaku.com", "kiutaku.com"],
        reg: /(xiutaku\.com|kiutaku\.com)\/\d+$/,
        init: () => fun.remove(".search-form~*,.blog~*:not([class]),.pagination~*:not([class]):not(hr),.article.content~*:not([class]):not(hr),.bottom-articles~*"),
        imgs: () => fun.getImg(".article-fulltext img", fun.gt(".pagination-list>span:last-child")),
        button: [4],
        insertImg: [".article-fulltext", 2],
        customTitle: () => fun.gt(".article-header>h1").replace(/.mitaku.net./, "").trim(),
        category: "nsfw1"
    }, {
        name: "XGirl/Xerocos",
        host: ["xgirl.one", "xerocos.com"],
        reg: /^https?:\/\/(xgirl\.one|xerocos\.com)\/view\//,
        init: async () => {
            await fun.waitEle("//span[text()='Sponsored ads']");
            fun.remove("//div[iframe]|//*[span[text()='Sponsored ads']]", 1000);
        },
        imgs: () => fun.getImgA(".items-center.min-h-screen img", "a[class*=bg-pink-500][href*='page=']"),
        button: [4],
        insertImg: [".items-center.min-h-screen", 2],
        customTitle: () => fun.gt("//div[strong[contains(text(),'Album Name')]]").replace("Album Name: ", "").replace(/\(\d+[\w\s]+\)/i, "").trim(),
        //customTitle: () => fun.title(/\s?-\sXGirl|\s?-\sXerocos/).replace(/\(\d+[\w\s]+\)/i, "").trim(),
        category: "nsfw2"
    }, {
        name: "XGirl 分類自動翻頁",
        enable: 1,
        reg: /^https?:\/\/xgirl\.one\//,
        reg: () => /^https?:\/\/xgirl\.one\//.test(siteUrl) && fun.ge("//div[@class='flex py-4 justify-center md:justify-between mt-4']") && fun.ge("//a[text()='Next']"),
        autoPager: {
            mode: 1,
            waitEle: "//div[@class='flex py-4 justify-center md:justify-between mt-4']/preceding-sibling::div[1][@class='grid grid-cols-2 md:grid-cols-3 lg:grid-cols-4 xl:grid-cols-5 gap-4']//img",
            ele: "//div[@class='flex py-4 justify-center md:justify-between mt-4']/preceding-sibling::div[1][@class='grid grid-cols-2 md:grid-cols-3 lg:grid-cols-4 xl:grid-cols-5 gap-4']",
            pos: ["//div[@class='flex py-4 justify-center md:justify-between mt-4']", 1],
            next: "//a[text()='Next']",
            re: "//div[@class='flex py-4 justify-center md:justify-between mt-4']",
            title: () => "Page " + nextLink.match(/\d+$/)[0],
            bottom: screen.height * 2
        },
        openInNewTab: ".grid a:not([target=_blank])",
        category: "autoPager"
    }, {
        name: "Xerocos 分類自動翻頁",
        enable: 1,
        reg: () => /^https?:\/\/xerocos\.com\//.test(siteUrl) && fun.ge("//div[@class='flex py-4 justify-center md:justify-between mt-4']") && fun.ge("//a[text()='Next']"),
        autoPager: {
            mode: 1,
            waitEle: "//div[@class='flex py-4 justify-center md:justify-between mt-4']/preceding-sibling::div[1][@class='grid grid-cols-2 md:grid-cols-3 lg:grid-cols-4 gap-4']//img|//div[@class='flex py-4 justify-center md:justify-between mt-4']/preceding-sibling::div[@class='grid grid-cols-2 md:grid-cols-3 lg:grid-cols-4 gap-4 pb-6']//img",
            ele: "//div[@class='flex py-4 justify-center md:justify-between mt-4']/preceding-sibling::div[1][@class='grid grid-cols-2 md:grid-cols-3 lg:grid-cols-4 gap-4']|//div[@class='flex py-4 justify-center md:justify-between mt-4']/preceding-sibling::div[@class='grid grid-cols-2 md:grid-cols-3 lg:grid-cols-4 gap-4 pb-6']",
            pos: ["//div[@class='flex py-4 justify-center md:justify-between mt-4']", 1],
            next: "//a[text()='Next']",
            re: "//div[@class='flex py-4 justify-center md:justify-between mt-4']",
            title: () => "Page " + nextLink.match(/\d+$/)[0],
            aF: () => fun.gae(".blur-2xl").forEach(e => e.classList.remove("blur-2xl")),
            bottom: screen.height * 2
        },
        openInNewTab: ".grid a:not([target=_blank])",
        category: "autoPager"
    }, {
        name: "私图网/图库库/coscoser",
        host: ["baoruba.com", "tukuku.cc", "coscoser.com"],
        reg: /(baoruba\.com|tukuku\.cc|coscoser\.com)\/(bb|t)?\d+\.html/i,
        imgs: ".entry-content img[decoding]",
        button: [4],
        insertImg: [".entry-content", 2],
        go: 1,
        autoDownload: [0],
        next: ".nav-previous>a",
        prev: ".nav-next>a",
        customTitle: () => fun.title(/ - 私图网| - coscoser/),
        css: "[id].widget_text,.gridmode-post-thumbnail-single,.gridbit-thumbnail-alignwide{display:none!important}",
        category: "nsfw1"
    }, {
        name: "Cup2D",
        host: ["www.cup2d.com"],
        reg: /^https?:\/\/www\.cup2d\.com\/[^\/]+\/$/i,
        imgs: () => {
            let imgs = fun.gae("img[data-high-res-src]");
            thumbnailsSrcArray = imgs.map(e => e.src);
            return imgs;
        },
        button: [4],
        insertImg: ["//div[a[img[@data-high-res-src]]]", 2],
        autoDownload: [0],
        next: ".nav-previous>a",
        prev: ".nav-next>a",
        customTitle: () => fun.title(" – Cup2D"),
        category: "nsfw1"
    }, {
        name: "美图社",
        host: ["928r.com"],
        reg: /^https?:\/\/928r\.com\/post\/\d+\.html$/i,
        imgs: () => {
            fun.showMsg(displayLanguage.str_05, 0);
            let url = fun.gu("//a[text()='显示全文']");
            return fun.fetchDoc(url).then(doc => fun.gae("#lightgallery img", doc));
        },
        button: [4],
        insertImg: ["#lightgallery", 2],
        autoDownload: [0],
        next: ".prev>a",
        prev: ".next>a",
        customTitle: ".focusbox-title",
        category: "nsfw1"
    }, {
        name: "找套图/Xiuno BBS",
        host: ["www.zhaotaotu.cc", "zhaotaotu.one", "kantaotu.cc"],
        reg: /^https?:\/\/((www\.)?zhaotaotu\.cc|(www\.)?zhaotaotu\.one|kantaotu\.cc)\/\??thread-\d+\.htm/i,
        imgs: ".message>img:not(:first-of-type)",
        button: [4],
        insertImg: [".message", 2],
        customTitle: ".media-body>h4",
        category: "nsfw1"
    }, {
        name: "尤美图库",
        host: ["www.umeitu.com"],
        reg: /www\.umeitu\.com\/img\/\d+\.html/,
        imgs: () => fun.getImg(".vipimglist img", fun.gt(".stitle>h1>span").match(/\d+/)[0], 9),
        button: [4],
        insertImg: [".vipimglist", 2],
        customTitle: () => fun.title(" - 尤美图库", 1).replace(/\[\d+P\]/i, ""),
        css: ".sb.list2>li:nth-child(n+2):nth-child(-n+3){display:none!important}.vipimglist img{min-height:unset!important;}",
        category: "nsfw1"
    }, {
        name: "美图库",
        host: ["www.meituku.org"],
        reg: /www\.meituku\.org\/\d+\/\d+\.html/,
        imgs: () => [...fun.doc(_unsafeWindow.imgs.join("")).images],
        button: [4],
        insertImg: ["#content", 2],
        autoDownload: [0],
        next: "//div[contains(text(),'下一篇')]/a",
        prev: "//div[contains(text(),'上一篇')]/a",
        customTitle: ".info-title>a:nth-child(3)",
        category: "nsfw1"
    }, {
        name: "秀爱美女网/秀套图吧",
        host: ["www.2mn.cc", "www.taotu8.cc"],
        reg: /(www\.2mn\.cc|www\.taotu8\.cc)\/mm\/\d+\.html/i,
        imgs: () => {
            let max;
            try {
                max = fun.gu(".page_navi a:last-child").split("_")[1].match(/\d+/)[0];
            } catch (e) {
                max = 1;
            }
            return fun.getImg(".sg_img img", max, 9);
        },
        button: [4],
        insertImg: [".sg_img", 2],
        customTitle: "h1",
        css: "#divpsg,.tujia{display:none!important}.sg_img img{min-height:unset!important}",
        category: "nsfw1"
    }, {
        name: "Xiuren 秀人网",
        host: ["www.xiuren.org"],
        reg: /www\.xiuren\.org\/.+\.html/i,
        imgs: "a[rel='gallery']:not([href*='html']",
        button: [4],
        insertImg: [
            [".post p>a:not([title])", 2, ".post p>a[title],.post p>span"], 2
        ],
        customTitle: "#title>h1",
        css: "#post .post img{max-width:100% !important}",
        category: "nsfw2"
    }, {
        name: "微圖坊",
        host: ["www.v2ph.com", "www.v2ph.net", "www.v2ph.ru", "www.v2ph.ovh"],
        reg: () => /^https?:\/\/www\.v2ph\.(com|net|ru|ovh)\/album\//.test(siteUrl) && !fun.indexOf(siteUrl, "?page=") && fun.ge(".photos-list"),
        imgs: async () => {
            let picTotalNum = fun.gt("dd:last-child").match(/\d+/)[0];
            let pagePicNum = fun.gae(".album-photo img[alt]").length;
            let max = Math.ceil(picTotalNum / pagePicNum);
            let links = fun.arr(max).map((_, i) => siteUrl.replace(/\?hl=.+|\?page=\d+/, "") + `?page=${(i + 1)}`);
            let srcArr = [];
            let status = 200;
            let vip = false;
            let fetchNum = 0;
            fun.showMsg(displayLanguage.str_01, 0);
            for (let page = 0; page < links.length; page++) {
                await fetch(links[page]).then(res => {
                    if (res.status == 403) status = 403;
                    fun.showMsg(`${displayLanguage.str_02}${fetchNum+=1}/${links.length}`, 0);
                    return res.arrayBuffer();
                }).then(buffer => {
                    const decoder = new TextDecoder(document.characterSet || document.charset || document.inputEncoding);
                    const htmlText = decoder.decode(buffer);
                    const doc = fun.doc(htmlText);
                    debug(`\n${links[page]}\n`, doc);
                    let vipEle = fun.ge(".lead", doc);
                    if (vipEle) vip = true;
                    let imgs = fun.gae(".album-photo img[alt]", doc);
                    imgs.length == 0 ? debug(`\n${links[page]}\n沒有任何圖片`) : debug(`\n${links[page]}\n此頁圖片`, imgs);
                    let tE = fun.gae("div.album-photo").at(-1);
                    imgs.forEach(img => {
                        img.dataset.src ? srcArr.push(img.dataset.src) : srcArr.push(img.src);
                        if (page != 0) tE.parentNode.insertBefore(img.parentNode.cloneNode(true), tE.nextSibling);
                    });
                    if (page != 0 && !vipEle && fun.ge(".pagination", doc)) fun.ge(".pagination").outerHTML = fun.ge(".pagination", doc).outerHTML;
                });
                if (status == 403) {
                    setTimeout(() => {
                        fun.showMsg("403請先登錄網站!", 0);
                    }, 1200);
                    return srcArr;
                }
                if (vip) {
                    setTimeout(() => {
                        fun.showMsg("VIP限定專輯圖片!", 5000);
                    }, 1200);
                    return srcArr;
                }
                await fun.delay(600, 0);
            }
            if (picTotalNum != srcArr.length && !vip) {
                setTimeout(() => {
                    fun.hideMsg();
                    fun.showMsg("圖片有缺,請看主控台訊息", 5000);
                }, 1300)
            }
            return srcArr;
        },
        button: [4],
        insertImg: [".photos-list", 2],
        customTitle: "h1",
        css: ".albums-list img,.photos-list img{opacity:1!important}",
        threading: 8,
        category: "nsfw2"
    }, {
        name: "柠檬皮",
        host: ["www.emonl.com"],
        reg: () => /www\.emonl\.com\/\d+\.html$/i.test(siteUrl) && fun.ge(".page-links") && !fun.ge(".read-point-box"),
        imgs: () => fun.getImg(".single-content img", (fun.gt(".page-links>a:last-child", 2) || 1), 7),
        button: [4],
        insertImg: [".single-content", 1],
        customTitle: "h1.entry-title",
        fancybox: {
            v: 3,
            css: false
        },
        category: "nsfw1"
    }, {
        name: "柠檬皮",
        host: ["www.emonl.com"],
        reg: () => /www\.emonl\.com\/\d+\.html$/i.test(siteUrl) && fun.ge(".single-content img") && !fun.ge(".read-point-box"),
        imgs: ".single-content img",
        button: [4],
        insertImg: [".single-content", 1],
        customTitle: "h1.entry-title",
        fancybox: {
            v: 3,
            css: false
        },
        category: "nsfw1"
    }, {
        name: "51sex",
        host: ["51sex.vip"],
        reg: /51sex\.vip\/pic\/\d+/i,
        init: () => fun.addUrlHtml(_this.next(), ".headling_main", 1, "下一篇"),
        imgs: () => {
            let max;
            try {
                max = fun.gt(".headling_swiper_num_small").match(/\d+/)[0];
            } catch (e) {
                max = 1;
            }
            let links = fun.arr(max).map((_, i) => siteUrl + "/" + (i + 1));
            return fun.getImgA("#bigimg", links);
        },
        button: [4, "24%"],
        insertImg: [".headling_main", 2],
        next: () => {
            let [num] = siteUrl.match(/\d+$/);
            return siteUrl.replace(/\d+$/, "") + (Number(num) - 1);
        },
        customTitle: ".headling_word_main_box_title",
        css: ".headling_main{height:auto}",
        category: "nsfw1"
    }, {
        name: "51sex分類自動翻頁",
        host: ["51sex.vip"],
        reg: /https?:\/\/51sex\.vip\/category\/\d+/i,
        init: () => {
            fun.lp.split("/").length == 3 ? currentPageNum = 1 : currentPageNum = Number(fun.lp.split("/").at(-1));
        },
        autoPager: {
            ele: ".headling_main_a",
            observer: ".headling_main_a",
            next: () => siteUrl.match(/https?:\/\/51sex\.vip\/category\/\d+/)[0] + "/" + (currentPageNum += 1),
            stop: doc => {
                let currentEleURLs = fun.gau(".headling_main_a");
                if (currentEleURLs.length < 24) {
                    return true;
                } else {
                    if (currentEleURLs.length > 24) currentEleURLs = currentEleURLs.slice(-24);
                    let nextEleURLs = fun.gau(".headling_main_a", doc);
                    for (let url of currentEleURLs) {
                        if (nextEleURLs.includes(url)) return true;
                    }
                }
                return false;
            },
            title: () => "Page " + currentPageNum
        },
        openInNewTab: "a.headling_main_a:not([target=_blank])",
        category: "autoPager"
    }, {
        name: "美图乐",
        host: ["www.meitule.net", "www.meitule.com", "www.meitulu.cc"],
        reg: /(www\.)?(meitule|meitulu)\.\w+\/photo\/\d+\.html/i,
        imgs: () => {
            let max;
            try {
                max = fun.gu(".page>li:last-child>a").split("_")[1].match(/\d+/)[0];
            } catch (e) {
                max = 1;
            }
            return fun.getImgO(".content img", max, 9);
        },
        button: [4],
        insertImg: [".content", 2],
        customTitle: "h1.h5",
        css: "#dtag>center,#divpsg,.tujia,.list-album>li:nth-child(n+1):nth-child(-n+2){display:none!important}",
        category: "nsfw1"
    }, {
        name: "美桌",
        host: ["www.win4000.com"],
        link: "http://www.win4000.com/meitu.html",
        reg: /www\.win4000\.com\/meinv\d+\.html/,
        imgs: () => fun.getImgA(".pic-large", "#scroll>li:not(.current)>a", 200),
        button: [4],
        insertImg: ["#pic-meinv,.pic-meinv", 2],
        autoDownload: [0],
        next: ".group-next>a",
        prev: ".group-prev>a",
        customTitle: ".ptitle>h1",
        threading: 3,
        category: "nsfw1"
    }, {
        name: "MM1311",
        host: ["www.mm1311.net", "m.mm1311.net"],
        reg: /(www|m)\.mm1311\.net\/\w+\/\d+\.html/,
        imgs: () => {
            let max;
            fun.ge(".page-ch") ? max = fun.gt(".page-ch").match(/\d+/)[0] : max = fun.gt(".fenye>.rw").match(/\d+\/(\d+)/)[1];
            return fun.getImg(".content-pic img,.post-content img", max, 9);
        },
        button: [4],
        insertImg: [".content-pic,.post-content", 1],
        autoDownload: [0],
        next: ".updown_r",
        prev: ".updown_l",
        customTitle: ".content>h5,.mm-title",
        css: "union{display:none!important}",
        category: "nsfw1"
    }, {
        name: "656G精品套图",
        host: ["www.656g.com", "m.656g.com"],
        reg: /^https?:\/\/(www|m)\.656g\.com\/tid\/\d+\.html$/,
        imgs: () => {
            let max = fun.gt(".i1").match(/\d+/)[0];
            return fun.getImgO(".imgg img", max, 9);
        },
        button: [4],
        insertImg: [".imgg", 2],
        customTitle: ".c-tt>h1",
        category: "nsfw1"
    }, {
        name: "依依图片网",
        host: ["www.eemm.cc"],
        reg: /www\.eemm\.cc\/pic\/\d+\.html/,
        imgs: async () => {
            await fun.getNP("#content img", "a.on+a:not(.next)", null, ".page", 0, null, 0, 0);
            return fun.gae("#content img");
        },
        button: [4],
        insertImg: ["#content", 1],
        customTitle: ".article>h1",
        css: ".article .content img{max-width:100%!important}",
        category: "nsfw1"
    }, {
        name: "依依图片网M",
        host: ["m.eemm.cc"],
        reg: /m\.eemm\.cc\/pic\/\d+\.html/,
        imgs: () => {
            let max = fun.gt(".contentpage").match(/\d+\/(\d+)/)[1];
            return fun.getImg(".content img", max, 9);
        },
        button: [4],
        insertImg: [".content", 1],
        customTitle: ".content>h1",
        css: ".topad,.mdiv{display:none!important}",
        category: "nsfw1"
    }, {
        name: "青年美圖",
        host: ["jrants.com"],
        reg: /^https?:\/\/(\w+\.)?jrants\.com\/\d+\.html$|^https:\/\/\w+\.jrants\.com\/[^\/]+\/$/,
        imgs: () => fun.ge(".page-links") ? fun.getImg(".entry-content img", fun.gt(".page-links>a:last-child"), 7) : fun.gae(".entry-content img"),
        button: [4],
        insertImg: [".entry-content", 1],
        autoDownload: [0],
        next: "span.prev>a",
        prev: "span.next>a",
        customTitle: ".entry-title",
        css: ".code-block{display:none!important;}",
        category: "nsfw2"
    }, {
        name: "CosBlay/風流雜誌",
        host: ["cosblay.com", "trendszine.com"],
        reg: /^https?:\/\/(cosblay\.com|trendszine\.com|www\.tiplogo\.com)\/\d+\.html/i,
        imgs: () => fun.getImg(".entry-content img", fun.gt(".pgntn-page-pagination-block>*:last-child", 2) || 1, 7),
        button: [4],
        insertImg: [".entry-content", 2],
        autoDownload: [0],
        next: "span.prev>a",
        prev: "span.next>a",
        customTitle: ".entry-title",
        css: ".code-block{display:none!important;}@media (max-width:768px){.separate-containers .inside-article,.separate-containers .comments-area,.separate-containers .page-header,.separate-containers .paging-navigation,.one-container .site-content,.inside-page-header{padding:2px}.entry-content:not(:first-child),.entry-summary:not(:first-child),.page-content:not(:first-child){margin-top:2px}}",
        category: "nsfw2"
    }, {
        name: "MM5MM5美女图片",
        host: ["www.mm5mm5.com"],
        reg: /www\.mm5mm5\.com\/mm\/\d+/,
        imgs: () => _unsafeWindow.picinfo[0].split(","),
        button: [4],
        insertImg: ["#content", 2],
        customTitle: ".article>h2",
        css: ".article .content img{max-width:100%!important}",
        category: "nsfw1"
    }, {
        name: "MM5MM5美女图片M",
        host: ["m.mm5mm5.com"],
        reg: /m\.mm5mm5\.com\/mm\/\d+/,
        imgs: () => {
            let max = fun.gt(".contentpage>span>i").match(/\/(\d+)/)[1];
            let links = [siteUrl];
            for (let i = 1; i < max; i++) {
                links.push(siteUrl + "/" + i);
            }
            return fun.getImgA("div>a>img", links, 333);
        },
        button: [4],
        insertImg: ["//div[a[img]]", 2],
        customTitle: ".content>h1",
        css: "union[id],.pag-ts,.contentpage{display:none!important}",
        category: "nsfw1"
    }, {
        name: "888美女网",
        host: ["www.888meinv.com"],
        reg: () => /^https?:\/\/www\.888meinv\.com\/\w+\/\d+$/.test(siteUrl) && fun.ge(".suoyou"),
        imgs: () => {
            let max = fun.gt(".suoyou").match(/\/(\d+)/)[1];
            let links = fun.arr(max).map((_, i) => siteUrl + "/" + (i + 1));
            return fun.getImgA(".pannel img", links);
        },
        button: [4],
        insertImg: [".pannel", 1],
        autoDownload: [0],
        next: ".pre_pageload>a",
        prev: ".next_pageload>a",
        customTitle: "h1",
        css: ".nr .tupianqu img{margin-top:0px!important}@media only screen and (max-width:480px){.nr .tupianqu,.nr .tupianqu .pannel{padding:0px!important}}union{display:none!important;}",
        category: "nsfw1"
    }, {
        name: "可爱小图",
        host: ["www.keaitupian.com", "m.keaitupian.com"],
        reg: /(www|m)\.keaitupian\.com\/pic\/\d+\.html/,
        imgs: () => {
            try {
                let max = fun.gt(".entry-title,.desk-tit>h1").match(/\/(\d+)/)[1];
                let links = [siteUrl];
                let url = siteUrl.replace(".html", "");
                for (let i = 1; i < max; i++) {
                    links.push(url + "-" + i + ".html");
                }
                return fun.getImgA(".entry-content img,#content_pic img", links, 1000);
            } catch {
                return fun.gae(".entry-content img,#content_pic img");
            }
        },
        button: [4],
        insertImg: [".entry-content,#content_pic", 1],
        customTitle: ".entry-title,.desk-tit>h1",
        category: "nsfw1"
    }, {
        name: "回车桌面",
        host: ["www.enterdesk.com", "m.enterdesk.com"],
        reg: /^https?:\/\/((m\.)?mm?\.|www\.|(m\.)?sj\.)enterdesk\.com\/\w+\/[0-9-]+\.html/,
        include: ".arc_pandn .swiper-wrapper img,.marc_pandn .swiper-wrapper img,.arc_main_pic_img,#main_img",
        imgs: () => fun.gae(".arc_pandn .swiper-wrapper img,.marc_pandn .swiper-wrapper img,.arc_main_pic_img,#main_img").map(e => e.src.replace("_360_360", "")),
        button: [4],
        insertImg: [".arc_main_pic,.marc_img", 2],
        autoDownload: [0],
        next: "//a[div[text()='下一组']]|//div[@id='next_pics']",
        prev: 1,
        customTitle: ".arc_location>a:last-child,.m_h1>a",
        css: ".marc_img img{min-height:unset!important}",
        category: "nsfw1"
    }, {
        name: "女人吧",
        host: ["www.nvhai8.com", "m.nvhai8.com"],
        reg: /^https?:\/\/(www|m)\.nvhai8\.com\/body\/\d+\/\d+\.htm/,
        init: () => {
            fun.remove("//div[iframe] | //div[@class='hengfu2'] | //div[@onclick]");
            document.body.removeAttribute("style");
        },
        imgs: () => {
            try {
                let max = fun.gt(".imgfooter>a").match(/\d+/)[0];
                return fun.getImgA(".remark img,.ui-article-detail img", ".imgfooter>a[href]");
            } catch (e) {
                return fun.gae(".remark img,.ui-article-detail img");
            }
        },
        button: [4],
        insertImg: [".remark,.ui-article-detail", 2],
        autoDownload: [0],
        next: "//label[contains(text(),'下一篇')]/preceding-sibling::a[1]",
        prev: "//label[contains(text(),'上一篇')]/following-sibling::a[1]",
        customTitle: ".text_content>h1,.arc_location>a:last-child,.m_h1>a,h1",
        category: "nsfw1"
    }, {
        name: "淑女爱",
        host: ["www.shunvi.com", "www.shunvai.com"],
        reg: () => /^https?:\/\/www\.shunva?i\.com\/\w+\/\d+\.html$/.test(siteUrl) && fun.ge("#allnum"),
        imgs: () => {
            let max = fun.gt("#allnum");
            let links = fun.arr(max).map((_, i) => i == 0 ? siteUrl : siteUrl.replace(".html", "") + "_" + (i + 1) + ".html");
            return fun.getImgA(".picsbox img", links, 200);
        },
        button: [4],
        insertImg: [".picsbox>center", 2],
        customTitle: ".picmainer>h1",
        css: ".picpege{display:none!important;}",
        category: "nsfw1"
    }, {
        name: "淑女爱M",
        host: ["m.shunvi.com", "m.shunvai.com"],
        reg: () => /^https?:\/\/m\.shunva?i\.com\/photo\/\d+\.html$/.test(siteUrl) && fun.ge("#thenum"),
        imgs: () => {
            let max = fun.gt("//span[b[@id='thenum']]").match(/\d+$/)[0];
            let links = fun.arr(max).map((_, i) => i == 0 ? siteUrl : siteUrl.replace(".html", "") + "_" + (i + 1) + ".html");
            return fun.getImgA(".swiper-slide img", links, 200);
        },
        button: [4],
        insertImg: ["#slider", 2],
        customTitle: () => fun.gt(".infoline").replace(/\d+\s\/\s\d+\n/, ""),
        category: "nsfw1"
    }, {
        name: "mn52图库",
        host: ["www.mn52.com", "wap.mn52.com"],
        link: "https://www.mn52.com/xingganmeinv/",
        reg: /^https?:\/\/(www|wap)\.mn52\.com\/\w+\/\d+\.html$/,
        imgs: "#originalpic img,.w100 img",
        button: [4],
        insertImg: ["#originalpic,.w100", 2],
        autoDownload: [0],
        next: "//a[span[text()='上一个图集']]|//li[contains(text(),'上一篇')]/a",
        prev: "//a[span[text()='下一个图集']]|//li[contains(text(),'下一篇')]/a",
        customTitle: ".title>h1,.general-title>h4",
        css: ".general-title{padding:unset!important}",
        category: "nsfw1"
    }, {
        name: "三千图片网",
        host: ["www.win3000.com"],
        link: "https://www.win3000.com/tags/xingganmeinv/",
        reg: /^https?:\/\/www\.win3000\.com\/\w+\/\d+\.html$/,
        imgs: () => {
            let max = fun.gt(".title>span").match(/\d+$/)[0];
            let links = fun.arr(max).map((_, i) => siteUrl.replace(".html", "") + "_" + (i + 1) + ".html");
            return fun.getImgA(".pic-cont img", links);
        },
        button: [4],
        insertImg: [".pic-cont", 2],
        autoDownload: [0],
        next: "a.other-group.fr",
        prev: "a.other-group.fl",
        customTitle: ".title>h1",
        category: "nsfw1"
    }, {
        name: "三千图片网M",
        host: ["m.win3000.com"],
        link: "https://m.win3000.com/tags/xingganmeinv/",
        reg: /^https?:\/\/m\.win3000\.com\/\w+\/\d+\.html$/,
        imgs: () => {
            let max = fun.gt(".show-page>i");
            let links = fun.arr(max).map((_, i) => siteUrl.replace(".html", "") + "_" + (i + 1) + ".html");
            return fun.getImgA(".pic-showbox .imgbox img", links);
        },
        button: [4],
        insertImg: [".pic-showbox", 2],
        autoDownload: [0],
        next: "a.page-next",
        prev: "a.page-prev",
        customTitle: ".pic-infobox h1",
        css: "#app{font-size:14px!important}",
        category: "nsfw1"
    }, {
        name: "3G 壁纸",
        host: ["www.3gbizhi.com", "m.3gbizhi.com"],
        link: "https://www.3gbizhi.com/meinv",
        reg: /(www|m|desk)\.3gbizhi\.com\/meinv\/(\w+\/)?\w+\.html/,
        imgs: () => fun.getImgA("#contpic,#mobile_c_img>img", ".swiper-slide:not(:first-child) a"),
        thums: ".swiper-slide>a>img",
        button: [4],
        insertImg: ["#showimg", 1],
        autoDownload: [0],
        next: "a.next[href$=html]",
        prev: "a.pver[href$=html]",
        customTitle: "h2.title,.titlew>h2",
        css: "#FullPictureLoadEnd{color:rgb(255, 255, 255)}.showcontw #showimg{height:auto!important}[class^=ad_id]{display:none!important}",
        category: "nsfw1"
    }, {
        name: "亿图全景图库",
        host: ["www.yeitu.com", "m.yeitu.com"],
        link: "https://www.yeitu.com/meinv/",
        reg: /(www|m)\.yeitu\.com\/\w+\/\w+\/\w+\.html/,
        init: () => {
            let a = fun.ge(".article-body>a,.gallery-item>a");
            if (a) a.outerHTML = a.innerHTML;
        },
        imgs: () => {
            let max = fun.gt(".imageset-sum,span.num").match(/\/\s?(\d+)/)[1];
            let links = [siteUrl];
            let url = siteUrl.replace(".html", "");
            for (let i = 2; i <= max; i++) {
                links.push(url + "_" + i + ".html");
            }
            return fun.getImgA(".img_box img[alt],.gallery-item img[alt],.article-show img", links, 2);
        },
        button: [4],
        insertImg: [".img_box,.gallery-item,.article-show", 2],
        customTitle: "#title>h1,h1.article-title,.article-info>h1",
        css: ".appbox,.uk-page~section,.yt-pages+.mssp{display:none!important}",
        category: "nsfw1"
    }, {
        name: "优美图库",
        host: ["www.umei.cc"],
        link: "https://www.umei.cc/meinvtupian/",
        reg: /www\.umei\.cc\/meinvtupian\/\w+\/\d+\.htm/i,
        imgs: () => {
            let url = fun.gu(".pages li:last-child>a");
            let max = url.match(/_(\d+).htm/)[1];
            return fun.getImg(".big-pic img", max, 17);
        },
        button: [4],
        insertImg: [".big-pic", 1],
        autoDownload: [0],
        next: ".preandnext:not(.connext)>a",
        prev: ".preandnext.connext>a[href$=htm]",
        customTitle: "#photos>h1",
        css: ".photo img {max-width:100% !important}",
        category: "nsfw1"
    }, {
        name: "优美图库M",
        host: ["wap.umei.cc"],
        reg: () => /wap\.umei\.cc\/meinvtupian\/\w+\/\d+\.htm$/.test(siteUrl) && fun.ge("//a[text()='尾页']"),
        imgs: () => {
            let max = fun.gu("//a[text()='尾页']").match(/_(\d+).htm/)[1];
            return fun.getImg("#maincont img", max, 17);
        },
        button: [4],
        insertImg: ["#maincont", 1],
        autoDownload: [0],
        next: () => {
            let next = fun.ge("a.f-r.l3");
            return next ? next.href : null;
        },
        prev: 1,
        customTitle: ".title>h1",
        css: "#maincont>div:not(#FullPictureLoadImgBox),dl:nth-child(n+1):nth-child(-n+2){display:none!important}",
        category: "nsfw1"
    }, {
        name: "MEITU131",
        host: ["www.meitu131.net", "m.meitu131.net"],
        link: "https://www.meitu131.net/nvshen/,https://www.meitu131.net/jigou/",
        reg: /(www|m)\.meitu131\.(com|net)\/(\w+\/)?meinv\/\d+\//,
        imgs: () => {
            let max = fun.gt("a[title],.uk-page>span").match(/\/(\d+)/)[1];
            return fun.getImgO(".work-content img,.uk-article-bd img", max, 15);
        },
        button: [4],
        insertImg: [".work-content>p,.uk-article-bd", 1],
        customTitle: ".contitle-box>h1,h1.uk-article-title",
        css: ".appbox,.uk-page~section{display:none!important}.work-content img{max-width:100%!important}",
        category: "nsfw1"
    }, {
        name: "唯一图库",
        host: ["www.mmonly.com", "m.mmonly.com"],
        reg: /^https?:\/\/(www|m)\.mmonly\.\w+\/\w+\/\w+\/\d+\.html$/i,
        init: "$(document).off();",
        imgs: () => {
            let max;
            try {
                max = fun.gt(".pages a,.article_page a").match(/\d+/)[0];
            } catch (e) {
                max = 1;
            }
            return fun.getImg(".big-pic img,#ArticleBox img", max, 9);
        },
        button: [4],
        insertImg: [".big-pic,#ArticleBox", 2],
        customTitle: ".imgtitle>h1,.PsBox",
        category: "nsfw1"
    }, {
        name: "和邪社",
        host: ["www.hexieshe.cn"],
        reg: /^https?:\/\/www\.hexieshe\.cn\/\d+\/$/i,
        init: async () => await fun.getNP("#content-innerText>p", "span.current+a", null, ".post-links"),
        imgs: "#content-innerText img",
        customTitle: () => fun.gt(".entry-title").replace("为您朗读", "").trim(),
        category: "nsfw1"
    }, {
        name: "天极图片",
        host: ["pic.yesky.com"],
        reg: /^https?:\/\/pic\.yesky\.com\/\d+\/\d+\.shtml$/i,
        init: () => {
            fun.ge(".bigPic").outerHTML = '<div class="imgBox"></div>';
        },
        imgs: () => {
            thumbnailsSrcArray = fun.getImgSrcArr(".previewPic img");
            return thumbnailsSrcArray.map(e => e.replace(/d-|\/180x320/g, ""));
        },
        button: [4],
        insertImg: [".imgBox", 2],
        customTitle: "h1",
        css: ".atlasSwiper .floatR,.atlasSwiper .floatR .previewPic{width:unset!important}",
        category: "nsfw1"
    }, {
        name: "天极图片M",
        host: ["wap.yesky.com"],
        reg: /^https?:\/\/wap\.yesky\.com\/pic\/\d+\/\d+\.shtml$/i,
        init: () => {
            globalImgArray = fun.gae("[data-imgid] img");
            fun.ge(".swiper-container").outerHTML = '<div class="imgBox"></div>';
        },
        imgs: () => globalImgArray,
        button: [4],
        insertImg: [".imgBox", 2],
        customTitle: ".atlas_introduce h1",
        css: ".swiper-sum,[class^=ad]{display:none!important;}",
        category: "nsfw1"
    }, {
        name: "爱美女",
        host: ["www.92meinv.com"],
        reg: /www\.92meinv\.com\/article.+\.html/,
        imgs: () => {
            let max = fun.gt(".des>h1,.post_title_topimg").match(/\/\s?(\d+)/)[1];
            let links = fun.arr(max).map((_, i) => siteUrl.replace(/\.html$/, "") + "-" + (i + 1) + ".html");
            return fun.getImgA(".pp.hh img[alt],#image_div img", links, 200);
        },
        button: [4],
        insertImg: [".pp.hh,.content", 1],
        autoDownload: [0],
        next: "//a[@class='active' and contains(text(),'下一篇')] | //a[@class='active' and contains(text(),'下一组')]",
        prev: "//a[@class='active' and contains(text(),'上一篇')] | //a[@class='active' and contains(text(),'上一组')]",
        css: ".pp img{max-width:100%!important}",
        customTitle: () => fun.title("_", 1),
        category: "nsfw1"
    }, {
        name: "爱美女M",
        host: ["m.92meinv.com"],
        reg: /m\.92meinv\.com\/article-\d+\.html/,
        imgs: () => {
            let max = fun.gt(".article-page>*:last-child", 2);
            let links = fun.arr(max).map((_, i) => siteUrl.replace(/\.html$/, "") + "-" + (i + 1) + ".html");
            return fun.getImgA(".arcmain img,#image_div img", links, 200);
        },
        button: [4],
        insertImg: [".clearfix.arcmain,.content", 1],
        autoDownload: [0],
        next: "a.f-r.l3",
        prev: "a.f-l.l2",
        css: "body>a{display:none!important}",
        customTitle: () => fun.title("_", 1),
        category: "nsfw1"
    }, {
        name: "绅士猫",
        host: "www.cos6.net",
        reg: /www\.cos6\.net\/\d+\.html/,
        exclude: ".hidden-text.signin-loader,.hidden-text.pay-vip",
        imgs: ".wp-posts-content img[data-src]",
        button: [4],
        insertImg: [".bialty-container", 2],
        autoDownload: [0],
        next: ".article-nav>div:first-child>a[href$=html]",
        prev: ".article-nav>div:last-child>a[href$=html]",
        customTitle: "h1.article-title",
        fancybox: {
            blacklist: 1
        },
        category: "nsfw1"
    }, {
        name: "泡泡",
        host: "paopoi.com",
        reg: /^https?:\/\/paopoi\.com\/\d+\.html/,
        imgs: ".article-content img",
        button: [4],
        insertImg: [
            ["//p[img]", 2, "//p[img] | //div[@class='read-more']"], 2
        ],
        customTitle: ".article-title",
        css: "div[data-nav=posts][style]{max-height:unset!important}",
        category: "nsfw1"
    }, {
        name: "涩涩乐园",
        host: "sesew.top",
        reg: /^https?:\/\/sesew\.top\/\w+\.html/i,
        imgs: ".wp-posts-content img[data-src]",
        button: [4],
        insertImg: [".wp-posts-content", 2],
        autoDownload: [0],
        next: ".article-nav>div:first-child>a[href$=html]",
        prev: ".article-nav>div:last-child>a[href$=html]",
        customTitle: "h1.article-title",
        category: "nsfw1"
    }, {
        name: "扮之狐狸",
        host: "www.costhisfox.com",
        reg: () => /^https?:\/\/www\.costhisfox\.com\/\d+\/$/i.test(siteUrl) && fun.ge("//ul[@class='breadcrumb']//a[text()='cos福利美图']|//ul[@class='breadcrumb']//a[text()='写真系列']"),
        imgs: ".wp-posts-content img[data-src]",
        button: [4],
        insertImg: [".wp-posts-content", 2],
        autoDownload: [0],
        next: "//a[p[text()='上一篇']]",
        prev: "//a[p[text()='下一篇']]",
        customTitle: "h1.article-title",
        fancybox: {
            blacklist: 1
        },
        css: "div[data-nav=posts][style]{max-height:unset!important}",
        category: "nsfw1"
    }, {
        name: "男人之家",
        host: "nanrenhome.cc",
        reg: () => /^https?:\/\/nanrenhome\.cc\/\d+\.html/.test(siteUrl) && fun.ge("//a[@rel='category tag'][text()='福利美图']"),
        imgs: () => {
            let pag = fun.ge(".article-paging a[href]");
            return pag ? fun.getImgA(".article-content img", ".article-paging a[href]") : fun.gae(".article-content img");
        },
        button: [4],
        insertImg: [
            ["//article/p[img]", 2, "//article/p[img] | //div[@class='article-paging']"], 2
        ],
        customTitle: ".article-title",
        category: "nsfw1"
    }, {
        name: "网红跟我俩",
        host: "www.2wh.net",
        reg: () => /^https?:\/\/www\.2wh\.net\/\d+\.html$/.test(siteUrl) && fun.ge("//div[@class='breadcrumbs']/a[2][text()='美女写真机构']"),
        imgs: () => {
            let pag = fun.ge(".article-paging a[href]");
            return pag ? fun.getImgA(".article-content img", ".article-paging a[href]") : fun.gae(".article-content img");
        },
        button: [4],
        insertImg: [".article-content", 2],
        autoDownload: [0],
        next: ".article-nav-prev a",
        prev: ".article-nav-next a",
        customTitle: () => fun.gt(".article-title").replace("无删减私房写真流出", "").replace(/\[\d+[\w\s\+-]+\]/, "").replace(/\(\d+[\w\s\+-]+\)/, ""),
        category: "nsfw1"
    }, {
        name: "网红跟我俩",
        reg: /^https?:\/\/www\.2wh\.net\/\d+\.html$/,
        imgs: ".article-content img",
        autoDownload: [0],
        next: ".article-nav-prev a",
        prev: ".article-nav-next a",
        customTitle: () => fun.gt(".article-title").replace("无删减私房写真流出", "").replace(/\[\d+[\w\s\+-]+\]/, ""),
        category: "nsfw1"
    }, {
        name: "RedBust",
        host: "redbust.com",
        reg: () => /redbust\.com\/[^\/]+\/$/.test(siteUrl) && fun.ge(".entry-inner img"),
        imgs: () => {
            //return fun.getImgA(".image-attachment img", ".gallery a");
            return fun.gae(".entry-inner img").map(img => {
                let srcset = img.getAttribute("srcset");
                if (srcset) {
                    let splitArr = srcset.split(",");
                    splitArr = splitArr.sort((a, b) => a.match(/\s(\d+)w/)[1] - b.match(/\s(\d+)w/)[1]);
                    return splitArr.at(-1).trim().split(" ")[0];
                } else {
                    return img.src.replace(/-\d+x\d+\./, ".");
                }
            });
        },
        thums: ".entry-inner img",
        button: [4],
        insertImg: [".entry-inner", 2],
        autoDownload: [0],
        next: ".previous>a",
        prev: ".next>a",
        customTitle: "h1.post-title",
        category: "nsfw2"
    }, {
        name: "妞妞之家",
        host: ["niuniuhome.club"],
        reg: /^https?:\/\/niuniuhome\.club\/[^\/]+\/$|^https?:\/\/niuniuhome\.club\/\?p=\d+$/,
        imgs: ".entry-content img",
        button: [4],
        insertImg: [".post-content", 2],
        autoDownload: [0],
        next: "a.post-nav-prev",
        prev: "a.post-nav-next",
        customTitle: ".post-title",
        css: ".post-inner{width:98%!important;max-width:98%!important;padding:0!important}",
        category: "nsfw1"
    }, {
        name: "妞妞之家 分類自動翻頁",
        enable: 1,
        reg: /^^https?:\/\/niuniuhome\.club\/(\?paged=\d+|\?cat=\d+)?$/,
        autoPager: {
            mode: 1,
            waitEle: "#posts[style]",
            ele: "#posts",
            next: "a.archive-nav-older.fleft",
            re: ".archive-nav",
            title: () => "Page " + nextLink.match(/\d+$/)[0],
            bottom: screen.height * 3
        },
        openInNewTab: ".post-container a:not([target=_blank])",
        css: ".post-container{opacity:1 !important}",
        category: "autoPager"
    }, {
        name: "PixiBB",
        host: ["www.pixibb.com"],
        reg: /^https?:\/\/www\.pixibb\.com\/$|^https?:\/\/www\.pixibb\.com\/\?list=/,
        openInNewTab: ".list-item-image a",
        category: "none"
    }, {
        name: "PixiBB",
        host: ["www.pixibb.com"],
        reg: /^https?:\/\/www\.pixibb\.com\/album\//,
        imgs: async () => {
            await fun.getNP("#list-most-recent>.pad-content-listing", ".pagination-next>a");
            try {
                thumbnailsSrcArray = fun.gae(".list-item-image img").map(e => e.src.replace(/(-\d+)-1(\.md\.\w+)$/i, "$1$2")).sort((a, b) => a.match(/-(\d+)\.md\./)[1] - b.match(/-(\d+)\.md\./)[1]);
            } catch {
                thumbnailsSrcArray = fun.gae(".list-item-image img").map(e => e.src).sort();
            }
            return thumbnailsSrcArray.map(e => e.replace(".md.", "."));
        },
        button: [4],
        insertImg: ["#list-most-recent", 2],
        topButton: true,
        customTitle: () => fun.title(" - PixiBB", 1),
        category: "nsfw1"
    }, {
        name: "Luscious",
        host: ["www.luscious.net", "luscious.net"],
        reg: /^https?:\/\/(www\.)?luscious\.net\/albums\//,
        imgs: async () => {
            fun.showMsg(displayLanguage.str_05, 0);
            const getApiUrl = (id, page) => {
                let searchParams = new URLSearchParams({
                    operationName: "PictureListInsideAlbum",
                    query: " query PictureListInsideAlbum($input: PictureListInput!) { picture { list(input: $input) { info { ...FacetCollectionInfo } items { __typename id title description created like_status number_of_comments number_of_favorites moderation_status width height resolution aspect_ratio url_to_original url_to_video is_animated position permissions url tags { category text url } thumbnails { width height size url } } } } } fragment FacetCollectionInfo on FacetCollectionInfo { page has_next_page has_previous_page total_items total_pages items_per_page url_complete } ",
                    variables: `{"input":{"filters":[{"name":"album_id","value":"${id}"}],"display":"date_newest","items_per_page":50,"page":${page}}}`
                });
                return `https://apicdn.luscious.net/graphql/nobatch/?${searchParams}`;
            };
            let id = Number(new URL(fun.gu("a[href*='/read/'],.album-heading a")).pathname.split("/")[2].match(/\d+$/)[0]);
            let max = await fetch(getApiUrl(id, 1)).then(res => res.json()).then(json => json.data.picture.list.info.total_pages);
            let fetchNum = 0;
            let resArr = fun.arr(max).map((_, i) => {
                let url = getApiUrl(id, (i + 1));
                return fetch(url).then(res => {
                    fun.showMsg(`${displayLanguage.str_06}${fetchNum+=1}/${max}`, 0);
                    return res.json();
                }).then(json => json.data.picture.list.items.map(e => {
                    return e.url_to_video ? {
                        video: e.url_to_video
                    } : {
                        original: e.url_to_original,
                        thumbnail: e.thumbnails.at(-1).url
                    }
                }));
            });
            return Promise.all(resArr).then(data => {
                videosSrcArray = data.flat().filter(item => item.video).map(e => e.video);
                thumbnailsSrcArray = data.flat().filter(item => item.thumbnail).map(e => e.thumbnail);
                return data.flat().filter(item => item.original).map(e => e.original);
            });
        },
        button: [4],
        insertImg: ["article.o-padding-top-bottom,.picture-frame-wrapper", 3],
        downloadVideo: true,
        customTitle: ".album-heading:not(.o-padding-sides),.album-heading.o-padding-sides a",
        observerTitle: true,
        css: "body.o-modal-no-scroll{overflow:unset!important}#modal-root{display:none!important;}",
        category: "hcomic"
    }, {
        name: "E次元",
        host: ["www.evacg.org"],
        reg: () => /www\.evacg\.org\/archives\/\d+/.test(siteUrl) && fun.ge(".wp-caption img") && !fun.ge(".poi-alert__msg"),
        imgs: ".wp-caption img",
        button: [4],
        insertImg: [
            [".inn-singular__post__body__content", 0, ".wp-caption"], 2
        ],
        customTitle: ".inn-singular__post__title",
        category: "nsfw1"
    }, {
        name: "次元岛",
        host: ["ciyuandao.com"],
        reg: /^https?:\/\/ciyuandao\.com\/photo\/show\/\d+/,
        imgs: ".talk_pic  img",
        button: [4],
        insertImg: [".talk_pic", 2],
        customTitle: "h1",
        category: "nsfw1"
    }, {
        name: "萌次元",
        host: ["www.mtutuu.com"],
        reg: /^https?:\/\/www\.mtutuu\.com\/\d+\.html/,
        exclude: ".content-cap",
        imgs: ".entry-content img",
        button: [4],
        insertImg: [
            ["//div[@class='entry-content']/p[img]", 2, "//div[@class='entry-content']/p[img]"], 2
        ],
        customTitle: ".post-style-3-title",
        category: "nsfw1"
    }, {
        name: "次元小镇",
        host: ["dimtown.com"],
        reg: /^https?:\/\/dimtown\.com\/\d+\.html/,
        exclude: ".down-login",
        imgs: "#content img",
        button: [4],
        insertImg: [
            ["//p[img]", 2, "//p[img]/img[@decoding] | //p[img]/img[@decoding]/following-sibling::br"], 2
        ],
        autoDownload: [0],
        next: ".post-pre a",
        prev: ".post-next a",
        customTitle: "h1",
        category: "nsfw1"
    }, {
        name: "3楼猫图库",
        host: ["pic.3loumao.org"],
        reg: /pic\.3loumao\.org\/[a-z-]+\/\d+\.html/i,
        imgs: "article img",
        button: [4],
        insertImg: ["//p[img]", 2],
        customTitle: "h1",
        fancybox: {
            v: 3,
            insertLibrarys: 1
        },
        category: "nsfw1"
    }, {
        name: "Simply Porn",
        host: ["www.simply-porn.com"],
        reg: /www\.simply-porn\.com\/gallery\/[^\/]+$/,
        init: async () => await fun.waitEle(".full-gutters>div>a>img", 600),
        imgs: () => {
            thumbnailsSrcArray = fun.gae(".full-gutters>div>a>img").map(e => e.dataset.src ?? e.src);
            return thumbnailsSrcArray.map(e => e.replace("thumb_", ""));
        },
        button: [4],
        insertImg: ["//div[@class='row full-gutters'][div[a[img]]]", 2],
        customTitle: ".container>h1",
        fetch: 1,
        category: "nsfw1"
    }, {
        name: "Simply Cosplay",
        host: ["www.simply-cosplay.com"],
        reg: /www\.simply-cosplay\.com\/gallery\//,
        init: async () => {
            fun.showMsg(displayLanguage.str_04, 0);
            await fun.waitEle("h1.content-headline", 600);
            await fun.waitEle(".swipe-area img", 600);
        },
        imgs: () => fun.gae(".swiper-slide img").map(e => e.dataset.src.replace("small_square_", "")),
        button: [4],
        insertImg: ["//div[div[div[div[@class='image-wrapper']]]]", 2],
        customTitle: "h1.content-headline",
        fetch: 1,
        css: ".gallery-view .row{display:block}",
        category: "nsfw1"
    }, {
        name: "Cosplay Porn",
        host: ["cosplayporn.online"],
        link: "https://cosplayporn.online/category/cosplay/",
        reg: () => /^https?:\/\/cosplayporn\.online\/\w+\/[^\/]+\/$/.test(siteUrl) && fun.ge(".video-description img") && !fun.ge(".responsive-player"),
        imgs: ".video-description img",
        button: [4],
        insertImg: [".video-description", 2],
        customTitle: ".entry-title",
        category: "nsfw1"
    }, {
        name: "Cosersets",
        host: ["www.cosersets.com"],
        link: "https://www.cosersets.com/1",
        reg: /^https?:\/\/www\.cosersets\.com/,
        init: async () => await fun.waitEle(".z-breadcrumbs"),
        imgs: async () => {
            fun.showMsg(displayLanguage.str_05, 0);
            let body = {
                storageKey: "1",
                path: decodeURIComponent(window.location.pathname.replace(/^\/1/, "")),
                password: "",
                orderBy: "name",
                orderDirection: "asc"
            };
            let fetchJson = await fetch("/api/storage/files", {
                "headers": {
                    "accept": "application/json, text/plain, */*",
                    "content-type": "application/json;charset=UTF-8;"
                },
                "body": JSON.stringify(body),
                "method": "POST"
            }).then(res => res.json());
            return fetchJson.data.files.map(file => file.url);
        },
        repeat: 1,
        customTitle: () => fun.gt(".z-breadcrumbs").replace(/\n/g, " - ").replace(/首页 - |Cosersets - /, ""),
        observerTitle: true,
        category: "nsfw1"
    }, {
        name: "小丁 (Fantasy Factory) Patreon Cosplay Leaks",
        host: ["www.fantasyfactory.xyz"],
        reg: /^https?:\/\/www\.fantasyfactory\.xyz\//,
        init: async () => await fun.waitEle("#crumbbar"),
        imgs: ".item.file>a",
        repeat: 1,
        customTitle: () => fun.gt("#crumbbar").replace("www.fantasyfactory.xyz", "小丁 (Fantasy Factory)"),
        observerTitle: true,
        category: "nsfw1"
    }, {
        name: "COSPLAY ZIP",
        host: ["www.coszip.com", "coszip.com"],
        reg: /^https?:\/\/(www\.)?coszip\.com\/\d+\.html(\?noamp=mobile.*)?$/,
        imgs: () => {
            let max;
            try {
                max = fun.gt(".page-links>a:last-child").match(/\d+$/)[0];
            } catch (e) {
                max = 1;
            }
            return fun.getImg(".entry-content img", max, 7);
        },
        button: [4],
        insertImg: [
            [".entry-content", 0, "//div[@class='page-links'] | //p[img[@decoding]] | //figure[contains(@class,'wp-block-gallery')] | //figure[@class='wp-block-image']"], 2
        ],
        go: 1,
        autoDownload: [0],
        next: ".nav-previous>a",
        prev: ".nav-next>a",
        customTitle: ".entry-title",
        category: "nsfw2"
    }, {
        name: "COSPLAY ZIP M",
        host: ["www.coszip.com", "coszip.com"],
        reg: /^https?:\/\/(www\.)?coszip\.com\/\d+\.html\?amp=1$/,
        imgs: ".amp-wp-article-content amp-img",
        button: [4],
        insertImg: [
            [".amp-wp-article-content", 0, "//p[amp-img] | //figure[@class='wp-block-image']"], 2
        ],
        go: 1,
        customTitle: ".amp-wp-title",
        css: "pre{white-space:pre-wrap!important}",
        category: "nsfw2"
    }, {
        name: "女神社",
        host: ["nshens.com", "inewgirl.com"],
        reg: /(nshens\.com|inewgirl\.com)\/\d+\/\d+\/\d+\/[^/]+$/,
        exclude: ".justify-center>button>.v-btn__content",
        delay: 800,
        imgs: async () => {
            fun.showMsg(displayLanguage.str_05, 0);
            let max = fun.gt(".v-pagination li:last-child", 2);
            let links = fun.arr(max).map((_, i) => siteUrl + "/" + (i + 1));
            let fetchNum = 0;
            let resArr = links.map((url, i, arr) => {
                return fun.fetchDoc(url).then(doc => {
                    fun.showMsg(`${displayLanguage.str_06}${fetchNum+=1}/${arr.length}`, 0);
                    let code = fun.gst("photoList", doc);
                    return fun.run(code.match(/photoList:([^\]]+\])/)[1]);
                });
            });
            let photourl = await Promise.all(resArr).then(data => data.flat().map(e => e.photourl));
            if (photourl.length > [...new Set(photourl)].length) setTimeout(() => fun.showMsg("VIP套圖需升級為VIP", 5000), 1200);
            return photourl;
        },
        button: [4],
        insertImg: ["//div[a[div[@class='v-image v-responsive theme--light']]]", 2],
        customTitle: "h3",
        category: "nsfw2"
    }, {
        name: "女神社",
        host: ["nshens.com", "inewgirl.com", "lovens.cc"],
        reg: /(nshens\.com|inewgirl\.com)\/latestpost$/,
        delay: 500,
        observerClick: "//button[span[text()='加載更多'] or span[text()='加载更多'] or span[text()='Load More'] or span[text()='Tải thêm']]",
        category: "autoPager"
    }, {
        name: "Chottie", //很多都需要VIP,不然只會重複抓到第一頁的圖片
        host: ["chottie.com"],
        reg: /chottie\.com\/blog\/(\w{2}\/)?archives\/\d+$/,
        exclude: ".justify-center>button>.v-btn__content",
        delay: 800,
        imgs: async () => {
            fun.showMsg(displayLanguage.str_05, 0);
            let max = fun.gt(".v-pagination li:last-child", 2);
            let links = fun.arr(max).map((_, i) => siteUrl + "/" + (i + 1));
            let fetchNum = 0;
            let resArr = links.map((url, i, arr) => {
                return fun.fetchDoc(url).then(doc => {
                    fun.showMsg(`${displayLanguage.str_06}${fetchNum+=1}/${arr.length}`, 0);
                    let code, imgs;
                    try {
                        code = fun.gst("imgList", doc);
                        imgs = fun.run(code.match(/imgList:([^\]]+\])/)[1]);
                    } catch (e) {
                        code = fun.gst("snapshotList", doc);
                        imgs = fun.run(code.match(/snapshotList:([^\]]+\])/)[1]);
                    }
                    return imgs;
                });
            });
            let data = await Promise.all(resArr).then(data => data.flat());
            if (data.length > [...new Set(data)].length) setTimeout(() => fun.showMsg("VIP套圖需升級為VIP", 5000), 1200);
            return data;
        },
        button: [4],
        insertImg: ["//div[a[div[@class='v-image v-responsive theme--light']]]", 2],
        //css: ".text-center{display:none!important}",
        customTitle: "h3",
        category: "nsfw2"
    }, {
        name: "街角图片社",
        host: ["ijjiao.com"],
        reg: /^https?:\/\/ijjiao\.com\/\d+\/\d+\/\d+\/album/,
        exclude: "//span[text()='加载更多']",
        init: async () => await fun.waitEle(".v-pagination"),
        imgs: async () => {
            let max = fun.gt("//li[button[@aria-label='Next page']]", 2);
            let url = siteUrl.replace(/\/\d+$/, "");
            let links = fun.arr(max).map((_, i) => url + "/" + (i + 1));
            fun.showMsg(displayLanguage.str_07, 0);
            let check = await fun.fetchDoc(links[1]).then(doc => {
                let code = fun.gst("photoList", doc);
                let photoList = fun.run(code.match(/photoList:([^\]]+\])/)[1]);
                return photoList.length < 1 ? false : true;
            });
            if (check) {
                fun.showMsg(displayLanguage.str_05, 0);
                let fetchNum = 0;
                let resArr = links.map((url, i, arr) => {
                    return fun.fetchDoc(url).then(doc => {
                        fun.showMsg(`${displayLanguage.str_06}${fetchNum+=1}/${arr.length}`, 0);
                        let code = fun.gst("photoList", doc);
                        let photoList = fun.run(code.match(/photoList:([^\]]+\])/)[1]);
                        return photoList;
                    });
                });
                return Promise.all(resArr).then(data => data.flat().map(e => e.photourl));
            } else {
                alert("登錄狀態已失效!請手動點擊第2頁,觸發密碼輸入框重新登錄。");
                return [];
            }
        },
        button: [4],
        insertImg: ["//div[div[@class='image-item']]", 2],
        customTitle: "h3",
        category: "nsfw1"
    }, {
        name: "美妹妹",
        host: ["www.meimeimei.org"],
        reg: /www\.meimeimei\.org\/\d+\/\d+\/$|www\.meimeimei\.org\/\d+\/\d+\/\d+\.html/,
        imgs: () => {
            let max = fun.gt(".chapterpage>a:last-child", 2);
            let links = [];
            if (/\.html/.test(siteUrl)) {
                let url = fun.gu(".pageCurr").replace("_1.html", "");
                links = fun.arr(max).map((_, i) => url + "_" + (i + 1) + ".html");
            } else {
                let url = fun.gu(".pageCurr").replace("1.html", "");
                links = fun.arr(max).map((_, i) => url + (i + 1) + ".html");
            }
            return fun.getImgA(".img>img", links, 100);
        },
        button: [4],
        insertImg: [".txt_tcontent", 1],
        autoDownload: [0],
        next: "//div[contains(text(),'上一篇')]/a[not(@href='#')]",
        prev: "//div[contains(text(),'下一篇')]/a[not(@href='#')]",
        customTitle: ".bread>li:last-child>a",
        category: "nsfw1"
    }, {
        name: "tu928美女写真网",
        host: ["tu928.com"],
        reg: /^https?:\/\/tu928\.com\/\d+\.html/,
        imgs: () => fun.getImgA(".wp-block-image img", ".page-links>a", 300),
        button: [4],
        insertImg: [
            [".post-item-metadata", 1, ".wp-block-image"], 2
        ],
        autoDownload: [0],
        next: ".nav-previous>a",
        prev: ".nav-next>a",
        customTitle: ".entry-title",
        css: "#af-preloader{display:none!important;}",
        category: "nsfw1"
    }, {
        name: "图集网",
        host: ["aiavr.uk"],
        reg: /^https?:\/\/aiavr\.uk\/detail\?aid=\d+/,
        imgs: async () => {
            fun.showMsg(displayLanguage.str_05, 0);
            let id = fun.url.match(/\?aid=(\d+)/)[1];
            let total = await fetch(`/api/image/list?aid=${id}&pageNum=1`).then(res => res.json()).then(json => json.total);
            let pages = Math.ceil(total / 6);
            let links = fun.arr(pages).map((_, i) => `/api/image/list?aid=${id}&pageNum=${i+1}`);
            let resArr = links.map(url => fetch(url).then(res => res.json()).then(json => json.data));
            return Promise.all(resArr).then(data => data.flat()).then(arr => arr.map(e => e.sourceUrl == null ? e.sourceWeb + e.url : e.sourceWeb + e.sourceUrl));
        },
        button: [4],
        insertImg: [".q-infinite-scroll", 2],
        customTitle: () => {
            let id = fun.url.match(/\?aid=(\d+)/)[1];
            //return fetch(`https://admin.aiavr.uk/album/info?id=${id}`).then(res => res.json()).then(json => json.data.title);
            return fun.xhr(`https://admin.aiavr.uk/album/info?id=${id}`, {
                responseType: "json"
            }).then(json => json.data.title);
        },
        category: "nsfw1"
    }, {
        name: "图集网",
        host: ["user.aiavr.uk"],
        reg: /^https?:\/\/user\.aiavr\.uk\/detail\?aid=\d+/,
        imgs: async () => {
            fun.showMsg(displayLanguage.str_05, 0);
            let id = fun.url.match(/\?aid=(\d+)/)[1];
            let total = await fetch(`https://admin.aiavr.uk/image/list?aid=${id}&pageNum=1`).then(res => res.json()).then(json => json.total);
            let pages = Math.ceil(total / 6);
            let links = fun.arr(pages).map((_, i) => `https://admin.aiavr.uk/image/list?aid=${id}&pageNum=${i+1}`);
            let resArr = links.map(url => fetch(url).then(res => res.json()).then(json => json.data));
            return Promise.all(resArr).then(data => data.flat()).then(arr => arr.map(e => e.sourceUrl == null ? e.sourceWeb + e.url : e.sourceWeb + e.sourceUrl));
        },
        button: [4],
        insertImg: [".q-infinite-scroll", 2],
        customTitle: () => {
            let id = fun.url.match(/\?aid=(\d+)/)[1];
            return fetch(`https://admin.aiavr.uk/album/info?id=${id}`).then(res => res.json()).then(json => json.data.title);
        },
        category: "nsfw1"
    }, {
        name: "图集网",
        host: ["user.aiavr.uk"],
        reg: /^https?:\/\/user\.aiavr\.uk\/userAlbumDetail\?aid=\d+/,
        imgs: async () => {
            fun.showMsg(displayLanguage.str_05, 0);
            let id = fun.url.match(/\?aid=(\d+)/)[1];
            let vip = await fetch(`https://admin.aiavr.uk/userAlbum/getInfo/${id}`).then(res => res.json()).then(json => json.data.isSee);
            if (vip == false) {
                setTimeout(() => {
                    fun.showMsg("VIP限定專輯圖片!", 5000);
                }, 1200);
                return [];
            }
            let total = await fetch(`https://admin.aiavr.uk/userImage/list?aid=${id}&pageNum=1`).then(res => res.json()).then(json => json.total);
            let pages = Math.ceil(total / 6);
            let links = fun.arr(pages).map((_, i) => `https://admin.aiavr.uk/userImage/list?aid=${id}&pageNum=${i+1}`);
            let resArr = links.map(url => fetch(url).then(res => res.json()).then(json => json.data));
            return Promise.all(resArr).then(data => data.flat()).then(arr => arr.map(e => e.imgUrl == null ? null : "https://image.51x.uk/xinshijie" + e.imgUrl).filter(item => item));
        },
        button: [4],
        insertImg: [".q-infinite-scroll", 2],
        customTitle: () => {
            let id = fun.url.match(/\?aid=(\d+)/)[1];
            return fetch(`https://admin.aiavr.uk/userAlbum/getInfo/${id}`).then(res => res.json()).then(json => json.data.title);
        },
        category: "nsfw1"
    }, {
        name: "爱死美女图片站",
        host: ["www.24tupian.org"],
        reg: () => /^https?:\/\/www\.24tupian\.org\/\w+\/\d+\/\d+\/\d+\.html$/.test(siteUrl) && fun.ge("img[data-original*='imgs.diercun.com']"),
        imgs: async () => {
            let pid = fun.gt("#pid");
            let num = Number(fun.gt(".mores>a").match(/\d+/)[0]);
            let max = Math.ceil(num / 21);
            let html = "";
            let fetchNum = 0;
            for (let i = 0; i < num; i += 21) {
                fun.showMsg(`${displayLanguage.str_06}${fetchNum+=1}/${max}`, 0);
                await fetch(`/ajaxs.aspx?fun=getmore&id=${pid}&p=${i}`).then(res => res.text()).then(text => (html += text));
            }
            let dom = fun.doc(html);
            let datas = fun.gae("img[data]", dom).map(e => e.getAttribute("data"));
            thumbnailsSrcArray = datas.map(data => "https://imgs.diercun.com" + data);
            return datas.map(data => "https://big.diercun.com" + _unsafeWindow.getbig(data));
        },
        button: [4],
        insertImg: [
            [".mores", 2], 2
        ],
        go: 1,
        topButton: true,
        threading: 12,
        customTitle: ".gtitle1>h1",
        css: "body>.mask{display:none!important}",
        category: "nsfw1"
    }, {
        name: "爱死cos美女图片站",
        host: ["www.24cos.org", "www.lovecos.net"],
        reg: /(www\.24cos\.org|www\.lovecos\.net)\/\w+\/\d+\.html$/,
        imgs: async () => {
            let pages = fun.gau(".page>a");
            let liImgs = fun.gae(".mtp>li");
            if (pages.length > 0 && liImgs.length < 21) {
                await fun.getEle(pages, ".mtp>li", [".mtp", 0]);
            }
            thumbnailsSrcArray = fun.gae(".mtp img").map(e => decodeURIComponent(e.src));
            return thumbnailsSrcArray.map(url => {
                let i = url.lastIndexOf("/");
                let murl = url.substring(i + 1);
                url = url.replace(murl, murl.substring(1));
                return url;
            });
        },
        button: [4],
        insertImg: [
            [".mtp", 2, ".mtp"], 2
        ],
        topButton: true,
        threading: 5,
        customTitle: ".tmsg>h1",
        css: ".tpmh img{filter:unset!important;}",
        category: "nsfw1"
    }, {
        name: "Huamao wallpaper 花猫壁纸",
        host: ["ja.huamaobizhi.com", "en.huamaobizhi.com"],
        reg: /^https?:\/\/[a-z]{2}\.huamaobizhi\.com\/mix\/\d+/,
        init: async () => {
            let load = fun.ge(".load-more-photos");
            if (load) load.remove();
            await fun.getNP(".images-card", "li.active+li>a", null, ".pagination");
            fun.gae(".thumb-nsfw").forEach(e => e.classList.remove("thumb-nsfw"));
        },
        imgs: async () => {
            thumbnailsSrcArray = fun.gae(".images-card img").map(e => e.dataset.src ?? e.src);
            fun.clearAllTimer(2);
            fun.showMsg(displayLanguage.str_05, 0);
            let fetchNum = 0;
            const resBlobUrl = (id, max) => {
                return fetch("/normal-download/", {
                    "headers": {
                        "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.9",
                        "content-type": "application/x-www-form-urlencoded"
                    },
                    "body": `wallpaperId=${id}`,
                    "method": "POST"
                }).then(res => res.blob()).then(blob => {
                    fun.showMsg(`${displayLanguage.str_06}${fetchNum+=1}/${max}`, 0);
                    return URL.createObjectURL(blob);
                });
            };
            let IDs = fun.gae("span[data-imgid]").map(e => e.dataset.imgid);
            let bigImgsArr = [];
            for (let id of IDs) {
                bigImgsArr.push(await resBlobUrl(id, IDs.length));
                //await fun.delay(1500, 0);
            }
            return bigImgsArr;
        },
        button: [4],
        insertImg: [
            ["#main", 2], 0
        ],
        go: 1,
        customTitle: ".title>h1",
        fetch: 1,
        ex: "jpg",
        category: "nsfw1"
    }, {
        name: "Huamao wallpaper 花猫壁纸 en.huamaobizhi.com 分類自動翻頁",
        host: ["ja.huamaobizhi.com", "en.huamaobizhi.com"],
        enable: 1,
        reg: /^https?:\/\/[a-z]{2}\.huamaobizhi\.com\/(mixs|tags|artists|people-tags)\/\?/,
        autoPager: {
            ele: "//div[@class='row'][div[div[@class='mixs-card']]] | //div[@class='table-responsive table-sm-no-border'] | //div[div[div[@class='thumbnail']]] | //div[@class='tags-wrap']",
            next: ".pagination li.active+li>a",
            re: ".pagination",
            title: doc => "Page " + fun.ge(".pagination li.active", doc).innerText,
            bF: doc => {
                fun.gae(".mixs-card-img:not(.lock)", doc).forEach(e => {
                    let url = e.attributes[1].value.replaceAll("'", "");
                    e.outerHTML = `<div class="mixs-card-img" data-src="${url}" lazy="loaded" style="background-image: url(&quot;${url}&quot;);"></div>`;
                });
                fun.gae(".thumbnail .img-circle[v-lazy]", doc).forEach(e => {
                    let url = e.getAttribute("v-lazy").replaceAll("'", "");
                    e.outerHTML = `<img src="${url}" alt="${e.alt}" class="img-circle" data-src="${url}" lazy="loaded">`;
                });
                fun.gae(".tags-item img[v-lazy]", doc).forEach(e => {
                    let url = e.getAttribute("v-lazy").replaceAll("'", "");
                    e.outerHTML = `<img src="${url}" alt="${e.alt}" data-src="${url}" lazy="loaded">`;
                });
            }
        },
        openInNewTab: ".mixs-card-content>a:not([target=_blank])",
        category: "autoPager"
    }, {
        name: "云边网盘",
        host: ["qinzhi.top"],
        reg: /^https?:\/\/qinzhi\.top\/[^\/]+\/[^\/]+\/.+/,
        init: async () => {
            await fun.waitEle("div.list");
            fun.createImgBox(".body");
        },
        imgs: () => fun.getAList(),
        repeat: 1,
        button: [4],
        insertImg: ["#FullPictureLoadMainImgBox", 3],
        go: 1,
        observerTitle: true,
        downloadVideo: true,
        customTitle: () => fun.title(" | 云边网盘").replace(/\s?\d+p\s?|\[\d+[\w\s\.\+-]+\]/i, ""),
        category: "nsfw1"
    }, {
        name: "新美图录/臺灣美腿女郎",
        host: ["www.xinmeitulu.com", "www.twlegs.com"],
        reg: /(www\.xinmeitulu\.com|www\.twlegs\.com)\/photo\/.+/,
        imgs: "img[data-original]",
        button: [4],
        insertImg: [".text-center", 2],
        customTitle: "h1.h3",
        category: "nsfw1"
    }, {
        name: "美图录",
        host: ["meitulu.me"],
        reg: /meitulu\.me\/item\/\d+\.html/,
        imgs: () => fun.getImg(".mb-4>img[alt]", fun.gt(".pagination>li:last-child", 2), 9),
        button: [4],
        insertImg: [".mb-4", 1],
        customTitle: ".top-title",
        category: "nsfw1"
    }, {
        name: "爱图集谷",
        host: ["www.tujigu.top"],
        reg: /^https?:\/\/www\.tujigu\.top\/photo\//,
        imgs: ".entry-body img",
        button: [4],
        insertImg: [".entry-body", 2],
        customTitle: ".entry-title",
        category: "nsfw1"
    }, {
        name: "秀窝/RMM吧/赞MM/恩图集/美Girl图集/狐图网/930圖片網/爱秀美女/四魔写真/JN美眉网",
        host: ["www.xiuwo.net", "rmm8.com", "www.zanmm.com", "www.entuji.com", "www.mhgirl.com", "www.hutu6.com", "www.930tu.com", "www.930tp.com", "wap.kunv.cc", "www.smkwan.com", "www.jnmmw.com"],
        reg: [
            /(www\.xiuwo\.net|rmm8\.com|www\.mhgirl\.com|wap\.kunv\.cc)\/tu([\w]+)?\/\d+\.html/,
            /www\.zanmm\.com\/tupian\/\d+\.html/,
            /(www\.entuji\.com|www\.hutu6\.com)\/\w+\/\d+\.html/,
            /www\.930t(u|p)\.com\/\w+\/\d+\.html/,
            /www\.smkwan\.com\/mm\/\d+\.html/,
            /www\.jnmmw\.com\/meimei\/\d+\.html/
        ],
        init: () => fun.clearAllTimer(),
        imgs: () => fun.getImgO("#showimg img", fun.gt("//p[contains(text(),'图片数量')]").match(/\d+/)[0], 9),
        button: [4],
        insertImg: ["#showimg", 2],
        customTitle: ".weizhi h1",
        css: "@media only screen and (max-width:3840px){.content img{max-width:100%!important}}",
        category: "nsfw1"
    }, {
        name: "妹妹图",
        host: ["mm.tvv.tw"],
        reg: /mm\.tvv\.tw\/archives\/\d+\.html/,
        imgs: ".img-responsive",
        button: [4],
        insertImg: ["//p[img]", 2],
        customTitle: ".blog-details-headline",
        category: "nsfw1"
    }, {
        name: "小姐姐",
        host: ["www.nvsheng.cc"],
        reg: /nvsheng\.cc\/\w+\/\d+\.html/,
        imgs: () => fun.getImg(".info-imtg-box>img[alt]", fun.gt(".pagebar>*:last-child", 3)),
        button: [4],
        insertImg: [".info-imtg-box", 1],
        autoDownload: [0],
        next: "//a[p[text()='上一篇']]",
        prev: "//a[p[text()='下一篇']]",
        customTitle: () => fun.title("-", 1),
        //threading: 4,
        category: "nsfw1"
    }, {
        name: "小姐姐么",
        host: ["xiaojiejie.me"],
        reg: /^https?:\/\/xiaojiejie\.me\/\d+\/[^\/]+\/$/,
        imgs: () => {
            fun.showMsg(displayLanguage.str_05, 0);
            return fetch("/wp-admin/admin-ajax.php", {
                "headers": {
                    "accept": "*/*",
                    "content-type": "application/x-www-form-urlencoded; charset=UTF-8",
                    "x-requested-with": "XMLHttpRequest"
                },
                "body": `action=chenxing_imageall&type=all&post_id=${_unsafeWindow.chenxing.PID}`,
                "method": "POST",
            }).then(res => res.text()).then(text => fun.doc(text)).then(doc => [...doc.images]);
        },
        button: [4],
        insertImg: ["#content", 2],
        insertImgAF: () => fun.run("$(document).off()"),
        customTitle: () => fun.title(" – 小姐姐").replace(/\[\d+[\s\.\+\w-]+\]/gi, "").replace(/\s?\d+p(\d+V)?/i, "").replace(/[\d\.\s]+(GB|MB)/i, "").replace(/(\d+月\d+打赏群(自购)?资源)/, "").trim(),
        category: "nsfw1"
    }, {
        name: "图片吧/14MM图片网",
        host: ["www.tp8.org", "www.14mm.cn"],
        reg: /^https:\/\/(www\.tp8\.org|www\.14mm\.\w+)\/\d+\.html$/,
        exclude: "//a[@rel='category tag'][text()='演出视频']",
        imgs: async () => {
            let max = fun.gt("a[title='最后页']");
            return fun.getImg("#image_div img", max, 9, [/\?x-oss-process.+$/, ""]);
            //return fun.getImg("#image_div img", max, 9);
        },
        button: [4],
        insertImg: ["#content", 2],
        insertImgAF: () => fun.run("$(document).off()"),
        customTitle: () => fun.title(" – 14MM图片网"),
        category: "nsfw1"
    }, {
        name: "Coser Lab",
        host: ["coserlab.io"],
        reg: /^https?:\/\/coserlab\.io\/archives\/\d+$/,
        exclude: ".card-body .error-empty",
        imgs: () => {
            thumbnailsSrcArray = fun.getImgSrcArr("a.masonry-image img");
            fun.showMsg("fun.xhrHEA(check)...", 0);
            let xhrNum = 0;
            return fun.gau("a.masonry-image").map(u => u.replace("-scaled", "")).map(async (src, i, arr) => {
                await fun.delay(100 * i, 0);
                let res = await fun.xhrHEAD(src);
                fun.showMsg(`fun.xhrHEAD(${xhrNum+=1}/${arr.length})`, 0);
                let status = res.status;
                return status == 404 ? src.replace(/(\.[a-z]+)$/i, "-scaled$1") : src;
            });
        },
        thums: "a.masonry-image img",
        button: [4],
        insertImg: [
            [".masonry-list", 2, ".masonry-list"], 2
        ],
        customTitle: "span.current",
        category: "nsfw1"
    }, {
        name: "孔雀海/洛丽网/ladymao图库/懒人看图",
        host: ["www.kongquehai.net", "www.lolili.net", "www.ladymao.net", "www.lazymanpic.net"],
        reg: [
            /^https?:\/\/((www\.)?kongquehai\.net|(www\.)?lolili\.net)\/\w+\/\w+\/\w+\.html(\?btwaf=\d+)?$/i,
            /^https?:\/\/(www\.)?ladymao\.net\/[a-z]{2,3}\/\w+(\?btwaf=\d+)?$/,
            /^https?:\/\/(www\.)?lazymanpic\.net\/[a-z]{2,3}\/\w+(\?btwaf=\d+)?$/
        ],
        imgs: async () => {
            await fun.getNP(".m-list-content img", "//a[text()='下一页'][@class='next']", null, ".link_pages");
            return fun.gae(".m-list-content img");
        },
        button: [4],
        insertImg: [".m-list-content", 2],
        autoDownload: [0],
        next: ".sxpage_r>a",
        prev: ".sxpage_l>a",
        customTitle: () => fun.gt(".m-list-tools>h2").replace(/\(\d\)/, "").replace(/\[\d+[\s\.\+\w-\/]+\].*/, "").replace(/全网首发|免费下载|无损图包下载|未删减版|无删减图包/g, ""),
        category: "nsfw1"
    }, {
        name: "尤物秀",
        host: ["www.youwushow.net"],
        reg: /^https?:\/\/(www\.)?youwushow\.net\/pic\/\w+\.html(\?btwaf=\d+)?$/,
        imgs: async () => {
            await fun.getNP(".entry-content>*:not(.page-links)", "span.current+a", null, ".page-links");
            return fun.gae(".entry-content img");
        },
        button: [4],
        insertImg: [".entry-content", 2],
        autoDownload: [0],
        next: "a.prev-link",
        prev: "a.next-link",
        customTitle: () => fun.gt(".entry-title").replace(/\(\d\)/, "").replace(/\[\d+[\s\.\+\w-\/]+\].*/, "").replace(/全网首发|免费下载|无损图包下载|未删减版|无删减图包/g, ""),
        category: "nsfw1"
    }, {
        name: "iLegs时光印象网",
        host: ["legskr.com"],
        reg: /^https?:\/\/legskr\.com\/album\/detail\/\d+\.html$/,
        imgs: () => {
            thumbnailsSrcArray = fun.gae("#lightgallery .img-fluid[data-src]").map(e => e.dataset.src ?? e.src);
            return fun.gae("#lightgallery div.col-6[data-src]");
        },
        button: [4],
        insertImg: ["#lightgallery", 2],
        customTitle: () => fun.gt(".title").replace("Album name:", "").replace(/\[\d+[\s\.\+\w-\/]+\]/, "").trim(),
        category: "nsfw1"
    }, {
        name: "比思在線圖庫",
        host: ["bisipic.xyz", "bisipic.online"],
        reg: /^https?:\/\/bisipic\.(xyz|online)\/thread[\d-]+\.html$/,
        imgs: () => fun.gae("img[zoomfile]").map(e => location.origin + "/" + e.getAttribute("zoomfile")),
        button: [4],
        insertImg: ["[id^=postmessage]", 2],
        customTitle: () => fun.ge("meta[name=keywords]").content.replace(/【\d+P】.*/i, ""),
        category: "nsfw1"
    }, {
        name: "洛秀网/维秘秀",
        host: ["www.loxiu.com", "www.counv.com"],
        reg: /^https?:\/\/((www\.)?loxiu\.com|(www\.)?counv\.com)\/post\/\d+\.html/,
        imgs: () => fun.getImg(".info-imtg-box>img[alt]", fun.gt(".pagebar>*:last-child", 3)),
        button: [4],
        insertImg: [".info-imtg-box", 2],
        autoDownload: [0],
        next: "//a[p[text()='上一篇']]",
        prev: "//a[p[text()='下一篇']]",
        customTitle: ".info-title>h1",
        category: "nsfw1"
    }, {
        name: "遛无写真/推妹妹美图/无圣光/有脾气美图/KP写真/美女云图网/tck天天番号/4tck番号库/5pwc番号库/5tck天天番号/6K美女/6vtr宅男社区/7tck番号网/1凸5宅男福利/有脾气美图/极品番号社/过热E宅男天堂/杰瑞宅男频道/宅男番号库/PXA番号库/54k5宅男必备/0niz宅男频道/7k1a番号库/男人沉默宅男在线/7c0a宅男福利网站",
        host: ["www.6evu.com", "www.6kpo.com", "www.6vtr.com", "www.tmm123.vip", "www.wushengguang.biz", "www.1plq.com", "www.c0h.net", "www.3tck.com", "www.3pxa.com", "www.4tck.com", "www.5pwc.com", "www.5tck.com", "www.6tck.com", "www.7tck.com", "www.7c0a.com", "www.1tu5.com", "www.wsqap.com", "www.gr2e.com", "www.joerei.com", "www.game1313.net", "www.54k5.com", "www.0niz.com", "www.7k1a.com", "www.1nlm.com"],
        reg: /^https?:\/\/www\.(6evu|6kpo|6vtr|c0h|\dtck|3pxa|5pwc|7c0a|1tu5|wsqap|gr2e|joerei|game1313|54k5|0niz|7k1a|1nlm|1plq|tmm123|wushengguang)\.(com|net|vip|biz)\/\d+\.html/,
        include: "#post_content img,.article-content img,.entry-content img",
        exclude: "//a[@rel='category tag'][contains(text(),'人物简历') or contains(text(),'宅男科技') or contains(text(),'时尚玩酷') or contains(text(),'身边事') or contains(text(),'追星一族') or contains(text(),'网红头条') or contains(text(),'大众娱乐') or contains(text(),'生活热点') or contains(text(),'影评剧透') or contains(text(),'娱乐时尚') or contains(text(),'吃喝玩乐') or contains(text(),'体育') or contains(text(),'亲子宠物') or contains(text(),'番号大全') or contains(text(),'番号推荐') or contains(text(),'最新番号') or contains(text(),'素人番号')]",
        imgs: () => fun.getImgA("#post_content img,.article-content img,.entry-content img", ".pagelist a,.pagination a,.article-paging a"),
        button: [4],
        insertImg: ["#post_content,.article-content,.entry-content", 2],
        autoDownload: [0],
        next: "a[rel=prev],.article-nav-prev a",
        prev: "a[rel=next],.article-nav-next a",
        customTitle: () => fun.gt("h1").replace(/\(\d+P\)/i, "").replace(/无圣光写真福利套图|高品质写真作品收藏合集|超高清绝版网图流出|无圣光私房写真个人分享|无水印私房写真流出|无删减写真作品良心推荐|无删减写真大图流出|无圣光壁纸图片良心推荐|无圣光绝版网图传疯了|无水印私房照片收藏合集|高品质壁纸图片传疯了|高品质壁纸图片珍藏版|无圣光壁纸图片免费在线|无圣光私房写真良心推荐|超高清私家拍摄作品珍藏版|超高清私房照片在线浏览|无圣光写真作品流出|无水印壁纸图片良心推荐|无水印绝版网图在线浏览|无水印私房照片珍藏版|无水印私房照片个人分享/g, "").trim(),
        css: ".article_container{padding:10px 0px!important}#post_content{padding:0px!important}@media only screen and (max-width:640px){.container{max-width:100% !important}}",
        category: "nsfw1"
    }, {
        name: "出物社区写真网",
        host: ["www.ywsq.cc"],
        reg: /^https?:\/\/www\.ywsq\.cc\/[^\/]+\/[^.]+\.html$/,
        imgs: () => fun.getImgA("#post_content img", ".pagelist a"),
        button: [4],
        insertImg: ["#post_content", 2],
        autoDownload: [0],
        next: ".post-previous a",
        prev: ".post-next a",
        customTitle: ".article_container>h1",
        css: ".article_container{padding:10px 0px!important}#post_content{padding:0px!important}@media only screen and (max-width:640px){.container{max-width:100% !important}}",
        category: "nsfw1"
    }, {
        name: "原创妹子图/尤物私房图/极品美女图/免费私房图/私房网红图/尤物妹妹图",
        host: ["www.ycmzt.com", "www.ywsft.com", "www.jpmnt.com", "www.mfsft.com", "www.sfwht.com", "www.ywmmt.com"],
        reg: /www\.(ywmmt|mnwht|ycmeinv|yhsft|yhmnt|mfsft|jpsft|akxzt|flwht|threnti|ywnmt|ztmeinv|mstaotu|tstaotu|ywmtw|mgtaotu|prmzt|xrtaotu|jjtaotu|prmeinv|axtaotu|mgmeinv|xsmeinv|ugtaotu|msmeinv|flxzw|axmeinv|swtaotu|hjtaotu|nsxzw|ugmeinv|hytaotu|xrmeinv|zfmeinv|jpmnt|zttaotu|mfmzt|ykmeinv|qjtaotu|pmtaotu|ddtaotu|plxzw|mfxzt|mtgqt|fltuku|yhtuku|ycmeitu|mttuku|xhtuku|qjtuku|jpflt|ycwht|yctuk|akywt|ywtuk|jctuk|xstuk|xgtuk|mztuk|xztuk|sytuk|gcxzt|tsxzt|gqxzt|mfnmt|spxzt|yhxzt|mtxzt|nsxzt|jdxzt|spmeitu|jpmzw|yhmeitu|mzmeitu|qpmzt|flsft|ywsft|wkmzt|snmzt|thmzt|brtaotu|aimzt|qtmzt|mtmnt|jrmzt|yztaotu|jrmeinv|xsmzt|zbtaotu|yhmnw|zbmzt|xjjtaotu|jpnst|ywmeitu|jrmnt|ftmeinv|xjjmzt|smtaotu|mtywt|sfsnt|jdtaotu|xgyouwu|ywmzt|xgywt|mtflt|nmtaotu|mtmnw|flmeitu|gqtaot|plmeitu|zpmzt|mtmzt|mtwht|sfwht|gqsft|yhmeinv|jdmnt|yctaotu|wkrenti|yzrenti|mtsyt|sptaotu|mttaotu|wsgtu|ywtaotu|sfmzt|sftaotu|gcmeinv|nstaotu|xhtaotu|jdwht|mtmeinv|gqwht|jpywt|jcwht|tptaotu|spyouwu|xgmeitu|nsmeitu|jstaotu|yhtaotu|sytaotu|nsxiez|swmzt|jpmzt|yhflt|sfywt|ywxzt|plmzt|sfmtw|jpyouwu|sfxzt|zftaotu|ycmzt|whtaotu|jpxzt|sftuku|plwht|symzt|sfmnt|sfnmt|jcmeinv|tsmnt|jjmeinv|wsgmzt|gqnmt)\.com\/[a-z]+\/[a-z]+\/\d+\/\d+\.html$/,
        include: "#picg",
        init: () => {
            fun.gae(".b a").forEach(a => a.removeAttribute("target"));
            fun.gae("#picg a").forEach(a => (a.outerHTML = a.innerHTML));
            fun.remove("iframe", 2000);
        },
        imgs: async () => {
            let max = fun.gt(".pagelist font~*:last-child", 2);
            let links = [siteUrl.replace(/(_\d+)?\.html$/, "") + ".html"];
            let imgsArr = [];
            for (let i = 2; i <= max; i++) {
                links.push(siteUrl.replace(/(_\d+)?\.html$/, "") + `_${i}.html`);
            }
            for (let i = 0; i < links.length; i++) {
                let doc = await new Promise(async resolve => {
                    for (let check = 1; check <= 100; check++) {
                        let res = await fetch(links[i]);
                        if (res.status == 304 || res.status == 200) {
                            let buffer = await res.arrayBuffer();
                            let decoder = new TextDecoder(document.characterSet || document.charset || document.inputEncoding);
                            let htmlText = decoder.decode(buffer);
                            let doc = fun.doc(htmlText);
                            resolve(doc);
                            break;
                        } else {
                            fun.showMsg(`第${i + 1}頁${res.status}重試第${check}次`, 2900);
                            await fun.delay(3000, 0);
                        }
                    }
                });
                let imgs = fun.gae("#picg img[alt]", doc);
                let te = fun.gae("#picg img[alt]").at(-1);
                imgs.forEach(e => {
                    imgsArr.push(e.cloneNode(true));
                    if (i != 0) te.parentNode.insertBefore(e.cloneNode(true), te.nextSibling);
                });
                if (i != 0) {
                    let ce = fun.gae("h1,.page .pagelist");
                    let re = fun.gae("h1,.page .pagelist", doc);
                    if (ce.length == re.length) {
                        ce.forEach((e, i) => (e.outerHTML = re[i].outerHTML));
                    }
                }
                await fun.delay(200, 0);
            }
            return imgsArr;
        },
        button: [4],
        insertImg: ["#picg", 2],
        autoDownload: [0],
        next: "//div[@class='b' and contains(text(),'上一')]/a",
        prev: "//div[@class='b' and contains(text(),'下一')]/a",
        customTitle: () => fun.gt("h1").replace(/\s?\[\d+[\.\+\s\w-]+\]|\(\d+[\.\+\s\w-]+\)|\/?(\d+P)?|\|/gi, "").replace(/第\d+页|^- /g, "").trim(),
        topButton: true,
        fancybox: {
            v: 3,
            insertLibrarys: 1
        },
        css: "#imgc img{margin:0px auto!important}#picg{max-width: 1110px!important;margin: 0 auto;}#picg img:hover{transform:none !important}#picg img{filter:blur(0px)!important}body>br,#apic,#bzs7,.interestline+center,center+#pic,#d4a,#divone,#xzpap1,#divpsgx,#bdivpx,#divfts,#divftsp,#app+div,#xzappsq,div.bg-text,#divpsg,#divStayTopright2,#bdssy,#qrcode2>.erweima-text,#qrcode2>center,#qrcode2>center+div,#d5tig,#pcapicb,#google_translate_element,#d5a>*:not([id]):not([class]),.slide>a+div,.slide>img+div,#xtjpp,.interestline+.nav~*:not([id^='pv-']):not([class^='pv-']):not(.pagetual_tipsWords):not(#comicRead):not(#fab):not(.FullPictureLoadMsg):not(.FullPictureLoadFixedBtn):not(#FullPictureLoadOptions):not(#FullPictureLoadFixedMenu):not(*[class^=fancybox]){display:none !important}",
        category: "nsfw2"
    }, {
        name: "魅狸图片网/美女私房照/看妹图",
        host: ["www.rosi8.com", "www.rosi8.net", "www.sfjpg.com", "www.kanmeitu.net", "www.kanmeitu1.cc", "www.kanmeitu1.com", "kanmeitu.net", "kanmeitu1.cc", "kanmeitu1.com"],
        reg: /(www\.rosi\d\.(com|net)|www\.sfjpg\.\w+|kanmeitu\d?\.\w+)\/\w+\/\d+\.html$/,
        include: "#picg img",
        init: () => {
            fun.gae(".b a").forEach(a => a.removeAttribute("target"));
            fun.gae("#picg a").forEach(a => (a.outerHTML = a.innerHTML));
        },
        imgs: () => {
            let max = fun.gt(".pagelist span,.pagelist a[title=Page]").match(/\/(\d+)/)[1];
            return fun.getImgO("#picg img", max, 9, null, 200, ".page .pagelist", siteUrl, 0);
        },
        button: [4],
        insertImg: ["#picg", 2],
        autoDownload: [0],
        next: "//div[@class='b' and contains(text(),'上一')]/a",
        prev: "//div[@class='b' and contains(text(),'下一')]/a",
        customTitle: "h1",
        topButton: true,
        fancybox: {
            v: 3,
            insertLibrarys: 1
        },
        css: "#imgc img{margin:0px auto!important}#picg{max-width: 1110px!important;margin: 0 auto;}#picg img:hover{transform:none !important}#picg img{filter:blur(0px)!important}body>br,.interestline+center,center+#pic,#xzpap1,#divpsgx,#bdivpx,#divfts,#divftsp,#app+div,#xzappsq,div.bg-text,#divpsg,#divStayTopright2,#bdssy,#qrcode2>center,#d5tig,#pcapicb,#pcapic,#google_translate_element,#d5a>*:not([id]):not([class]),union[id]{display:none !important}",
        category: "nsfw2"
    }, {
        name: "六色美图",
        host: ["www.06se.com"],
        reg: /^https?:\/\/www\.06se\.com\/\d+\.html/,
        imgs: ".article-content img",
        button: [4],
        insertImg: [
            [".wp-posts-content", 2, ".wp-posts-content"], 2
        ],
        autoDownload: [0],
        next: "//a[p[text()='上一篇']]",
        prev: "//a[p[text()='下一篇']]",
        customTitle: () => fun.gt(".article-title").replace(/\[\d([/\+\.\w]+)?\]\s?|【\d+P】/i, ""),
        css: ".modal-open{overflow:unset!important;}#modal-system-notice,.container.fluid-widget,#zibpay_modal,#mini-imgbox,.modal-backdrop{display:none!important;}",
        category: "nsfw1"
    }, {
        name: "女神部落",
        host: ["girlsteam.club"],
        reg: () => /^https?:\/\/girlsteam\.club\//.test(siteUrl) && fun.ge("#content img") && fun.ge(".item_title>h1"),
        imgs: "#content img",
        button: [4],
        insertImg: ["#content", 2],
        customTitle: ".item_title>h1",
        category: "nsfw1"
    }, {
        name: "丝袜客",
        host: ["siwake.cc"],
        reg: /^https?:\/\/siwake\.cc\/post\//,
        imgs: ".Content>a",
        button: [4],
        insertImg: [".Content", 2],
        autoDownload: [0],
        next: "a.fas",
        prev: "a.next.fas",
        customTitle: ".title",
        css: "#FullPictureLoadEnd{color:rgb(255, 255, 255)}@media only screen and (max-width:480px){#wrapper  .single{padding:0!important}}",
        category: "nsfw1"
    }, {
        name: "丝袜客 分類自動翻頁",
        enable: 1,
        reg: /^https?:\/\/siwake\.cc\//,
        autoPager: {
            ele: "#main.gallery",
            observer: "#main.gallery>.thumb",
            next: "a.next.fas",
            re: ".pagelist"
        },
        openInNewTab: "#main.gallery a:not([target=_blank])",
        category: "autoPager"
    }, {
        name: "柔丝映画",
        host: ["www.mfpho.com"],
        reg: /^https?:\/\/www\.mfpho\.com\/\d+\.html$/i,
        imgs: () => fun.getImgA(".single-content img", ".page-links a"),
        button: [4],
        insertImg: [".single-content", 2],
        fancybox: {
            v: 3,
            css: false
        },
        category: "nsfw1"
    }, {
        name: "爱妹子",
        host: ["xx.knit.bid", "mm.187187.xyz", "999888.best"],
        reg: /^https?:\/\/(xx\.knit\.bid|mm\.187187\.xyz|999888\.best)\/([\w-]+\/)?article\/\d+\//i,
        init: () => fun.clearAllTimer(2),
        imgs: async () => {
            await fun.getNP(".item-image", ".next-page>a", null, ".pagination");
            return fun.gae(".item-image img,#img-box img");
        },
        button: [4],
        insertImg: [
            [".item-image", 2, ".item-image"], 2
        ],
        customTitle: ".focusbox-title",
        css: "a{white-space:unset!important}",
        category: "nsfw1"
    }, {
        name: "爱妹子 反反廣告提示",
        host: ["xx.knit.bid"],
        reg: /(xx\.knit\.bid|mm\.187187\.xyz|999888\.best)\//,
        init: () => fun.clearAllTimer(2),
        openInNewTab: ".excerpts-wrapper a:not([target=_blank])",
        category: "ad"
    }, {
        name: "美女写真",
        host: ["portrait.knit.bid"],
        reg: () => /portrait\.knit\.bid\/\w+\/\d+$/.test(siteUrl) && fun.ge(".container>.container>img"),
        imgs: async () => {
            let max = fun.gt("//li[a[text()='下页']]", 2);
            let links = fun.arr(max).map((_, i) => siteUrl + "?page=" + (i + 1));
            return fun.getImgA(".container>.container>img", links, 300);
        },
        button: [4],
        insertImg: [
            [".container>.container>nav", 2, "nav[aria-label=pagination],.img-fluid"], 2
        ],
        customTitle: ".container h1",
        category: "nsfw1"
    }, {
        name: "美图网",
        host: ["meitu.knit.bid"],
        reg: () => /^https?:\/\/meitu\.knit\.bid\/(beauty|handsome)\/[^\/]+$/.test(siteUrl) && fun.ge(".details_item>img"),
        imgs: async () => {
            let max = fun.gau("a[href*=gotoPage]").at(-2).match(/\d+/)[0];
            let links = fun.arr(max).map((_, i) => siteUrl + "?page=" + (i + 1));
            return fun.getImgA(".details_item>img", links, 300);
        },
        button: [4],
        insertImg: [".details_item", 2],
        customTitle: () => fun.gt(".text-center>h1").replace("|", "-"),
        category: "nsfw1"
    }, {
        name: "美图网",
        host: ["meitu.knit.bid"],
        reg: /^https?:\/\/meitu\.knit\.bid\/(news|street)\/\d+$/,
        imgs: ".news-body img",
        customTitle: () => fun.gt(".text-center>h1").replace("|", "-"),
        category: "nsfw1"
    }, {
        name: "萌图社",
        host: ["www.446m.com", "446m.com"],
        reg: () => /^https?:\/\/(www\.)?446m\.com\/index\.php\/\w+\/\d+\.html/.test(siteUrl) && fun.ge(".post-content"),
        imgs: "span.post-item",
        button: [4],
        insertImg: [".post-content", 2],
        customTitle: () => document.title.slice(0, -6),
        fancybox: {
            v: 3,
            css: false
        },
        category: "nsfw1"
    }, {
        name: "日式JK",
        host: ["www.jk.rs"],
        reg: /^https?:\/\/www\.jk\.rs\/\d+\/\d+\/\d+\/\d+\.html/,
        imgs: "div[data-fancybox]",
        button: [4],
        insertImg: ["#masonry", 2],
        customTitle: () => fun.title(" - 日式JK"),
        fancybox: {
            v: 3,
            css: false
        },
        css: "#masonry{position:unset!important;height:unset!important}",
        category: "nsfw1"
    }, {
        name: "妹妹美",
        host: ["mmm.red"],
        reg: /(www\.)?mmm\.red\/art\/\d+$/,
        exclude: ".login-tip",
        imgs: "div[data-fancybox][data-src]",
        autoDownload: [0],
        next: "//div[text()='上一篇']/following-sibling::a",
        prev: "//div[text()='下一篇']/following-sibling::a",
        customTitle: ".post-info-text",
        category: "nsfw1"
    }, {
        name: "胴体的诱惑",
        host: ["dongti.blog.2nt.com"],
        reg: /dongti\.blog\.2nt\.com\/blog-entry-\d+.html/,
        imgs: ".inner-contents img",
        button: [4],
        insertImg: [".entry-content", 2],
        autoDownload: [0],
        next: "//a[div[@class='pager_entry-box next-justify']]",
        prev: "//a[div[@class='pager_entry-image-prev']]",
        customTitle: "#entry-title",
        category: "nsfw1"
    }, {
        name: "好圖屋",
        host: ["www.haotuwu.com", "m.haotuwu.com"],
        reg: () => /(www|m)\.haotuwu\.com\/\w+\/\d+(\/page\/\d+)?(\.html)?$/.test(siteUrl) && fun.ge(".suoyou"),
        init: () => {
            let url = location.href;
            if (/\/page\/\d+/.test(url)) location.href = location.href.replace(/\/page\/\d+/, "");
            let a = fun.ge("#showimg a:has(img),.img-box a:has(img)");
            if (a) a.outerHTML = a.innerHTML;
        },
        imgs: () => {
            let links = [siteUrl];
            let url = siteUrl.replace(".html", "");
            let max = fun.gt(".suoyou").match(/\d+\/(\d+)/)[1];
            for (let i = 2; i <= max; i++) {
                links.push(url + "/page/" + i + ".html");
            }
            return fun.getImgA("#showimg img,.img-box img", links, 2);
        },
        button: [4],
        insertImg: ["#showimg,.img-box", 2],
        autoDownload: [0],
        next: "//div[contains(text(),'上一篇')]/a | //span[contains(text(),'上一篇')]/following-sibling::a[1]",
        prev: "//div[contains(text(),'下一篇')]/a | //span[contains(text(),'下一篇')]/following-sibling::a[1]",
        customTitle: ".showtitle>h2,.imgTitle-name",
        css: "#imgshow .flow-box:nth-child(n+1):nth-child(-n+2){display:none!important}",
        category: "nsfw1"
    }, {
        name: "秀色女神",
        host: ["www.xsnvshen.co"],
        reg: /www\.xsnvshen\.(co|com)\/album\/\d+/,
        imgs: () => {
            thumbnailsSrcArray = fun.getImgSrcArr("img[id^='imglist'][data-original]");
            return thumbnailsSrcArray.map(e => e.replace("thumb_600x900/", ""));
        },
        button: [4],
        insertImg: ["//li[img[@id='bigImg']]", 2],
        customTitle: "h1",
        css: ".workShow li img{max-width:100%!important}",
        category: "nsfw1"
    }, {
        name: "秀色女神M",
        host: ["m.xsnvshen.co"],
        reg: /m\.xsnvshen\.(co|com)\/album\/\d+/,
        imgs: async () => {
            let max = fun.gt(".pg_current").match(/\d+$/)[0];
            thumbnailsSrcArray = await fun.getImg("#arcbox img.lazy", max, 6);
            return thumbnailsSrcArray.map(e => e.replace("thumb_600x900/", ""));
        },
        button: [4],
        insertImg: [
            ["#arcbox", 0, "//div[@id='arcbox']/p[img]"], 2
        ],
        customTitle: "h1>a",
        css: "#arcbox img{max-width:100%!important;margin:0px!important;min-height:50px!important;min-width:50px!important}",
        category: "nsfw1"
    }, {
        name: "秀色女神news",
        host: ["www.xsnvshen.co", "m.xsnvshen.co"],
        reg: /^https?:\/\/(www|m)\.xsnvshen\.co\/news\/\d+/,
        imgs: "#arcbox img",
        button: [4],
        insertImg: [
            ["#arcbox>*:first-child", 1, "//p[img]"], 2
        ],
        customTitle: "h1",
        css: "#arcbox img{max-width:100%!important;margin:auto!important;min-height:50px!important;min-width:50px!important}",
        category: "nsfw1"
    }, {
        name: "HotAsiaGirl分頁模式",
        host: ["hotgirl.asia"],
        reg: () => /hotgirl\.asia\/.+\//.test(siteUrl) && fun.ge(".galeria_img"),
        imgs: () => fun.getImgA(".galeria_img>img", ".pagination a[href]"),
        button: [4],
        insertImg: [".mx-auto", 1],
        customTitle: "h3",
        css: ".galeria_img{display:none!important}",
        category: "nsfw2"
    }, {
        name: "HotAsiaGirl幻燈片模式",
        host: ["hotgirl.asia"],
        reg: () => /hotgirl\.asia\/.+\//.test(siteUrl) && fun.ge("#carouselImageIndicators"),
        imgs: "#carouselImageIndicators img",
        button: [4],
        insertImg: [".mx-auto", 2],
        customTitle: "h3",
        css: ".galeria_img{display:none!important}",
        category: "nsfw2"
    }, {
        name: "HotGirl World",
        host: ["www.hotgirl2024.com"],
        reg: /^https?:\/\/www\.hotgirl2024\.com\/g\/\w+\.html\//,
        imgs: () => fun.getImg(".article__image-list img", fun.gt(".pagination__total") || 1),
        button: [4],
        insertImg: [".article__image-list", 2],
        go: 1,
        customTitle: ".article-header__title",
        fancybox: {
            v: 3,
            css: false
        },
        category: "nsfw1"
    }, {
        name: "HotGirl World 分類自動翻頁",
        enable: 1,
        reg: /^https?:\/\/www\.hotgirl2024\.com\/(\?page=\d+)?$|^https?:\/\/www\.hotgirl2024\.com\/(category|agency|tag)\/\d+\.html\/(\?page=\d+)?$|^https?:\/\/www\.hotgirl2024\.com\/search\.html\/\?(page=\d+&)?q=/,
        include: ".pagination",
        init: () => fun.gae(".blur-image").forEach(e => e.classList.remove("blur-image")),
        autoPager: {
            ele: ".articles-grid",
            next: ".pagination__item--active+a",
            re: ".pagination",
            lazySrc: "img[data-src]",
            title: dom => "Page " + fun.gt(".pagination__item--active", 1, dom),
            aF: () => _this.init(),
            bottom: screen.height * 2
        },
        openInNewTab: ".articles-grid a:not([target=_blank])",
        category: "autoPager"
    }, {
        name: "1Y Beauties",
        host: ["www.1y.is"],
        reg: /^https?:\/\/www\.1y\.is\/[\w-]+\/[^\.]+\.html$/,
        imgs: async () => {
            let max;
            try {
                max = fun.gu(".page-links>a:last-child").match(/\d+$/)[0];
            } catch (e) {
                max = 1;
            }
            return fun.getImg(".entry-content img", max);
        },
        capture: () => _this.imgs(),
        customTitle: ".entry-title",
        category: "nsfw1"
    }, {
        name: "BeautyLeg",
        host: ["www.beautyleg6.com"],
        reg: /www\.beautyleg6\.com\/\w+\/\d+\/\d+\.html/i,
        imgs: () => {
            let max;
            try {
                max = fun.gt(".page a").match(/\d+/)[0];
            } catch (e) {
                max = 1;
            }
            return fun.getImg(".contents img[alt]", max, 9);
        },
        button: [4],
        insertImg: [".contents", 2],
        autoDownload: [0],
        next: ".pre>a",
        prev: ".next>a",
        customTitle: ".content>h1",
        css: ".content .contents img{max-width:100%!important}",
        category: "nsfw1"
    }, {
        name: "BeautyLegM",
        host: ["m.beautyleg6.com"],
        reg: /m\.beautyleg6\.com\/view\.php\?aid=\d+/,
        imgs: async () => {
            let links = [siteUrl];
            for (let i = 2; i <= _unsafeWindow.totalpage; i++) {
                links.push(siteUrl + "&pageno=" + i);
            }
            await fun.getEle(links, "#bigImg", ".show-simg", ".show-pages");
            return fun.gae("#bigImg");
        },
        button: [4],
        insertImg: [".show-simg", 2],
        autoDownload: [0],
        next: () => {
            let next = fun.ge("a.f-r.l3");
            return next ? next.href : null;
        },
        prev: 1,
        customTitle: ".showcontbt>h1",
        category: "nsfw1"
    }, {
        name: "Asianude4u",
        host: ["www.asianude4u.net"],
        reg: /www\.asianude4u\.net\/.+\/.+\/(#small-1)?$/,
        exclude: "//a[@rel='category tag' and text()='Videos'] | //a[@rel='category tag' and text()='Madonna-AV']",
        imgs: () => fun.ge(".wp-block-image a[href*=attachment_id]") ? fun.gae(".wp-block-image img[data-id]") : fun.gae(".wp-block-image>a,.mgl-img-container>a,.gallery a").map(e => e.href),
        button: [4],
        //insertImg: ["//li[img[@id='bigImg']]", 1],
        insertImg: [
            ["div.entry>*:last-child", 2], 2
        ],
        go: 1,
        customTitle: "h1.entry-title",
        css: ".single-box,.entry-img-300{display:none!important}@media only screen and (max-width:409px){.entry{width:100%!important}}button.rmp_menu_trigger{z-index:100!important}",
        category: "nsfw1"
    }, {
        name: "NICEGIRL4U",
        host: ["nicegirl4u.cyou"],
        reg: () => /^https?:\/\/nicegirl4u\.cyou\/[^\/]+\/$/.test(siteUrl) && fun.ge(".wp-block-image>img"),
        init: () => fun.remove(".ads_custom"),
        imgs: async () => {
            let pag = fun.ge(".page-links");
            if (pag) {
                let max = fun.gt(".page-links>a:last-child");
                return fun.getImg(".wp-block-image>img", max, 14);
            } else {
                return fun.gae(".wp-block-image>img");
            }
        },
        button: [4],
        insertImg: [
            [".responsive-tabs-wrapper,.entry-meta", 2], 2
        ],
        insertImgAF: () => fun.gae("figure.wp-block-image").forEach(e => (e.outerHTML = "")),
        go: 1,
        customTitle: ".entry-title",
        category: "nsfw1"
    }, {
        name: "Nudegirls4u",
        host: ["nudegirls4u.com"],
        reg: /^https?:\/\/nudegirls4u\.com\/[^\/]+\/$/,
        imgs: ".rgg-imagegrid>a",
        button: [4],
        insertImg: [".rgg-container", 2],
        customTitle: ".entry-title",
        css: ".rgg-imagegrid{height:auto!important}",
        category: "nsfw1"
    }, {
        name: "Chinese Beauties",
        host: ["sxchinesegirlz.one", "sxchinesegirlz01.xyz"],
        reg: /sxchinesegirlz(\d+)?\.\w+\/\d+\/\d+\/\d+\/.+\/$/,
        imgs: () => fun.getImg(".wp-block-image img", fun.gt(".pagination>*:last-child", 2), 4),
        button: [4],
        insertImg: [".thecontent", 2],
        customTitle: "h1.entry-title",
        category: "nsfw2"
    }, {
        name: "爱看 INS",
        host: ["www.ikanins.com"],
        reg: /www\.ikanins\.com\/[\w-]+\//,
        imgs: "img[srcset]",
        button: [4],
        insertImg: [
            [".entry-content", 0, "//p[img]"], 2
        ],
        go: 1,
        autoDownload: [0],
        next: "a[rel=prev]",
        prev: "a[rel=next]",
        customTitle: ".entry-title",
        category: "nsfw1"
    }, {
        name: "好女神网",
        host: ["www.haonvshen.com", "www.nvshen5.com"],
        reg: /(www\.haonvshen\.com|www\.nvshen\d\.com)\/gallery\/\d+\.html/,
        imgs: () => {
            let max;
            fun.ge(".page") ? max = fun.gt(".page").match(/\d+\/(\d+)/)[1] : max = fun.gt("#pages>*:last-child", 3) || 1;
            return fun.getImg("#hgallery>img,#imgwrap img", max, 9);
        },
        button: [4],
        insertImg: ["#hgallery,#imgwrap", 1],
        customTitle: () => fun.title(" - 第1页-美女图片-好女神网"),
        css: ".f_b_c_d{display:none!important}",
        category: "nsfw1"
    }, {
        name: "Jablehk",
        host: ["jablehk.com"],
        reg: /jablehk\.com\/\w+/,
        imgs: ".gallery-strips-lightbox-link>img[data-src]",
        thums: "figure.gallery-strips-item",
        button: [4],
        insertImg: [
            [".gallery-strips-wrapper", 2], 2, 2000
        ],
        autoDownload: [0],
        next: ".item-pagination-link--next",
        prev: ".item-pagination-link--prev",
        go: 1,
        customTitle: "h1>strong",
        category: "nsfw1"
    }, {
        name: "TangMoc",
        host: ["tangmoc.com"],
        reg: /^https?:\/\/tangmoc\.com\/blog\/show\/\w+\/.+/,
        init: () => fun.remove("//div[@class='row mt-3'] | //div[ins[@class='adsbygoogle']] | //div[@class='mt-3'][@id] | //div[@class='row my-5'] | //iframe[@id]"),
        imgs: () => fun.ge(".btn-warning+.btn-secondary") ? fun.getImgA("a[href*=media]>.media-preview", "a.btn-secondary") : fun.gae("a[href*=media]>.media-preview"),
        button: [4],
        insertImg: ["//media[article]", 2],
        go: 1,
        customTitle: "h1",
        category: "nsfw1"
    }, {
        name: "TangMoc去廣告",
        host: ["tangmoc.com"],
        reg: /^https?:\/\/tangmoc\.com\//,
        init: () => fun.addMutationObserver(() => fun.remove("//div[@class='row mt-3'] | //div[ins[@class='adsbygoogle']] | //div[@class='mt-3'][@id] | //div[@class='row my-5'] | //iframe[@id]")),
        category: "ad"
    }, {
        name: "☆ Ảnh đẹp ☆",
        host: ["tuyetnhan.com"],
        reg: /^https?:\/\/tuyetnhan\.com\/[^\/]+\/$/,
        init: () => {
            let ele = fun.ge("//div[@class='entry-content']/p[em]");
            if (ele) {
                let x = fun.ge(".entry-footer,.entry-meta-footer,.related-post");
                x.parentNode.insertBefore(ele, x);
            }
        },
        imgs: ".entry-content img:not(.emoji,[src*=logo])",
        button: [4],
        insertImg: [".entry-content", 2],
        autoDownload: [0],
        next: ".nav-previous>a",
        prev: ".nav-next>a",
        customTitle: ".entry-title",
        category: "nsfw1"
    }, {
        name: "Girls Collection 18+!",
        host: ["gaitrung.lovestoblog.com", "aigirl.lovestoblog.com", "gainhat.lovestoblog.com", "hotpic.lovestoblog.com"],
        reg: [
            /^https?:\/\/gaitrung\.lovestoblog\.com\/[^\/]+\/(\?i=1)?$/,
            /^https?:\/\/aigirl\.lovestoblog\.com\/[^\/]+\/(\?i=1)?$/,
            /^https?:\/\/gainhat\.lovestoblog\.com\/[^\/]+\/(\?i=1)?$/,
            /^https?:\/\/hotpic\.lovestoblog\.com\/[^\/]+\/(\?i=1)?$/

        ],
        imgs: ".entry-content img:not(.emoji,[src*=logo])",
        button: [4],
        insertImg: [".entry-content", 2],
        autoDownload: [0],
        next: ".nav-previous>a",
        prev: ".nav-next>a",
        customTitle: ".entry-title",
        category: "nsfw2"
    }, {
        name: "Fapello",
        host: ["fapello.com"],
        reg: /^https?:\/\/fapello\.com\/[^\/]+\/$/,
        init: async () => {
            if (fun.ge("#showmore")) {
                fun.run("scrollMore=()=>{};");
                let ele = fun.ge("#showmore");
                let max = ele.dataset.max;
                fun.remove("#showmore");
                let links = [];
                for (let i = 2; i <= max; i++) {
                    links.push(siteUrl + `page-${i}/`);
                }
                await fun.getEle(links, "#content>div", ["#content", 0]);
                fun.remove("#next_page");
            }
        },
        imgs: () => {
            let imgSrcs = fun.gae("#content>div").map(node => {
                if (fun.ge("img[src*='icon-play.svg']", node)) {
                    let videoSrc = fun.ge("img", node).src.replace("https://fapello.com/", "https://cdn.fapello.com/").replace("_300px", "").replace(/\.jpg$/i, ".mp4");
                    videosSrcArray.push(videoSrc);
                    return null;
                } else {
                    thumbnailsSrcArray.push(fun.ge("img", node).src);
                    let imgSrc = fun.ge("img", node).src.replace("_300px", "");
                    return imgSrc;
                }
            }).filter(item => item);
            return imgSrcs;
        },
        button: [4],
        insertImg: ["#content", 3],
        downloadVideo: true,
        category: "nsfw2"
    }, {
        name: "Fapello.su",
        host: ["fapello.su"],
        reg: /^https?:\/\/fapello\.su\/[^\/]+\/$/,
        init: async () => {
            let total = Number(fun.gt("//div[strong[text()='Media']]").match(/\d+/)[0]); //媒體總數
            console.log("媒體總數", total);
            const model_bid = fun.lp.replaceAll("/", "");
            let ele = fun.ge("#showmore");
            let max = ele.dataset.max;
            fun.showMsg(displayLanguage.str_05, 0);
            let ajaxNum = 0;
            let resArr = fun.arr(max).map((_, i, arr) => {
                return new Promise(resolve => {
                    $.ajax({
                        url: `/ajax/model_new/${model_bid}/page-${i+1}/photos`,
                        dataType: "html",
                        success: (data) => {
                            fun.showMsg(`${displayLanguage.str_06}${ajaxNum+=1}/${arr.length}`, 0);
                            resolve(data);
                        }
                    });
                });
            });
            let tempDom1;
            let picNum;
            await Promise.all(resArr).then(async arr => {
                await fun.delay(1000, 0);
                fun.hideMsg();
                ajaxNum = 0;
                let html = "";
                arr.forEach(str => (html += str));
                tempDom1 = fun.doc(html);
                picNum = [...tempDom1.images].length; //圖片數量
                console.log("圖片數量", picNum);
                thumbnailsSrcArray = [...tempDom1.images].map(e => e.dataset.src);
                console.log("縮圖地址", thumbnailsSrcArray);
            });
            let videoNum = total - picNum;
            let videoPages = Math.ceil(videoNum / 16);
            fun.showMsg(displayLanguage.str_05, 0);
            let resArr2 = fun.arr(videoPages).map((_, i, arr) => {
                return new Promise(resolve => {
                    $.ajax({
                        url: `/ajax/model_new/${model_bid}/page-${i+1}/videos`,
                        dataType: "html",
                        success: (data) => {
                            fun.showMsg(`${displayLanguage.str_06}${ajaxNum+=1}/${arr.length}`, 0);
                            resolve(data);
                        }
                    });
                });
            });
            let tempDom2;
            await Promise.all(resArr2).then(async arr => {
                await fun.delay(1000, 0);
                fun.hideMsg();
                ajaxNum = 0;
                let html = "";
                arr.forEach(str => (html += str));
                tempDom2 = fun.doc(html);
                let videoUrls = fun.gae("iframe.saint-iframe", tempDom2).map(e => e.src);
                console.log("iframeVideoUrls", videoUrls);
                fun.showMsg(displayLanguage.str_05, 0);
                let getVideoUrlsArr = videoUrls.map((url, i, arr) => {
                    return fun.xhrDoc(url).then(doc => {
                        fun.showMsg(`${displayLanguage.str_06}${ajaxNum+=1}/${arr.length}`, 0);
                        return fun.ge("source[type]", doc)?.src ?? null;
                    });
                });
                await Promise.all(getVideoUrlsArr).then(async mp4Arr => {
                    await fun.delay(1000, 0);
                    mp4Arr = mp4Arr.filter(item => item);
                    fun.hideMsg();
                    console.log("MP4地址", mp4Arr);
                    videosSrcArray = mp4Arr;
                });
            });
        },
        imgs: () => thumbnailsSrcArray.map(e => e.replace(".md.", ".")),
        button: [4],
        insertImg: ["#content", 3],
        insertImgAF: () => {
            fun.run("scrollMore=()=>{};");
            fun.remove("#showmore,#next_page,.content-action-buttons");
        },
        downloadVideo: true,
        threading: 4,
        category: "nsfw2"
    }, {
        name: "Fapachi",
        host: ["fapachi.com"],
        reg: /^https?:\/\/fapachi\.com\/[^\/]+$/,
        imgs: async () => {
            let medias = Number(fun.gt("//p[contains(text(),'Media')]").match(/\d+/)[0]);
            if (medias > 24) {
                let max = Math.ceil(medias / 24);
                let links = fun.arr(max).map((_, i) => siteUrl + "/page/" + (i + 1));
                thumbnailsSrcArray = await fun.getImgA(".model-media-prew img", links);
                return thumbnailsSrcArray.map(e => e.replace("/300px/", "/full/").replace("_300px", ""));
            } else {
                thumbnailsSrcArray = fun.getImgSrcArr(".model-media-prew img");
                return thumbnailsSrcArray.map(e => e.replace("/300px/", "/full/").replace("_300px", ""));
            }
        },
        button: [4],
        insertImg: ["//div[div[contains(@class,'model-media-prew')]]", 3],
        customTitle: "h1",
        category: "nsfw2"
    }, {
        name: "Faponic/Fapellas",
        host: ["faponic.com", "fapellas.com"],
        reg: /^https?:\/\/(faponic\.com|fapellas\.com)\/[^\/]+\/$/,
        init: async () => {
            if (fun.ge("#showmore")) {
                fun.run("scrollMore=()=>{};");
                let ele = fun.ge("#showmore");
                let max = ele.dataset.max;
                fun.remove("#showmore");
                let links = [];
                for (let i = 2; i <= max; i++) {
                    links.push(siteUrl + `page-${i}/`);
                }
                await fun.getEle(links, "#content>div", ["#content", 0]);
                fun.remove("#next_page");
            }
        },
        imgs: () => fun.gae(".photo-item>img").map(e => e.src).reverse(),
        button: [4],
        insertImg: ["#content", 3],
        category: "nsfw2"
    }, {
        name: "The Fappening Plus",
        host: ["thefappening.plus"],
        reg: /^https?:\/\/thefappening\.plus\/[^\/]+\/$/,
        imgs: async () => {
            await fun.getNP(".gallery__item", "//a[text()='Next']", null, ".fusion-meta-info");
            thumbnailsSrcArray = fun.gae(".gallery_thumb").map(e => e.src).reverse();
            return thumbnailsSrcArray.map(e => e.replace(/_s(\.\w+)$/, "$1"));
        },
        button: [4],
        insertImg: [".post-content", 2],
        customTitle: () => fun.gt(".entry-title").replaceAll("/", "-"),
        category: "nsfw2"
    }, {
        name: "TheFappening",
        host: ["thefappeningblog.com"],
        reg: /^https?:\/\/thefappeningblog\.com\/[^\/]+\/(#more-\d+)?$/,
        include: "//a[noscript][not(@class)]",
        imgs: "//a[noscript]",
        button: [4],
        insertImg: [
            ["//a[noscript]", 2, "//a[noscript]"], 2
        ],
        customTitle: ".entry-title",
        category: "nsfw2"
    }, {
        name: "TheFappening",
        host: ["thefappeningblog.com"],
        reg: /^https?:\/\/thefappeningblog\.com\/gallery\/[^\/]+\/$/,
        imgs: async () => {
            await fun.getNP(".item_content", ".nav-next>a", null, ".nav-single");
            thumbnailsSrcArray = fun.gae(".item_img>img").map(e => e.src).reverse();
            return thumbnailsSrcArray.map(e => e.replace(/_\d+px(\.\w+)$/, "$1"));
        },
        button: [4],
        insertImg: [".entry-content", 2],
        customTitle: () => fun.gt(".entry-title").replaceAll("/", "-"),
        category: "nsfw2"
    }, {
        name: "Fapomania",
        host: ["fapomania.com"],
        reg: /^https?:\/\/fapomania\.com\/[^\/]+\/$/,
        init: () => fun.createImgBox(".previzakosblo", 2),
        imgs: async () => {
            const last = doc => {
                let ele = fun.ge(".leftocontar .previzako", doc);
                return ele ? false : true;
            }
            await fun.getNP(".leftocontar .previzako", "//a[contains(text(),'Next')]", last, ".morebutaro");
            thumbnailsSrcArray = fun.gae(".leftocontar .previzakoimag>img:not([src$='videoleaks.png'])").map(e => e.src).reverse();
            return thumbnailsSrcArray.map(e => e.replace(/_\d+px(\.\w+)$/, "$1"));
        },
        button: [4],
        insertImg: [
            ["#FullPictureLoadMainImgBox", 0, ".leftocontar .previzakosblo,.morebutaro"], 2
        ],
        customTitle: () => fun.gt(".leftocontar>h1").replaceAll("/", "-"),
        fancybox: {
            v: 3,
            insertLibrarys: 1
        },
        category: "nsfw2"
    }, {
        name: "NudoStar.TV",
        host: ["nudostar.tv"],
        reg: /^https?:\/\/nudostar\.tv\/models\/[^\/]+\/$/,
        imgs: async () => {
            await fun.getNP("#list_videos_common_videos_list_items>.item", ".next>a", null, "#list_models_models_list_pagination");
            thumbnailsSrcArray = fun.gae("#list_videos_common_videos_list img.thumb").map(e => e.src).reverse();
            return thumbnailsSrcArray.map(e => e.replace(/_\d+px(\.\w+)$/, "$1"));
        },
        button: [4],
        insertImg: [".list-videos", 2],
        customTitle: () => fun.gt(".headline>h1").replaceAll("/", "-"),
        category: "nsfw2"
    }, {
        name: "Nudogram",
        host: ["nudogram.com"],
        reg: /^https?:\/\/nudogram\.com\/models\/[^\/]+\/$/,
        imgs: async () => {
            await fun.getNP("#list_videos_common_videos_list_items>.item", "//li[span]/following-sibling::li[1]/a", null, ".pagination");
            thumbnailsSrcArray = fun.gae("#list_videos_common_videos_list div.img>img").map(e => e.src).reverse();
            return thumbnailsSrcArray.map(e => e.replace(/_\d+(\.\w+)$/, "$1"));
        },
        button: [4],
        insertImg: [".list-videos", 2],
        customTitle: () => fun.gt(".headline>h2").replaceAll("/", "-"),
        category: "nsfw2"
    }, {
        name: "HentaiDude TV",
        host: ["hentaidude.tv"],
        link: "https://hentaidude.tv/category/cosplay/",
        reg: /^https?:\/\/hentaidude\.tv\/\w+\/[^\/]+\/$/,
        imgs: ".entry-content a.swipebox",
        customTitle: ".entry-title",
        category: "nsfw2"
    }, {
        name: "Sankaku Complex",
        host: ["www.sankakucomplex.com"],
        reg: /^https?:\/\/www\.sankakucomplex\.com\/\d+\/\d+\/\d+\/[^\/]+\/$/,
        imgs: ".entry-content a.swipebox",
        customTitle: ".entry-title",
        category: "nsfw2"
    }, {
        name: "Influencers GoneWild",
        host: ["influencersgonewild.com"],
        reg: /^https?:\/\/influencersgonewild\.com\/[^\/]+\/$/,
        include: [
            ".entry-title",
            ".entry-content"
        ],
        imgs: () => {
            videosSrcArray = fun.gae("video>source[type='video/mp4']").map(e => e.src);
            return fun.gae(".entry-content img[data-src]").map(e => fun.lo + e.dataset.src);
        },
        capture: () => _this.imgs(),
        customTitle: ".entry-title",
        downloadVideo: true,
        category: "nsfw2"
    }, {
        name: "Fan Leaks",
        host: ["fanleaks.club"],
        reg: /^https?:\/\/fanleaks\.club\/[^\/]+$/,
        imgs: async () => {
            thumbnailsSrcArray = await fun.getImg("#content img", fun.gt("nav[aria-label=Pagination]>*:last-child", 2) || 1);
            return thumbnailsSrcArray.map(e => e.replace("thumbs/", ""));
        },
        button: [4],
        insertImg: ["#content", 2],
        customTitle: "h1",
        category: "nsfw2"
    }, {
        name: "Thotsbay/Hotleak/Leakedzone",
        host: ["thotsbay.tv", "hotleak.vip", "leakedzone.com"],
        reg: () => /^https?:\/\/(thotsbay\.tv|hotleak\.vip|leakedzone\.com)\/[\w\.]+(\/photo)?$/i.test(fun.url) && !/^\/home/.test(fun.lp),
        init: () => {
            if (location.href.split("/").length == 4) location.href = location.href + "/photo";
        },
        imgs: async () => {
            if (/\/photo/.test(location.href)) fun.clearAllTimer();
            let ptext = fun.gt("#photos-tab");
            let m = ptext.match(/\(([\d\.K]+)\)/)[1];
            let num;
            if (/\./.test(m) && /K/.test(m)) {
                num = (Number(m.replace(/\.|K/g, "")) + 1) * 100;
            } else if (/K/.test(m)) {
                num = Number(m.replace(/K/g, "")) * 1000 + 100;
            } else {
                num = Number(m);
            }
            let pages = Math.ceil(num / 48);
            let actorName = siteUrl.split("/")[3];
            let imgsSrcArr = [];
            let fetchNum = 0;
            fun.showMsg(displayLanguage.str_05, 0);
            for (let i = 1; i <= pages; i++) {
                let json = await fetch(`/${actorName}?page=${i}&type=photos&order=0`, {
                    "headers": {
                        "x-requested-with": "XMLHttpRequest"
                    }
                }).then(res => {
                    fun.showMsg(`${displayLanguage.str_06}${fetchNum+=1}/${pages}`, 0);
                    return res.json();
                });
                if (json.length == 0) break;
                let images;
                if (fun.lh == "leakedzone.com") {
                    images = json.map(e => e.thumbnail.replace("_300.", "."));
                } else {
                    images = json.map(e => e.player);
                }
                let thumbnails = json.map(e => e.thumbnail);
                imgsSrcArr = imgsSrcArr.concat(images);
                thumbnailsSrcArray = thumbnailsSrcArray.concat(thumbnails);
                if (json.length < 48) break;
            }
            return imgsSrcArr;
        },
        button: [4],
        insertImg: ["#photos", 3],
        customTitle: ".actor-name>h1",
        category: "nsfw2"
    }, {
        name: "Hot Girl Pix",
        host: ["www.hotgirlpix.com"],
        reg: /^https?:\/\/www\.hotgirlpix\.com\/p\//,
        imgs: () => fun.getImgA("article img", "#singlePostPagination a", 300),
        button: [4],
        insertImg: ["article", 2],
        customTitle: "#singlePostTitle",
        css: "#modalAdblock,.alignCenter{display:none!important}",
        category: "nsfw1"
    }, {
        name: "Hot Girl Pix",
        host: ["www.hotgirlpix.com"],
        reg: /^https?:\/\/www\.hotgirlpix\.com\//,
        css: "#modalAdblock{display:none!important}",
        category: "ad"
    }, {
        name: "自拍图库",
        host: ["自拍图库.com", "zipaipic.com"],
        reg: () => /\/content_\d+\.html$/.test(siteUrl) && fun.ge("//title[contains(text(),'自拍图库')]"),
        init: () => fun.clearAllTimer(),
        imgs: ".showimg",
        button: [4],
        insertImg: ["#imgviewer", 2],
        go: 1,
        autoDownload: [0],
        next: "//a[text()='下一组']",
        prev: "//a[text()='上一组']",
        customTitle: () => fun.gt(".ttle").replace(/\n|\d+p/gi, "").trim(),
        referer: "",
        css: "a[rel]{display:none!important}",
        category: "nsfw2"
    }, {
        name: "美拍 - 我自拍",
        host: ["5zipai.com", "7aipai.com", "9zipai.net"],
        reg: /^https?:\/\/(\d+aipai\.com|\d+zipai.com|\d+zipai\.net)\/\w+\/\d+\/\d+\.html/i,
        init: () => fun.clearAllTimer(),
        imgs: async () => {
            await fun.waitEle("#showCon img");
            videosSrcArray = fun.gae("#showCon video").map(e => /\.mp4/.test(e.src) ? e.src : null).filter(item => item);
            thumbnailsSrcArray = fun.gae("#showCon img").map(e => /zipai/.test(e.src) ? e.src.replace(/&w=\d+/, "&w=100") : null).filter(item => item);
            return fun.gae("#showCon img").map(e => /zipai/.test(e.src) ? e.src.replace(/&output.+/, "") : null).filter(item => item);
        },
        button: [4],
        insertImg: ["#showCon", 2],
        go: 1,
        autoDownload: [0],
        next: ".article-nav-prev a",
        prev: 1,
        customTitle: ".item_title>h1",
        referer: "",
        css: ".affs{display:none!important}.content_left img{cursor:unset}",
        category: "nsfw2"
    }, {
        name: "吃瓜大队",
        host: ["cgdd.net"],
        reg: /^https?:\/\/cgdd\.net\/\d+\.html$/i,
        imgs: () => {
            videosSrcArray = fun.gae(".article-content video>source").map(e => e.src);
            return fun.gae(".article-content img");
        },
        capture: () => _this.imgs(),
        customTitle: ".article-title>a",
        downloadVideo: true,
        category: "nsfw2"
    }, {
        name: "套圖TAOTU.ORG",
        host: ["taotu.org"],
        reg: () => /^https?:\/\/(\w{2}\.)?taotu\.org\/[\w-]+\//.test(siteUrl) && fun.ge(".piclist"),
        imgs: "a[data-fancybox=gallery]",
        thums: "a[data-fancybox=gallery] img",
        button: [4],
        insertImg: [
            ["#wrapper-footer", 2], 2
        ],
        autoDownload: [0],
        next: ".next a",
        prev: ".prev a",
        customTitle: ".suit_title>h1",
        go: 1,
        css: "#right-bottom,#ad,.ad{display:none!important;}",
        category: "nsfw1"
    }, {
        name: "Taotuxp.com/www.taotucd.com",
        host: ["www.taotucc.com", "www.taotucd.com"],
        reg: /www\.taotuc(c|d)\.com\/\d+\.html/,
        imgs: () => fun.getImg("#post_content img[alt]", fun.gt(".pagelist>*:last-child"), 7),
        button: [4],
        insertImg: ["#post_content", 1],
        autoDownload: [0],
        next: "a[rel=prev]",
        prev: "a[rel=next]",
        customTitle: "h1",
        category: "nsfw1"
    }, {
        name: "MM 范",
        host: ["www.95mm.vip"],
        reg: /www\.95mm\.\w+\/\d+\.html/,
        init: "$(document).unbind('keydown');$(document).unbind('keyup');",
        imgs: () => {
            let max = fun.gt(".post-title").match(/\/(\d+)/)[1];
            return fun.getImg(".post img[alt]", max, 2);
        },
        button: [4],
        insertImg: [".post", 2],
        autoDownload: [0],
        next: "//div[div[text()='上一组']]/preceding-sibling::div/a",
        prev: "//div[div[text()='下一组']]/preceding-sibling::a",
        customTitle: ".post-title",
        category: "nsfw1"
    }, {
        name: "18AV",
        host: ["18av.mm-cg.com"],
        link: "https://18av.mm-cg.com/zh/cg_random/all/index.html",
        reg: /18av\.mm-cg\.com\/(\w{2}\/)?\w+\/\d+\/content\.html|18av\.mm-cg\.com\/.+\.html/,
        include: ".sel_enlarge_page,.sel_enlarge",
        imgs: () => _unsafeWindow.Large_cgurl,
        button: [4],
        insertImg: ["#show_cg_html,#showcg_container", 2],
        customTitle: ".archive-title>h1,h1",
        css: ".ut1_img_content{display:none!important;}",
        category: "nsfw1"
    }, {
        name: "Xgirls",
        host: ["xgirlscollection.com", "img3xgirls.com"],
        reg: /(xgirlscollection\.com|img3xgirls\.com)\/(collection|album)\/\d+/,
        imgs: () => fun.getImg("img[id].collection-image,.album-image[data-pin-media]", (fun.gt(".pagination>*:last-child", 2) || 1)),
        button: [4],
        insertImg: ["//div[img[@data-pin-url]]", 1],
        customTitle: ".container>h1",
        category: "nsfw1"
    }, {
        name: "SexyAsianGirl",
        host: ["www.sexyasiangirl.xyz"],
        reg: /www\.sexyasiangirl\.xyz\/album\/\d+\.html/,
        init: () => fun.remove("//article/div[a[img]]"),
        imgs: () => fun.getImg("img.block", fun.gt("//a[text()='Next']", 2) || 1),
        button: [4],
        insertImg: ["//div[img[@title]]", 2],
        customTitle: "header>h2",
        category: "nsfw2"
    }, {
        name: "尤物丧志/HotAsianX/色图/亚色图库/福利姬美图",
        host: ["youwu.lol", "hotasianx.com", "setu.pics", "yase.pics", "fuligirl.top"],
        reg: [
            /^https:\/\/youwu\.\w+\/albums\//,
            /^https?:\/\/hotasianx\.com\/albums\//,
            /^https?:\/\/setu\.pics\/albums\//,
            /^https?:\/\/yase\.pics\/albums\//,
            /^https?:\/\/fuligirl\.top\/albums\//
        ],
        imgs: () => fun.getImg("img.block", fun.gt("a[rel=next]", 2) || 1),
        button: [4],
        insertImg: ["//div[img[@title]]", 2],
        customTitle: () => fun.gt("#main>h1").replace(/\(\d+[\w\s\\\/\.+-/]+\)?|\[\d+[\w\s\\\/\.+-/]+\]?|(\d+[\w\s\\\/\.+-/]+)?|【\d+[\w\s\\\/\.+-/]+】?|\d+P/gi, "").replace(/未分类性感写真|^.+人体|AI图区/, "").replace(/(\d+月\d+打赏群(自购)?资源)/gi, "").trim(),
        category: "nsfw2"
    }, {
        name: "美图",
        host: ["meitu.neocities.org"],
        reg: /^https?:\/\/meitu\.neocities\.org\/posts\/\w+\/$/i,
        exclude: ".text_mask",
        imgs: ".mb-2>img",
        button: [4],
        insertImg: ["//div[img][@class='mb-2']", 2],
        autoDownload: [0],
        next: "//span[contains(text(),'上一篇')]//following-sibling::a",
        prev: "//span[contains(text(),'下一篇')]/following-sibling::a",
        customTitle: "h1.text-xl",
        category: "nsfw1"
    }, {
        name: "顶尖美女图",
        host: ["djjpg.com"],
        reg: /^https?:\/\/djjpg\.com\/\d+.html/,
        imgs: ".post-countent-data img",
        autoDownload: [0],
        next: "//a[div[h5[text()=' 上一篇']]]",
        prev: "//a[div[h5[text()=' 下一篇']]]",
        customTitle: () => fun.gt(".multi-single-header>h1").replace(/\(\d+\/\d+\)|(\s–\s)?\(\d+P\)/i, "").trim(),
        category: "nsfw1"
    }, {
        name: "秀人图吧",
        host: ["www.502x.com"],
        reg: /^https?:\/\/www\.502x\.com\/\w+\/\d+\.html/,
        //imgs: () => fun.getImg("#image_div img", (fun.gt("a.prev", 2) || 1), 9),
        imgs: () => fun.getImgA("#content img", ".post_au>a"),
        button: [4],
        insertImg: ["#image_div", 2],
        customTitle: ".item_title>h1",
        css: ".affs{display:none!important}.image_div a img{cursor:unset}",
        category: "nsfw1"
    }, {
        name: "OSOSEDKI",
        host: ["ososedki.com"],
        reg: /^https?:\/\/ososedki\.com\/([a-z]{2}\/)?photos\//,
        imgs: () => {
            thumbnailsSrcArray = fun.getImgSrcArr("a[data-fancybox] img").sort((a, b) => a.match(/(\d+)\.\w+$/)[1] - b.match(/(\d+)\.\w+$/)[1]);
            return fun.gau("a[data-fancybox]").sort((a, b) => a.match(/(\d+)\.\w+$/)[1] - b.match(/(\d+)\.\w+$/)[1]);
        },
        button: [4],
        insertImg: ["//div[div[@id='masonry']]", 2],
        customTitle: () => fun.ge("//meta[@property='og:description']").content,
        category: "nsfw2"
    }, {
        name: "COSPLAYASIAN/COSPLAYTHOTS/COSPLAYRULE34/WAIFUBITCHES/COSPLAY BOOBS",
        host: ["cosplayasian.com", "cosplaythots.com", "cosplayrule34.com", "waifubitches.com", "cosplayboobs.com"],
        reg: [
            /^https?:\/\/cosplayasian\.com\/([a-z]{2}\/)?post\/\d+/,
            /^https?:\/\/cosplaythots\.com\/([a-z]{2}\/)?p\/\d+/,
            /^https?:\/\/cosplayrule34\.com\/([a-z]{2}\/)?post\/\d+/,
            /^https?:\/\/waifubitches\.com\/([a-z]{2}\/)?gallery\/\d+/,
            /^https?:\/\/cosplayboobs\.com\/([a-z]{2}\/)?album\/\d+/
        ],
        init: () => fun.createImgBox(".grid", 2),
        imgs: "a[data-fancybox]",
        thums: "a[data-fancybox] img",
        button: [4],
        insertImg: [
            ["#FullPictureLoadMainImgBox", 0, ".grid"], 2
        ],
        customTitle: () => fun.ge("h1.text-uppercase:not(.mt-2)").textContent.replace(/^[\w\s]+:/i, "").trim(),
        category: "nsfw2"
    }, {
        name: "Pack de chicas",
        host: ["packdechicas.net"],
        reg: /^https?:\/\/packdechicas\.net\/[^\/]+\/$/,
        include: ".tiled-gallery__gallery",
        init: () => {
            fun.createImgBox(".entry.themeform");
            let selectors = ["#twitch-embed", "iframe", "marquee", "audio", "img[alt='LOS NECESITOOOOOOOOO']"];
            fun.remove(selectors);
        },
        imgs: () => {
            videosSrcArray = fun.gae("video[src]").map(e => e.src);
            if (fun.ge(".tiled-gallery__gallery img[srcset]")) {
                let srcset = fun.attr(".tiled-gallery__gallery img[srcset]", "srcset");
                if (srcset.includes(",")) {
                    return fun.gae(".tiled-gallery__gallery img[srcset]").map(img => {
                        let srcset = img.getAttribute("srcset");
                        let splitArr = srcset.split(",");
                        splitArr = splitArr.sort((a, b) => a.match(/\s(\d+)w/)[1] - b.match(/\s(\d+)w/)[1]);
                        let src = splitArr.at(-1).trim().split(" ")[0];
                        if (/^https:\/\/i\d\.wp\.com/.test(src)) {
                            return splitArr.at(-1).trim().split(" ")[0].replace(/\?.+$/, "?ssl=1").replace(/-\d+x\d+\./, ".");
                        } else {
                            return src;
                        }
                    });
                }
            }
            if (fun.ge(".tiled-gallery__gallery img[data-orig-file]") && fun.ge(".tiled-gallery__gallery img[data-medium-file]")) {
                return fun.gae(".tiled-gallery__gallery img[data-orig-file]").map(e => e.dataset.origFile);
            } else if (fun.ge(".tiled-gallery__gallery img[data-link]") && fun.ge(".tiled-gallery__gallery img[data-url]")) {
                return fun.gae(".tiled-gallery__gallery img[data-url]").map(e => e.dataset.url.replace(/-\d+x\d+(\.jpg)$/, "$1"));
            } else {
                return [];
            }
        },
        button: [4],
        insertImg: ["#FullPictureLoadMainImgBox", 2],
        go: 1,
        customTitle: "h1.entry-title",
        downloadVideo: true,
        category: "nsfw2"
    }, {
        name: "Pack de chicas AD",
        reg: /^https?:\/\/packdechicas\.net\//,
        init: () => {
            let selectors = ["#twitch-embed", "iframe", "marquee", "audio", "img[alt='LOS NECESITOOOOOOOOO']"];
            fun.remove(selectors);
        },
        category: "ad"
    }, {
        name: "NudoStar",
        host: ["nudostar.com"],
        reg: /^https?:\/\/nudostar\.com\/[^\/]+\//,
        include: "h1.entry-title",
        init: () => fun.createImgBox(".crp_related", 1),
        imgs: "//p/a[img]",
        button: [4],
        insertImg: [
            ["#FullPictureLoadMainImgBox", 0, "//p[a[img]]"], 2
        ],
        go: 1,
        autoDownload: [0],
        next: "a.previous-post",
        prev: "a.next-post",
        customTitle: "h1.entry-title",
        category: "nsfw2"
    }, {
        name: "OnlyFaps",
        host: ["faps.club"],
        reg: /^https?:\/\/faps\.club\/[^\/]+\//,
        include: "h1.entry-title",
        imgs: () => {
            videosSrcArray = fun.gae(".entry-content video>source").map(e => e.src).reverse();
            return fun.gae(".entry-content img[data-srcset]").map(e => {
                let splitArr = e.dataset.srcset.split(",");
                splitArr = splitArr.sort((a, b) => a.match(/\s(\d+)w/)[1] - b.match(/\s(\d+)w/)[1]);
                return splitArr.at(-1).trim().split(" ")[0];
            }).sort((a, b) => a.match(/-(\d+)-/)[1] - b.match(/-(\d+)-/)[1]);
        },
        button: [4],
        insertImg: [
            [".wp-block-image", 2, ".wp-block-image"], 2
        ],
        go: 1,
        autoDownload: [0],
        next: "a.previous-post",
        prev: "a.next-post",
        customTitle: "h1.entry-title",
        downloadVideo: true,
        category: "nsfw2"
    }, {
        name: "ThotBook.tv/Famous Internet Girls",
        host: ["thotbook.tv", "www.famousinternetgirls.com"],
        reg: [
            /^https?:\/\/thotbook\.tv\/[^\/]+\/thotbook\/[\w-]+\/$/,
            /^https?:\/\/www\.famousinternetgirls\.com\/[^\/]+\/[^\/]+\/[^\/]+\/$/
        ],
        include: "video>source,.mace-gallery-teaser",
        imgs: () => {
            videosSrcArray = fun.gae("video>source").map(e => e.src);
            let picArr1 = fun.gae(".entry-featured-media-main[itemprop='image'] meta[itemprop='url']").map(e => e.content);
            if (fun.ge(".mace-gallery-teaser")) {
                let picArr2 = JSON.parse(fun.ge(".mace-gallery-teaser").dataset.g1Gallery).map(e => {
                    if (e.type === "image" && !/18xmob\.png$/.test(e.full)) {
                        return e.full;
                    } else {
                        return null;
                    }
                }).filter(item => item);
                return picArr1.concat(picArr2);
            } else {
                return picArr1;
            }
        },
        button: [4],
        insertImg: [
            [".entry-inner", 0, ".entry-featured-media-main,.entry-content"], 2
        ],
        autoDownload: [0],
        next: "a[rel='prev']",
        prev: "a[rel='next']",
        customTitle: ".entry-title",
        downloadVideo: true,
        category: "nsfw2"
    }, {
        name: "TNApics",
        host: ["www.tnapics.com"],
        reg: /^https:\/\/www\.tnapics\.com\/[\w-]+\/$/,
        imgs: "a[data-fslightbox]",
        customTitle: ".entry-title",
        category: "nsfw2"
    }, {
        name: "EroThots",
        host: ["erothots.co"],
        reg: () => !hasTouchEvents && /^https?:\/\/erothots\.co\/a\/[^\/]+\/[^\/]+/.test(fun.url),
        imgs: () => {
            videosSrcArray = fun.gae("a[data-type='html5video']").map(e => e.dataset.src);
            return fun.gae("a[data-type='image']").map(e => e.dataset.src);
        },
        capture: () => _this.imgs(),
        customTitle: ".head-title",
        downloadVideo: true,
        category: "nsfw2"
    }, {
        name: "Fapdungeon",
        host: ["fapdungeon.com"],
        reg: /^https?:\/\/fapdungeon\.com\/\w+\/[^\/]+\/$/,
        include: ".entry-content img.size-full",
        init: () => fun.addMutationObserver(() => fun.remove("div[class][style*='z-index']")),
        imgs: () => {
            videosSrcArray = fun.gae("video>source").map(e => e.src);
            return fun.gae(".entry-content img.size-full").map(e => e.src);
        },
        capture: () => _this.imgs(),
        customTitle: ".entry-title",
        referer: "https://fapdungeon.com/",
        downloadVideo: true,
        category: "nsfw2"
    }, {
        name: "Ibradome",
        host: ["ibradome.com"],
        reg: /^https?:\/\/ibradome\.com\/\w+\/photos\/\d+\//i,
        imgs: () => {
            let url = fun.gu("a.gallery-view");
            return fun.fetchDoc(url).then(dom => fun.gau("a.ohidden", dom));
        },
        capture: () => _this.imgs(),
        customTitle: ".art-title",
        category: "nsfw2"
    }, {
        name: "Fapopedia",
        host: ["fapopedia.net"],
        reg: () => !hasTouchEvents && /^https?:\/\/fapopedia\.net\/[^\/]+\/$/.test(fun.url) && fun.ge("a[name='photos']"),
        init: () => fun.createImgBox(".shrt-blk", 2),
        imgs: async () => {
            await fun.getNP("//h2[i]/following-sibling::div[1][@class='shrt-blk']/div", "//a[text()='Next ']", null, ".nv-blk");
            thumbnailsSrcArray = fun.gae("//h2[i]/following-sibling::div[1][@class='shrt-blk']//img").map(e => e.src).sort();
            return fun.getImgA(".lrg-pc>a", "//h2[i]/following-sibling::div[1][@class='shrt-blk']//a").then(arr => arr.sort());
        },
        button: [4],
        insertImg: [
            ["#FullPictureLoadMainImgBox", 0, "//h2[i]/following-sibling::div[1][@class='shrt-blk']|//div[@class='nv-blk']"], 2
        ],
        customTitle: "h1",
        category: "nsfw2"
    }, {
        name: "fapfappy",
        host: ["fapfappy.com"],
        reg: /^https?:\/\/fapfappy\.com\/\d+\/\d+\/\d+\/[^\/]+\/$/i,
        imgs: ".myrpf-xph img[data-lazy-src]",
        capture: () => fun.gae(".myrpf-xph img[data-lazy-src]").map(e => e.dataset.lazySrc),
        customTitle: ".entry-title",
        category: "nsfw2"
    }, {
        name: "gotanynudes.com",
        host: ["gotanynudes.com"],
        reg: /^https?:\/\/gotanynudes\.com\/[^\/]+\/$/i,
        imgs: () => {
            videosSrcArray = fun.gae("video>source").map(e => e.src);
            return fun.gae("img[data-lazy-srcset]").map(img => {
                let srcset = img.dataset.lazySrcset;
                let splitArr = srcset.split(",");
                splitArr = splitArr.sort((a, b) => a.match(/\s(\d+)w/)[1] - b.match(/\s(\d+)w/)[1]);
                return splitArr.at(-1).trim().split(" ")[0];
            });
        },
        capture: () => _this.imgs(),
        customTitle: ".entry-title",
        downloadVideo: true,
        referer: "https://gotanynudes.com/",
        category: "nsfw2"
    }, {
        name: "Thotslife.com",
        host: ["thotslife.com"],
        reg: /^https?:\/\/thotslife\.com\/[^\/]+\/$/i,
        imgs: () => {
            videosSrcArray = fun.gae("video>source").map(e => e.src);
            let arr1 = fun.gae(".entry-content img[data-srcset]").map(img => {
                let srcset = img.dataset.srcset;
                let splitArr = srcset.split(",");
                splitArr = splitArr.sort((a, b) => a.match(/\s(\d+)w/)[1] - b.match(/\s(\d+)w/)[1]);
                return splitArr.at(-1).trim().split(" ")[0];
            });
            let arr2 = fun.gae(".entry-content img[data-src]:not([data-srcset])").map(e => e.dataset.src);
            return arr1.concat(arr2);
        },
        capture: () => _this.imgs(),
        customTitle: ".entry-title",
        downloadVideo: true,
        referer: "https://thotslife.com/",
        category: "nsfw2"
    }, {
        name: "Nude Cosplay Albums",
        host: ["nudecosplaygirls.com"],
        reg: /^https?:\/\/nudecosplaygirls\.com\/[^\/]+\/$/,
        include: ".entry-content img.msacwl-img,#post img",
        imgs: ".entry-content img.msacwl-img,#post img",
        button: [4],
        insertImg: [".entry-content,#post", 2],
        customTitle: ".entry-title",
        css: ".entry-content>img{width:auto!important;height:auto!important;max-width:100%!important;display:block!important;margin:0 auto !important}#secondary{display:none!important}h1.g1-mega{text-align:center}",
        category: "nsfw2"
    }, {
        name: "Jizz to Nude Girls",
        host: ["jizzy.org"],
        reg: /^https?:\/\/jizzy\.org\/[^\/]+\/$/,
        include: ".post-card__image",
        imgs: ".post-card__image",
        button: [4],
        insertImg: [".entry-content", 2],
        customTitle: ".entry-title",
        category: "nsfw2"
    }, {
        name: "VoyeurFlash.com",
        host: ["voyeurflash.com"],
        reg: /^https?:\/\/voyeurflash\.com\/[^\/]+\/$/,
        include: ".gallery_thumb",
        imgs: ".gallery_thumb",
        button: [4],
        insertImg: [".entry-content", 2],
        customTitle: () => fun.gt(".entry-title").replaceAll("/ ", ""),
        category: "nsfw2"
    }, {
        name: "Leaked Models",
        host: ["leakedmodels.com"],
        reg: /^https?:\/\/leakedmodels\.com\/[^\/]+\/$/,
        include: "//a[span[@class='faux-button'][text()='View']][@class='more-link']",
        init: () => fun.createImgBox("#site-content", 2),
        imgs: () => {
            thumbnailsSrcArray = fun.getImgSrcArr("img.size-large").sort();
            let links = fun.gau("//a[span[@class='faux-button'][text()='View']][@class='more-link']");
            return fun.getImgA("img.wp-image", links).then(arr => arr.sort());
        },
        button: [4],
        insertImg: ["#FullPictureLoadMainImgBox", 2],
        customTitle: () => fun.gt(".entry-title").replace("/ ", ""),
        category: "nsfw2"
    }, {
        name: "ThotHD Albums / Thothub Albums",
        host: ["thothd.com", "thothub.to"],
        reg: [
            /^https?:\/\/thothd\.com\/([a-z]{2}\/)?albums\/\d+\/[^\/]+\/$/,
            /^https?:\/\/thothub\.to\/albums\/\d+\/[^\/]+\/$/
        ],
        include: "a[data-fancybox-type]",
        imgs: "a[data-fancybox-type]",
        thums: "a[data-fancybox-type] .thumb",
        button: [4],
        insertImg: [".images", 2],
        customTitle: "h1",
        category: "nsfw2"
    }, {
        name: "The Hentai World",
        host: ["thehentaiworld.com"],
        link: "https://thehentaiworld.com/hentai-cosplay-images/",
        reg: /^https?:\/\/thehentaiworld\.com\/[^\/]+\/[^\/]+\/$/,
        include: "#miniThumbContainer",
        init: () => fun.createImgBox("#miniThumbContainer", 2),
        imgs: () => {
            thumbnailsSrcArray = fun.getImgSrcArr("#miniThumbContainer img[itemprop='thumbnail']");
            return thumbnailsSrcArray.map(e => e.replace(/-\d+x\d+(\.\w+)/, "$1"));
        },
        button: [4],
        insertImg: [
            ["#FullPictureLoadMainImgBox", 0, "#miniThumbContainer,#doujin,div.ad"], 2
        ],
        customTitle: "h1",
        category: "nsfw2"
    }, {
        name: "Cosplayers GoneWild",
        host: ["cosplayersgonewild.net"],
        reg: /^https?:\/\/cosplayersgonewild\.net\/albums\/\d+\/$/,
        init: async () => {
            await fun.waitEle("#main-carousel-list img");
            fun.createImgBox(".grid", 2);
        },
        imgs: "#main-carousel-list img",
        button: [4],
        insertImg: ["#FullPictureLoadMainImgBox", 2],
        customTitle: "h1.text-3xl",
        category: "nsfw1"
    }, {
        name: "Share Cosplay",
        host: ["sharecosplay.com"],
        reg: /^https?:\/\/sharecosplay\.com\/(zh|en)\/cosplay\/\d+$/,
        init: async () => await fun.waitEle("img[variant='thumbnail']"),
        imgs: () => {
            let src = fun.attr("img[variant='thumbnail']", "src");
            let srcKey = src.split("/").at(-1);
            let code = fun.gst(srcKey);
            let imgKeys;
            if (/coverColumn/.test(code)) {
                imgKeys = code.match(/\\"images\\":\\"(\[[^\]]+\])/)[1].replaceAll("\\", "");
            } else {
                imgKeys = code.slice(23, -3).replaceAll("\\", "");
            }
            let imgKeysArr = JSON.parse(imgKeys);
            return imgKeysArr.map(key => "https://image.sharecosplay.com/" + key);
        },
        button: [4],
        insertImg: ["//div[@class='flex flex-col items-center'][div[div[a[img]]]] | //div[@class='flex flex-col items-center'][div[div[img]]]", 2, 1000],
        customTitle: ".justify-between h2",
        viewMode: 1,
        category: "nsfw1"
    }, {
        name: "Nude Bird/Nude Cosplay",
        host: ["nudebird.biz", "nudecosplay.biz"],
        reg: () => /^https?:\/\/nudecosplay\.biz\/[^\/]+\/$|^https?:\/\/nudebird\.biz\/[^\/]+\/$/.test(siteUrl) && fun.ge("//p[a[img]]"),
        init: () => {
            let video = fun.ge(".online-video");
            if (video) {
                let x = fun.ge("//p[a[img]]");
                fun.gae(".online-video").forEach(e => x.parentNode.insertBefore(e, x));
            }
        },
        imgs: ".thecontent a,.content-inner>p>a",
        button: [4],
        insertImg: ["//p[a[img]]", 2],
        customTitle: () => fun.gt("h1").replace(/\/nudecosplay\.biz\//, "").replace(/\[\d+[\w\s\.\+-]+\]/i, "").trim(),
        category: "nsfw1"
    }, {
        name: "Cosplaytele",
        host: ["cosplaytele.com"],
        reg: () => /cosplaytele\.com\/[^/]+\//.test(siteUrl) && fun.ge("figure.gallery-item"),
        imgs: "figure.gallery-item a",
        button: [4],
        insertImg: [".gallery", 2],
        customTitle: () => fun.gt("h1.entry-title").replace(/\s?“[^”]+”/, "").trim(),
        css: "#FullPictureLoadEnd{color:rgb(255, 255, 255)}",
        category: "nsfw2"
    }, {
        name: "JimmysOnline.com",
        host: ["www.jimmysonline.com"],
        reg: /^https?:\/\/www\.jimmysonline\.com\/[^\/]+\/$/,
        include: "a.aigpl-img-link[data-mfp-src]",
        imgs: () => fun.gae("a.aigpl-img-link[data-mfp-src]").map(a => a.dataset.mfpSrc),
        button: [4],
        insertImg: [".aigpl-gallery", 2],
        customTitle: ".entry-title",
        category: "nsfw2"
    }, {
        name: "gaidam18",
        host: ["gaidam18.com"],
        reg: () => /^https?:\/\/gaidam18\.com\/[^\/]+\/$/.test(siteUrl) && fun.ge("figure.gallery-item,.entry-content>div>a[href*='blogger'],.entry-content img[src*='/wp-content/uploads/']"),
        imgs: () => {
            if (fun.ge(".gallery-item img")) {
                return fun.gae(".gallery-item img");
            } else if (fun.ge(".entry-content>div>a[href*='blogger']")) {
                return fun.gae(".entry-content>div>a[href*='blogger']").map(a => {
                    let url = a.href;
                    let urlArr = url.split("/");
                    urlArr[urlArr.length - 2] = "s16000";
                    return urlArr.join("/");
                });
            } else if (fun.ge(".entry-content img[src*='/wp-content/uploads/']")) {
                return fun.gae(".entry-content img[src*='/wp-content/uploads/']");
            } else {
                return [];
            }
        },
        button: [4],
        insertImg: [".gallery,.entry-content", 2],
        customTitle: () => fun.gt("h1.entry-title").replace("Ảnh sex ", "").replace(/\s?“[^”]+”|\(\d+ Pics\)/, "").trim(),
        css: "[class^='float']{display:none!important;}",
        category: "nsfw2"
    }, {
        name: "Cosplay69",
        host: ["www.cosplay69.net", "cosplay69.net"],
        reg: /^https?:\/\/(www\.)?cosplay69\.net\/[^\/]+\/$/,
        include: "a[data-fancybox],.gallery-item a,.entry-content img[alt]",
        init: () => {
            fun.addMutationObserver(() => {
                document.documentElement.style.overflow = "";
                document.body.classList.remove("has-header-ad", "tie-popup-is-opend");
                fun.remove("#tie-popup-adblock");
            });
            let iframe = fun.ge(".iframe-container,iframe[scrolling]");
            if (iframe) {
                let x = fun.ge(".entry-content");
                fun.gae(".iframe-container,iframe[scrolling]").forEach(e => x.parentNode.insertBefore(e, x));
            }
        },
        imgs: () => fun.fetchDoc(fun.url).then(dom => fun.gae("a[data-fancybox],.gallery-item a,.entry-content img[alt]", dom)),
        button: [4],
        insertImg: [".entry-content", 2],
        autoDownload: [0],
        next: ".nav-previous>a",
        prev: ".nav-next>a",
        customTitle: "h1.entry-title",
        category: "nsfw2"
    }, {
        name: "Cosplay69",
        reg: /^https?:\/\/(www\.)?cosplay69\.net\//,
        init: () => {
            fun.addMutationObserver(() => {
                document.documentElement.style.overflow = "";
                document.body.classList.remove("has-header-ad", "tie-popup-is-opend");
                fun.remove("#tie-popup-adblock");
            });
        },
        category: "ad"
    }, {
        name: "X Cosplay",
        host: ["xcosplay.top"],
        reg: /xcosplay\.top\/\d+\/\d+\/\d+\//,
        imgs: ".galeria_img>img",
        button: [4],
        insertImg: [".entry-content", 2],
        autoDownload: [0],
        next: "a[rel=prev]",
        prev: "a[rel=next]",
        customTitle: "h1.entry-title",
        category: "nsfw1"
    }, {
        name: "CG Cosplay",
        host: ["cgcosplay.org"],
        reg: /^https?:\/\/cgcosplay\.org\/\d+\/$/,
        init: () => {
            let video = fun.ge(".fluid_video_wrapper");
            if (video) {
                let x = fun.ge(".gallery");
                fun.gae(".fluid_video_wrapper").forEach(e => x.parentNode.insertBefore(e, x))
            }
        },
        imgs: ".gallery a",
        button: [4],
        insertImg: [".gallery", 2],
        autoDownload: [0],
        next: ".nav-previous a[rel=prev]",
        prev: ".nav-next a[rel=next]",
        customTitle: ".elementor-heading-title",
        category: "nsfw1"
    }, {
        name: "AsiaOnTop",
        host: ["asiaontop.com", "asiaon.top"],
        reg: () => /^https?:\/\/(asiaontop\.com|asiaon\.top)\/[^\/]+\/$/.test(siteUrl) && fun.ge(".modula-items"),
        init: () => fun.addMutationObserver(() => fun.remove("#mdpDeblocker-css")),
        imgs: "a[data-image-id]",
        button: [4],
        insertImg: [
            [".modula-items", 2, ".modula-items"], 2
        ],
        autoDownload: [0],
        next: "a#prepost",
        prev: "a#nextpost",
        customTitle: () => fun.gt(".single_post_title_main").replace(":", " -"),
        go: 1,
        category: "nsfw2"
    }, {
        name: "AsiaOnTop",
        reg: /^https?:\/\/(asiaontop\.com|asiaon\.top)\//,
        init: () => fun.addMutationObserver(() => fun.remove("#mdpDeblocker-css")),
        css: ".mdpDeblocker-wrapper,.mdpDeblocker-blackout.active{display:none!important;}[data-aos^=fade][data-aos^=fade]{opacity:1!important;transition-property:unset!important}[data-aos=fade-up]{transform:unset!important}",
        category: "ad"
    }, {
        name: "Mitaku",
        host: ["mitaku.net"],
        reg: /^https?:\/\/mitaku\.net\/.+\/.+\/$/,
        imgs: () => fun.ge("a.msacwl-img-link[data-mfp-src]") ? fun.gae("a.msacwl-img-link[data-mfp-src]").map(a => a.dataset.mfpSrc).slice(1, -1) : fun.gae(".msacwl-img").slice(1, -1),
        button: [4],
        insertImg: [
            [".article-content", 2], 2
        ],
        go: 1,
        autoDownload: [0],
        next: ".previous>a",
        prev: ".next>a",
        customTitle: () => fun.gt("h1.entry-title").replace(/.[\smitaku]{6,7}\.net./, "").trim(),
        downloadVideo: true,
        category: "nsfw2"
    }, {
        name: "Cosplay World",
        host: ["cosplayworld.net"],
        reg: () => /^https?:\/\/cosplayworld\.net\/[^\/]+\/$/.test(siteUrl) && fun.ge(".entry-content"),
        imgs: () => {
            videosSrcArray = fun.gae("video.lazy").map(e => e.dataset.src ?? e.src);
            return fun.gae(".entry-content img");
        },
        button: [4],
        insertImg: [".entry-content", 2],
        go: 1,
        autoDownload: [0],
        next: ".g1-nav-single-prev a",
        prev: ".g1-nav-single-next a",
        customTitle: () => fun.gt(".entry-inner .entry-title").replace(/.mitaku\.net./, "").trim(),
        category: "nsfw2"
    }, {
        name: "Byoru",
        host: ["byoru.net"],
        reg: /^https?:\/\/byoru\.net\/[^\/]+\/$/,
        init: () => {
            let eles = fun.gae("//p[contains(text(),'Download')] | //p[contains(text(),'Password')]");
            if (eles.length > 0) {
                let x = fun.ge(".s-post-content");
                for (let e of eles) {
                    x.parentNode.insertBefore(e, x);
                }
            }
        },
        imgs: () => {
            if (fun.ge(".msacwl-slide>a")) {
                return fun.gae(".msacwl-slide>a").map(a => a.dataset.mfpSrc).sort((a, b) => a.match(/(\d+)\.\w+$/)[1] - b.match(/(\d+)\.\w+$/)[1]);
            } else if (fun.ge("figure.wp-block-image img[data-src]")) {
                return fun.gae("figure.wp-block-image img[data-src]").map(e => e.dataset.src.replace(/-\d+x\d+(\.\w+)/, "$1")).sort((a, b) => {
                    try {
                        return a.match(/(\d+)\.\w+$/)[1] - b.match(/(\d+)\.\w+$/)[1];
                    } catch (e) {
                        try {
                            return a.match(/\((\d+)\)\.\w+$/)[1] - b.match(/\((\d+)\)\.\w+$/)[1];
                        } catch (e) {
                            return a;
                        }
                    }
                });
            } else if (fun.ge(".galeria_img>img")) {
                return fun.gae(".galeria_img>img");
            } else if (fun.ge(".s-post-content img[title][data-lazyloaded]")) {
                return fun.gae(".s-post-content img[title][data-lazyloaded]").map(e => e.src);
            } else {
                return [];
            }
        },
        button: [4],
        insertImg: [".s-post-content", 2],
        autoDownload: [0],
        next: "a.next-page-link",
        prev: "a.prev-page-link",
        customTitle: () => fun.gt("h1.entry-title").replace(/Byoru – | \(Cosplay\)/g, ""),
        category: "nsfw1"
    }, {
        name: "NudesLegion",
        host: ["nudeslegion.com"],
        reg: () => /nudeslegion.com\/[^\/]+\/$/.test(siteUrl) && fun.ge(".msacwl-slider-wrap"),
        imgs: () => fun.gae(".msacwl-img").slice(1, -1),
        button: [4],
        insertImg: [
            [".msacwl-slider-wrap", 2], 2
        ],
        customTitle: "h1.entry-title",
        css: "footer+script+div[id]{display:none!important}",
        category: "nsfw2"
    }, {
        name: "Hình ảnh gái",
        host: ["hinhanhgai.com"],
        reg: /^https?:\/\/hinhanhgai\.com\/image\/\d+$/,
        include: "//script[contains(text(),'full_url')]",
        imgs: () => {
            /*
//字串取得圖片網址
const code = [...document.scripts].find(s => s.innerHTML.includes("full_url")).innerHTML;
const matchObj = code.matchAll(/full_url="([^"]+)"/g);
return [...matchObj].map(arr => arr[1].replaceAll("\\u002F", "/"));
            */
            const files = Object.values(_unsafeWindow.__NUXT__.data).find(obj => !!obj.files).files;
            return files.filter(item => !!item.full_url).map(item => item.full_url);
        },
        capture: () => _this.imgs(),
        autoDownload: [0],
        next: () => {
            let next = fun.ge("a.next[href^='/image/']");
            return next ? next.href : null;
        },
        prev: 1,
        customTitle: "h1.title",
        css: "#m_website_float,#m_website_center,#m_image_content_title,.aside_right_ad,#p_image_content_title,#p_website_float,#p_website_center,#p_website_right_float{display:none!important;}",
        category: "nsfw1"
    }, {
        name: "Hình ảnh gái",
        host: ["hinhanhgai.com"],
        reg: /^https?:\/\/hinhanhgai\.com\/article\//,
        include: "//script[contains(text(),'content')]",
        imgs: ".content img",
        capture: ".content img",
        customTitle: "h1.title",
        css: "#m_website_float,#m_website_center,#m_image_content_title,.aside_right_ad,#p_image_content_title,#p_website_float,#p_website_center,#p_website_right_float{display:none!important;}",
        category: "nsfw1"
    }, {
        name: "Hình ảnh gái 廣告",
        reg: /^https?:\/\/hinhanhgai\.com\//,
        css: "#m_website_float,#m_website_center,#m_image_content_title,.aside_right_ad,#p_image_content_title,#p_website_float,#p_website_center,#p_website_right_float{display:none!important;}",
        category: "ad"
    }, {
        name: "Gai.vn",
        host: ["www.gai.vn"],
        reg: /^https?:\/\/www\.gai\.vn\/[\w-]+$/,
        include: [
            "#content .gai-thumb>.vn-box",
            "a[data-fancybox='slide']"
        ],
        imgs: async () => {
            await fun.getNP(".gai-thumb", "li.page-item.active+li:not(.disabled)>a");
            fun.remove("//div[nav[@aria-label='Page navigation']]");
            return fun.gae("a[data-fancybox='slide']");
        },
        button: [4],
        insertImg: ["#content", 2],
        customTitle: ".nav-breadcrumb>.nav-breadcrumb-item:last-child",
        fancybox: {
            blacklist: 1
        },
        category: "nsfw1"
    }, {
        name: "imgcup.com",
        host: ["imgcup.com"],
        reg: /^https?:\/\/imgcup\.com\/[^\.]+\.html$/,
        init: () => fun.createImgBox(".penci-post-gallery-container", 2),
        imgs: ".item-gallery-masonry>a",
        thums: ".item-gallery-masonry>a img",
        button: [4],
        insertImg: [
            ["#FullPictureLoadMainImgBox", 0, ".penci-post-gallery-container"], 2
        ],
        autoDownload: [0],
        next: ".prev-post-inner>a",
        prev: ".next-post-inner>a",
        customTitle: ".entry-title",
        category: "nsfw1"
    }, {
        name: "Nude Babes",
        host: ["www.mzpic.com"],
        reg: /^https?:\/\/www\.mzpic\.com\/\d+\.html$/,
        init: () => fun.remove(".hide-img"),
        imgs: async () => {
            await fun.getNP("//div[@class='single-content']/p[img]", "//span[@class='post-page-numbers current']/following-sibling::a[1][span[@class='next-page']]", null, ".page-links");
            return fun.gae(".single-content img");
        },
        button: [4],
        insertImg: [".single-content", 2],
        customTitle: ".entry-title",
        fancybox: {
            v: 3,
            css: false
        },
        autoClick: ".s-hide",
        category: "nsfw1"
    }, {
        name: "MissKON.com",
        host: ["misskon.com"],
        reg: /^https?:\/\/misskon\.com\/[^\/]+\/$/,
        imgs: () => fun.getImg(".entry img[decoding]", fun.gt(".page-link>*:last-child"), 4),
        button: [4],
        insertImg: ["//p[img[@decoding]]", 2],
        go: 1,
        customTitle: () => fun.gt("h1").replace(/\(\d+\s?photos?\s?(\+\s?\d+\s?videos?)?\)/gi, "").trim(),
        category: "nsfw1"
    }, {
        name: "Xiuren",
        host: ["xiuren.biz"],
        reg: () => /^https?:\/\/xiuren\.biz\/[^\/]+\//.test(siteUrl) && fun.ge(".content-inner a[data-lbwps-srcsmall],.content-inner a[rel=noopener]"),
        imgs: ".content-inner a[data-lbwps-srcsmall],.content-inner a[rel=noopener]",
        button: [4],
        insertImg: [".content-inner", 2],
        autoDownload: [0],
        next: "a.post.prev-post",
        prev: "a.post.next-post",
        customTitle: "h1.jeg_post_title",
        category: "nsfw1"
    }, {
        name: "4KHD",
        host: ["www.4khd.com", "www.4kep.com", "xjav.cc", "hhhy.quest", "vxkk.cc", "rtlvmk.xxtt.info", "lfdxxb.xxtt.info"],
        reg: () => (/^\/\d+\/\d+\/\d+\/[^\.\/]+\.html$/.test(fun.lp) || /^\/content\/\d+\/[^\.\/]+\.html$/.test(fun.lp)) && fun.ge("//a[@rel='home'][text()='4KHD']"),
        imgs: async () => {
            thumbnailsSrcArray = await fun.getImgA("figure.wp-block-image>a>img,#basicExample>a>img,.entry-content>p>a>img", ".page-link-box a").then(arr => arr.map(e => e.replace(/\?w=\d+$/, "?w=100")));
            return thumbnailsSrcArray.map(e => e.replace(/\/w\d+-rw\//, "/w7680-rw/").replace("?w=100", ""));
        },
        button: [4],
        insertImg: [
            [".page-link-box,.wp-block-post-content>*:last-child,#khd", 1, "#basicExample,.wp-block-image,.entry-content>p:not(#FullPictureLoadEnd),.page-link-box"], 2
        ],
        //autoDownload: [0],
        //next: ".post-navigation-link-previous>a",
        //prev: ".post-navigation-link-next>a",
        customTitle: () => fun.gt("h3.wp-block-post-title").replace(/\[\d+[\w\s\.\+-]+\]|\(\d+[\w\s\.\+-]+\)/gi, "").trim(),
        //fetch: 1,
        //threading: 4,
        css: ".centbtd,.popup,.wp-container-13{display:none!important}.FullPictureLoadImage{max-width:100%!important}",
        category: "nsfw2"
    }, {
        name: "AsianPink",
        host: ["asianpink.net"],
        reg: /^https?:\/\/asianpink\.net\/[^\/]+\/$/,
        imgs: "a.e-gallery-item",
        button: [4],
        insertImg: ["//div[div[a[contains(@class,'e-gallery-item')]]][@class='elementor-widget-container']", 2],
        go: 1,
        autoDownload: [0],
        next: "a[rel=prev]",
        prev: "a[rel=next]",
        customTitle: "h1.elementor-heading-title",
        category: "nsfw1"
    }, {
        name: "Buon Dua",
        host: ["buondua.com", "buondua.us"],
        init: () => {
            fun.remove("//div[text()='Sponsored ads']");
            fun.remove(".search-form~*");
        },
        reg: /buondua\.(com|us)\/(?!hot|tag|collection)[^\?]+$/,
        imgs: () => fun.getImg(".article-fulltext img[alt]", fun.gt(".pagination-list>span:last-child>a").match(/\d+/)[0]),
        button: [4],
        insertImg: [".article-fulltext", 1],
        customTitle: () => fun.gt(".article-header>h1").replace(/\(\d+\s?photos\s?\)/i, "").trim(),
        category: "nsfw2"
    }, {
        name: "BaoBua.Com",
        host: ["baobua.com"],
        reg: /^https?:\/\/baobua\.com\/post\/\w+\.html/i,
        imgs: async () => {
            let max;
            try {
                max = fun.gt(".article-header>h1").match(/Page\s?\d+\/(\d+)/i)[1];
            } catch (e) {
                max = 1;
            }
            return /\?m=1/.test(siteUrl) ? await fun.getImg(".contentme img", max, "8") : await fun.getImg(".contentme img", max);
        },
        button: [4],
        insertImg: [".contentme", 2],
        customTitle: () => fun.gt(".article-header>h1").split("|")[0].trim(),
        category: "nsfw2"
    }, {
        name: "BaoBua.Net",
        host: ["www.baobua.net"],
        reg: /www\.baobua\.net\/post\/.+/,
        imgs: () => fun.getImg(".wp-block-image img[alt]", (fun.gt(".nav-links>*:last-child") || 1), 6),
        button: [4],
        insertImg: [".entry-content.read-details", 2],
        customTitle: () => fun.title("|", 1),
        category: "nsfw2"
    }, {
        name: "blog.baobua.net",
        host: ["www.baobua.net"],
        reg: /(blog|fb|vn)\.baobua\.net\/\w+\/.+/,
        imgs: "a.fancybox",
        button: [4],
        insertImg: [".article-body", 2],
        customTitle: () => fun.title("@BaoBua", 1),
        css: "#fix_scale img:hover{transform:none!important}",
        category: "nsfw2"
    }, {
        name: "HOTGIRLchina格式",
        host: ["hotgirlchina.com", "cutexinh.com", "babeasia.com", "anhnguoimau.com", "nongbong.com", "anhnguoidep.com", "anhdoitruy.com", "anhnguoilon.com"],
        reg: [
            /(hotgirlchina\.com|cutexinh\.com)\/.+(photos?|videos?|anh)?\/?/,
            /^https?:\/\/babeasia\.com\/\d+\//,
            /^https?:\/\/anhnguoimau\.com\/\d+\/[^\/]+\/$/,
            /^https?:\/\/nongbong\.com\/[^\/]+\/$/,
            /^https?:\/\/anhnguoidep\.com\/[^\/]+\/$/,
            /^https?:\/\/anhdoitruy\.com\/[^\/]+\/$/,
            /^https?:\/\/anhnguoilon\.com\/[^\/]+\/$/,
        ],
        include: ".entry-inner img[alt]",
        init: () => {
            let share = fun.ge(".entry.share");
            if (share) share.classList.remove("share");
        },
        imgs: () => {
            let max;
            try {
                max = fun.gt("span.pages").match(/\d+$/)[0];
            } catch (e) {
                max = 1
            }
            return fun.getImg(".entry-inner img[alt]", max, 4);
        },
        button: [4],
        insertImg: [
            [".pagination", 1, ".entry-inner>p:not(#FullPictureLoadEnd),.separator"], 2
        ],
        customTitle: () => fun.gt(".post-title").replace(/\(\d+\s?photos\s?\)|(\s?\(\d+\s?photos?\s?\+\s?\d+\s?videos?\))|\([0-9\s]+ảnh[0-9\s\+]+video\)|\([0-9\s]+ảnh.*\)|\/mitaku\.net\//i, "").trim(),
        css: ".boxzilla-container,.boxzilla-overlay,.sharrre-container{display:none!important}",
        category: "nsfw1"
    }, {
        name: "HOTGIRLchina 格式 AD",
        reg: /(hotgirlchina\.com|cutexinh\.com|babeasia\.com|anhnguoimau\.com|nongbong\.com|anhnguoidep|anhnguoilon\.com)\//,
        css: ".boxzilla-container,.boxzilla-overlay,.sharrre-container{display:none!important}",
        category: "ad"
    }, {
        name: "FoamGirl",
        host: ["foamgirl.net"],
        reg: /foamgirl\.net\/\d+\.html/,
        imgs: () => {
            let max;
            try {
                max = fun.gt(".mbx-nav-right").match(/\d+\/(\d+)/)[1];
            } catch (e) {
                max = 1;
            }
            return fun.getImg("a.imageclick-imgbox", max, 9);
        },
        button: [4],
        insertImg: [
            ["#image_div>*:last-child", 1, "#image_div br,a.imageclick-imgbox"], 2
        ],
        customTitle: () => fun.gt(".item_title>h1").replace(/\(\d+P\)|\n/gi, ""),
        css: ".affs{display:none!important}",
        category: "nsfw2"
    }, {
        name: "photo.camcam.cc",
        host: ["photo.camcam.cc"],
        reg: /photo\.camcam\.cc\/[^/]+\/$/,
        init: () => fun.createImgBox(".entry-content"),
        imgs: "a.rgg-img",
        button: [4],
        insertImg: [
            ["#FullPictureLoadMainImgBox", 0, ".rgg-container"], 2
        ],
        next: "a[rel=prev]",
        prev: "a[rel=next]",
        customTitle: () => fun.gt(".page-title").replace(/\[\d+P-?\d+MB?\]/i, "").trim(),
        category: "nsfw2"
    }, {
        name: "3600000 Beauty",
        host: ["3600000.xyz"],
        reg: /^https?:\/\/3600000\.xyz\/[^\/]+\/$/,
        imgs: () => {
            let [a, img] = ["//a[img[@file]]", ".entry-content img.ls_lazyimg[file]"];
            if (fun.ge(a)) {
                return fun.gae(a);
            } else if (fun.ge(img)) {
                return fun.gae(img).map(e => e.getAttribute("file"));
            } else {
                return [];
            }
        },
        button: [4],
        insertImg: [".entry-content", 2],
        autoDownload: [0],
        next: ".nav-previous>a",
        prev: ".nav-next>a",
        customTitle: ".entry-title",
        category: "nsfw1"
    }, {
        name: "Big Boobs Asia",
        host: ["www.tokyobombers.com"],
        reg: /^https?:\/\/www\.tokyobombers\.com\/\d+\/\d+\/\d+\/[^\/]+\/$/,
        imgs: "a[itemprop='contentURL']",
        button: [4],
        insertImg: [".gallery", 2],
        customTitle: ".entry-title",
        category: "nsfw1"
    }, {
        name: "Erogirl",
        host: ["erogirl.net"],
        reg: /^https?:\/\/erogirl\.net\/p\//,
        init: async () => {
            let fetchJson = await fun.fetchDoc(fun.url).then(doc => {
                let data = fun.gt("#__NEXT_DATA__", 1, doc);
                let json = JSON.parse(data);
                return json;
            });
            debug("\n此頁JSON資料\n", fetchJson);
            siteJson = fetchJson;
        },
        imgs: () => {
            thumbnailsSrcArray = siteJson.props.pageProps.post.content.data.map(e => e.attributes.formats.thumbnail.url);
            return siteJson.props.pageProps.post.content.data.map(e => e.attributes.formats.serving_2560.url);
        },
        button: [4],
        insertImg: [".content-img", 2],
        insertImgAF: () => {
            let loop = setInterval(() => !fun.ge(".FullPictureLoadImage") ? fun.immediateInsertImg() : null, 500);
            setTimeout(() => clearInterval(loop), 10000);
        },
        go: 1,
        customTitle: () => siteJson.props.pageProps.post.title,
        css: "#FullPictureLoadEnd{color:rgb(255, 255, 255)}",
        category: "nsfw2"
    }, {
        name: "Everia.club",
        host: ["everia.club"],
        reg: /(everia\.club|everiaeveria\.b-cdn\.net)\/\d+\/\d+\/\d+\/[^/]+\//,
        imgs: () => {
            let [img, a] = [".wp-block-image img", ".separator>a.no-lightbox"]
            if (!!fun.ge(img)) {
                return fun.gae(img);
            } else if (!!fun.ge(a)) {
                return fun.gae(a);
            } else {
                return fun.gae(".entry-content img");
            }
        },
        button: [4],
        insertImg: [".entry-content", 2],
        customTitle: "h1",
        category: "nsfw2"
    }, {
        name: "Everia club",
        host: ["www.everiaclub.com"],
        reg: () => /^https?:\/\/www\.everiaclub\.com\/(?!tags).+/.test(siteUrl) && !fun.indexOf(siteUrl, ".html"),
        imgs: ".mainleft img",
        button: [4],
        insertImg: [".mainleft", 2],
        customTitle: ".mainleft h1",
        category: "nsfw2"
    }, {
        name: "SexyGirl",
        host: ["sexygirl.cc"],
        reg: /sexygirl\.cc\/a\/\d+\.html|^https?:\/\/sexygirl\.cc\/photo\/([\w-]+\/)?a\/\d+\.html$/,
        imgs: "div>img.img-f1luid,div>img.img-fluid",
        button: [4],
        insertImg: ["//div[img]", 2],
        next: "//a[text()='Previous']",
        prev: "//a[text()='Next']",
        category: "nsfw2"
    }, {
        name: "Căng Cực",
        host: ["cangcuc.com"],
        reg: /^https?:\/\/cangcuc\.com\/[^\/]+\/[^\/]+\/$/,
        imgs: ".royal_grid a",
        button: [4],
        insertImg: [
            [".royal_grid", 2, ".royal_grid"], 2
        ],
        go: 1,
        autoDownload: [0],
        next: ".widget-previous-post a",
        prev: ".widget-next-post a",
        customTitle: "h1.title",
        category: "nsfw1"
    }, {
        name: "Porn Pics",
        host: ["www.pornpics.com"],
        reg: /www\.pornpics\.\w+\/.*galleries\//,
        imgs: "#tiles a.rel-link",
        thums: "#tiles a.rel-link>img",
        button: [4],
        insertImg: ["#main", 3],
        customTitle: ".title-section h1",
        category: "nsfw2"
    }, {
        name: "HD Porn Pictures",
        host: ["hdpornpictures.net"],
        reg: /^https?:\/\/hdpornpictures\.net\/id\/\d+\//,
        imgs: () => {
            let imgs = fun.gau("#tiles a.rel-link");
            thumbnailsSrcArray = imgs.map(e => e + "?w=300");
            return imgs;
        },
        button: [4],
        insertImg: ["#main", 3],
        customTitle: () => fun.title(" - HD Porn Pictures"),
        category: "nsfw2"
    }, {
        name: "Hot Sex Picture",
        host: ["www.hotzxgirl.com"],
        reg: /^https?:\/\/www\.hotzxgirl\.com\/\w+\/[^\.]+\.htm$/,
        exclude: "p[class='404info']",
        imgs: () => {
            thumbnailsSrcArray = fun.getImgSrcArr("#connbox .im-main-rec>a>img");
            return fun.gae("#connbox .im-main-rec>a").map(a => "http://" + a.href.split("/").at(-1).replaceAll("*", "/").replace(".asp", "").replace(/-\d+x\d+\./, "."));
        },
        button: [4],
        insertImg: ["#connbox", 2],
        customTitle: () => fun.title(" | Hot Sex Picture"),
        css: "#connbox{height:auto!important}",
        category: "nsfw2"
    }, {
        name: "Freebigtit",
        host: ["www.freebigtitpornpics.com"],
        reg: /www\.freebigtitpornpics\.com\/content\/\d+\//,
        imgs: "//ul[@id='dylan']//a[img[@data-src]]",
        thums: "ul#dylan a>img[data-src]",
        button: [4],
        insertImg: [
            ["#dylan", 2], 1
        ],
        go: 1,
        category: "nsfw2"
    }, {
        name: "NongMo.Zone",
        host: ["www.ilovexs.com", "ilovexs.com"],
        reg: [
            /^https?:\/\/(www\.)?ilovexs\.com\/post_id\/\d+\//,
            /^https?:\/\/(www\.)?ilovexs\.com\/post\/[^\/]+\//,
        ],
        imgs: ".separator img",
        button: [4],
        insertImg: [".entry-content", 2],
        customTitle: ".entry-title",
        category: "nsfw2"
    }, {
        name: "idol.gravureprincess.date",
        host: ["idol.gravureprincess.date"],
        reg: /idol\.gravureprincess\.date\/\d+\/\d+\/.+\.html/,
        imgs: ".separator img",
        button: [4],
        insertImg: [
            [".entry-content", 0], 2
        ],
        go: 1,
        autoDownload: [0],
        next: "a.blog-pager-older-link",
        prev: "a.blog-pager-newer-link",
        customTitle: ".post-title",
        category: "nsfw2"
    }, {
        name: "劍心回憶",
        host: ["kenshin.hk"],
        link: "https://kenshin.hk/category/jnews/photoalbum/",
        reg: /kenshin\.hk\/\d+\/\d+\/\d+\/[^/]+\/(#small-1)?$/,
        include: "//div[@class='entry-utility']/a[1][text()='寫真組圖'] | //div[@class='cat-tags']/a[1][text()='寫真組圖']",
        init: async () => {
            let p = fun.ge("//p[contains(text(),'寫真')]");
            if (p) {
                let tE = fun.ge(".entry-content,.post-page-content");
                tE.parentNode.insertBefore(p, tE);
            }
            let links = fun.gau("//a[button[contains(text(),'寫真')]]");
            await fun.getEle(links, ".entry-content>p>img,.post-page-content>p>img,.videoWrapper", ".entry-content,.post-page-content");
            let v = fun.ge(".videoWrapper");
            if (v) {
                let tE = fun.ge(".entry-content,.post-page-content");
                tE.parentNode.insertBefore(v, tE);
            }
        },
        imgs: ".entry-content>img,.post-page-content>img",
        button: [4],
        insertImg: [".entry-content,.post-page-content", 2],
        go: 1,
        customTitle: () => fun.gt("h1.entry-title,h2.post-title").replace(/【寫真】|\s?\(\d+P,片\)/gi, ""),
        category: "nsfw1"
    }, {
        name: "千葉熊的出沒地/CyberKuma的部落格",
        host: ["chibakuma.pixnet.net", "cyberkuma.pixnet.net"],
        link: "https://www.pixnet.net/pcard/ChibaKuma",
        reg: [
            /^https?:\/\/chibakuma\.pixnet\.net\/blog\/post\/\d+/,
            /^https?:\/\/cyberkuma\.pixnet\.net\/blog\/post\/\d+/
        ],
        imgs: "#article-content-inner img,.article-content-inner img",
        button: [4],
        insertImg: ["#article-content-inner,.article-content-inner", 2],
        customTitle: ".title  a,.header-title>div",
        category: "nsfw1"
    }, {
        name: "J M G T",
        host: ["www.qiuyeshudian.com"],
        reg: /^https?:\/\/www\.qiuyeshudian\.com\/[^\/]+\/$/,
        imgs: () => {
            thumbnailsSrcArray = fun.gae(".feature-box img,.entry-content img").map(e => e.dataset.src ?? e.src);
            return thumbnailsSrcArray.length > 1 ? thumbnailsSrcArray.map(e => e.replace(/\?w=\d+&ssl=1/, "").replace(/\?resize.+/, "")) : [];
        },
        button: [4],
        insertImg: [".entry-content", 2],
        go: 1,
        autoDownload: [0],
        next: "a[rel=prev]",
        prev: "a[rel=next]",
        customTitle: () => fun.gt("article h1").replace(/(\d+Photos)\s|\(\d+Photos\)\s|\d+Photos\s|\d+\spics|\(选登\)|(选登\d+P)/, ""),
        category: "nsfw1"
    }, {
        name: "J M G T的AList",
        host: ["alist.qiuyeshudian.com"],
        reg: /^https?:\/\/alist\.qiuyeshudian\.com\/[^\/]+\/[^\/]+\/.+/,
        init: async () => {
            await fun.waitEle("div.list");
            fun.createImgBox(".body");
        },
        imgs: () => fun.getAList(),
        repeat: 1,
        button: [4],
        insertImg: ["#FullPictureLoadMainImgBox", 3],
        go: 1,
        observerTitle: true,
        downloadVideo: true,
        customTitle: () => fun.title(" | AList").replace(/\s?\d+p\s?|\[\d+[\w\s\.\+-]+\]/i, "").replace(/(\d+Photos)\s|\(\d+Photos\)\s|\d+Photos\s|\d+\spics|\(选登\)|(选登\d+P)/, ""),
        category: "nsfw1"
    }, {
        name: "Gravia",
        host: ["gravia.site"],
        reg: /gravia\.site\/box\/show\.php\?id=\d+$/,
        imgs: ".slideshow .item>img",
        thums: ".thums img",
        button: [4],
        insertImg: [".slideshow.for_box", 2],
        customTitle: () => fun.gt(".container>h1").replace(/\s?【\d+枚】/, ""),
        css: "img.small{max-width:100% !important;max-height:auto !important}.cmd_bar.wide{display:none!important}",
        category: "nsfw1"
    }, {
        name: "トップページ | AI.img",
        host: ["aiimg.fun"],
        reg: /^https?:\/\/aiimg\.fun\/note\/public\.php\?id=\d+/,
        init: () => fun.createImgBox(".thums", 2),
        imgs: async () => {
            await fun.getNP(".thums>.item", ".pager>a.now+a", null, ".pager");
            thumbnailsSrcArray = fun.getImgSrcArr(".thums img");
            return fun.gae("div.item[org_img_url]");
        },
        button: [4],
        insertImg: [
            ["#FullPictureLoadMainImgBox", 0, ".thums"], 2
        ],
        customTitle: "h1",
        category: "nsfw1"
    }, {
        name: "NEWSグラビアアイドル.net",
        host: ["news.idolsenka.net"],
        reg: /^https?:\/\/news\.idolsenka\.net\/archives\/\d+/,
        init: () => fun.createImgBox("#jp-relatedposts", 1),
        imgs: () => {
            let [w, b] = [".entry-content a[href*='/wp-content/uploads/']", ".entry-content a[href*='blogger']"];
            if (!!fun.ge(w)) {
                return fun.gae(w);
            } else if (!!fun.ge(b)) {
                return fun.gae(b).map(a => {
                    let url = a.href;
                    let urlArr = url.split("/");
                    urlArr[urlArr.length - 2] = "s16000";
                    return urlArr.join("/");
                });
            } else {
                return [];
            }
        },
        button: [4],
        insertImg: [
            ["#FullPictureLoadMainImgBox", 0, "//p[a[img]]"], 2
        ],
        customTitle: ".entry-title",
        category: "nsfw1"
    }, {
        name: "グラビア週刊誌 9/グラビア週刊誌 5/グラビア週刊誌 6",
        host: ["gravurezasshi9.doorblog.jp", "magazinejapanese5.blog.jp", "magazinejapanese6.blog.jp"],
        reg: /(gravurezasshi9\.doorblog\.jp|magazinejapanese(5|6)\.blog\.jp)\/archives\/\d+\.html(\?ref=)?/,
        imgs: ".article-body-inner>a,#article-contents>a",
        thums: ".article-body-inner>a>img,#article-contents>a>img",
        button: [4],
        insertImg: [".article-body-inner,#article-contents", 2],
        autoDownload: [0],
        next: "//li[text()='前の記事: ']/a | //a[text()='前の記事']",
        prev: "//li[text()='次の記事: ']/a | //a[text()='次の記事']",
        customTitle: "h1.article-title>a,.article-header>h1",
        category: "nsfw1"
    }, {
        name: "グラビア週刊誌 9/グラビア週刊誌 5/グラビア週刊誌 6 - 分類自動翻頁",
        host: ["gravurezasshi9.doorblog.jp", "magazinejapanese5.blog.jp", "magazinejapanese6.blog.jp"],
        reg: /^https?:\/\/(gravurezasshi9\.doorblog\.jp|magazinejapanese(5|6)\.blog\.jp)\/(\?p=\d+)?$|^https?:\/\/(gravurezasshi9\.doorblog\.jp|magazinejapanese(5|6)\.blog\.jp)\/archives\/([\d-]+|cat_\d+)\.html(\?p=\d+)?$/,
        autoPager: {
            ele: ".autopagerize_page_element,.article-list-outer",
            observer: "article.article,.article-list-outer>li",
            next: "//li[@class='current']/following-sibling::li[1]/a | //a[span[text()='次へ']]",
            re: ".pager,.pager_fixed,.fractional-page",
            title: doc => "Page " + nextLink.match(/\?p=(\d+)/)[1]
        },
        openInNewTab: ".autopagerize_page_element a[href]:not([target=_blank]),.article-list-outer a[href]:not([target=_blank])",
        category: "autoPager"
    }, {
        name: "Gravure Idols",
        host: ["gravureidols.top"],
        reg: /^https?:\/\/gravureidols\.top\/\d+\/\d+\/\d+\/[^\/]+\/$/,
        imgs: ".content-inner>div:not(.apss-social-share) a",
        button: [4],
        insertImg: [
            ["//p[a[img]]", 2, "//p[a[img]]"], 1
        ],
        go: 1,
        autoDownload: [0],
        next: ".jeg_prevnext_post a",
        prev: ".jeg_prevnext_post a",
        customTitle: ".jeg_post_title",
        category: "nsfw1"
    }, {
        name: "水着グラビア",
        host: ["www.mizugigurabia.com"],
        reg: /^https?:\/\/www\.mizugigurabia\.com\/\?p=\d+/,
        init: () => fun.remove("#content-top"),
        imgs: () => {
            return fun.gae(".article img[srcset]").map(img => {
                if (img?.parentNode?.nodeName === "A") {
                    return img.parentNode.href;
                } else if (!!img.getAttribute("srcset")) {
                    let splitArr = img.getAttribute("srcset").split(",");
                    splitArr = splitArr.sort((a, b) => a.match(/\s(\d+)w/)[1] - b.match(/\s(\d+)w/)[1]);
                    return splitArr.at(-1).trim().split(" ")[0];
                }
                return img.dataset.src ?? null;
            });
        },
        capture: () => _this.imgs(),
        customTitle: ".entry-title",
        category: "nsfw2"
    }, {
        name: "エロ役場",
        host: ["eroyakuba.com"],
        reg: /eroyakuba\.com\/[^/]+\/$/,
        imgs: () => {
            return fun.gae(".flexitem_content img[srcset],.entry-content img[srcset]").map(img => {
                if (img.dataset.srcset !== "") {
                    let splitArr = img.dataset.srcset.split(",");
                    splitArr = splitArr.sort((a, b) => a.match(/\s(\d+)w/)[1] - b.match(/\s(\d+)w/)[1]);
                    return splitArr.at(-1).trim().split(" ")[0];
                }
                return img.dataset.src ?? null;
            });
        },
        capture: () => _this.imgs(),
        customTitle: "h1.entry-title",
        category: "nsfw2"
    }, {
        name: "エロ画像まとめ",
        host: ["geinou-nude.com"],
        reg: /^https?:\/\/geinou-nude\.com\/[^\/]+\/(#.*)?$/,
        imgs: ".post_content a[href*='/uploads/']",
        autoDownload: [0],
        next: "a.nav_link_l",
        prev: "a.f_row_r",
        customTitle: "h1.post_title",
        category: "nsfw2"
    }, {
        name: "裏ピク",
        host: ["www.urapic.com"],
        reg: /^https?:\/\/www\.urapic\.com\/blog-entry-\d+\.html/,
        imgs: "//div[@class='entry-body']//a[img[@title]] | //div[@class='entry_body']//a[img[@title]]",
        customTitle: () => fun.gt(".entry-title,.entry_title>h1").replace(/[w]+$/, ""),
        category: "nsfw2"
    }, {
        name: "Gravure",
        host: ["Idols gravureidols.top"],
        reg: /gravureidols\.top\/\d+\/\d+\/\d+\/[^/]+\//,
        imgs: ".content-inner p>a",
        autoDownload: [0],
        next: "a.prev-post",
        prev: "a.next-post",
        customTitle: ".jeg_post_title",
        category: "nsfw2"
    }, {
        name: "復刻書林",
        host: ["reprint-kh.com"],
        reg: /reprint-kh\.com\/archives\/\d+/,
        imgs: async () => {
            if (fun.ge(".gallery-row")) {
                await fun.getNP(".gallery-row", "//a[span[text()='次のページ']]");
            }
            if (fun.ge(".ngg-gallery-thumbnail-box")) {
                await fun.getNP(".ngg-gallery-thumbnail-box", "span.current+a");
            }
            thumbnailsSrcArray = fun.getImgSrcArr(".tiled-gallery a img,.ngg-gallery-thumbnail-box a img");
            return fun.gae(".tiled-gallery a,.ngg-gallery-thumbnail-box a");
        },
        button: [4],
        insertImg: [
            [".single-post-main>.share,.single-post-main .content", 2], 2
        ],
        go: 1,
        autoDownload: [0],
        next: ".previous_post>a",
        prev: ".next_post>a",
        customTitle: () => fun.gt(".single-post-title").replace(/\d+photos/, "").trim(),
        category: "nsfw2"
    }, {
        name: "マブい女画像集",
        host: ["mabui-onna.com"],
        reg: /^https?:\/\/mabui-onna\.com\/blog-entry-\d+\.html/,
        init: () => {
            let texts = fun.gae("//div[@class='entry_body']//div[not(br)][not(a[img])][not(@class='fc2_footer')][not(@class='topentry_text')][not(@class='fc2button-clap')][not(@class='entry_footer')][not(@class='entry_data')]");
            if (texts.length > 0) {
                let te = fun.ge(".topentry_text,.entry_body");
                texts.forEach(e => te.parentNode.insertBefore(e, te));
            }
        },
        imgs: ".topentry_text div>a:not([href*='.html']),.entry_body div>a:not([href*='.html'])",
        button: [4],
        insertImg: [".topentry_text,.entry_body", 2],
        autoDownload: [0],
        next: "a.pager_next,.next_entry>a",
        prev: "a.pager_prev,.prev_entry>a",
        customTitle: () => fun.gt(".topentry_title span,.entry_title h1>strong").replace(/\d+枚/, "").replace(/\s\s/g, " ").trim(),
        category: "nsfw1"
    }, {
        name: "美女の集い",
        host: ["bizyonotudoi.com"],
        reg: /^https?:\/\/bizyonotudoi\.com\/d\/\d+\.html$/,
        imgs: ".thumb-img-area>img",
        button: [4],
        insertImg: [".kizi-thumb-list", 2],
        customTitle: ".page-title",
        css: "#pagemap-navi{display:none!important;}",
        category: "nsfw1"
    }, {
        name: "ぷるるんお宝画像庫",
        link: "http://blog.livedoor.jp/pururungazou/",
        reg: () => !hasTouchEvents && /^https?:\/\/blog\.livedoor\.jp\/pururungazou\/archives\/\d+\.html$/.test(fun.url),
        imgs: () => {
            videosSrcArray = fun.gae("video[src]").map(e => e.src);
            return fun.gae(".entry-content img[src*='/pururungazou/imgs/']").map(e => e.src.replace(/-s(\.\w+)$/, "$1"));
        },
        button: [4],
        insertImg: [".article-body-more", 3],
        customTitle: ".entry-title",
        downloadVideo: true,
        category: "nsfw2"
    }, {
        name: "ぷるるんお宝画像庫M",
        link: "http://blog.livedoor.jp/pururungazou/",
        reg: () => hasTouchEvents && /^https?:\/\/blog\.livedoor\.jp\/pururungazou\/archives\/\d+\.html$/.test(fun.url),
        imgs: () => {
            videosSrcArray = fun.gae("video[src]").map(e => e.src);
            return fun.gae(".article-body img[src*='/pururungazou/imgs/']").map(e => e.src.replace(/-s(\.\w+)$/, "$1"));
        },
        button: [4],
        insertImg: [".article-body", 3],
        customTitle: ".article-title",
        downloadVideo: true,
        category: "nsfw2"
    }, {
        name: "Love Asian Babes",
        host: ["amazon-love.com"],
        reg: /^https?:\/\/amazon-love\.com\/[^.]+\.html/,
        imgs: () => {
            let max = fun.gt("//a[text()='Next Page »']", 2) || 1;
            return fun.getImg(".entry-content img", max, 7);
        },
        button: [4],
        insertImg: [".entry-content", 2],
        autoDownload: [0],
        next: "span.prev>a",
        prev: "span.next>a",
        customTitle: ".entry-title",
        category: "nsfw1"
    }, {
        name: "ドッグ速報",
        host: ["dog-sokuhou.com"],
        reg: /^https?:\/\/dog-sokuhou\.com\/archives\/\d+\/[^\/]+\//,
        imgs: ".eye-catch>img,.wp_rss_scrapeing_post-content div>a",
        button: [4],
        insertImg: [".wp_rss_scrapeing_post-content", 2],
        customTitle: () => fun.gt(".entry-title").replace(/\d+枚/, "").replace(/\s\s/g, " ").trim(),
        css: "#oxzilla-overlay,boxzilla-overlay{display:none!important}",
        category: "nsfw1"
    }, {
        name: "Permanent Bachelor",
        host: ["www.saladpuncher.com"],
        reg: /^https?:\/\/www\.saladpuncher\.com\/\d+\/\d+\/[^\/]+\//,
        init: () => fun.createImgBox(".entry-container", 2),
        imgs: () => {
            thumbnailsSrcArray = fun.getImgSrcArr(".rsTmb>img");
            return thumbnailsSrcArray.map(e => e.replace(/-\d+x\d+(\.\w+)$/, "$1"))
        },
        button: [4],
        insertImg: ["#FullPictureLoadMainImgBox", 2],
        go: 1,
        customTitle: ".posttitle",
        category: "nsfw1"
    }, {
        name: "IVPhoto_Gravure",
        host: ["ivphoto.tistory.com"],
        reg: /ivphoto\.tistory\.com\/(m\/)?\d+/,
        imgs: ".imageblock img",
        button: [4],
        insertImg: [".entry-content,.blogview_content", 3],
        customTitle: ".tit_blogview,.hgroup h1",
        category: "nsfw1"
    }, {
        name: "MIC MIC IDOL",
        host: ["www.micmicidol.club"],
        reg: /www\.micmicidol\.club\/\d+\/\d+\/.+\.html/,
        imgs: async () => {
            let imgsSrcArr = fun.gae(".entry-content a[href*=blog]").map(a => {
                let arr = a.href.split("/");
                if (arr.length === 9) {
                    arr[7] = "s16000";
                    return arr.join("/");
                } else {
                    return a.href;
                }
            });
            thumbnailsSrcArray = imgsSrcArr.map(e => e.replace("/s16000/", "/w100/"));
            return imgsSrcArr;
        },
        button: [4],
        insertImg: [
            [".entry-content", 0, ".entry-content a[href*=blog]:not([data-fancybox]),.entry-content br"], 2
        ],
        customTitle: ".entry-title",
        topButton: true,
        css: ".post img{max-width:100% !important}.post-body{margin:0px!important;}",
        category: "nsfw2"
    }, {
        name: "MIC MIC IDOL - 分類自動翻頁",
        host: ["www.micmicidol.club"],
        reg: /^https?:\/\/www\.micmicidol\.club\/(\?m=1)?$|^https?:\/\/www\.micmicidol\.club\/search/,
        include: ".date-outer",
        init: () => fun.run("$('.snips-image').unbind();$('.snips-image img').unbind();"),
        autoPager: {
            ele: ".blog-posts",
            next: "a.blog-pager-older-link",
            http: "https",
            observer: ".post.hentry",
            re: "#blog-pager",
            stop: doc => fun.ge(".date-outer", doc) ? false : true,
            aF: () => {
                fun.gae("//div[@class='snips-image']/a[not(img)]").forEach(a => {
                    let script = fun.ge("script", a);
                    if (script) {
                        let code = script.innerText;
                        if (/document\.write/.test(code)) {
                            let [, url, , alt] = code.split('"');
                            let img = new Image();
                            img.src = url.replace("/s72-c/", "/w400/").replace("=s72-c", "=w400");
                            img.alt = alt;
                            script.parentNode.insertBefore(img, script.nextSibling);
                        }
                    }
                });
            },
            title: () => {
                let num;
                /start=/.test(nextLink) ? num = Number(nextLink.match(/start=(\d+)/)[1]) / 50 + 1 : num = 1;
                return "Page " + num;
            }
        },
        openInNewTab: ".date-outer a[href]:not([target=_blank])",
        category: "autoPager"
    }, {
        name: "Kemono/Coomer",
        host: ["kemono.su", "coomer.su"],
        link: "https://kemono.su/fantia/user/17148/post/1633768",
        reg: /(kemono\.party|kemono\.su|coomer\.party|coomer\.su)\/.+\/post/,
        delay: 1000,
        include: "a.fileThumb.image-link",
        init: () => fun.createImgBox(".post__body", 2),
        imgs: () => {
            videosSrcArray = fun.gae("video>source").map(e => e.src);
            thumbnailsSrcArray = fun.gae("a.fileThumb.image-link>img").map(e => {
                if (e.dataset.src) {
                    return /^\/\//.test(e.dataset.src) ? location.protocol + e.dataset.src : e.dataset.src;
                } else {
                    return e.src;
                }
            });
            return fun.gae("a.fileThumb.image-link");
        },
        button: [4],
        insertImg: ["#FullPictureLoadMainImgBox", 2],
        go: 1,
        autoDownload: [0],
        next: "a.next",
        prev: "a.prev",
        customTitle: ".post__title",
        downloadVideo: true,
        topButton: true,
        threading: 2,
        fetch: 1,
        category: "nsfw2"
    }, {
        name: "Nekohouse",
        host: ["nekohouse.su"],
        reg: /nekohouse\.su\/.+\/post\/\d+/,
        delay: 1000,
        include: "div.fileThumb[href]",
        init: () => fun.createImgBox(".scrape__body", 2),
        imgs: () => {
            thumbnailsSrcArray = fun.gae("div.fileThumb>img").map(e => {
                if (e.dataset.src) {
                    return /^\/\//.test(e.dataset.src) ? location.protocol + e.dataset.src : e.dataset.src;
                } else {
                    return e.src;
                }
            });
            return fun.gae("div.fileThumb[href]").map(e => fun.lo + e.getAttribute("href"));
        },
        button: [4],
        insertImg: ["#FullPictureLoadMainImgBox", 2],
        go: 1,
        customTitle: ".scrape__title",
        topButton: true,
        threading: 2,
        fetch: 1,
        category: "nsfw2"
    }, {
        name: "半次元",
        host: ["bcy.net"],
        reg: /bcy\.net\/item\/detail\/\d+\?_source_page=\w+/,
        imgs: ".inner-container img",
        customTitle: () => fun.title(" - ", 1),
        category: "none"
    }, {
        name: "套图之家",
        host: ["www.taotuhome.com", "taotuhome.com"],
        reg: /taotuhome\.com\/\d+\.html/i,
        imgs: () => fun.getImg(".single-content img[alt]", (fun.gt(".page-links>*:last-child", 2) || 1), 7),
        button: [4],
        insertImg: [".single-content", 2],
        autoDownload: [0],
        next: "a[rel=prev]:not([href^=j])",
        prev: "a[rel=next]:not([href^=j])",
        customTitle: () => fun.gt(".entry-title").replace("-套图之家", ""),
        category: "nsfw1"
    }, {
        name: "套图之家",
        host: ["www.taotuzj.com"],
        reg: /^https:\/\/(www\.)?taotuzj\.com\/\w+\/\d+\.html$/i,
        imgs: () => {
            let max = fun.gu("//a[text()='尾页']").match(/_(\d+)\.html$/)[1];
            let links = fun.arr(max).map((_, i) => i == 0 ? fun.url : fun.url.replace(".html", "") + `_${i+1}.html`);
            return fun.getImgA(".content img[alt]", links);
        },
        button: [4],
        insertImg: [".content", 2],
        customTitle: () => fun.title(/-套图之家.*$/),
        category: "nsfw1"
    }, {
        name: "套图之家M",
        host: ["m.taotuzj.com"],
        reg: /^https:\/\/m\.taotuzj\.com\/\w+\/\d+\.html$/i,
        imgs: () => {
            let max = fun.gt("a.allpage").match(/\d+$/)[0];
            let links = fun.arr(max).map((_, i) => i == 0 ? fun.url : fun.url.replace(".html", "") + `_${i+1}.html`);
            return fun.getImgA(".content img[alt]", links);
        },
        button: [4],
        insertImg: [".content", 2],
        customTitle: () => fun.title(/-套图之家.*$/),
        category: "nsfw1"
    }, {
        name: "俊美图",
        host: ["www.meijuntu.com", "www.junmeitu.com", "www.jeya.de", "www.jeya.jp"],
        reg: () => /((www\.)?meijuntu\.com|(www\.)?junmeitu\.com|(www\.)?jeya\.\w+)\/\w+\/\w+\.html/i.test(siteUrl) && fun.ge(".pictures img"),
        imgs: async () => {
            let imgsArr = [];
            let max = fun.gt("#pages>*:last-child", 2) || 1;
            let url = siteUrl.replace(/(-\d+)?\.html$/, "");
            let links = fun.arr(max).map((_, i) => url + "-" + (i + 1) + ".html")
            for (let i = 0; i < links.length; i++) {
                let doc = await new Promise(async resolve => {
                    for (let check = 1; check <= 100; check++) {
                        let res = await fetch(links[i]);
                        if (res.status == 304 || res.status == 200) {
                            let buffer = await res.arrayBuffer();
                            let decoder = new TextDecoder(document.characterSet || document.charset || document.inputEncoding);
                            let htmlText = decoder.decode(buffer);
                            let doc = fun.doc(htmlText);
                            resolve(doc);
                            break;
                        } else {
                            fun.showMsg(`第${i + 1}頁${res.status}重試第${check}次`, 2900);
                            await fun.delay(3000, 0);
                        }
                    }
                });
                let imgs = fun.gae(".pictures img", doc);
                let te = fun.gae(".pictures img").at(-1);
                imgs.forEach(e => {
                    imgsArr.push(e.cloneNode(true));
                    if (i != 0) te.parentNode.insertBefore(e.cloneNode(true), te.nextSibling);
                });
                if (i != 0) {
                    let ce = fun.gae("#pages");
                    let re = fun.gae("#pages", doc);
                    if (ce.length == re.length) {
                        ce.forEach((e, i) => (e.outerHTML = re[i].outerHTML));
                    }
                }
                await fun.delay(1000, 0);
            }
            return imgsArr;
        },
        button: [4],
        insertImg: [".pictures", 1],
        autoDownload: [0],
        next: "//span[contains(text(),'下一')]/following-sibling::a",
        prev: "//span[contains(text(),'上一')]/following-sibling::a",
        customTitle: "h1.title",
        css: ".pre_picture,.next_picture{display:none!important}",
        category: "nsfw1"
    }, {
        name: "x6o",
        host: ["x6o.com"],
        link: "https://x6o.com/topics/14#articles",
        reg: /(www\.)?x6o\.com\/articles\/\d+/,
        init: async () => {
            await fun.waitVar("initPage", 20);
            await fun.delay(600, 0);
        },
        imgs: () => {
            if (fun.ge("a[data-fancybox]")) {
                return fun.gae("a[data-fancybox]");
            } else {
                fun.showMsg("fun.xhrHEA(check)...", 0);
                let xhrNum = 0;
                return fun.gae(".content img").map(async (img, i, arr) => {
                    let parent = img.parentNode;
                    let src = img.dataset.original ?? img.src;
                    if (!!parent && parent?.nodeName === "A" && !!parent?.getAttribute("data-fancybox")) {
                        return parent.href;
                    } else if (/^\/upload\/image\//.test(src)) {
                        return location.origin + src;
                    } else if (!/^http|^\/\//.test(src)) {
                        let testSrc = "https://telegra.ph/file/" + src;
                        let res = await fun.xhrHEAD(testSrc);
                        fun.showMsg(`fun.xhrHEAD(${xhrNum+=1}/${arr.length})`, 0);
                        let status = res.status;
                        return status == 404 ? src : testSrc;
                    } else {
                        return img;
                    }
                });
            }
        },
        button: [4],
        insertImg: [".content", 2],
        customTitle: "h1.title",
        category: "nsfw2"
    }, {
        name: "妹子图",
        host: ["mt316.com"],
        reg: /mt316\.com\/\w+\/\d+\.html/,
        imgs: ".m-list-content img",
        button: [4],
        insertImg: [".m-list-content", 2],
        autoDownload: [0],
        next: ".sxpage_l>a",
        prev: 1,
        customTitle: ".m-list-tools>h2",
        css: ".m-list-content img{max-width:100%!important}",
        category: "nsfw1"
    }, {
        name: "心动美图",
        host: ["www.wai76.com", "www.wai77.com"],
        reg: () => /^https?:\/\/www\.wai\d{2}\.com\/[^\/]+\//.test(siteUrl) && fun.ge(".entry-content div[data-src]"),
        imgs: async () => {
            let divDataSrcs = await fun.getImgA(".entry-content div[data-src]", ".page-links a");
            thumbnailsSrcArray = divDataSrcs.map(src => {
                let arr = src.split("/");
                arr[arr.length - 1] = "thumbnail/s" + arr[arr.length - 1];
                return arr.join("/");
            });
            return divDataSrcs;
        },
        button: [4],
        insertImg: [".entry-content", 2],
        customTitle: ".entry-title",
        category: "nsfw1"
    }, {
        name: "美女集合",
        host: ["meinvjihe.cc"],
        reg: /^https?:\/\/meinvjihe\.cc\/thread-\d+\.htm$/,
        imgs: ".message>img",
        button: [4],
        insertImg: [".message", 2],
        customTitle: ".media-body>span.break-all",
        category: "nsfw1"
    }, {
        name: "美女库",
        host: ["www.meinvku.org.cn"],
        reg: /www\.meinvku\.org\.cn\/album\/\d+(\/)?(\.html)?$/,
        imgs: async () => {
            let firstImg = fun.attr("#img_src img", "src");
            let imgDir = firstImg.match(/.+\//)[0];
            let max = fun.gt("//span[contains(text(),'页次')]").match(/\/(\d+)/)[1];
            let arr = fun.arr(max).map((_, i) => imgDir + (i + 1) + ".jpg");
            let a = fun.ge("#img_src");
            if (a) a.outerHTML = `<div class="CustomPictureBox">${fun.ge("img", a).outerHTML}</div>`;
            return arr;
        },
        button: [4],
        insertImg: [".CustomPictureBox", 1],
        css: ".CustomPictureBox>img{max-width:100%}",
        category: "nsfw1"
    }, {
        name: "图宅网/咔咔西三/YouFreeX",
        reg: () => {
            let hosts = ["www.tuzac.com", "www.kkc3.com", "www.youfreex.com"];
            return hosts.includes(fun.lh) && /^\/file\//.test(fun.lp);
        },
        imgs: async () => {
            let a = fun.ge("#the-photo-link");
            if (a) a.outerHTML = a.innerHTML;
            let max = fun.attr("#auto-play", "total");
            let id = fun.attr("#auto-play", "data").match(/\d+/)[0];
            fun.showMsg(displayLanguage.str_05, 0);
            let fetchNum = 0;
            return fun.arr(max).map((_, i) => fetch(`/api/?ac=get_album_images&id=${id}&num=${i+1}`).then(res => res.json()).then(json => {
                fun.showMsg(`${displayLanguage.str_06}${fetchNum+=1}/${max}`, 0);
                return json.src;
            }));
        },
        button: [4],
        insertImg: ["#task,#fdp-photo,#fdp-photo-old", 2],
        customTitle: () => fun.gt(".fc-text-content>h1").replace(/(\[\d+P\]|\n|\(\d+P\))/gi, "").trim(),
        css: ".content-container .content{margin-right:0px!important}.ad-container,.fdp-click-area,.ad-side-right,.footer{display:none!important}",
        category: "nsfw2"
    }, {
        name: "图宅网/咔咔西三/YouFreeX",
        reg: () => {
            let hosts = ["www.tuzac.com", "www.kkc3.com", "www.youfreex.com"];
            return hosts.includes(fun.lh);
        },
        css: ".ad-container{display:none!important}",
        category: "ad"
    }, {
        name: "七仙子图片",
        host: ["www.qixianzi.com"],
        reg: /www\.qixianzi\.com\/\w+\/\d+\.html$/,
        imgs: async () => {
            let a = fun.ge(".picture_content>a");
            if (a) a.outerHTML = a.innerHTML;
            await fun.getNP(".picture_content img", "//a[text()='下一页']", null, ".pagination", 0, null, 0);
            return fun.gae(".picture_content img");
        },
        button: [4],
        insertImg: [".picture_content", 2],
        next: "//li[contains(text(),'上一篇')]/a",
        prev: "//li[contains(text(),'下一篇')]/a",
        customTitle: "h1.diy-h1",
        css: "#FullPictureLoadEnd{color:rgb(255, 255, 255)}",
        category: "nsfw1"
    }, {
        name: "七仙子图片M",
        host: ["www.qixianzi.com"],
        link: "https://www.qixianzi.com/e/wap/",
        reg: /www\.qixianzi\.com\/e\/wap\/show\.php\?/,
        imgs: ".arcmain img",
        button: [4],
        insertImg: [".arcmain", 1],
        customTitle: ".header>span",
        category: "nsfw1"
    }, {
        name: "嘿~色女孩",
        host: ["heysexgirl.com"],
        reg: /^https?:\/\/heysexgirl\.com\/archives\/\d+$/,
        imgs: () => {
            let max = fun.gt(".page-links>*:last-child");
            return fun.getImg(".entry-content p>a,.entry-content p>img", max, "4");
        },
        button: [4],
        insertImg: [".entry-container", 2],
        autoDownload: [0],
        next: ".nav-previous>a",
        prev: ".nav-next>a",
        customTitle: "h1.page-title",
        category: "nsfw2"
    }, {
        name: "嘿~色女孩 分類自動翻頁",
        enable: 1,
        reg: /^https?:\/\/heysexgirl\.com\/(page\/\d+)?$|^https?:\/\/heysexgirl\.com\/archives\/category\/\w+(\/page\/\d+)?$/,
        init: async () => await fun.waitEle(".blog-posts-wrapper[style]"),
        autoPager: {
            mode: 1,
            waitEle: ".blog-posts-wrapper[style]",
            ele: ".blog-posts-wrapper",
            observer: ".blog-posts-wrapper",
            next: "span.current+a",
            re: ".nav-links",
            title: () => "Page " + nextLink.match(/\d+$/)[0]
        },
        openInNewTab: ".blog-posts-wrapper a:not([target=_blank])",
        css: ".blog-posts-wrapper article.has-post-thumbnail .entry-container{margin:0 auto 0 !important}",
        category: "autoPager"
    }, {
        name: "2LSP",
        host: ["2lsp.xyz"],
        reg: () => /2lsp\.xyz\/[^/]+\/$/.test(siteUrl) && fun.ge(".entry-content img[data-srcset]") && !fun.ge(".content-hide-tips"),
        observerClick: ".swal2-close",
        imgs: () => fun.gae(".entry-content img[data-srcset]").map(e => e.dataset.srcset),
        button: [4],
        insertImg: [".entry-content", 2],
        autoDownload: [0],
        next: ".article-nav-prev>a",
        prev: ".article-nav-next>a",
        customTitle: "h1.entry-title",
        fancybox: {
            v: 3,
            insertLibrarys: 1
        },
        category: "nsfw1"
    }, {
        name: "2LSP",
        host: ["2lsp.xyz"],
        reg: /2lsp\.xyz\//,
        observerClick: ".swal2-close",
        category: "none"
    }, {
        name: "性趣套图/H漫画",
        host: ["myjkwd.com", "enpeta.com", "xjzi.top", "xqtt.xqtt.de", "534798.xyz", "539765.xyz", "123548.xyz"],
        reg: () => /(myjkwd\.com|enpeta\.com|xjzi\.top|xqtt\.xqtt\.de|534798\.xyz|539765\.xyz|123548\.xyz)\/e\/action\/ShowInfo\.php/i.test(siteUrl) && fun.ge(".entry img"),
        imgs: async () => {
            if (fun.ge("embed[src*='sendvid']")) {
                let links = fun.gae("embed").map(e => e.src);
                let resArr = links.map(url => fun.xhrDoc(url).then(doc => fun.ge("video>source", doc).src));
                videosSrcArray = await Promise.all(resArr);
            }
            return fun.getImg(".entry img", fun.gt("a[title=总数]"), 8)
        },
        button: [4],
        insertImg: ["//div[@class='entry']//img/parent::*", 1],
        autoDownload: [0],
        next: "//p[contains(text(),'上一')]/a",
        prev: "//p[contains(text(),'下一')]/a",
        customTitle: ".contitle",
        css: "aside.side{display:none!important;}.main-content{margin-left:0px!important;}body{background:#EDEDED!important;}",
        category: "nsfw2"
    }, {
        name: "多伦多情色",
        host: ["torontolove.cc"],
        reg: () => /^https?:\/\/torontolove\.cc\/detail\?id=\d+/i.test(siteUrl) && fun.ge("//div[@class='post-topic']//div[text()='情色靓影']"),
        init: async () => await fun.waitEle("#J-description-conent img[src^='/bucket/']"),
        imgs: () => fun.gae("#J-description-conent img").map(e => e.src),
        button: [4],
        insertImg: ["#J-description-conent", 2],
        customTitle: "#J-main-title",
        fancybox: {
            v: 3,
            css: false
        },
        category: "nsfw2"
    }, {
        name: "苍井优图",
        host: ["www.28tyu.com", "www.28rty.com", "www.28ery.com", "www.28wer.com", "www.028kkp.com", "sldlxz.com", "www.yuxiangcao.com", "282471.xyz", "284019.xyz"],
        reg: /((www\.|a\.)(\d+tyu|\d+rty|\d+ery|\d+wer)\.com|sldlxz\.com|(www|a).yuxiangcao\.com|(www|a).028kkp\.com|282471|284019\.xyz)\/e\/action\/ShowInfo\.php/i,
        imgs: "img[id^='aimg'],.entry img",
        button: [4],
        insertImg: [".entry", 2],
        autoDownload: [0],
        next: "//p[contains(text(),'上一')]/a",
        prev: "//p[contains(text(),'下一')]/a",
        customTitle: ".contitle",
        category: "nsfw2"
    }, {
        name: "三界异次元",
        host: ["ycyweb.cloudapp.net"],
        reg: /^https?:\/\/ycyweb\.cloudapp\.net\/p\/\d+$/i,
        imgs: ".postBody img",
        button: [4],
        insertImg: [".postBody", 2],
        customTitle: "#postTitle",
        category: "nsfw1"
    }, {
        name: "好视角",
        host: ["www.lianjiajr.net"],
        reg: /^https?:\/\/www\.lianjiajr\.net\/\w+\.html$/i,
        exclude: "div.pic",
        imgs: ".text img:not([onerror])",
        button: [4],
        insertImg: [".text", 2],
        autoDownload: [0],
        next: "//p[contains(text(),'上一篇')]/a",
        prev: "//p[contains(text(),'下一篇')]/a",
        customTitle: ".tit>h1",
        css: "audio{display:none!important}",
        category: "nsfw2"
    }, {
        name: "好视角M",
        host: ["www.lianjiajr.net"],
        reg: /^https?:\/\/www\.lianjiajr\.net\/\w+\.html$/i,
        init: () => fun.remove("//div[a[img[contains(@src,'gif')]]]"),
        imgs: "div.pic img:not([onerror])",
        button: [4],
        insertImg: ["div.pic", 2],
        customTitle: ".grjs1>h1",
        css: "audio{display:none!important}",
        category: "nsfw2"
    }, {
        name: "YY美女图片/美眉大宝贝",
        host: ["www.yyzhenshun.com", "bb.meinvnews.com"],
        reg: /(www\.yyzhenshun\.com|bb\.meinvnews\.com)\/\d+\.html/i,
        imgs: () => {
            if (fun.ge(".ep-pages a")) {
                let max = fun.gu("//a[text()='尾页']").match(/(\d+)\.html$/)[1];
                return fun.getImg(".wzy_body img", max, 3);
            } else {
                return fun.gae(".wzy_body img[alt]");
            }
        },
        button: [4],
        insertImg: ["//p[img] | //p[strong[img]] | //div[@class='wzy_body']", 2],
        autoDownload: [0],
        next: "//li[contains(text(),'上一篇')]/a",
        prev: "//li[contains(text(),'下一篇')]/a",
        customTitle: ".wzy_tit",
        css: "body>section[id],a[href*=download]{display:none!important}header{margin-top:0px!important}.wzy_body{text-indent:unset!important}@media (max-width:768px){.wzy_body{margin:0px!important}}@media (max-width:768px){.neiye{margin:0px!important}}",
        category: "nsfw1"
    }, {
        name: "爱看美图网",
        host: ["www.ikmt.net", "m.ikmt.net"],
        reg: /(www|m)\.ikmt\.net\/\w+\/\w+\/\d+\/\d+\.html/i,
        imgs: () => {
            let mouse_page = fun.ge("#mouse_page");
            if (mouse_page) {
                let max = fun.gt("//li[a[text()='下一页']]", 2) || fun.gt("//a[text()='下一张']", 2).match(/\/(\d+)/)[1];
                return fun.getImg("#picBody img,.post-content img", max, 9);
            } else {
                return fun.gae("#picBody img,.post-content img");
            }
        },
        button: [4],
        insertImg: ["#picBody,.post-content", 2],
        autoDownload: [0],
        next: "//div[contains(text(),'上一篇')]/a",
        prev: "//div[contains(text(),'下一篇')]/a",
        customTitle: ".articleV2Title>h1,.mm-title",
        css: ".articleV2Body img{max-width:100% !important}",
        category: "nsfw1"
    }, {
        name: "犀牛图片网",
        host: ["www.xintp.com"],
        reg: /www\.xintp\.com\/(\w+\/\w+\/\d+\.html|\w+\/\d+\.html)/i,
        imgs: async () => {
            let pages = fun.ge(".page-links");
            if (pages) {
                await fun.getNP(".single-content img", "//span[@class='post-page-numbers current']/following-sibling::a[span][1]", null, ".page-links");
                return fun.gae(".single-content img");
            } else {
                return fun.gae(".single-content img");
            }
        },
        button: [4],
        insertImg: [
            [".single-content", 0, ".wp-block-image,.single-content>p~p:not(#FullPictureLoadEnd)"], 2
        ],
        customTitle: ".entry-title",
        fancybox: {
            v: 3,
            css: false
        },
        css: ".header-sub,.tg-box{display:none!important}",
        category: "nsfw1"
    }, {
        name: "AVJB/The AV Porn",
        host: ["avjb.com", "theavporn.com"],
        link: "https://avjb.com/albums/,https://theavporn.com/albums/",
        reg: /^https?:\/\/(avjb\.com|avjb\.fun|av\d{2}\.fun|bav\d{2}\.xyz|bbav\d{3}\.com|onebookcms\.com|theavporn\.com|thedemovideos\.com|thepa\d+\.\w+|the\d+\.\w+)\/(\w{2}\/)?albums\/\d+\/[\w-]+\//i,
        init: () => {
            new MutationObserver((mutations, observer) => {
                if (fun.ge(".chatra--webkit")) {
                    fun.ge(".chatra--webkit").remove();
                    observer.disconnect();
                }
            }).observe(document.body, MutationObserverConfig);
        },
        imgs: ".images>a",
        thums: ".images>a>img",
        button: [4],
        insertImg: [
            [".images", 2, ".images"], 2
        ],
        customTitle: ".headline>h1",
        css: ".sponsor,.chatra--webkit{display:none!important}",
        category: "nsfw2"
    }, {
        name: "AVJB 去廣告",
        reg: /^https?:\/\/(avjb\.com|avjb\.fun|av\d{2}\.fun|bav\d{2}\.xyz|bbav\d{3}\.com|onebookcms\.com|theavporn\.com|thedemovideos\.com|thepa\d+\.\w+|the\d+\.\w+)\//i,
        init: () => {
            new MutationObserver((mutations, observer) => {
                if (fun.ge(".chatra--webkit")) {
                    fun.ge(".chatra--webkit").remove();
                    observer.disconnect();
                }
            }).observe(document.body, MutationObserverConfig);
        },
        css: ".sponsor,.chatra--webkit{display:none!important}",
        category: "ad"
    }, {
        name: "爱微社区",
        host: ["dev.avjb.com"],
        link: "https://dev.avjb.com/albums/",
        reg: /^https:\/\/dev\.avjb\.com\/albums\/\d+\/[^\/]+\/$/i,
        imgs: () => {
            thumbnailsSrcArray = fun.gae(".images>a>img").map(e => e.dataset.original ?? e.src);
            return thumbnailsSrcArray.map(e => e.replace("main/200x150", "sources"))
        },
        button: [4],
        insertImg: [
            [".images", 2, ".images"], 2
        ],
        customTitle: "h1.title",
        category: "nsfw2"
    }, {
        name: "爱微社区 成人相册",
        reg: /^https?:\/\/dev\.avjb\.com\/albums\/$/i,
        init: async () => await fun.waitEle(".thumb.item img[src^=http]"),
        autoPager: {
            ele: ".albums-thumbs",
            observer: ".albums-thumbs .thumb.item",
            next: (doc) => {
                let next = fun.ge(".pagination a.active+a:not(.next)", doc);
                return next ? "/albums/?mode=async&function=get_block&block_id=list_albums_common_albums_list&sort_by=post_date&from=" + next.innerText : null;
            },
            re: ".pagination",
            title: doc => "Page " + fun.gt(".pagination a.active", 1, doc),
            lazySrc: "img[data-original]"
        },
        openInNewTab: ".thumb.item a",
        category: "autoPager"
    }, {
        name: "Asian To Lick",
        host: ["asiantolick.com"],
        reg: /asiantolick\.com\/post/,
        init: () => fun.createImgBox(".spotlight-group", 2),
        imgs: () => {
            thumbnailsSrcArray = fun.gae("div[data-src]>img").map(e => e.src);
            return fun.gae("div[data-src]").map(e => e.dataset.src);
        },
        button: [4],
        insertImg: [
            ["#FullPictureLoadMainImgBox", 0, ".spotlight-group"], 2
        ],
        customTitle: "h1",
        css: "#touch_to_see{display:none!important}",
        category: "nsfw2"
    }, {
        name: "套图200网",
        host: ["www.taotu200.com", "taotu200.com"],
        reg: /^https?:\/\/(www\.)?taotu200\.com\/t\d\/\d+\.html$/,
        imgs: "#post_content img",
        button: [4],
        insertImg: [
            ["#post_content", 0, "article>*:last-child"], 2
        ],
        customTitle: () => fun.gt("article>h1").replaceAll("/", "").replace(/\(\d+[\w\s\.\+-]+\)/, ""),
        css: "#touch_to_see{display:none!important}",
        category: "nsfw1"
    }, {
        name: "Models Vibe",
        host: ["www.modelsvibe.com"],
        reg: () => /^https?:\/\/www\.modelsvibe\.com\/[^/]+\/$/.test(siteUrl) && fun.ge(".td-post-content img"),
        init: () => {
            let ele = fun.ge("//p[br and not(contains(text(),'[ad_1]'))]");
            if (!!ele) {
                ele = ele.cloneNode(true);
                fun.gae("img", ele).forEach(img => img.remove());
                let tE = fun.ge(".td-post-content");
                tE.parentNode.insertBefore(ele, tE);
            }
            let ele2 = fun.ge("//p[contains(text(),'Number of pictures')]");
            if (!!ele2) {
                if (ele2.previousSibling.tagName == "P") {
                    ele2.previousSibling.innerHTML = ele2.previousSibling.innerHTML + "<br>" + ele2.innerText;
                    let e = ele2.previousSibling;
                    let te = ele2.previousSibling.parentNode;
                    te.parentNode.insertBefore(e, te);
                }
            }
        },
        imgs: () => {
            if (fun.ge(".page-nav")) {
                let max = fun.gt(".page-nav>*:last-child", 2);
                return fun.getImg(".td-post-content img", max, 4);
            } else if (fun.ge(".td-post-content img[srcset]")) {
                let srcs = fun.gae(".td-post-content img[src]").map(e => decodeURIComponent(e.src));
                let srcsets = fun.gae(".td-post-content img[srcset]").map(img => {
                    let splitArr = img.getAttribute("srcset").split(",");
                    splitArr = splitArr.sort((a, b) => a.match(/\s(\d+)w/)[1] - b.match(/\s(\d+)w/)[1]);
                    return decodeURIComponent(splitArr.at(-1).trim().split(" ")[0]);
                });
                return [...new Set(srcs.concat(srcsets))];
            } else {
                return fun.gae(".td-post-content img");
            }
        },
        button: [4],
        insertImg: [".td-post-content .tdb-block-inner", 2],
        go: 1,
        customTitle: "h1.tdb-title-text",
        css: ".tdb_header_menu .tdb-menu .tdb-mega-menu-inactive,.tdb_header_menu .tdb-menu .tdb-menu-item-inactive{pointer-events:auto!important}.tdb_header_menu .tdb-menu .tdb-mega-menu-inactive > ul,.tdb_header_menu .tdb-menu .tdb-menu-item-inactive>ul{visibility:unset!important;opacity:1!important}.tdb_header_menu .tdb-normal-menu ul .tdb-menu-item{list-style-type:auto!important}",
        category: "nsfw1"
    }, {
        name: "Models Vibe - 分類自動翻頁",
        host: ["www.modelsvibe.com"],
        reg: /^https?:\/\/www\.modelsvibe\.com\/(albums\/.+)?(page\/\d+\/)?$/,
        init: () => {
            /page\/\d+\//.test(fun.lp) ? currentPageNum = Number(fun.lp.match(/\/page\/(\d+)/)[1]) : currentPageNum = 1;
        },
        autoPager: {
            ele: ".td_flex_block:not(.td-flex-radius),.td_block_inner.tdb-block-inner",
            observer: ".td-cpt-post",
            next: () => {
                let url = siteUrl.replace(/page\/\d+\/?/, "") + `page/${currentPageNum += 1}/`;
                return url;
            },
            re: ".page-nav",
            stop: doc => fun.ge(".td-404-title", doc) ? true : false,
            bF: doc => {
                fun.gae("span[data-img-url]", doc).forEach(span => {
                    span.classList.add("td-animation-stack-type0-2");
                    span.style.backgroundImage = `url('${span.dataset.imgUrl}')`;
                });
            },
            title: doc => "Page " + currentPageNum
        },
        openInNewTab: ".td-cpt-post a:not([target=_blank])",
        css: ".tdi_60.td-a-rec{display:none!important;}.tdb_header_menu .tdb-menu .tdb-mega-menu-inactive,.tdb_header_menu .tdb-menu .tdb-menu-item-inactive{pointer-events:auto!important}.tdb_header_menu .tdb-menu .tdb-mega-menu-inactive > ul,.tdb_header_menu .tdb-menu .tdb-menu-item-inactive>ul{visibility:unset!important;opacity:1!important}.tdb_header_menu .tdb-normal-menu ul .tdb-menu-item{list-style-type:auto!important}",
        category: "autoPager"
    }, {
        name: "Models Vibe - 修正選單CSS和去廣告",
        host: ["www.modelsvibe.com"],
        reg: /^https?:\/\/www\.modelsvibe\.com\//,
        css: ".tdi_60.td-a-rec{display:none!important;}.tdb_header_menu .tdb-menu .tdb-mega-menu-inactive,.tdb_header_menu .tdb-menu .tdb-menu-item-inactive{pointer-events:auto!important}.tdb_header_menu .tdb-menu .tdb-mega-menu-inactive > ul,.tdb_header_menu .tdb-menu .tdb-menu-item-inactive>ul{visibility:unset!important;opacity:1!important}.tdb_header_menu .tdb-normal-menu ul .tdb-menu-item{list-style-type:auto!important}",
        category: "autoPager"
    }, {
        name: "Goddess247/BestPrettyGirl/Girl Sweetie/Girl Dreamy",
        reg: () => {
            let hosts = ["goddess247.com", "bestprettygirl.com", "girlsweetie.com", "girldreamy.com"];
            return hosts.includes(fun.lh) && !/^\/tag\/|^\/category\//.test(fun.lp) && fun.ge(".elementor-widget-container p img[alt],.elementor-widget-container img.aligncenter.size-full");
        },
        init: () => fun.createImgBox("//p[img] | //img[@class='aligncenter size-full']", 1),
        imgs: ".elementor-widget-container p img[alt],.elementor-widget-container img.aligncenter.size-full",
        button: [4],
        insertImg: [
            ["#FullPictureLoadMainImgBox", 0, "//p[img] | //img[@class='aligncenter size-full']"], 2
        ],
        go: 1,
        customTitle: () => fun.title(/ - Goddess247| - BestPrettyGirl| - Girl Sweetie| - Girl Dreamy/),
        fancybox: {
            v: 3,
            css: false
        },
        category: "nsfw1"
    }, {
        name: "BestGirlSexy",
        reg: () => {
            let hosts = ["bestgirlsexy.com"];
            return hosts.includes(fun.lh) && !/^\/tag\/|^\/category\//.test(fun.lp) && fun.ge(".elementor-widget-theme-post-content img");
        },
        init: () => fun.createImgBox("//p[img] | //img[@class='aligncenter size-full']", 1),
        imgs: ".elementor-widget-theme-post-content img",
        button: [4],
        insertImg: [
            ["#FullPictureLoadMainImgBox", 0, "//p[img] | //img[@class='aligncenter size-full']"], 2
        ],
        go: 1,
        customTitle: () => fun.title(" - BestGirlSexy"),
        fancybox: {
            v: 3,
            css: false
        },
        category: "nsfw1"
    }, {
        name: "eyval.net",
        host: ["www.eyval.net"],
        reg: /^https?:\/\/www\.eyval\.net\/\d+\/\d+\/[\w-]+\.html/,
        imgs: async () => {
            let imgsSrcArr = fun.gae(".entry-content a[href*=blog]").map(a => {
                let arr = a.href.split("/");
                if (arr.length === 9) {
                    arr[7] = "s16000";
                    return arr.join("/");
                } else {
                    return a.href;
                }
            });
            thumbnailsSrcArray = imgsSrcArr.map(e => e.replace("/s16000/", "/w100/"));
            return imgsSrcArr;
        },
        button: [4],
        insertImg: [".entry-content", 2],
        customTitle: ".entry-title",
        category: "nsfw1"
    }, {
        name: "eyval.net - 分類自動翻頁",
        host: ["www.eyval.net"],
        reg: /^https?:\/\/www\.eyval\.net\//,
        autoPager: {
            mode: 1,
            ele: ".blog-posts>.date-outer",
            next: "a.blog-pager-older-link",
            observer: ".blog-posts>.date-outer",
            re: "#blog-pager",
            stop: doc => fun.ge(".date-outer", doc) ? false : true,
            title: () => "Page" + (currentPageNum += 1)
        },
        openInNewTab: ".date-outer a[href]:not([target=_blank])",
        category: "autoPager"
    }, {
        name: "PhimVu",
        host: ["m.phimvuspot.com"],
        reg: /^https?:\/\/m\.phimvuspot\.com\/\w+\/\w+\.cfg/i,
        imgs: async () => {
            let max;
            try {
                max = fun.gt("h1.post-title").match(/\d+$/)[0];
            } catch (e) {
                max = 1;
            }
            return /\?m=1/.test(siteUrl) ? await fun.getImg(".post-content img", max, "8") : await fun.getImg(".post-content img", max);
        },
        button: [4],
        insertImg: [".post-content", 2],
        customTitle: () => fun.title(/^[a-z-\s\.I]+:/i).split("|")[0].trim().replace(/\(\d+[\w\s\.\+-]+\)|\[\d+[\w\s\.\+-]+\]|【\d+[\w\s\.\+-]+】|\d+p(\d+v)?/i, ""),
        category: "nsfw2"
    }, {
        name: "Poringa!",
        host: ["www.poringa.net", "m.poringa.net"],
        reg: /^https?:\/\/(www|m)\.poringa\.net\/posts\//i,
        imgs: ".post-content img,.content-post-img>img",
        button: [4],
        insertImg: [".post-content,.content.short", 3],
        customTitle: ".post-title,h1.title",
        category: "nsfw2"
    }, {
        name: "YeuGai.Net",
        host: ["yeugai.org"],
        reg: /^https?:\/\/yeugai\.org\/[^\/]+\/$/i,
        init: async () => {
            await fun.waitEle(".mirror-image img");
            fun.run("jQuery(document).off();");
        },
        imgs: () => {
            videosSrcArray = fun.gau("video>source[type='video/mp4']+a[href*='.mp4']");
            if (fun.ge(".mirror-image img[src*=blog]")) {
                let imgsSrcArr = fun.gae(".mirror-image img[src*=blog]").map(e => {
                    let arr = e.src.split("/");
                    if (arr.length === 9) {
                        arr[7] = "s16000";
                        return arr.join("/");
                    } else {
                        return e.src;
                    }
                });
                thumbnailsSrcArray = imgsSrcArr.map(e => e.replace("/s16000/", "/w100/"));
                return imgsSrcArr;
            } else {
                return fun.gae(".mirror-image img");
            }
        },
        button: [4],
        insertImg: [".entry-content", 2],
        customTitle: () => fun.gt(".entry-title").replace(/^Ảnh.+Xinh\s|^Clip.+Em\s/, ""),
        downloadVideo: true,
        category: "nsfw2"
    }, {
        name: "min: archive",
        host: ["min-bin.blogspot.com"],
        reg: /^https?:\/\/min-bin\.blogspot\.com\/\d+\/\d+\/[^\.]+\.html/,
        imgs: () => fun.gau(".separator>a").map(u => u.replace("/s1600/", "/s16000/")),
        button: [4],
        insertImg: [".post-body", 2],
        customTitle: ".entry-title",
        category: "nsfw2"
    }, {
        name: "Graphis",
        host: ["20sanctuary-grahpis.blogspot.com"],
        reg: /^https?:\/\/20sanctuary-grahpis\.blogspot\.com\/\d+\/\d+\/[^\.]+\.html/,
        imgs: () => {
            thumbnailsSrcArray = fun.gae(".separator>a img").map(e => e.src.replace("/s320/", "/w100/"));
            return fun.gau(".separator>a").map(u => u.replace("/s1600/", "/s16000/"));
        },
        button: [4],
        insertImg: [".post-body", 2],
        customTitle: ".post_item>h1",
        category: "nsfw2"
    }, {
        name: "Asia Idols",
        host: ["asiaidols.wordpress.com"],
        reg: /^https?:\/\/asiaidols\.wordpress\.com\/\d+\/\d+\/\d+\/[^\/]+\/$/,
        imgs: () => {
            thumbnailsSrcArray = fun.getImgSrcArr("img[alt='image host']");
            let imageHostLinks = fun.gau("//a[img[@alt='image host']]");
            return fun.getImageHost(imageHostLinks);
        },
        button: [4],
        insertImg: [".entry-content", 3],
        customTitle: ".entry-title",
        category: "nsfw2"
    }, {
        name: "Asia Porn Photo",
        host: ["www.asiapornphoto.com"],
        reg: /^https?:\/\/www\.asiapornphoto\.com\/[^\.]+\.shtml$/,
        imgs: ".entry-content img",
        button: [4],
        insertImg: [".entry-content", 2],
        autoDownload: [0],
        next: ".nav-previous>a",
        prev: ".nav-next>a",
        customTitle: ".entry-title",
        category: "nsfw2"
    }, {
        name: "Tabakus Gallery",
        host: ["tabakus.blogspot.com"],
        reg: /^https?:\/\/tabakus\.blogspot\.com\/\d+\/\d+\/[^\.]+\.html/,
        imgs: ".separator>a",
        imgs: () => {
            thumbnailsSrcArray = fun.getImgSrcArr(".separator>a img").map(e => e.replace("/s400/", "/w100/"));
            return fun.gau(".separator>a").map(u => u.replace("/s1600/", "/s16000/"));
        },
        button: [4],
        insertImg: [".post-body", 2],
        customTitle: ".post_item>h1",
        downloadVideo: true,
        category: "nsfw2"
    }, {
        name: "Chinese Nude Art Photos",
        host: ["chinesenudeart.blogspot.com"],
        reg: /^https?:\/\/chinesenudeart\.blogspot\.com\/\d+\/\d+\/[\w-]+\.html/i,
        imgs: ".entry-content a[href]",
        thums: ".entry-content a[href]>img",
        button: [4],
        insertImg: [".entry-content", 2],
        autoDownload: [0],
        next: "a.blog-pager-older-link",
        prev: "a.blog-pager-newer-link",
        customTitle: () => fun.gt(".entry-title").trim().replace("Chinese beautiful model Amanda -", "").replace("Beautiful Chinese girl -", "").replace("Beautiful Chinese girl ", "").replace("Chinese Beautiful girl -", "").replace(" |18+ Nude model Amateur", ""),
        css: "@media only screen and (max-width:479px){#outer-wrapper{margin:0px!important;width:100%!important}}",
        category: "nsfw1"
    }, {
        name: "CUTE GIRLS ADDICT",
        host: ["cutegirlsaddict.blogspot.com"],
        reg: /cutegirlsaddict\.blogspot\.com\/\d+\/\d+\/[a-z0-9-]+\.html/i,
        imgs: async () => {
            thumbnailsSrcArray = fun.gae(".separator>a>img").map(e => {
                let arr = e.src.split("/");
                arr[7] = "w100";
                return arr.join("/");
            });
            let srcArr = fun.gau(".separator>a");
            let firstSrcArr = srcArr[0].split("/");
            if (firstSrcArr.length === 9) {
                firstSrcArr[7] = "s16000";
                let testMaxSrc = firstSrcArr.join("/");
                let obj = await fun.checkImgStatus(testMaxSrc);
                debug("\n確認圖片狀態\n", obj);
                if (obj.ok) {
                    srcArr = srcArr.map(src => {
                        let arr = src.split("/");
                        arr[7] = "s16000";
                        return arr.join("/");
                    });
                    return srcArr;
                } else {
                    return srcArr;
                }
            } else {
                return srcArr;
            }
        },
        button: [4],
        insertImg: [".entry-content", 2],
        customTitle: "h1.post-title,h3.entry-title",
        category: "nsfw1"
    }, {
        name: "4KUP",
        host: ["4kup.net"],
        reg: /^https?:\/\/4kup\.net\/(?!getlink)[^\/]+\/$/,
        exclude: "//button[text()='Click here to continue']",
        imgs: "a.thumb-photo",
        thums: "a.thumb-photo>img",
        button: [4],
        insertImg: ["#gallery", 2],
        go: 1,
        autoDownload: [0],
        next: "a[rel=prev]",
        prev: "a[rel=next]",
        customTitle: ".entry-title",
        category: "nsfw2"
    }, {
        name: "Spacemiss.com",
        host: ["spacemiss.com"],
        reg: /^https?:\/\/spacemiss\.com\/.+$/,
        include: ".td-post-content .tdb-block-inner.td-fix-index",
        imgs: () => {
            videosSrcArray = fun.gae("video>source[type='video/mp4']").map(e => e.src);
            return fun.gae(".td-post-content .tdb-block-inner.td-fix-index img").map(e => decodeURIComponent(e.src));
        },
        button: [4],
        insertImg: [".td-post-content .tdb-block-inner.td-fix-index", 2],
        go: 1,
        customTitle: () => fun.gt(".tdb-title-text").replace(/\d+P([\d\s\+P]+)?/, "").replaceAll("|", "-").trim(),
        downloadVideo: true,
        category: "nsfw1"
    }, {
        name: "Imgasd",
        host: ["imgasd.com"],
        reg: /^https?:\/\/imgasd\.com\/article\/\d+$/,
        imgs: ".imgs>img[alt]",
        button: [4],
        insertImg: [".imgs", 2],
        customTitle: ".content>h1",
        category: "nsfw1"
    }, {
        name: "呦糖社",
        host: ["www.nicesss.com"],
        reg: /^https?:\/\/www\.nicesss\.com\/archives\/[\w-]+\/([\w-]+\/)?\d+\.html$/i,
        init: () => fun.createImgBox(".entry-content>img[data-srcset],.entry-content>p>img[data-srcset]", 1),
        imgs: () => fun.gae(".entry-content>img[data-srcset],.entry-content>p>img[data-srcset]").map(e => e.dataset.srcset),
        button: [4],
        insertImg: [
            ["#FullPictureLoadMainImgBox", 0, ".entry-content>img[data-srcset],.entry-content>p:has(>img[data-srcset])"], 2
        ],
        customTitle: ".entry-title>a",
        fancybox: {
            v: 3,
            css: false
        },
        category: "nsfw1"
    }, {
        name: "呦糖社C+",
        host: ["www.nicezzz.com", "www.nicekkk.com"],
        reg: [
            /^https?:\/\/www\.nicezzz\.com\/archives\/[\w-]+\/([\w-]+\/)?\d+\.html$/i,
            /^https?:\/\/www\.nicekkk\.com\/archives\/[\w-]+\/[\w-]+\.html$/i
        ],
        init: () => fun.createImgBox(".wp-posts-content>img,.wp-posts-content>p>img", 1),
        imgs: ".wp-posts-content>img,.wp-posts-content>p>img",
        button: [4],
        insertImg: [
            ["#FullPictureLoadMainImgBox", 0, ".wp-posts-content>img,.wp-posts-content>p:has(>img)"], 2
        ],
        customTitle: ".article-title>a",
        fancybox: {
            v: 3,
            insertLibrarys: 1
        },
        category: "nsfw1"
    }, {
        name: "Fliporn",
        host: ["fliporn.biz"],
        reg: /fliporn\.biz\/videos\//,
        include: "//span[@class='entry-category']/a[text()='亚洲贴图' or text()='写真' or text()='动漫贴图' or text()='性感贴图' or text()='欧美贴图' or text()='网友自拍']",
        init: () => fun.createImgBox("//center[img] | //center[p[img]] | //div[@id='conttpc' and img] | //div[@id='conttpc' and p[img]] | //div[@class='entry-content']//p[img] | //div[figure[div[img]]]", 1),
        imgs: () => fun.gae(".entry-content img").map(e => e.dataset.src ? e.dataset.src.replace(/\?w=858(&ssl=1)?/, "") : e.src.replace("%3C/center%3E%3C/p%3E%3Cdiv%20class=", "").replace(/\?w=858(&ssl=1)?/, "")),
        button: [4],
        insertImg: [
            ["#FullPictureLoadMainImgBox", 0, "//center[img] | //center[p[img]] | //div[@id='conttpc' and img] | //div[@id='conttpc' and p[img]] | //div[@class='entry-content']//p[img] | //div[figure[div[img]]]"], 2
        ],
        customTitle: () => document.title.replace(/\s?\[[0-9p\s]+\]|\[\d+P\]|“\d+ photos.+$/i, "").trim(),
        category: "nsfw2"
    }, {
        name: "91图录",
        host: ["www.91tulu.com"],
        reg: /^https?:\/\/www\.91tulu\.com\/\d+\.html/,
        imgs: ".wp-posts-content img",
        button: [4],
        insertImg: [".wp-posts-content", 2],
        autoDownload: [0],
        next: "//a[p[text()='上一篇']]",
        prev: "//a[p[text()='下一篇']]",
        customTitle: ".article-title",
        css: ".wp-posts-content{max-height:unset!important}",
        category: "nsfw1"
    }, {
        name: "萌妹社区",
        host: ["www.mmav.me"],
        link: "https://www.mmav.me/photo/",
        reg: /^https?:\/\/www\.mmav\.me\/photo\/\d+\.html/,
        imgs: () => {
            thumbnailsSrcArray = fun.gae(".imglist img[data-original]").map(e => location.origin + e.dataset.original);
            return thumbnailsSrcArray.map(e => e.replace(/_t(\.\w+)$/, "$1"));
        },
        button: [4],
        insertImg: [".main.warp.row", 2],
        customTitle: () => fun.gt(".play-title").replace(/_?(\s-\s)?\(\d+P\)/i, ""),
        css: "#top-img-list,#tonglanad_t1,#ajdjs{display:none!important}body{padding-bottom:0px!important}",
        category: "nsfw2"
    }, {
        name: "萌妹社区去廣告",
        host: ["www.mmav.me"],
        reg: /^https?:\/\/www\.mmav\.me\//,
        css: "#top-img-list,#tonglanad_t1,#ajdjs{display:none!important}",
        category: "ad"
    }, {
        name: "麻豆村/麻麻传媒/乌鸦传媒/糖心vlog/果冻传媒/兔子先生/中国X站/中国P站/麻豆101/麻豆吃瓜社区/mini传媒/星空无限传媒/天美传媒/9草吃瓜网/皇家华人",
        host: ["www.madoucun.com", "www.madoucun.org", "www.madoumcn.com", "www.madoucun.net", "modeltvmcn.com", "www.mamamcn.com", "www.wuyamcn.com", "www.tangxvlog.com", "www.guodongmcn.com", "www.mrrabbit.org", "www.xvideo.bar", "www.proncn.com", "www.md101.tv", "www.mdcg.club", "www.minimcn.com", "www.xkmcn.net", "www.tianmeimcn.com", "www.9ccg.org", "www.hkdoll.org", "www.royalmcn.com", "www.psychoporn.org"],
        link: "/arttype/57.html",
        reg: [
            /^https?:\/\/(www\.)?madoucun(\d+)?\.(com|org|net)\/artdetail-\d+/,
            /^https?:\/\/(www\.)?(mamamcn|madoumcn|modeltvmcn)\.com\/artdetail-\d+/,
            /^https?:\/\/(www\.)?wuyamcn\.com\/artdetail-\d+/,
            /^https?:\/\/(www\.)?tangxvlog\.com\/artdetail-\d+/,
            /^https?:\/\/(www\.)?guodongmcn\.com\/artdetail-\d+/,
            /^https?:\/\/(www\.)?mrrabbit\.org\/artdetail-\d+/,
            /^https?:\/\/(www\.)?xvideo\.bar\/artdetail-\d+/,
            /^https?:\/\/(www\.)?proncn\.com\/artdetail-\d+/,
            /^https?:\/\/(www\.)?md101\.tv\/artdetail-\d+/,
            /^https?:\/\/(www\.)?mdcg\.club\/artdetail-\d+/,
            /^https?:\/\/(www\.)?minimcn\.com\/artdetail-\d+/,
            /^https?:\/\/(www\.)?xkmcn\.net\/artdetail-\d+/,
            /^https?:\/\/(www\.)?tianmeimcn\.com\/artdetail-\d+/,
            /^https?:\/\/(www\.)?9ccg\.org\/artdetail-\d+/,
            /^https?:\/\/(www\.)?hkdoll\.org\/artdetail-\d+/,
            /^https?:\/\/(www\.)?royalmcn\.com\/artdetail-\d+/,
            /^https?:\/\/(www\.)?psychoporn\.org\/artdetail-\d+/
        ],
        include: ".hl-article-box img,.news-content img",
        init: () => fun.addMutationObserver(() => fun.remove("//div[div[@id and a[@id and img]]] | //div[div[@id='homeBannerWrap']]")),
        imgs: ".hl-article-box img,.news-content img",
        button: [4],
        insertImg: [".hl-article-box,.news-content", 2],
        customTitle: ".hl-article-title,.news-title",
        css: "#Conchnavlinkp>*,.hl-pops-bg,.hl-poptips-wrap{display:none!important;}",
        category: "nsfw2"
    }, {
        name: "淫淫小说写真馆",
        host: ["books.xxgirls.vip"],
        reg: /^https?:\/\/books\.xxgirls\.vip\/artdetail-\d+\//,
        imgs: "#read_tpc img,.hl-article-content img",
        button: [4],
        insertImg: ["#read_tpc,.hl-article-content", 2],
        autoDownload: [0],
        next: ".hl-next",
        prev: ".hl-prev",
        customTitle: () => fun.gt(".hl-article-title").replace(/-[\d\s]+P?$|\(\d+P\)?.*$|【\d+P】$/i, "").trim(),
        category: "nsfw2"
    }, {
        name: "ACG宅吧",
        host: ["www.acgers.com"],
        link: "https://www.acgers.com/list/list",
        reg: /^https?:\/\/www\.acgers\.com\/list\/detail\?id=\d+$/,
        imgs: ".detail-info img",
        button: [4],
        insertImg: [".detail-info", 2],
        customTitle: ".content-title",
        category: "nsfw1"
    }, {
        name: "成人图片 Qinimg",
        host: ["www.qinimg.com"],
        reg: /www\.qinimg\.com\/image\/\d+\.html/,
        imgs: () => {
            thumbnailsSrcArray = fun.gae("#image a>img").map(e => e.getAttribute("img") != "" ? e.getAttribute("img") : e.src);
            return fun.gae("#image a");
        },
        button: [4],
        insertImg: [
            ["#image", 2], 2
        ],
        go: 1,
        customTitle: ".box>h1",
        category: "nsfw2"
    }, {
        name: "零零COS",
        host: ["00cos.com"],
        reg: /00cos\.com\/\d+\.html/,
        exclude: ".tinymce-hide,.fa-info-circle[aria-hidden=true]",
        imgs: ".article-content img",
        customTitle: ".article-title>a",
        category: "nsfw1"
    }, {
        name: "Elite Babes格式",
        host: ["www.elitebabes.com", "pmatehunter.com", "www.jperotica.com", "www.metarthunter.com", "www.femjoyhunter.com"],
        reg: /(www\.)?(elitebabes|pmatehunter|jperotica|metarthunter|femjoyhunter)\.com\/.+\//,
        exclude: "#content video",
        imgs: ".list-gallery a[data-fancybox]",
        thums: ".list-gallery a[data-fancybox]>img",
        button: [4, "23%"],
        insertImg: [
            [".list-gallery", 2], 2
        ],
        go: 1,
        customTitle: "#content>p",
        fancybox: {
            v: 3,
            css: false
        },
        category: "nsfw2"
    }, {
        name: "Naked Women Pics/VIEW GALS/Hot Pussy Pics/Busty Women Pics",
        host: ["nakedwomenpics.com", "viewgals.com", "hotpussypics.com", "bustypassion.com"],
        reg: [
            /^https?:\/\/nakedwomenpics\.com\/pics\/[^\/]+\/$/,
            /^https?:\/\/viewgals\.com\/pics\/[^\/]+\/$/,
            /^https?:\/\/hotpussypics\.com\/pics\/[^\/]+\/$/,
            /^https?:\/\/bustypassion\.com\/pics\/[^\/]+\/$/,
        ],
        imgs: "a.ss-image",
        button: [4],
        insertImg: [".m-content-con", 2],
        customTitle: "h1",
        category: "nsfw2"
    }, {
        name: "TeenPussyPics.com",
        host: ["teenpussypics.com"],
        reg: /^https?:\/\/teenpussypics\.com\/images\/\d+\/$/,
        imgs: "//div[@id='lucrezia']//a[img[@data-src]]",
        button: [4],
        insertImg: ["#lucrezia", 2],
        customTitle: "h1",
        css: "#lucrezia{height:auto!important}",
        category: "nsfw2"
    }, {
        name: "NSFWalbum",
        host: ["nsfwalbum.com"],
        reg: /^https?:\/\/nsfwalbum\.com\/album\/\d+$/,
        init: () => fun.createImgBox(".album", 2),
        imgs: () => {
            thumbnailsSrcArray = fun.getImgSrcArr(".albumPhoto");
            fun.showMsg(displayLanguage.str_05, 0);
            let fetchNum = 0;
            return fun.gae(".album .item>a").map(async (a, i, arr) => {
                let img = fun.ge("img", a);
                let src = img.dataset.src ?? img.src;
                if (/imx\.to/.test(src)) {
                    return src.replace("/t/", "/i/");
                } else {
                    await fun.delay(100 * i, 0);
                    return fetch(a.href).then(res => res.text()).then(text => {
                        let id = a.href.split("/").at(-1);
                        let spirit = fun.run(text.match(/var\sspirit\s?=\s?([^;]+);/)[1]);
                        let api = `/backend.php?&spirit=${spirit}&photo=${id}`;
                        return fetch(api).then(res => res.json()).then(json => {
                            fun.showMsg(`${displayLanguage.str_06}${fetchNum+=1}/${arr.length}`, 0);
                            return json[0];
                        });
                    });
                }
            });
        },
        button: [4, "24%", 3],
        insertImg: [
            ["#FullPictureLoadMainImgBox", 0, ".album"], 2
        ],
        customTitle: () => fun.gt(".gallery_name").replace(/\sx\d{1,4}.*|-\sx\d{1,4}.*|-\s\d{1,4}x.*|-[\d\s]+pic.+| - \d{2}.\d{2}.\d{4}.*|\(x\d+\).*|[\d\s]+pics.*|\([\w\s\.\+,]+\)|\|[\s\dx]+\|.*/i, "").trim(),
        category: "nsfw2"
    }, {
        name: "Adult photo sets",
        host: ["adultphotosets.best"],
        reg: /^https?:\/\/adultphotosets\.best\/index\.php\?newsid=\d+$/i,
        include: "//a[img[@data-src][@data-maxwidth]]",
        imgs: () => {
            thumbnailsSrcArray = fun.getImgSrcArr("//img[@data-src][@data-maxwidth]");
            let URLs = fun.gau("//a[img[@data-src][@data-maxwidth]]");
            return fun.getImageHost(URLs);
        },
        button: [4],
        insertImg: [
            ["//a[img[@data-src][@data-maxwidth]]", 2, "//a[img[@data-src][@data-maxwidth]]"], 2
        ],
        customTitle: ".title",
        category: "nsfw2"
    }, {
        name: "Pics-X",
        host: ["pics-x.com"],
        reg: /^https?:\/\/pics-x\.com\/gallery\/\d+\//i,
        init: async () => await fun.waitEle("#images-container img"),
        imgs: "#images-container img",
        button: [4],
        insertImg: ["#images-container", 2],
        customTitle: () => fun.title(" | Pics-X"),
        category: "nsfw2"
    }, {
        name: "SXYPIX",
        host: ["sxypix.com"],
        reg: /^https?:\/\/sxypix\.com\/w\/\w+/i,
        init: () => fun.createImgBox(".gallgrid", 2),
        imgs: async () => {
            fun.showMsg(displayLanguage.str_05, 0);
            let pid = fun.ge("div.grid-item").dataset.photoid;
            let aid = fun.gu(".gall_info_panel a.tdn").split("/").at(-1);
            let ghash = fun.ge(".gall_cp[data-ghash]").dataset.ghash;
            let total = Number(fun.gt(".ip_count"));
            let pages = Math.ceil(total / 36);
            let headers = {
                "content-type": "application/x-www-form-urlencoded; charset=UTF-8",
                "x-requested-with": "XMLHttpRequest"
            };
            let resArr = fun.arr(pages).map((_, i) => fetch("/php/apg.php", {
                "headers": headers,
                "body": `mode=w&param={"page":${(i+1)},"ghash":"${ghash}"}`,
                "method": "POST"
            }).then(res => res.json()).then(json => json.r));
            thumbnailsSrcArray = await Promise.all(resArr).then(data => data.flat()).then(arr => {
                let html = arr.join("");
                let dom = fun.doc(html);
                return fun.gae(".gall_cover", dom).map(e => e.dataset.src ?? e.src);
            });
            return fetch("/php/gall.php", {
                "headers": headers,
                "body": `x=x&pid=${pid}&aid=${aid}&ghash=${ghash}&width=1920`,
                "method": "POST"
            }).then(res => res.json()).then(json => {
                let arr = json.r;
                let html = arr.join("");
                let dom = fun.doc(html);
                return fun.gae("div.gall_pix_el", dom);
            });
        },
        button: [4],
        insertImg: [
            ["#FullPictureLoadMainImgBox", 0, ".grid"], 2
        ],
        customTitle: ".gall_title",
        css: "#FullPictureLoadEnd{color:rgb(255, 255, 255)}",
        category: "nsfw2"
    }, {
        name: "URLGalleries",
        host: ["urlgalleries.net"],
        reg: /^https?:\/\/[^\.]+\.urlgalleries\.net\/porn-gallery-\d+\//,
        imgs: async () => {
            let links = fun.gau(".gallerybody a[href*='?p=']");
            links = [...new Set(links)];
            await fun.getEle(links, "#wtf>a", ["#wtf", 0]);
            thumbnailsSrcArray = fun.gae("#wtf>a>img").map(img => img.src);
            return fun.getImgCorsA("img.pic", "#wtf>a");
        },
        button: [4],
        insertImg: [
            ["#wtf", 2, "#wtf"], 2
        ],
        customTitle: ".galleryhead>h3>a",
        category: "nsfw2"
    }, {
        name: "wikiFeet",
        host: ["www.wikifeet.com"],
        reg: /^https?:\/\/www\.wikifeet\.com\/[^\/]+$/,
        imgs: async () => {
            await fun.waitEle(".pic>a");
            const {
                messanger
            } = _unsafeWindow;
            let imgDir = fun.gu(".pic>a").match(/[^\d]+/)[0];
            thumbnailsSrcArray = messanger.gdata.map(e => "https://thumbs.wikifeet.com/" + e.pid + ".jpg");
            return messanger.gdata.map(e => imgDir + e.pid + ".jpg");
        },
        button: [4],
        insertImg: ["#thepics", 2],
        customTitle: "#content h1",
        category: "nsfw1"
    }, {
        name: "VK",
        host: ["vk.com"],
        link: "https://vk.com/album-74498063_255021373",
        reg: /^https?:\/\/vk\.com\/album-[\d_]+$/,
        imgs: () => {
            fun.showMsg(displayLanguage.str_05, 0);
            let list = window.location.pathname.split("/")[1];
            let picsNum = document.querySelector(".ui_crumb_count").innerText;
            let max = Math.ceil(picsNum / 10);
            let fetchNum = 0;
            let resArr = [];
            for (let i = 0; i < picsNum; i += 10) {
                let res = fetch("https://vk.com/al_photos.php?act=show", {
                    "headers": {
                        "content-type": "application/x-www-form-urlencoded",
                        "x-requested-with": "XMLHttpRequest"
                    },
                    "body": `act=show&al=1&direction=1&list=${list}&offset=${i}`,
                    "method": "POST"
                }).then(res => res.json()).then(json => {
                    fun.showMsg(`${displayLanguage.str_06}${fetchNum+=1}/${max}`, 0);
                    return json.payload[1][3].map(e => e.z_src);
                });
                resArr.push(res);
            };
            return Promise.all(resArr).then(data => data.flat());
        },
        capture: () => _this.imgs(),
        customTitle: ".photos_album_intro>h1",
        category: "nsfw2"
    }, {
        name: "Bunkr",
        host: ["bunkr.si"],
        reg: () => fun.lh.includes("bunkr") && /^\/a\/[\w#]+$/i.test(fun.lp),
        init: () => fun.createImgBox(".grid-images", 2),
        imgs: async () => {
            fun.showMsg(displayLanguage.str_01, 0);
            let xhrNum = 0;
            let links = fun.gau(".grid-images_box a[href*='/i/']");
            let resArr = [];
            for (let url of links) {
                let res = fun.xhrDoc(url).then(dom => {
                    fun.showMsg(`${displayLanguage.str_02}${xhrNum+=1}/${links.length}`, 0);
                    let img = dom.querySelector(".lightgallery>img");
                    return img ? img.src : null;
                });
                resArr.push(res);
            }
            let videoLinks = fun.gau(".grid-images_box a[href*='/v/']");
            let videoResArr = [];
            for (let url of videoLinks) {
                let res = fun.xhrDoc(url).then(dom => {
                    let video = dom.querySelector("#player>source");
                    return video ? video.src : null;
                });
                videoResArr.push(res);
            }
            videosSrcArray = await Promise.all(videoResArr).then(data => data.filter(item => item));
            return Promise.all(resArr);
        },
        button: [4],
        insertImg: ["#FullPictureLoadMainImgBox", 2],
        go: 1,
        customTitle: "h1.text-dark",
        referer: "https://bunkr.si/",
        category: "nsfw2"
    }, {
        name: "Bunkr 列表自動翻頁",
        host: ["bunkr-albums.io"],
        reg: /^https?:\/\/bunkr-albums\.io\//,
        autoPager: {
            ele: ".table-auto>tbody",
            next: "a.bg-gray-300+a",
            re: ".justify-center",
            observer: ".table-auto>tbody",
            title: doc => "Page " + fun.ge("a.bg-gray-300", doc).innerText
        },
        category: "autoPager"
    }, {
        name: "Good Sex Porn",
        host: ["goodsexporn.org"],
        reg: /^https?:\/\/goodsexporn\.org\/galleries\/\d+\.html/,
        init: () => {
            fun.gae("#gallery>*:not(#galleryImages)").forEach(e => {
                let x = e.parentNode.parentNode.parentNode.nextElementSibling;
                x.parentNode.insertBefore(e, x);
            });
        },
        imgs: () => {
            thumbnailsSrcArray = [...fun.gae("#galleryImages>.blockItem img")].map(e => e.dataset.src ?? e.src).sort((a, b) => a.match(/(\d+)\.\w+$/)[1] - b.match(/(\d+)\.\w+$/)[1]);
            return thumbnailsSrcArray.map(e => e.replace("thumbs/", ""));
        },
        button: [4],
        insertImg: [".content", 2],
        customTitle: ".player-title",
        css: "@media only screen and (max-width:450px){.related-block .block .blockItem.blockItemBox{width:120px !important}.block .blockItem{display:inline-block !important}}",
        category: "nsfw2"
    }, {
        name: "FitNakedGirls",
        host: ["fitnakedgirls.com"],
        reg: /^https?:\/\/fitnakedgirls\.com\/photos\/gallery\/[^\/]+\/$/,
        imgs: () => {
            let [a, b] = [".wp-block-image img[data-src]", ".entry-content img"];
            if (!!fun.ge(a)) {
                return fun.gae(a).map(e => e.dataset.src.replace(/-\d+x\d+(\.\w+)$/, "$1"));
            } else {
                return fun.gae(b).map(e => e.dataset.src ?? e.src);
            }
        },
        button: [4],
        insertImg: [".entry-content", 2],
        customTitle: () => fun.gt(".entry-title").replaceAll("/ ", "").replace(/\(\d+[\w\s\.\+-]+\)/, "").trim(),
        css: ".g1-column-2of3{width:100%!important}#secondary{display:none!important;}",
        category: "nsfw2"
    }, {
        name: "R18hub",
        host: ["r18hub.com"],
        link: "https://r18hub.com/photos",
        reg: /^https?:\/\/r18hub\.com\/photo\/[\w-]+/,
        imgs: () => {
            let eles = fun.gae("#photos>li");
            thumbnailsSrcArray = eles.map(e => e.dataset.thumb);
            return eles.map(e => e.dataset.src);
        },
        button: [4],
        insertImg: ["#photos", 2],
        customTitle: () => fun.title(" - R18hub"),
        category: "nsfw2"
    }, {
        name: "ZzUp.Com",
        host: ["zzup.com"],
        link: "https://zzup.com/user-album/3338/petmer/index.html",
        reg: /^https?:\/\/zzup\.com\/content\/.+index\.html/i,
        init: () => {
            fun.remove("//iframe|//div[div[center[script[contains(text(),'juicy')]]]][@class='container']|//font[b[contains(text(),'ads')]]");
            fun.createImgBox("//div[div[div[@class='picbox']]]", 2);
        },
        imgs: async () => {
            let max;
            try {
                max = fun.gu(".imgpagebar>a:last-child").match(/page-(\d+)/)[1];
            } catch (e) {
                max = 1;
            }
            if (max > 1) {
                let links = [];
                let url = siteUrl.replace("index.html", "");
                for (let i = 2; i <= max; i++) {
                    links.push(url + "page-" + i + ".html");
                }
                await fun.getEle(links, "//div[div[@class='picbox']]", ["//div[div[div[@class='picbox']]]", 0]);
            }
            thumbnailsSrcArray = fun.gae(".picbox img").map(img => img.src);
            let links = fun.gau(".picbox>a");
            return fun.getImgA("//main//a[img]", links, 100);
        },
        button: [4],
        insertImg: [
            ["#FullPictureLoadMainImgBox", 0, "//div[div[div[@class='picbox']]]"], 2
        ],
        customTitle: () => fun.title(" - ZzUp.Com").replace(/\[\d+[\w\s\.\+]+\]/i, ""),
        category: "nsfw2"
    }, {
        name: "ZzUp.Com 分類自動翻頁",
        enable: 1,
        reg: /^https?:\/\/zzup\.com\//,
        init: () => fun.remove("iframe[src*='ad']"),
        autoPager: {
            ele: "//div[div[@class='picbox']]",
            observer: "//div[div[@class='picbox']]",
            next: "//a[h3[span[@class='glyphicon glyphicon-arrow-right']]]",
            re: "//div[div[@class='imgpagebar']]",
            title: () => "Page" + nextLink.match(/page-(\d+)/)[1]
        },
        category: "autoPager"
    }, {
        name: "FreeXcafe",
        host: ["www.freexcafe.com"],
        reg: /www\.freexcafe\.com\/erotica\/[\w-]+\/[\w-]+\/index\.php/,
        init: () => fun.createImgBox("#content>*:last-child", 2),
        imgs: () => fun.getImgA("#imagelink>img", ".thumbs>a", 500),
        thums: ".thumbs>a>img",
        button: [4],
        insertImg: [
            ["#FullPictureLoadMainImgBox", 2, ".thumbs"], 2
        ],
        category: "nsfw2"
    }, {
        name: "TUPIC.TOP",
        host: ["www.tupic.top"],
        reg: /^https?:\/\/www\.tupic\.top\/(m\/)?\w+\/\d+\.html$/,
        imgs: "a[data-fancybox-group]",
        button: [4],
        insertImg: [".m-list1", 2],
        customTitle: () => fun.ge(".m-t1").textContent.replaceAll("\n", "").trim(),
        category: "nsfw2"
    }, {
        name: "EPORNER Photo",
        host: ["www.eporner.com"],
        link: "https://www.eporner.com/profile/namaiki/,https://www.eporner.com/profile/janekhansen/",
        reg: /\w{2,3}\.eporner\.com\/gallery\/.+\//,
        init: () => fun.createImgBox(".photosgrid", 2),
        imgs: () => {
            thumbnailsSrcArray = fun.gae("#container img").map(e => e.src);
            return thumbnailsSrcArray.map(e => e.replace("_296x1000", ""));
        },
        button: [4],
        insertImg: [
            ["#FullPictureLoadMainImgBox", 2, ".photosgrid"], 2
        ],
        customTitle: "#galleryheader>h1",
        css: "#FullPictureLoadEnd{color:rgb(255, 255, 255)}",
        category: "nsfw2"
    }, {
        name: "Asian Porn",
        host: ["asianporn.li"],
        link: "https://asianporn.li/photos/",
        reg: /^https?:\/\/asianporn\.li\/photo\/\d+\/[^\/]+\/$/i,
        init: () => fun.createImgBox(".photos", 2),
        imgs: async () => {
            await fun.getNP(".cell.photo", "li.active+li>a", null, ".pagination", 0, "img[data-src]");
            thumbnailsSrcArray = fun.gae(".photos img.thumb").map(e => e.dataset.src ?? e.src);
            return fun.getImgA("#image .img-reponsive", ".photos a");
        },
        button: [4],
        insertImg: [
            ["#FullPictureLoadMainImgBox", 2, ".photos"], 2
        ],
        customTitle: ".content-title",
        category: "nsfw2"
    }, {
        name: "Xasiat",
        host: ["www.xasiat.com", "areegator.net", "snapmoms.com"],
        link: "https://www.xasiat.com/albums/",
        reg: /(www\.xasiat\.com|areegator\.net|snapmoms\.com)\/([\w]{2}\/)?albums\/\d+\/[\w-]+\//i,
        init: () => {
            fun.gae("img.thumb[data-original]").forEach(img => (img.src = img.dataset.original));
            fun.remove(".sponsor,.footer-margin");
            fun.createImgBox(".images", 2);
        },
        imgs: ".images>a",
        thums: ".images>a>img[data-original]",
        button: [4],
        insertImg: [
            ["#FullPictureLoadMainImgBox", 0, ".images"], 2
        ],
        customTitle: ".headline>h1",
        css: "#FullPictureLoadEnd{color:rgb(255, 255, 255)}.block-album{display:block!important}.block-album>.table,.top,.footer~*:not([id^='pv-']):not([class^='pv-']):not(.pagetual_tipsWords):not(#comicRead):not(#fab):not(.FullPictureLoadMsg):not(.FullPictureLoadFixedBtn):not(#FullPictureLoadOptions):not(#FullPictureLoadFixedMenu):not(*[class^=fancybox]){display:none!important}",
        category: "nsfw2"
    }, {
        name: "Xasiat loadMore",
        host: ["www.xasiat.com"],
        link: "https://www.xasiat.com/albums/",
        reg: () => /www\.xasiat\.com\/albums\//.test(siteUrl) && fun.ge("#list_albums_common_albums_list_pagination"),
        init: () => {
            setInterval(() => {
                fun.remove("//div[iframe] | //iframe");
                if (document.body.getAttribute("class").length > 13) document.body.setAttribute("class", "big-container");
            }, 500);
        },
        observerClick: ".load-more>a",
        openInNewTab: ".list-albums a:not([target=_blank])",
        category: "ad"
    }, {
        name: "Xasiat去廣告",
        host: ["www.xasiat.com"],
        link: "https://www.xasiat.com/albums/",
        reg: /(www\.xasiat\.com\/albums\/$|www\.xasiat\.com\/albums\/categories\/)/,
        init: () => {
            fun.gae("img.thumb[data-original]").forEach(img => (img.src = img.dataset.original));
            fun.remove(".footer~*", 2000);
        },
        css: ".footer~*{display:none!important}",
        category: "ad"
    }, {
        name: "Erotic Pics",
        host: ["erotic.pics"],
        reg: () => /^https:\/\/erotic\.pics\/[^\/]+\/$/.test(siteUrl) && fun.ge(".entry-content img"),
        imgs: ".entry-content img",
        button: [4],
        insertImg: [".entry-content", 2],
        customTitle: () => fun.gt(".entry-title").replace(/\s–\s\d+\spics/, ""),
        category: "nsfw2"
    }, {
        name: "Erotic Pics 分類自動翻頁",
        enable: 1,
        reg: /^https:\/\/erotic\.pics\//,
        autoPager: {
            ele: "#masonry",
            observer: "#masonry>article",
            next: "span.current+a",
            re: ".wp-pagenavi",
            title: (doc) => "Page " + fun.gt("span.current", 1, doc)
        },
        openInNewTab: "a.entry-thumbnail:not([target=_blank])",
        category: "autoPager"
    }, {
        name: "xHamster gallery",
        host: ["xhamster.com"],
        link: "https://zh.xhamster.com/users/eros721_official/photos",
        reg: () => /xhamster\.com\/photos\/gallery\/[^/]+$/.test(siteUrl) && fun.ge(".gallery-section"),
        imgs: async () => {
            await fun.getNP("#initials-script", "//div[@class='gallery-section']//li[a[contains(@class,'active')]]/following-sibling::li[1]/a", null, ".gallery-section .pager-section");
            let photos = fun.gae("#initials-script").map(script => {
                let json = JSON.parse(script.innerText.replace(/window.initials=|;/g, ""));
                return json.photosGalleryModel.photos;
            }).flat();
            thumbnailsSrcArray = photos.map(e => e.thumbURL);
            return photos.map(e => e.imageURL);
        },
        init: "fun.remove('.mixed-list>.flex-element')",
        button: [4],
        insertImg: [
            ["main>article", 2, "main>article,.gallery-controls"], 2
        ],
        customTitle: ".page-title h1",
        css: "div[data-role=promo-messages-wrapper]{display:none!important}",
        category: "nsfw2"
    }, {
        name: "xHamsterM gallery M",
        host: ["xhamster.com"],
        reg: /xhamster\.com\/photos\/gallery\/[^/]+$/,
        imgs: async () => {
            await fun.getNP(".items[data-role='gallery-photos']>.item-container", "//ol[@class='page-list']/li[@class='page-button' and a[@class='page-button-link page-button-link--active']]/following-sibling::li[1]/a", null, "//ol[@class='page-list']");
            return fun.getImgA("#photoCurr", "a.item.slided", 1, null, 0);
        },
        button: [4],
        insertImg: [".items[data-role=gallery-photos]", 1],
        customTitle: "h1.page-title",
        css: ".items[data-role=gallery-photos]>.item-container{width:100%!important}aside[data-role=yld-mdtop],.yld-md--bottom,.yld-pc--bottom,aside[data-role=yld-pctop],div[data-role=promo-messages-wrapper]{display:none!important}",
        category: "nsfw2"
    }, {
        name: "PornHub photo", //很容易會被短暫封IP
        host: ["pornhub.com"],
        link: "https://pornhub.com/albums",
        enable: 1,
        reg: /pornhub\.com\/album\/\d+/,
        imgs: () => fun.getImgA("#photoImageSection img", ".js_lazy_bkg a", 200),
        button: [4],
        insertImg: [
            [".photoBlockBox .clear", 1], 1
        ],
        go: 1,
        customTitle: ".photoAlbumTitleV2",
        category: "nsfw2"
    }, {
        name: "BITCHES GIRLS",
        host: ["bitchesgirls.com"],
        reg: /^https?:\/\/bitchesgirls\.com\/[^\/]+\/[^\/]+\/[^\/]+\/$/,
        imgs: async () => {
            fun.showMsg(displayLanguage.str_05, 0);
            const selector = "script[type='application/ld+json']";
            const getUrls = (dom = document) => {
                let text = fun.ge(selector, dom).innerText;
                let thumbnailUrls = text.match(/"thumbnailUrl":\s?"[^"]+/g).map(e => e.replace(/"thumbnailUrl":\s?"/, "")).filter(e => !/\/logos\//.test(e));
                thumbnailsSrcArray = thumbnailsSrcArray.concat(thumbnailUrls);
                let urls = text.match(/"url":\s?"[^"]+/g).map(e => e.replace(/"url":\s?"/, ""));
                urls.filter(e => /\.mp4$/.test(e)).forEach(e => videosSrcArray.push(e));
                return urls.filter(e => !/\/logos\/|\.mp4$/.test(e));
            }
            const max = _unsafeWindow.adConstants.pagesAmount;
            if (max > 1) {
                let links = [siteUrl];
                for (let i = 2; i <= max; i++) {
                    links.push(siteUrl + `${i}/`);
                }
                let fetchNum = 0;
                let resArr = [];
                for (let i = 0; i < max; i++) {
                    let res = await fun.fetchDoc(links[i]).then(doc => {
                        fun.showMsg(`${displayLanguage.str_06}${fetchNum+=1}/${max}`, 0);
                        return getUrls(doc);
                    });
                    resArr.push(res);
                }
                return Promise.all(resArr).then(data => data.flat());
            } else {
                return getUrls();
            }
        },
        button: [4],
        insertImg: [
            [".button-container", 2, ".albumgrid,.popup-container"], 2
        ],
        go: 1,
        css: "a#loadMore,.my-girls-popup-element{display:none!important}",
        threading: 12,
        category: "nsfw2"
    }, {
        name: "X-video",
        host: ["x-video.tube"],
        reg: /^https?:\/\/x-video\.tube\/albums\/\d+\//i,
        init: () => fun.createImgBox(".album-view", 2),
        imgs: () => {
            fun.showMsg(displayLanguage.str_05, 0);
            let max = fun.attr("a[data-total]", "data-total");
            let fetchNum = 0;
            const getFn = url => {
                return fetch(url, {
                    "headers": {
                        "accept": "text/html, */*; q=0.01",
                        "x-requested-with": "XMLHttpRequest"
                    }
                }).then(res => res.text()).then(text => fun.doc(text)).then(dom => {
                    fun.showMsg(`${displayLanguage.str_06}${fetchNum+=1}/${max}`, 0);
                    return {
                        thumbsArr: fun.gae("a.grid-item img", dom).map(e => e.dataset.src),
                        originalsArr: fun.gae("a.grid-item", dom)
                    }
                });
            };
            let firstArr = [getFn(fun.url + "?mode=async&function=get_block&block_id=album_view_album_view")];
            let pagesArr = fun.arr(max).map((_, i) => getFn(fun.url + "?mode=async&function=get_block&block_id=album_view_album_view&load=more&from=" + (i + 1)));
            let resArr = firstArr.concat(pagesArr);
            return Promise.all(resArr).then(data => {
                thumbnailsSrcArray = data.map(e => e.thumbsArr).flat();
                return data.map(e => e.originalsArr).flat();
            });
        },
        button: [4],
        insertImg: [
            ["#FullPictureLoadMainImgBox", 0, ".album-view"], 2
        ],
        customTitle: ".title",
        category: "nsfw2"
    }, {
        name: "Fasting Sex Porn Pics/Cosplay Photos",
        host: ["www.fastingsex.com"],
        reg: /^https?:\/\/www\.fastingsex\.com\/post\//i,
        include: "//span[text()='Watch Gallery'] | //span[text()='Photo Gallery']",
        exclude: "//span[text()='Watch Movie']",
        init: async () => {
            fun.addMutationObserver(() => fun.remove("//div[div[div[div[iframe]]]]"));
            await fun.waitEle("img.gallery-item");
        },
        imgs: async () => {
            fun.ge("img.gallery-item").scrollIntoView();
            await fun.delay("2000");
            videosSrcArray = fun.gae("[data-breakout='normal'] video").map(e => e.src);
            thumbnailsSrcArray = fun.gae("img.gallery-item").map(e => e.src);
            return thumbnailsSrcArray.map(e => e.replace(/\/v1\/fill\/.+/, ""));
        },
        button: [4],
        insertImg: ["//div[div[div[div[@data-hook='galleryViewer']]]]", 2],
        customTitle: ".post-title__text",
        downloadVideo: true,
        css: "#POPUPS_ROOT{display:none!important;}",
        category: "nsfw2"
    }, {
        name: "Fasting Sex Hentai Pictures",
        host: ["www.fastingsex.com"],
        reg: /^https?:\/\/www\.fastingsex\.com\/post\//i,
        include: "//span[text()='Gallery']",
        exclude: "//span[text()='Watch Movie']",
        init: async () => {
            fun.addMutationObserver(() => fun.remove("//div[div[div[div[iframe]]]]"));
            await fun.waitEle("[data-breakout='normal'] [data-hook='imageViewer'] [data-image-info]");
        },
        imgs: () => {
            thumbnailsSrcArray = fun.gae("[data-breakout='normal'] [data-hook='imageViewer'] [data-image-info]>img").map(e => e.src);
            return thumbnailsSrcArray.map(e => e.replace(/\/v1\/fill\/.+/, ""));
        },
        button: [4],
        insertImg: ["//div[@data-hook='post-description']", 2],
        customTitle: ".post-title__text",
        css: "#POPUPS_ROOT{display:none!important;}",
        category: "nsfw2"
    }, {
        name: "Fasting Sex Porn Comic",
        host: ["www.fastingsex.com"],
        reg: /^https?:\/\/www\.fastingsex\.com\/post\//i,
        include: "//a[text()='Porn Comic']",
        exclude: "//span[text()='Watch Movie']",
        init: async () => {
            fun.addMutationObserver(() => fun.remove("//div[div[div[div[iframe]]]]"));
            await fun.waitEle("img.gallery-item");
        },
        imgs: async () => {
            fun.ge("img.gallery-item").scrollIntoView();
            await fun.delay("2000");
            thumbnailsSrcArray = fun.gae("img.gallery-item").map(e => e.src);
            return thumbnailsSrcArray.map(e => e.replace(/\/v1\/fill\/.+/, ""));
        },
        button: [4],
        insertImg: ["//div[@data-hook='post-description']", 2],
        customTitle: ".post-title__text",
        downloadVideo: true,
        css: "#POPUPS_ROOT{display:none!important;}",
        category: "nsfw2"
    }, {
        name: "EroMe",
        host: ["www.erome.com"],
        reg: /^https?:\/\/www\.erome\.com\/a\/\w+$/i,
        imgs: () => {
            videosSrcArray = fun.gae(".video source[type='video/mp4']").map(e => e.src);
            return hasTouchEvents ? fun.gae(".img>img[data-src]") : fun.gae("div.img[data-src]");
        },
        button: [4],
        insertImg: ["div[id^='album'].page-content", 2],
        customTitle: ".page-content h1",
        category: "nsfw2"
    }, {
        name: "EroMe",
        host: ["erome.pics"],
        reg: /^https?:\/\/erome\.pics\/a\/\d+\/$/i,
        imgs: () => {
            videosSrcArray = fun.gae(".video source[type='video/mp4']").map(e => e.src);
            return hasTouchEvents ? fun.gae(".img>img[data-src]").map(e => e.currentSrc) : fun.gae("div.img[data-src]");
        },
        button: [4],
        insertImg: [".entry-content", 2],
        customTitle: ".entry-title",
        category: "nsfw2"
    }, {
        name: "DirtyChicks",
        host: ["dirtychicks.net"],
        reg: /^https?:\/\/dirtychicks\.net\/gallery\/[^\/]+\/$/i,
        imgs: () => fun.gae("#album img").map(e => e.src.replace(/-\d+x\d+./, ".")),
        button: [4],
        insertImg: [".gallery_grid", 2],
        customTitle: () => fun.title(" - DirtyChicks"),
        category: "nsfw2"
    }, {
        name: "Amateur Likes",
        host: ["amateurlikes.com"],
        reg: /^https?:\/\/amateurlikes\.com\/n\/[^\/]+\/\d+$/i,
        imgs: "#gallery img",
        button: [4],
        insertImg: ["#gallery .masonry", 2],
        customTitle: () => fun.gt(".full_h1").replace(/\([\d\s]+Photos\)/i, "").trim(),
        css: "#gallery .masonry{display:block!important}",
        category: "nsfw2"
    }, {
        name: "Nakedsex",
        host: ["nakedsex.pics"],
        reg: /^https?:\/\/nakedsex\.pics\/.+\.php$/i,
        imgs: ".gallerycontent a",
        button: [4],
        insertImg: [
            [".tags", 2], 2
        ],
        go: 1,
        customTitle: () => fun.title(" - Best adult videos and photos"),
        css: "#FullPictureLoadEnd{color:rgb(255, 255, 255)}",
        category: "nsfw2"
    }, {
        name: "ThotHub Leaks",
        host: ["thothub.vip"],
        reg: /^https?:\/\/thothub\.vip\/[^\/]+\/$/i,
        imgs: ".entry-content img",
        customTitle: () => fun.gt(".entry-title").replace(/\([\d\s]+Photos\)/i, "").trim(),
        category: "nsfw2"
    }, {
        name: "MrDeepFakes",
        host: ["mrdeepfakes.com"],
        reg: /^https?:\/\/mrdeepfakes\.com\/photo\/\d+\//,
        init: () => {
            fun.remove(".player-adv");
            fun.ge(".page-columns").classList.remove("page-columns");
        },
        imgs: () => {
            if (fun.ge("#album_view_album_view_pagination")) {
                fun.showMsg(displayLanguage.str_05, 0);
                let max = Number(fun.gt("//li[@class='next action-item']/preceding-sibling::li[@class='page action-item'][1]//span[@class='text']"));
                let fetchNum = 0;
                let resArr = fun.arr(max).map((_, i) => {
                    let url = siteUrl + "?mode=async&function=get_block&block_id=album_view_album_view&sort_by=&from=" + (i + 1);
                    return fun.fetchDoc(url).then(doc => {
                        fun.showMsg(`${displayLanguage.str_06}${fetchNum+=1}/${max}`, 0);
                        return fun.gae("a[data-fancybox-type=image]", doc).map(a => {
                            let img = fun.ge("img", a);
                            return {
                                original: a.href,
                                thumbnail: img.dataset.original ?? img.src
                            }
                        });
                    });
                });
                return Promise.all(resArr).then(arr => {
                    thumbnailsSrcArray = arr.flat().map(e => e.thumbnail);
                    return arr.flat().map(e => e.original);
                });
            } else {
                thumbnailsSrcArray = fun.gae(".content img.thumb").map(e => e.dataset.original ?? e.src);
                return fun.gae("a[data-fancybox-type=image]");
            }
        },
        button: [4],
        insertImg: ["#album_view_album_view", 2],
        viewMode: 1,
        customTitle: ".player-title",
        category: "nsfw2"
    }, {
        name: "PicHunter",
        host: ["www.pichunter.com"],
        reg: /www\.pichunter\.com\/gallery\/\d+\/.+/,
        imgs: () => {
            if (fun.ge(".flex-images figure>a>img")) {
                thumbnailsSrcArray = fun.gae(".flex-images figure>a>img").map(e => e.getAttribute("xs"));
            } else {
                thumbnailsSrcArray = fun.gae("#main-grid a img").map(e => e.src);
            }
            return fun.gae(".flex-images figure>a,#main-grid a");
        },
        button: [4],
        insertImg: [
            [".flex-images,#main-grid", 2], 1
        ],
        go: 1,
        customTitle: "h1",
        fancybox: {
            v: 3,
            css: false
        },
        category: "nsfw2"
    }, {
        name: "Pictoa",
        host: ["www.pictoa.com"],
        reg: /www\.pictoa\.com\/(thumbs|albums)\/.+\.html/i,
        imgs: () => fun.getImgA("#player img", ".thumb-nav-img a"),
        thums: ".thumb-nav-img img",
        button: [4],
        insertImg: ["#player", 2],
        customTitle: ".title>h1",
        css: "#gallery #player{cursor:unset!important}.ad-placement{display:none!important;}",
        category: "nsfw2"
    }, {
        name: "PimpAndHost",
        host: ["pimpandhost.com"],
        link: "https://pimpandhost.com/site/trending",
        reg: /pimpandhost\.com\/(image|album)\/\d+/,
        init: () => {
            if (/image/.test(location.href)) location.href = fun.ge("a[title=Album]").href;
            fun.remove(".flex-block-1,.flex-block-2,#comments,.ano_po");
        },
        imgs: async () => {
            await fun.getNP("#album-images>.image-block", "li.active+li:not(.next)>a", null, ".pagination");
            return fun.gae("#album-images .image-block a[data-src]");
        },
        button: [4],
        insertImg: [
            [".summary", 2], 2
        ],
        go: 1,
        customTitle: ".author-header__album-name",
        category: "nsfw2"
    }, {
        name: "PimpAndHost 隱藏廣告",
        reg: /pimpandhost\.com\//,
        init: "fun.remove('.flex-block-1,.flex-block-2,#comments,.ano_po')",
        css: ".list-view:not(#main-list-view) .item:not(.image-block){display:none!important}",
        category: "ad"
    }, {
        name: "Pornpaw 圖片清單頁",
        host: ["www.pornpaw.com"],
        reg: /www\.pornpaw\.com\/gallery\/[\w-]+\.html/i,
        delay: 500,
        imgs: () => {
            thumbnailsSrcArray = fun.getImgSrcArr("img[data-src]");
            return thumbnailsSrcArray.map(e => e.replace("x160.", "."));
        },
        button: [4],
        insertImg: [
            [".container>.row", 2], 2
        ],
        go: 1,
        customTitle: "h1",
        css: "div:has(>ins){display:none!important;}",
        category: "nsfw2"
    }, {
        name: "ImageFap 圖片清單頁",
        reg: /www\.imagefap\.com\/(gallery|pictures)\/\d+/i,
        init: () => fun.getNP("//tr[td[@id]]", "b+a.link3", null, "#gallery>font>span", 100, null, 0),
        category: "autoPager"
    }, {
        name: "ImageFap",
        host: ["www.imagefap.com"],
        reg: /www\.imagefap\.com\/photo\/\d+\//i,
        init: () => {
            fun.remove("//td[div[@id='main']]/following-sibling::td[1] | //div[iframe]");
            fun.ge("#main").removeAttribute("style");
            fun.ge("//table[@width='750']").width = "1000";
        },
        imgs: async () => {
            let max = Number(fun.attr("div[data-total]", "data-total"));
            let pages = Math.ceil(max / 24);
            let pid = fun.ge("#imageid_input").value;
            let gid = fun.ge("#galleryid_input").value;
            let resArr = [];
            let fetchNum = 0;
            fun.showMsg(displayLanguage.str_05, 0);
            for (let i = 0; i < max; i += 24) {
                let url = `/photo/${pid}/?gid=${gid}&idx=${i}&partial=true`;
                let res = await fun.fetchDoc(url).then(doc => {
                    fun.showMsg(`${displayLanguage.str_06}${fetchNum+=1}/${pages}`, 0);
                    if (!fun.ge(".thumbs a", doc)) {
                        alert("Encountered human-machine verification");
                        window.location.href = siteUrl;
                    }
                    return fun.gae(".thumbs a", doc).map(a => {
                        let original = a.href;
                        let thumb = fun.attr("img", "src", a);
                        return {
                            original: original,
                            thumb: thumb
                        }
                    });
                });
                resArr.push(res);
                await fun.delay(1000, 0);
            }
            return Promise.all(resArr).then(data => data.flat()).then(arr => {
                let thumbs = arr.map(e => e.thumb);
                thumbnailsSrcArray = thumbs;
                let originals = arr.map(e => e.original);
                return originals;
            });
        },
        button: [4],
        insertImg: ["//td[div[@id='slideshow']]", 2],
        customTitle: "#main h1",
        threading: 8,
        category: "nsfw2"
    }, {
        name: "Fuskator 圖片清單頁",
        host: ["fuskator.com"],
        reg: /fuskator\.com\/thumbs\/[\w-~]+\/[\w-~]+\.html/i,
        init: async () => {
            fun.showMsg(displayLanguage.str_04, 0);
            await fun.waitEle(".pic_pad");
        },
        imgs: "#thumbimages a,.swipebox a",
        thums: "#thumbimages a>img,.swipebox a>img",
        button: [4],
        insertImg: [
            ["//a[text()='View full images']", 2], 2
        ],
        go: 1,
        category: "nsfw2"
    }, {
        name: "Fuskator 大圖頁",
        host: ["fuskator.com"],
        reg: () => /^https?:\/\/fuskator\.com\//i.test(siteUrl) && fun.ge("//a[text()='View gallery thumbnails']"),
        imgs: "img.full",
        button: [4],
        insertImg: ["#fullimages", 2, 1000],
        category: "nsfw2"
    }, {
        name: "TOKYO Motion",
        host: ["www.tokyomotion.net"],
        link: "https://www.tokyomotion.net/albums",
        reg: /^https?:\/\/www\.tokyomotion\.net\/album\/\d+\/.+/,
        imgs: async () => {
            await fun.getNP("div[id^=album_photo]", ".pagination li.active+li>a", null, ".pagination");
            thumbnailsSrcArray = fun.gae(".thumb-overlay img").map(e => e.src);
            return thumbnailsSrcArray.map(e => e.replace("tmb/", ""));
        },
        button: [4],
        insertImg: [
            ["//div[div[div[contains(@id,'album_photo')]]]", 0], 2
        ],
        go: 1,
        customTitle: () => fun.gae(".pull-left")[2].innerText.trim(),
        category: "nsfw2"
    }, {
        name: "JavBangers",
        host: ["javbangers.com"],
        reg: /www\.javbangers\.com\/albums\/.+/,
        imgs: ".images a",
        thums: ".images img",
        button: [4],
        insertImg: [
            [".album-info", 2], 2
        ],
        go: 1,
        customTitle: ".headline>h1",
        category: "nsfw2"
    }, {
        name: "multi.xnxx.com",
        host: ["multi.xnxx.com"],
        reg: /multi\.xnxx\.com\/gallery\/.+/,
        imgs: ".galleryPage .boxImg",
        button: [4],
        insertImg: [
            [".originalLink", 2], 1
        ],
        go: 1,
        category: "nsfw2"
    }, {
        name: "色情圖片網",
        host: ["www.photos18.com"],
        reg: /www\.photos18\.com\/(\w+-hans\/)?\w+\/\w+/i,
        imgs: ".imgHolder a[data-fancybox]",
        button: [4],
        insertImg: ["#content", 2],
        customTitle: "h1.title",
        fancybox: {
            v: 3,
            css: false
        },
        category: "nsfw2"
    }, {
        name: "趣事館",
        host: ["17sex.vip"],
        link: "https://17sex.vip/list/4858",
        reg: /^https?:\/\/17sex\.vip\/pic\/\d+$/i,
        imgs: () => {
            let max = fun.gt(".count-pageindex") || 1;
            return fun.getImg(".page>img", max, "4");
        },
        button: [4],
        insertImg: [
            [".page", 0], 2
        ],
        go: 1,
        customTitle: () => document.title.replace(/\[\d+[\w\s\.\+]+\]|\d+P$/i, ""),
        category: "nsfw2"
    }, {
        name: "GavPorn 相冊",
        host: ["cav103.com"],
        link: "https://cav103.com/albums/",
        reg: /cav\d+\.com\/albums\/\d+\/\w+\//,
        imgs: "a[data-fancybox-type]",
        button: [4],
        insertImg: [".sponsor", 2],
        customTitle: ".headline>h1",
        css: ".top{display:none!important}",
        category: "nsfw2"
    }, {
        name: "BuzzAV",
        host: ["www.buzzav.com"],
        reg: /old\.buzzav\.com\/album\/\d+\//,
        imgs: async () => {
            await fun.getNP("//div[a[div[img[contains(@id,'album_photo')]]]]", ".pagination li.active+li>a", null, ".d-sm-block>.pagination");
            return fun.gae("[id^=album_photo]").map(e => e.src.replace("tmb/", ""));
        },
        button: [4],
        insertImg: [
            [".well-info+.content-row", 2], 1
        ],
        go: 1,
        css: "#FullPictureLoadEnd{color:rgb(255, 255, 255)}",
        category: "nsfw2"
    }, {
        name: "Hentai Image 單張",
        host: ["hentai-img.com", "hentai-cosplays.com", "porn-images-xxx.com", "porn-gravure-idol.com"],
        reg: /(hentai-img|hentai-cosplays|porn-images-xxx|porn-gravure-idol)\.com\/image\/[^/]+\//,
        include: "//a[text()='DETAIL PAGE' or text()='DETAIL HALAMAN' or text()='詳細へ' or text()='详细信息页面' or text()='Страница сведений' or text()='상세 페이지' or text()='página de detalles' or text()='หน้ารายละเอียด' or text()='TRANG CHI TIẾT']",
        imgs: async () => {
            let max = document.title.split("/").at(-1).match(/\d+/)[0];
            let url = siteUrl.replace(/\/\d+\/$/, "");
            let links = fun.arr(max).map((_, i) => url + `/${(i + 1)}/`);
            let imgSrcArray = await fun.getImgA("#display_image_detail a,#detail_list a", links, 100);
            thumbnailsSrcArray = imgSrcArray.map(e => {
                let arr = e.split("/");
                arr[arr.length - 1] = "p=305/" + arr[arr.length - 1];
                return arr.join("/");
            });
            return imgSrcArray;
        },
        button: [4],
        insertImg: ["#display_image_detail,#detail_list", 2],
        customTitle: () => fun.gt("#title>h2,#page h3").replace(/\s?Photo\s?\d+P|\s?-\s?\d+\/\d+\s?|\([0-9\s]+ảnh\)/i, "").trim(),
        css: "#display_image_detail img{max-width:100% !important}",
        category: "nsfw2"
    }, {
        name: "Hentai Image",
        host: ["hentai-img.com", "hentai-cosplays.com", "porn-images-xxx.com", "porn-gravure-idol.com"],
        reg: /(hentai-img|hentai-cosplays|porn-images-xxx|porn-gravure-idol)\.com\/image\/[^/]+\/(page\/\d+\/)?$/,
        init: () => {
            let ele = fun.ge("//div[span[a]]");
            if (ele) {
                let tE = fun.ge("#display_image_detail,#detail_list");
                tE.parentNode.insertBefore(ele, tE);
            }
        },
        imgs: async () => {
            let max = fun.gt("#paginator>*:last-child", 3) || fun.gt(".paginator_page[rel=next]", 2) || 1;
            let url = siteUrl.replace(/page\/\d+\/$/, "");
            let links = fun.arr(max).map((_, i) => url + `page/${(i + 1)}/`);
            thumbnailsSrcArray = await fun.getImgA(".icon-overlay img,#display_image_detail img", links, 100);
            thumbnailsSrcArray = thumbnailsSrcArray.map(e => {
                let arr = e.split("/");
                arr[arr.length - 2] = "p=305";
                return arr.join("/");
            });
            return thumbnailsSrcArray.map(e => e.replace(/\/p=(700|305)/, ""));
        },
        button: [4],
        insertImg: ["#display_image_detail,#detail_list", 2],
        autoDownload: [0],
        next: () => {
            let next = fun.ge("//a[text()='Prev Article' or text()='前の記事' or text()='前一篇']");
            return next ? next.href : null;
        },
        prev: "//a[text()='Next Article' or text()='次の記事' or text()='下一篇文章']",
        customTitle: () => fun.gt("#title>h2,#page h3").replace(/\s?Photo\s?\d+P|\s?-\s?\d+\/\d+\s?|\([0-9\s]+ảnh\)/i, "").trim(),
        css: "#display_image_detail img{max-width:100% !important}",
        category: "nsfw2"
    }, {
        name: "Hentai Cosplay",
        host: ["www.hentaicos.com"],
        reg: () => /^https?:\/\/www\.hentaicos\.com\/\w+\/\d+\.html/.test(siteUrl) && fun.ge(".main-picture"),
        imgs: () => fun.getImg(".main-picture img", fun.gt("//a[text()='Next']", 2) || 1, 9),
        button: [4],
        insertImg: [".main-picture", 2],
        next: ".next_pics>.fr>a",
        prev: ".next_pics>.fl>a",
        customTitle: ".content-title",
        category: "nsfw1"
    }, {
        name: "Fapator 圖片清單頁",
        host: ["www.fapator.com"],
        reg: /www\.fapator\.com\/\?content_id=/i,
        init: () => fun.remove("//div[@class='img' and a[@target and img]]"),
        imgs: "a[data-lightbox]",
        thums: "a[data-lightbox]>img",
        button: [4],
        insertImg: [".fcon+.fapad", 1],
        next: "//a[contains(text(),'next photos')]",
        prev: 1,
        go: 1,
        css: ".fapad{width:auto !important;height:auto !important}",
        category: "nsfw2"
    }, {
        name: "SMUTPOND",
        host: ["www.smutpond.com"],
        reg: /www\.smutpond\.com\/gallery-pics\/\?uid=/i,
        init: async () => await fun.delay(2000, 0),
        imgs: () => {
            thumbnailsSrcArray = fun.gae(".viewerPreview img").slice(5).map(e => e.dataset.lazy ?? e.src);
            thumbnailsSrcArray = [...new Set(thumbnailsSrcArray)];
            return fun.gae("img[alt=Pic]");
        },
        button: [4],
        insertImg: [".viewerBox", 2],
        customTitle: "h2.sectionTitleLeft",
        fancybox: {
            v: 3,
            css: false
        },
        category: "nsfw2"
    }, {
        name: "SexyGirlsPics",
        host: ["sexygirlspics.com"],
        reg: /sexygirlspics\.com\/pics\/[\w-]+\//i,
        imgs: "a.ss-image",
        thums: "a.ss-image>img",
        button: [4],
        insertImg: [
            [".sponsor-button", 2], 1
        ],
        go: 1,
        category: "nsfw2"
    }, {
        name: "PornPic",
        host: ["www.pornpic.com"],
        reg: /www\.pornpic\.com\/gallery\/[\w-]+/i,
        imgs: ".gallery-grid a.item-link[data-fancybox]",
        thums: ".gallery-grid a.item-link[data-fancybox] img",
        button: [4],
        insertImg: [
            [".gallery-info", 2], 1
        ],
        go: 1,
        fancybox: {
            v: 3,
            css: false
        },
        category: "nsfw2"
    }, {
        name: "Nuded Photo",
        host: ["www.nudedxxx.com"],
        reg: /^https?:\/\/www\.nudedxxx\.com\/photo\/[^\.]+\.shtml$/i,
        imgs: ".elementor-element-1f729717 .elementor-widget-container img",
        button: [4],
        insertImg: [".elementor-element-1f729717 .elementor-widget-container", 2],
        autoDownload: [0],
        next: "a[rel=prev]",
        prev: "a[rel=next]",
        customTitle: () => fun.title(" – Nuded Photo"),
        css: "@media only screen and (max-width:480px){.hm-container{padding:0px!important}}",
        category: "nsfw2"
    }, {
        name: "Girlsreleased 載入更多",
        host: ["girlsreleased.com"],
        reg: /girlsreleased\.com\//,
        delay: 1000,
        include: "//button[text()='more']",
        observerClick: "//button[text()='more']",
        openInNewTab: ".content .main a",
        category: "autoPager"
    }, {
        name: "Girlsreleased",
        host: ["girlsreleased.com"],
        reg: /girlsreleased\.com\/set\/\d+/,
        init: () => fun.createImgBox(".images", 2),
        imgs: async () => {
            let selector = ".images .imageContainer .image img";
            await fun.waitEle(selector);
            thumbnailsSrcArray = fun.gae(selector).map(e => e.src);
            let src = fun.attr(selector, "src");
            let images = fun.gae(selector);
            if (/imx\.to/.test(src)) {
                let tempSrc = src.replace("https://imx.to/u/t/", "https://i.imx.to/i/");
                return new Promise(async resolve => {
                    let obj = await fun.checkImgStatus(tempSrc);
                    if (obj.ok && obj.width > 200) {
                        resolve(images.map(e => e.src.replace("https://imx.to/u/t/", "https://i.imx.to/i/")));
                    } else {
                        resolve(images.map(e => e.src.replace("/t/", "/i/")));
                    }
                });
            } else if (/imgadult\.com/.test(src)) {
                return images.map(e => e.src.replace("small-medium/", "big/"));
            } else if (/pixhost\.to/.test(src)) {
                return images.map(e => e.src.replace("https://t", "https://img").replace("/thumbs/", "/images/"));
            } else if (/imagevenue/.test(src)) {
                return fun.getImgCorsA("#main-image", "a[target=imageView]");
            } else {
                return [];
            }
        },
        button: [4],
        insertImg: [
            ["#FullPictureLoadMainImgBox", 0, ".images"], 2
        ],
        referer: "src",
        css: "@media only screen and (max-width:1920px){#FullPictureLoadMainImgBox{width:100%;max-width:1400px;margin:0 auto}}",
        category: "nsfw2"
    }, {
        name: "Eropics", // vipr.im,Imagetwist.com圖床無法外連但可以下載
        host: ["eropics.to"],
        reg: /eropics\.\w+\/\d+\/\d+\/\d+\//i,
        init: () => {
            document.addEventListener("keydown", event => {
                if (event.ctrlKey && event.altKey && (event.code == "KeyC" || event.key == "c" || event.key == "C")) {
                    event.preventDefault();
                    let arr = fun.gau(".entry-content a");
                    let str = arr.join("\n");
                    console.log(str);
                    copyToClipboard(str);
                    fun.showMsg(displayLanguage.str_11);
                }
            });
        },
        imgs: async () => {
            let aEles = fun.gae(".entry-content a[href^='//imgspice.com/'],.entry-content a[href^='//imagetwist.com/'],.entry-content a[href*='postimg.cc'],.entry-content a[href*='fastpic.org'],.entry-content a[href*='vipr.im'],.entry-content a[href*='pixhost.to']:not([href*='/gallery/']),.entry-content a[href*='turboimagehost'],.entry-content a[href*='imgbox.com'],.entry-content a[href*='imagevenue'],.entry-content a[href*='imx.to'],.entry-content a[href*='imagebam']");
            thumbnailsSrcArray = aEles.map(a => fun.ge("img", a).src);
            let URLs = aEles.map(a => a.href);
            return fun.getImageHost(URLs);
        },
        button: [4],
        insertImg: [
            [".entry-footer", 2], 3
        ],
        go: 1,
        threading: 10,
        customTitle: "h1.entry-title",
        category: "nsfw2"
    }, {
        name: "ViperGirls/PornCoven/ErotiCity",
        host: ["vipergirls.to", "viper.to", "porncoven.com", "eroticity.net"],
        reg: () => !hasTouchEvents && /^https?:\/\/(vipergirls\.to|viper\.to|porncoven\.com|eroticity\.net)\/threads\//i.test(fun.url),
        init: () => {
            document.addEventListener("click", event => {
                if (event.target.className === "postdetails") {
                    let links = [];
                    if (event.target.querySelector("a[href$='.jpg']:not([href^='http://imagetwist.com/'])")) {
                        links = [...event.target.querySelectorAll("a[href$='.jpg']")].map(a => a.href);
                    } else {
                        links = [...event.target.querySelectorAll("a[href^='https://imgspice.com/'],a[href*='imx.to']:not([href*='/u/i/']),a[href*='pixhost.to'],a[href^='http://imagetwist.com/'],a[href*='postimg.cc'],a[href*='fastpic.org'],a[href*='vipr.im'],a[href*='turboimagehost'],a[href*='imgbox.com'],a[href*='imagevenue'],a[href*='imagebam']")].map(a => a.href);
                    }
                    captureLinksArray = links;
                    fun.showMsg(`Capture ${links.length} Links`);
                    debug("captureLinksArray", captureLinksArray);
                }
            });
        },
        imgs: () => fun.getImageHost(),
        repeat: 1,
        category: "nsfw2"
    }, {
        name: "Kitty Kats Forum",
        host: ["kitty-kats.net"],
        reg: () => !hasTouchEvents && /^https?:\/\/kitty-kats\.net\/threads\//i.test(fun.url),
        init: () => {
            document.addEventListener("click", event => {
                if (event.target.className === "message-cell message-cell--user") {
                    let links = [];
                    if (event.target.parentNode.querySelector("a[href$='.jpg']:not([href^='http://imagetwist.com/'])")) {
                        links = [...event.target.parentNode.querySelectorAll("a[href$='.jpg']")].map(a => a.href);
                    } else {
                        links = [...event.target.parentNode.querySelectorAll("a[href^='https://imgspice.com/'],a[href*='imx.to']:not([href*='/u/i/']),a[href*='pixhost.to'],a[href^='http://imagetwist.com/'],a[href*='postimg.cc'],a[href*='fastpic.org'],a[href*='vipr.im'],a[href*='turboimagehost'],a[href*='imgbox.com'],a[href*='imagevenue'],a[href*='imagebam']")].map(a => a.href);
                    }
                    captureLinksArray = links;
                    fun.showMsg(`Capture ${links.length} Links`);
                    debug("captureLinksArray", captureLinksArray);
                }
            });
        },
        imgs: () => fun.getImageHost(),
        repeat: 1,
        category: "nsfw2"
    }, {
        name: "imx.to gallery",
        host: ["imx.to"],
        reg: /^https?:\/\/imx\.to\/g\/\w+$/i,
        imgs: () => fun.gae("img.imgtooltip").map(e => e.src.replace("/u/t/", "/u/i/")),
        button: [4],
        insertImg: [
            ["#content", 2], 2
        ],
        go: 1,
        category: "nsfw2"
    }, {
        name: "imx.to",
        host: ["imx.to"],
        reg: /^https?:\/\/imx\.to\/i\/\w+$/i,
        autoClick: ".button.blue.large,#continuebutton,a[title='Show gallery']",
        category: "none"
    }, {
        name: "Forum Girl",
        host: ["www.superbeautygirlx.top"],
        reg: /^https?:\/\/www\.superbeautygirlx\.top\/\d+\/\d+\/[^\.]+\.html/,
        init: () => fun.createImgBox(".separator", 1),
        imgs: ".separator>a",
        button: [4],
        insertImg: [
            ["#FullPictureLoadMainImgBox", 0, ".separator"], 2
        ],
        go: 1,
        category: "nsfw2"
    }, {
        name: "ShowGirlx",
        host: ["showgirlx.net"],
        reg: /^https?:\/\/showgirlx\.net\/[^/]+\/(\d+\/)?$/,
        init: () => fun.clearAllTimer(),
        imgs: async () => {
            let selector = ".wp-block-gallery img";
            await fun.waitEle(selector, 10);
            return fun.gae(selector).map(img => {
                let srcset = img.getAttribute("srcset");
                if (srcset) {
                    let splitArr = srcset.split(",");
                    splitArr = splitArr.sort((a, b) => a.match(/\s(\d+)w/)[1] - b.match(/\s(\d+)w/)[1]);
                    return splitArr.at(-1).trim().split(" ")[0];
                } else if (!!img.dataset?.lazySrc) {
                    return img.dataset.lazySrc;
                } else {
                    return img.src;
                }
            });
        },
        button: [4],
        insertImg: [
            [".penci-single-link-pages", 2], 2
        ],
        go: 1,
        category: "nsfw2"
    }, {
        name: "ShowGirlx album",
        host: ["showgirlx.net"],
        reg: /ngamgaixinh\.\w+\/album\/.+/,
        imgs: () => fun.gae(".list-item-image img").map(img => img.src.replace(/\.(th|md)\./, ".")),
        button: [4],
        insertImg: [
            [".pad-content-listing", 2], 2
        ],
        go: 1,
        category: "nsfw2"
    }, {
        name: "Degoo Cloud",
        host: ["app.degoo.com"],
        reg: /^https?:\/\/app\.degoo\.com\/share\//,
        imgs: async () => {
            let max = prompt(displayLanguage.str_13, "100");
            let img = ".preview-media .hidden";
            await fun.waitEle(img);
            let arr = [];
            arr.push(fun.ge(img).cloneNode(true));
            fun.showMsg(`${displayLanguage.str_02}1/${max}`, 0);
            let n = 1;
            for (let i = 1; i < max; i++) {
                fun.ge("#nextFileButton").click();
                await fun.delay(200, 0);
                if (await fun.waitEle(img)) {
                    arr.push(fun.ge(img).cloneNode(true));
                    fun.showMsg(`${displayLanguage.str_02}${n+=1}/${max}`, 0);
                }
            }
            return [...new Set(arr.map(e => e.src))];
        },
        category: "nsfw2"
    }, {
        name: "亚洲色吧",
        host: ["yazhouseba.com"],
        reg: () => /^https?:\/\/yazhouseba\.com\/meinv\/img-\d+\.html/.test(siteUrl) && fun.ge("#next-url"),
        imgs: async () => {
            fun.showMsg(displayLanguage.str_05, 0);
            let pid = fun.ge("#next-url").rel;
            let json = await new Promise(resolve => {
                $.post("ajax.php", {
                    "action": "src",
                    "pid": pid
                }, data => resolve(data), "json");
            });
            return json.error_code == "0" ? json.urls.map(e => _unsafeWindow.img_dir + e) : [];
        },
        button: [4],
        insertImg: [".content>.image", 2],
        customTitle: () => fun.gt(".content>h1").replace(/\(\d+\)/, "").trim(),
        category: "nsfw2"
    }, {
        name: "1000艺术摄影/169图片大全",
        host: ["www.1000yishu.com", "www.169tp.com", "wap.169tp.com"],
        reg: /^https?:\/\/(www\.1000yishu\.com|www\.169tp\.com|wap\.169tp\.com)\/\w+\/\d+\/\d+\/\d+\.html/,
        imgs: () => {
            let max;
            try {
                max = fun.gt(".pagelist a").match(/\d+/)[0];
            } catch (e) {
                max = 1;
            }
            return fun.getImg(".big-pic img,.inside_box img", max, 9);
        },
        button: [4],
        insertImg: [".big-pic,.inside_box", 2],
        autoDownload: [0],
        next: ".fenxianga a,.pre_arct a",
        prev: ".fenxianga a:last-child,.next_arct a",
        css: "union{display:none!important;}",
        category: "nsfw1"
    }, {
        name: "3K图片网格式",
        reg: () => {
            let hosts1 = ["www.021zxy.com", "www.0b23.com", "www.1001yy.com", "www.18qqt.com", "www.1taz.com", "www.2cra.com", "www.3ktu.com", "www.4k1k.com", "www.5269se.com", "www.579993.com", "www.714g.com", "www.777url.com", "www.803352.com", "www.832771.com", "www.959278.com", "www.aizibang.com", "www.ajkie.com", "www.ao5z.com", "www.aolangde.com", "www.biutu.com", "www.bjimx.com", "www.btsmmm.com", "www.bysga.com", "www.cdnecs.com", "www.cgareg.com", "www.cmylzx.com", "www.cpbdj.com", "www.csjgzy.com", "www.csltx.com", "www.cunedu.com", "www.czxbjc.com", "www.deenli.com", "www.diu5.com", "www.dymux.com", "www.edu-zytc.com", "www.fs120yy.com", "www.fssrr.com", "www.fxqmm.com", "www.fyzwe.com", "www.fzxfl.com", "www.ghsfc.com", "www.gkiev.com", "www.gknrnb.com", "www.gmcpx.com", "www.gxwpjc.com", "www.hceday.com", "www.hdz39.com", "www.hiuin.com", "www.hmcby.com", "www.hmrzry.com", "www.hsnmm.com", "www.hsudhf.com", "www.hyqcxs.com", "www.i9ke.com", "www.iduobi.com", "www.jnnmm.com", "www.jsjfgkgs.com", "www.jxaxsy.com", "www.jxybjk.com", "www.jye8.com", "www.ksruisj.com", "www.ksxx360.com", "www.ksxx365.com", "www.kyy41.com", "www.lcylaa.com", "www.linguifa.com", "www.lql1.com", "www.lzxjw.comc", "www.mash120.com", "www.mmdmlt.com", "www.mmokok.com", "www.mmxsl.com", "www.mokhee.com", "www.muhour.com", "www.nangluan.com", "www.nanitu.com", "www.ngptp.com", "www.nrrqq.com", "www.nxzths.com", "www.opks.cc", "www.php-art.com", "www.ppmlx.com", "www.qdsyhj.com", "www.qmjxg.com", "www.qxttsl.com", "www.qyjafk.com", "www.rodwy.com", "www.rzjyz.com", "www.sitpf.com", "www.smgcjk.com", "www.sqhyyz.com", "www.srzx168.com", "www.sskge.com", "www.sxji56.com", "www.sy-sme.com", "www.szckpt.com", "www.t7mm.com", "www.timitm.com", "www.tjsyyl.com", "www.tzala.com", "www.uwzyf.com", "www.wjjlf.com", "www.woxiutu.com", "www.wpslgs.com", "www.wslak.com", "www.wsvdj.com", "www.wt768.com", "www.wykpc.com", "www.wzcswy.com", "www.xcd100.com", "www.xgxff.com", "www.xhtrz.com", "www.xhycg.com", "www.xizhuai.com", "www.xr70.com", "www.xscmt.com", "www.xthkw.com", "www.xwdwz.com", "www.y521.com", "www.yachw.com", "www.ycwlx.com", "www.yjpfxs.com", "www.yqx101.com", "www.yunkay.com", "www.yvxji.com", "www.yymul.com", "www.yzbywh.com", "www.zggsdh.com", "www.zkjmpx.com", "www.zlsmm.com", "www.zqydc.com"];
            let hosts2 = ["www.7tul.com", "www.meinv007.com", "www.meinv173.com", "www.tufada.com"];
            return hosts1.includes(fun.lh) && /\/\w+\/\d+\.html$/.test(fun.lp) || hosts2.includes(fun.lh) && /\/tu\d+\.html$/.test(fun.lp);
        },
        include: "#showimg img,.img-box img",
        imgs: () => {
            let max;
            try {
                max = fun.gu(".endpage").match(/-(\d+)\.html/)[1];
            } catch (e) {
                max = 1;
            }
            return fun.getImgO("#showimg img,.img-box img", max, 5, null, 0, "#pageNum");
        },
        button: [4],
        insertImg: ["#showimg,.img-box", 2],
        autoDownload: [0],
        next: "a[title='上一篇']",
        prev: "a[title='下一篇']",
        category: "nsfw1"
    }, {
        name: "仿紳士漫畫UI寫真圖庫 簡介頁",
        reg: /^http/,
        include: [
            "//ul[@id='album_tabs']/li/a[@title='寫真圖庫'][text()='寫真圖庫']",
            ".png.bread a[title='寫真圖庫']",
            "//a[@class='btn'][text()='開始閱讀']",
            "#bodywrap",
        ],
        init: () => {
            fun.clearAllTimer();
            fun.createImgBox("#bodywrap", 2);
        },
        imgs: () => {
            fun.showMsg(displayLanguage.str_05, 0);
            let url = fun.ge("//a[@class='btn'][text()='開始閱讀']").href;
            return fun.fetchDoc(url).then(doc => fun.gae("#photo_body img", doc));
        },
        button: [4],
        insertImg: ["#FullPictureLoadMainImgBox", 2],
        customTitle: "#bodywrap>h2",
        css: "#FullPictureLoadMainImgBox{max-width:1170px;margin-left:auto;margin-right:auto}",
        category: "nsfw1"
    }, {
        name: "仿紳士漫畫UI寫真圖庫 閱讀頁",
        reg: /\/read\/id\//,
        include: [
            "//ul[@id='album_tabs']/li/a[@title='寫真圖庫'][text()='寫真圖庫']",
            ".png.bread a[title='寫真圖庫']",
            "#photo_body"
        ],
        imgs: "#photo_body img",
        button: [4],
        insertImg: ["#photo_body", 2],
        customTitle: () => fun.title(/閱讀內頁.+/),
        css: "#photo_body{max-width:1170px;margin-left:auto;margin-right:auto}",
        category: "nsfw1"
    }, {
        name: "仿紳士漫畫UI寫真圖庫 分類自動翻頁",
        reg: /^http/,
        include: [
            "//ul[@id='album_tabs']/li/a[@title='寫真圖庫'][text()='寫真圖庫']",
            "#o_t_d>.gallary_wrap",
            ".bot_toolbar.cc"
        ],
        autoPager: {
            ele: "#o_t_d>.gallary_wrap",
            next: "#o_t_d a.curpage.listpage+a:not(.nextpage)",
            re: ".bot_toolbar.cc",
            title: doc => "Page " + fun.gt("a.curpage.listpage", 1, doc),
            bottom: screen.height * 2
        },
        openInNewTab: "#o_t_d>.gallary_wrap a:not([target=_blank])",
        category: "autoPager"
    }, {
        name: "坏哥哥旧站",
        reg: /^http/,
        include: [
            "#content_news",
            "#content_news img",
            "#page",
            ".title h1"
        ],
        imgs: () => {
            let max = fun.gt("#page>*:last-child").match(/\d+/)[0];;
            let links = fun.arr(max).map((_, i) => i === 0 ? fun.url : fun.url + "index" + (i + 1) + ".html");
            return fun.getImgA("#content_news img", links);
        },
        button: [4],
        insertImg: ["#content_news", 2],
        customTitle: ".title h1",
        category: "nsfw2"
    }, {
        name: "坏哥哥旧站M",
        reg: /\.html$/,
        include: [
            ".fed-arti-content",
            ".fed-arti-content img",
            "//a[text()='尾页']",
            ".fed-arti-head h2"
        ],
        imgs: () => {
            let max = fun.gu("//a[text()='尾页']").match(/-(\d+)\.html$/)[1];
            let links = fun.arr(max).map((_, i) => i === 0 ? fun.url : fun.url.replace(".html", "") + "-" + (i + 1) + ".html");
            return fun.getImgA(".fed-arti-content img", links);
        },
        button: [4],
        insertImg: [".fed-arti-content", 2],
        customTitle: ".fed-arti-head h2",
        category: "nsfw2"
    }, {
        name: "坏哥哥旧站M",
        reg: /^http/,
        include: [
            ".fed-arti-content",
            ".fed-arti-content img",
            ".fed-page-info",
            ".fed-arti-head h2"
        ],
        imgs: () => {
            let max = fun.gt(".fed-page-info>*:last-child").match(/\d+/)[0];
            let links = fun.arr(max).map((_, i) => i === 0 ? fun.url : fun.url + "index" + (i + 1) + ".html");
            return fun.getImgA(".fed-arti-content img", links);
        },
        button: [4],
        insertImg: [".fed-arti-content", 2],
        customTitle: ".fed-arti-head h2",
        category: "nsfw2"
    }, {
        name: "坏哥哥新站",
        reg: /^http/,
        include: [
            ".single-video-info-content",
            ".single-video-info-content img",
            ".pagination",
            ".single-video-title h2"
        ],
        imgs: async () => {
            await fun.getNP(".single-video-info-content>*", ".pagination li.active+li>a:not([title='下一页'])", null, ".pagination");
            return fun.gae(".single-video-info-content img");
        },
        button: [4],
        insertImg: [".single-video-info-content", 2],
        customTitle: ".single-video-title h2",
        category: "nsfw2"
    }, {
        name: "万德美图屋/蚂蚁图库",
        host: ["www.wind5.com", "www.mayihz.com"],
        reg: () => /^https?:\/\/(www\.wind5\.com|www\.mayihz\.com)\/tu\d+\.html$/.test(siteUrl) && fun.ge("#portfolio img"),
        imgs: () => {
            let max;
            try {
                max = fun.gu("a[title=尾页]").match(/-(\d+)\.html/)[1];
            } catch (e) {
                max = 1;
            }
            return fun.getImgO("#portfolio img", max, 5);
        },
        button: [4],
        insertImg: ["#portfolio", 2],
        autoDownload: [0],
        next: "a[title='上一篇']",
        prev: "a[title='下一篇']",
        customTitle: "h1.fed-swip-head",
        category: "nsfw1"
    }, {
        name: "亿秀美女",
        host: ["www.tu11.com", "m.itu11.com"],
        reg: () => /^https?:\/\/(www|m)\.i?tu11\.com\/\w+\/\d+\/\d+\.html/.test(siteUrl) && fun.ge("#showimg img,.img-box img"),
        imgs: async () => {
            await fun.getNP("#showimg img,.img-box img", "a.curpage+a:not(.prepage)", null, "#paginationEle", 0, null, 0, 0);
            return fun.gae("#showimg img,.img-box img");
        },
        button: [4],
        insertImg: ["#showimg,.img-box", 2],
        autoDownload: [0],
        next: "//div[contains(text(),'上一篇')]/a | //a[text()='上一篇']",
        prev: "//div[contains(text(),'下一篇')]/a | //a[text()='下一篇']",
        category: "nsfw1"
    }, {
        name: "爱美女网",
        host: ["www.aimeinv6.com"],
        reg: /^https?:\/\/www\.aimeinv6\.com\/\w+\/\d+\.html/,
        init: () => {
            let a = fun.ge("a[href*=dPlayNext]");
            a.outerHTML = `<div class="imgBox">${a.innerHTML}</div>`;
        },
        imgs: () => {
            let max;
            try {
                max = fun.gt("//a[contains(text(),'共')]").match(/\d+/)[0];
            } catch (e) {
                max = 1;
            }
            return fun.getImg("#bigimg", max, 9);
        },
        button: [4],
        insertImg: [".imgBox", 2],
        autoDownload: [0],
        next: "//span[contains(text(),'上一篇')]/a",
        prev: "//span[contains(text(),'下一篇')]/a",
        category: "nsfw1"
    }, {
        name: "欧洲人体艺术套图网/亚洲人体艺术/日本人体艺术/美女人体艺术/一千美女",
        host: ["www.ozrt.live", "ozrt.live", "www.yzrt.live", "yzrt.live", "www.rbrt.live", "rbrt.live", "www.mnrt.live", "mnrt.live", "www.yqmn.live", "yqmn.live"],
        reg: /^https?:\/\/((www\.)?(ozrt|yzrt|rbrt|mnrt|yqmn)\.live)\/(index\.php)?\?action-imagelist-uid-/,
        imgs: async () => {
            await fun.getNP(".imglist>*,.m_aana>ul,.main_column_pic,.pic-list>ul", "strong+a:not(.next)", null, ".pages");
            return fun.getImgA(".bigimg img,#articlebody img,.content_pic img,#big-pic img", ".imglist a,.m_aana a,.main_column_pic a,.pic-list a");
        },
        button: [4],
        insertImg: [".imglist,.m_aana,.main_column,.pic-list", 2],
        customTitle: () => fun.ge(".title>div[style],.imgWrap a,.name>a") ? fun.gt(".title>div[style],.imgWrap a,.name>a").replace(/\(\d+p\)|\s?\(.+\)\s?/i, "").trim() : fun.ge(".main_column_pic img").alt.replace(/\(\d+p\)|\s?\(.+\)\s?/i, "").trim(),
        category: "nsfw2"
    }, {
        name: "中国人体艺术模特网/好312图库/空图美女网",
        host: ["www.crtys.net", "crtys.net", "www.hao312.live", "hao312.live", "www.kongtu.com", "www.kongtu.com"],
        reg: /^https?:\/\/((www\.)?crtys\.net|(www\.)?hao312\.live|(www\.)?kongtu\.com)\/post\/\d+$/,
        init: () => {
            fun.clearAllTimer();
            fun.createImgBox(".viewall_plugin", 2);
        },
        imgs: ".LightGallery_Item",
        button: [4],
        insertImg: [
            ["#FullPictureLoadMainImgBox", 0, ".viewall_plugin"], 2
        ],
        autoDownload: [0],
        next: ".prev>a",
        prev: ".next>a",
        customTitle: "h1.tit",
        category: "nsfw2"
    }, {
        name: "性爱吧",
        host: ["www.xingaiba.com", "xingaiba.com"],
        reg: () => /^https?:\/\/(www\.)?xingaiba\.com\/(index\.php)?\?action-viewnews-itemid-\d+$/.test(siteUrl) && fun.ge("//span[contains(text(),'美图类别')]"),
        imgs: async () => {
            await fun.getNP("#carousel_photo_container>*", "strong+a:not(.next)", null, ".pages");
            return fun.gae("#carousel_photo_container img");
        },
        button: [4],
        insertImg: ["#carousel_photo_container", 2],
        autoDownload: [0],
        next: "div[style^='TEXT-ALIGN']>a:first-child",
        prev: "div[style^='TEXT-ALIGN']>a:last-child",
        customTitle: ".n_content>h1",
        category: "nsfw2"
    }, {
        name: "阳雀人体艺术",
        host: ["www.yangque.xyz", "yangque.xyz"],
        reg: /^https?:\/\/www\.yangque\.xyz\/html\/\d+\/n-\d+\.html$/,
        imgs: async () => {
            await fun.getNP(".image-box>*", "strong+a:not(.next)", null, ".pages");
            return fun.gae(".image-box img");
        },
        button: [4],
        insertImg: [".image-box", 2],
        autoDownload: [0],
        next: "a[title^='下一篇']",
        prev: "a[title^='上一篇']",
        customTitle: ".article-title>h1",
        category: "nsfw2"
    }, {
        name: "上流时尚人体艺术",
        host: ["www.6643.live", "6643.live"],
        reg: /^https?:\/\/www\.6643\.live\/html\/\d+\/n-\d+\.html$/,
        imgs: async () => {
            await fun.getNP("#d_BigPic", "strong+a:not(.next)", null, ".pages");
            return fun.gae("#d_BigPic img");
        },
        button: [4],
        insertImg: ["#efpBigPic", 2],
        autoDownload: [0],
        next: "#efpNextTxt>a",
        prev: "#efpPreTxt>a",
        customTitle: "#d_picTit",
        category: "nsfw2"
    }, {
        name: "Girl Girl Go",
        host: ["girlgirlgo.org", "girlgirlgo.net", "girlgirlgo.xyz", "girlgirlgo.top", "girlgirlgo.icu", "girlgirlgo.biz", "girlygirlpic.com"],
        reg: /^https?:\/\/(\w{2}\.)?(girlgirlgo|girlygirlpic)\.(org|net|xyz|icu|com|biz|top)\/a\/\w+/,
        imgs: ".figure-link",
        button: [4],
        insertImg: [".post-media-body", 2],
        next: async () => {
            await fun.waitEle("a[rel=next]", 30);
            let next = fun.ge("a[rel=next]");
            return next ? next.href : null;
        },
        prev: "a[rel=prev]",
        customTitle: async () => {
            await fun.waitEle(".figure-link");
            return fun.gt(".entry-title a").split(" No.")[0].trim();
        },
        category: "nsfw1"
    }, {
        name: "QGirlz/CuteLadyPic",
        host: ["qgirlz.com", "cuteladypic.com"],
        reg: /^https?:\/\//,
        include: [
            ".main-image",
            "//a[@data-title and picture/source]",
            ".next",
            ".main-title"
        ],
        imgs: () => fun.getImg("//a[@data-title and picture/source]", (fun.gt(".next", 2) || 1), 16),
        button: [4],
        insertImg: [".main-image", 2],
        customTitle: () => fun.gt(".main-title").split(" No.")[0].trim(),
        category: "nsfw1"
    }, {
        name: "cn.angirlz.com", //SPA
        host: ["cn.angirlz.com"],
        reg: /^https?:\/\/\w{2}\.angirlz\.com\/album\/\w+/,
        imgs: async () => await fun.waitEle(".loading[style$=hidden]") ? fun.gae("#divGallery a") : [],
        button: [4],
        insertImg: ["div[key=album_main]", 2],
        customTitle: "h1",
        category: "nsfw2"
    }, {
        name: "KawaiiX系列",
        host: ["bunnyxgirl.com", "letsgirlz.com", "bootyxgirl.com", "xbeautyzone.com"],
        reg: /^https?:\/\/(bunnyxgirl|letsgirlz|bootyxgirl|xbeautyzone)\.com\/[^/]+\/.+/,
        include: ".separator>a",
        imgs: ".separator>a",
        button: [4],
        insertImg: [
            [".album-post-inner,.album-postmeta-primarypix", 2, ".separator"], 2
        ],
        customTitle: ".breadcrumbs>span:last-child",
        category: "nsfw2"
    }, {
        name: "KawaiiX系列",
        host: ["cn.bunnyxgirl.com", "cn.letsgirlz.com", "cn.bestxleg.com", "cn.xbeautyzone.com"],
        reg: /^https?:\/\/\w{2}\.(bunnyxgirl|letsgirlz|bestxleg|xbeautyzone)\.com\/[^/]+\/\w+/,
        include: ".separator>a",
        imgs: () => fun.getImg(".separator>a", (fun.gt(".nav-links>*:last-child", 2) || 1), 16),
        button: [4],
        insertImg: [
            [".album-post-body .clear,.album-post-share-wrap", 1, "div[itemprop='description articleBody'],.album-post-body>*:not(.album-post-inner):not(.album-post-share-wrap):not(#FullPictureLoadOptionsButtonParentDiv,.FullPictureLoadImage,a[data-fancybox]):not(#FullPictureLoadEnd)"], 2
        ],
        customTitle: ".breadcrumbs>span:last-child",
        category: "nsfw2"
    }, {
        name: "KawaiiX系列 分頁",
        host: ["cn.kawaiithong.com", "cn.kawaiix.com", "cn.kawaiixgirl.com", "cn.kawaiixpic.com", "cn.kinkygirlz.com", "cn.kawaiimetas.com", "cn.assxpic.com", "cn.metaxpic.com", "cn.metaxgirl.com", "cn.eroticxgirl.com", "cn.sexyxpic.com", "cn.hottyxpic.com", "cn.thongxxx.com", "cn.juicexgirl.com", "cn.eroticxpic.com", "cn.bustyxgirl.com", "cn.beautyxgirl.com", "cn.bellexpic.com", "cn.pantyxpic.com", "cn.peachgirlz.com", "cn.pantyxart.com", "cn.beautyxpic.com", "cn.cutemetas.com", "cn.cutexpic.com", "cn.perfectxbody.com", "cn.sexyqgirl.com", "cn.bestxhips.com", "cn.bestxass.com", "cn.assgirlz.com", "cn.bestxbum.com", "cn.adultmetas.com cn", "eroticxpic.com", "cn.xxxthong.com", "cn.thongxgirl.com", "cn.bestxlingerie.com", "cn.sexyxart.com", "cn.hotxhips.com", "cn.hotbeautypic", "cn.greatxgirl.com", "cn.asianxpic.com", "cn.bootyxgirl.com", "cn.tokyohotgirl.com"],
        reg: /^https?:\/\//,
        include: [
            "//a[@data-title and picture/source]",
            ".hero+.hero,.entry-content,.d-flex>.col-24,.album-post",
            ".entry-title,.album-title,.album-post-title,.col-12>h1,.album-h1",
            ".nav-links"
        ],
        imgs: () => {
            let max;
            fun.ge(".current-page") ? max = fun.gt(".current-page").match(/\d+$/)[0] : max = fun.gt(".nav-links>*:last-child", 2) || 1;
            return fun.getImg("//a[@data-title and picture/source]", max, 16);
        },
        button: [4],
        insertImg: [".hero+.hero,.entry-content,.d-flex>.col-24,.album-post", 2],
        customTitle: () => fun.gt(".entry-title,.album-title,.album-post-title,.col-12>h1,.album-h1").split(" No.")[0].trim(),
        css: ".flex-grid:not(.masonry){display:block!important;}",
        category: "nsfw2"
    }, {
        name: "KawaiiX系列",
        host: ["kawaiithong.com", "kawaiix.com", "kawaiixgirl.com", "kawaiixpic.com", "kinkygirlz.com", "kawaiimetas.com", "assxpic.com", "metaxpic.com", "metaxgirl.com", "eroticxgirl.com", "sexyxpic.com", "hottyxpic.com", "thongxxx.com", "juicexgirl.com", "adultmetas.com", "eroticxpic.com", "bustyxgirl.com", "beautyxgirl.com", "bellexpic.com", "pantyxpic.com", "www.peachgirlz.com", "peachgirlz.com", "pantyxart.com", "beautyxpic.com", "cutemetas.com", "cutexpic.com", "perfectxbody.com", "sexyqgirl.com", "bestxhips.com", "assgirlz.com", "beautifulmetas.com", "pantyxgirl.com", "greatxpic.com", "xartpic.com", "perfectxpic.com", "bestxboobs.com", "artthong.com", "hotbeautypic.com", "greatxgirl.com", "asianxpic.com", "bestxleg.com", "tokyohotgirl.com", "bestxass.com"],
        reg: /^https?:\/\//,
        include: [
            "//a[@data-title and picture/source]",
            ".hero+.hero,.entry-content,.d-flex>.col-24,.album-post",
            ".entry-title,.album-title,.album-post-title,.col-12>h1,.album-h1"
        ],
        imgs: "//a[@data-title and picture/source]",
        button: [4],
        insertImg: [".hero+.hero,.entry-content,.d-flex>.col-24,.album-post,.album-h1", 2],
        customTitle: () => fun.title(/\s-\s[\w\.]+$/i).replace(/\s?\(\d+\s?photos\)/, "").trim(),
        category: "nsfw2"
    }, {
        name: "gogo人体艺术M",
        reg: /\/(wap|mip|m)\.(gogortrt|gogo38|956n|48mp|133rt|xixirt|488xm|rtys96|renti92|rt211|gogo44|xixi78|816mm|999zv|28rtys|454t|454t|784z|34tp|28xv|22bb|444rp|03hb|39um|45xm|444wp|005mm|188rt|7m11|61ak|34bu|344F|23bp|rty6|22gs|44aq|291103|508332|693350|660183|702038|873750|981070)\.(com|org)\/\w+\/\d+\/$/i,
        init: () => fun.remove("//div[div[@class='ad-16 clearfix']]"),
        imgs: () => fun.getImg(".tal a>img[alt]", fun.gae(".p_select option").length, 11),
        button: [4],
        insertImg: [".tal", 2],
        category: "nsfw2"
    }, {
        name: "gogo人体艺术M2",
        reg: /\/(m)\.(98ah|02aj|139tu)\.com\/\w+\/(\d+\/)?\d+\.html$/i,
        imgs: () => fun.getImg(".tal a>img[alt]", fun.gae(".p_select option").length, 9),
        button: [4],
        insertImg: [".tal", 2],
        css: "div[style='margin:3px 0 0 0;']{display:none!important}",
        category: "nsfw2"
    }, {
        name: "666人体艺术M",
        reg: /\/(m)\.(6666rt)\.com\/\w+\/\d+\/1\.html$/i,
        imgs: () => fun.getImg(".tal a>img[alt]", fun.gt(".article_page a").match(/\/(\d+)/)[1], 11),
        button: [4],
        insertImg: [".tal", 2],
        customTitle: () => fun.title("-第1张", 1),
        css: "div[style='margin:2px 0 0 0;']{display:none!important}",
        category: "nsfw2"
    }, {
        name: "gogo人体艺术",
        host: ["gogortrt.com", "956n.com"],
        reg: /\/(gogortrt|956n)\.[a-z]{2,3}\/[a-z]+\/\d+\//i,
        imgs: () => fun.getImg(".main>div>a>img[alt],.warp .content>a>img[alt]", fun.gt("//span[@class='current']/preceding-sibling::a|//a[@class='thisclass']/preceding-sibling::a").match(/\d+/)[0], 11),
        button: [4],
        insertImg: ["//div[contains(@class,'main')]/div/a/parent::* | //div[contains(@class,'content') and a/img[@alt]]", 2],
        autoDownload: [0],
        next: ".crc_l_pic.left>a:not([href^=j])",
        prev: ".crc_r_pic.right>a:not([href^=j])",
        customTitle: () => /gogortrt\.com/.test(location.origin) ? fun.gt(".content_title") : fun.title(",", 1),
        category: "nsfw2"
    }, {
        name: "GOGO人体艺术",
        host: ["48mp.com", "133rt.com", "816mm.com"],
        reg: /(48mp\.com|133rt\.com|816mm\.com)\/\w+\/\d+\//i,
        imgs: () => fun.getImg(".main>div>a>img[alt]", fun.gt(".main span", 2).match(/\d+/)[0], 11),
        button: [4],
        insertImg: ["//div[contains(@class,'main')]/div[a/img[@alt]]", 2],
        autoDownload: [0],
        next: ".crc_l_pic.left>a:not([href^=j])",
        prev: ".crc_r_pic.right>a:not([href^=j])",
        customTitle: ".content_title",
        category: "nsfw2"
    }, {
        name: "666人体艺术 只翻預覽圖",
        host: ["6666rt.com"],
        reg: /6666rt\.com\/\w+\/\d+\/(index\.html)?/i,
        enable: 0,
        include: "//div[@class='boxx']//li[a[@target]/img]",
        init: () => fun.getNP("//div[@class='boxx']//li[a[@target]/img]", "a.curent+a[href]", null, ".pagelist"),
        category: "nsfw2"
    }, {
        name: "666人体艺术 大圖頁聚圖",
        host: ["6666rt.com"],
        reg: /6666rt\.com\/\w+\/\d+\//i,
        enable: 0,
        init: "document.onkeydown=null;",
        imgs: () => fun.getImg(".imgbox>a>img[alt]", fun.gt(".page>span#hover", 3).match(/\d+$/)[0], 11),
        button: [4],
        insertImg: ["//div[@class='imgbox' and a/img[@alt]]", 2],
        customTitle: ".contitle h1>a",
        css: "#FullPictureLoadEnd{color:rgb(0, 0, 0)}",
        category: "nsfw2"
    }, {
        name: "666人体艺术 翻完預覽圖立即插入大圖 getNP搭配getImgA",
        host: ["6666rt.com"],
        reg: /6666rt\.com\/\w+\/\d+\/(index\.html)?/i,
        enable: 1,
        include: "//div[@class='boxx']//li[a[@target]/img]",
        imgs: async () => {
            await fun.getNP("//div[@class='boxx']//li[a[@target]/img]", "a.curent+a[href]", null, ".pagelist");
            thumbnailsSrcArray = fun.gae("//div[@class='boxx']//li/a[@target]/img").map(e => e.src);
            return fun.getImgA(".imgbox>a>img[alt]", "//div[@class='boxx']//li/a[@target and img]");
        },
        button: [4],
        //insertImg: [".boxx ul", 1],
        insertImg: [
            [".footdh", 1], 2
        ],
        go: 1,
        autoDownload: [0],
        next: "//li[contains(text(),'上一')]/a",
        prev: "//li[contains(text(),'下一')]/a",
        customTitle: () => fun.title("_", 1),
        css: ".fzltp img{height:auto!important;width:100%!important}",
        category: "nsfw2"
    }, {
        name: "508人体艺术",
        host: ["508332.com"],
        reg: /508332\.com\/\w+\/\d+\//i,
        imgs: () => fun.getImg(".imgbox>a>img[alt]", fun.gt(".pagelist>a").match(/\d+/)[0], 11),
        button: [4],
        insertImg: ["//div[contains(@class,'imgbox') and a/img[@alt]]", 1],
        autoDownload: [0],
        next: "//li[contains(text(),'下一')]/a",
        prev: 1,
        customTitle: () => fun.title(" - 508", 1),
        category: "nsfw2"
    }, {
        name: "444人体艺术",
        host: ["444rp.com"],
        reg: /444rp\.com\/\w+\/\d+\//i,
        imgs: () => fun.getImg(".imgbox>a>img[alt]", fun.gt(".pagelist>a").match(/\d+/)[0], 11),
        button: [4],
        insertImg: ["//div[contains(@class,'imgbox') and a/img[@alt]]", 2],
        autoDownload: [0],
        next: ".zuopre>a",
        prev: ".younext>a",
        customTitle: "font>a:nth-child(3)",
        category: "nsfw2"
    }, {
        name: "64人体艺术",
        host: ["www.64ay.com"],
        reg: /www\.64ay\.com\/\w+\/\d+/i,
        imgs: () => fun.getImg(".tu>a>img[alt]", fun.gt(".page-show>span.current", 2).match(/\d+/)[0], 9),
        button: [4],
        insertImg: ["//div[@class='tu' and a/img[@alt]]", 2],
        autoDownload: [0],
        next: "//div[contains(text(),'下一')]/a[1]",
        prev: "//div[contains(text(),'上一')]/a[2]",
        customTitle: () => fun.title(",", 1),
        category: "nsfw2"
    }, {
        name: "45人体艺术/873人体艺术",
        host: ["45xm.com", "873750.com"],
        reg: /(45xm\.com|873750\.com)\/\w+\/\d+/i,
        imgs: () => fun.getImg(".tu>a>img[alt]", fun.gt(".page-show>span.current", 2).match(/\d+/)[0], 11),
        button: [4],
        insertImg: ["//div[contains(@class,'tu') and a/img[@alt]]", 2],
        autoDownload: [0],
        next: "//div[contains(text(),'下一')]/a[1]",
        prev: "//div[contains(text(),'上一')]/a[2]",
        customTitle: () => {
            try {
                return fun.gt(".wzbody>h1").split(/,|_/)[0];
            } catch (e) {
                return fun.gt(".wzbody>h1");
            }
        },
        category: "nsfw2"
    }, {
        name: "98人体艺术",
        host: ["www.98ah.com"],
        reg: /www\.98ah\.com\/\w+\/\d+\.html/i,
        imgs: () => fun.getImg(".content-pic img[alt]", fun.gt(".current", 2).match(/\d+/)[0], 9),
        button: [4],
        insertImg: [".content-pic", 2],
        autoDownload: [0],
        next: "//div[contains(text(),'下一')]/a[1]",
        prev: "//div[contains(text(),'下一')]/a[2]",
        customTitle: () => fun.gt("h5").split(",")[0],
        category: "nsfw2"
    }, {
        name: "54人体艺术",
        host: ["www.54aj.com"],
        reg: /www\.54aj\.com\/\w+\/\d+\.html/i,
        imgs: () => fun.getImg(".content img[alt]", fun.gt("#hover", 2).match(/\d+/)[0], 9),
        button: [4],
        insertImg: [".content", 2],
        autoDownload: [0],
        next: "//span[contains(text(),'下一')]/a",
        prev: "//span[contains(text(),'上一')]/a",
        customTitle: () => fun.gt(".content>h1").split(",")[0],
        category: "nsfw2"
    }, {
        name: "03人体艺术网",
        host: ["03hb.com"],
        reg: /03hb\.com\/\w+\/\d+\//i,
        imgs: () => fun.getImg(".content img[alt]", fun.gt("#hover", 2).match(/\d+/)[0], 11),
        button: [4],
        insertImg: [".content", 2],
        autoDownload: [0],
        next: "//span[contains(text(),'下一')]/a",
        prev: "//span[contains(text(),'上一')]/a",
        customTitle: () => fun.gt(".currentpath span:nth-child(2)>a:nth-child(2)").split(",")[0],
        category: "nsfw2"
    }, {
        name: "48人体艺术",
        host: ["www.48gd.com"],
        reg: /www\.48gd\.com\/\w+\/\d+\.html/i,
        init: "document.onkeydown=null;",
        imgs: () => fun.getImg("#content img[alt]", fun.gt(".pagelist>strong", 2).match(/\d+/)[0], 9),
        button: [4],
        insertImg: ["#content", 2],
        autoDownload: [0],
        next: "//span[contains(text(),'下一')]/a",
        prev: "//span[contains(text(),'上一')]/a",
        customTitle: () => fun.gt(".photo-tit>h3").split(",")[0],
        category: "nsfw2"
    }, {
        name: "693人体艺术",
        host: ["693350.com"],
        reg: /693350\.com\/\w+\/\d+\//i,
        imgs: () => fun.getImg("#content img[alt]", fun.gt(".pagelist>a").match(/\d+/)[0], 11),
        button: [4],
        insertImg: ["#content", 2],
        autoDownload: [0],
        next: "//span[contains(text(),'下一')]/a",
        prev: "//span[contains(text(),'上一')]/a",
        customTitle: () => fun.gt(".photo-tit>h3").split(",")[0],
        category: "nsfw2"
    }, {
        name: "42人体艺术",
        host: ["www.42jd.com"],
        reg: /www\.42jd\.com\/\w+\/\d+\.html/i,
        imgs: () => fun.getImg(".imgbox img[alt]", fun.gt(".pagelist>.curent", 2).match(/\d+/)[0], 9),
        button: [4],
        insertImg: [".imgbox", 2],
        autoDownload: [0],
        next: "//li[contains(text(),'下一')]/a",
        prev: "//li[contains(text(),'上一')]/a",
        customTitle: () => fun.gt(".imgbox h1").split(",")[0],
        category: "nsfw2"
    }, {
        name: "36人体艺术",
        host: ["www.36ut.com"],
        reg: /www\.36ut\.com\/\w+\/\d+\.html/i,
        init: "document.onkeydown=null;",
        imgs: () => fun.getImg(".pp.hh img[alt]", fun.gt(".page-show>.current", 2).match(/\d+/)[0], 9),
        button: [4],
        insertImg: [".pp.hh", 2],
        customTitle: () => fun.gt(".des>h1").split(",")[0],
        category: "nsfw2"
    }, {
        name: "西西人体艺术",
        host: ["xixirt.org", "291103.com"],
        reg: /(xixirt\.org|291103\.com)\/\w+\/\d+\//i,
        init: "document.onkeydown=null;",
        imgs: () => fun.getImg(".pp.hh img[alt]", fun.gt(".page-show>.current", 2).match(/\d+/)[0], 11),
        button: [4],
        insertImg: [".pp.hh", 2],
        customTitle: () => fun.gt(".des>h1").split(",")[0],
        category: "nsfw2"
    }, {
        name: "366人体艺术/660人体艺术/18人体艺术",
        host: ["366807.com", "660183.com", "18renti.com"],
        reg: /(366807\.com|660183\.com|18renti\.com)\/\w+\/\d+\//i,
        imgs: () => fun.getImg(".content img[alt]", fun.gt(".page-show>a,.page>a").match(/\d+/)[0], 11),
        button: [4],
        insertImg: [".content", 2],
        autoDownload: [0],
        next: "//span[contains(text(),'下一')]/a",
        prev: "//span[contains(text(),'上一')]/a",
        customTitle: () => fun.title(/_西西| - 660| - 18/, 1),
        category: "nsfw2"
    }, {
        name: "702人体艺术/211人体艺术",
        host: ["702038.com", "rt211.com"],
        reg: /(702038\.com|rt211.com)\/\w+\/\d+\//i,
        imgs: () => fun.getImg(".content-pic img[alt],#bomei img[alt]", fun.gt(".page-show>a").match(/\d+/)[0], 11),
        button: [4],
        insertImg: [".content-pic,#bomei", 2],
        autoDownload: [0],
        next: ".updown>a,#prenext a",
        prev: 1,
        customTitle: () => fun.title(/- 702| - 211/, 1),
        category: "nsfw2"
    }, {
        name: "188人体艺术",
        host: ["188rt.com"],
        reg: /188rt\.com\/\w+\/\d+\//i,
        imgs: () => fun.getImg("#bomei img[alt]", fun.gt(".page-show>a").match(/\d+/)[0], 11),
        button: [4],
        insertImg: ["#bomei", 2],
        autoDownload: [0],
        next: "#prenext a",
        prev: "#prenext li:last-child>a",
        customTitle: () => fun.gt("#bobox>h1").split(",")[0],
        category: "nsfw2"
    }, {
        name: "39人体艺术",
        host: ["39um.com"],
        reg: /39um\.com\/\w+\/\d+\//i,
        imgs: () => fun.getImg(".content-pic img[alt],#bomei img[alt]", fun.gt(".page-show>a").match(/\d+/)[0], 11),
        button: [4],
        insertImg: [".content-pic", 2],
        autoDownload: [0],
        next: ".updown>a",
        prev: 1,
        customTitle: ".content>h5",
        category: "nsfw2"
    }, {
        name: "23人体艺术",
        host: ["www.23fe.com"],
        reg: /www\.23fe\.com\/\w+\/\d+\.html/i,
        imgs: () => fun.getImg("#content-p img[alt]", fun.gt(".thispg", 2).match(/\d+/)[0], 9),
        button: [4],
        insertImg: ["#content-p", 2],
        autoDownload: [0],
        next: "//span[contains(text(),'下一')]/a",
        prev: "//span[contains(text(),'上一')]/a",
        customTitle: () => fun.gt("#ctt>h1").split(",")[0],
        category: "nsfw2"
    }, {
        name: "AJ人体艺术",
        host: ["www.02aj.com"],
        reg: /www\.02aj\.com\/\w+\/\d+\.html/i,
        imgs: () => fun.getImg(".content img[alt]", fun.gt(".thisclass", 2).match(/\d+/)[0], 9),
        button: [4],
        insertImg: [".content", 2],
        autoDownload: [0],
        next: "//div[contains(text(),'下一')]/a",
        prev: "//div[contains(text(),'上一')]/a",
        customTitle: ".title>h1",
        category: "nsfw2"
    }, {
        name: "gogo人体艺术",
        host: ["gogo44.com"],
        reg: /gogo44\.com\/\w+\/\d+\//i,
        init: "fun.ge('.content a').removeAttribute('href')",
        imgs: () => fun.getImg(".content img[alt]", fun.gt(".thisclass", 2).match(/\d+/)[0], 11),
        button: [4],
        insertImg: [".content a", 2],
        autoDownload: [0],
        next: ".updown a",
        prev: ".updown span:last-child>a",
        customTitle: () => fun.title(/ - gogo/, 1),
        category: "nsfw2"
    }, {
        name: "28人体艺术/4F人体艺术",
        host: ["28rtys.com", "344f.com"],
        reg: /(28rtys\.com|344f\.com)\/\w+\/\d+\//i,
        imgs: () => fun.getImg(".picbox img[alt]", fun.gt(".thisclass", 2).match(/\d+/)[0], 11),
        button: [4],
        insertImg: [".picbox", 2],
        autoDownload: [0],
        next: ".page+.content-msg a",
        prev: 1,
        customTitle: () => fun.title(/ - 28| - 4F/, 1),
        category: "nsfw2"
    }, {
        name: "西西人体艺术",
        host: ["44aq.com"],
        reg: /44aq\.com\/\w+\/\d+\//i,
        imgs: () => fun.getImg(".picbox img[alt]", fun.gt(".page a").match(/\d+/)[0], 11),
        button: [4],
        insertImg: [".picbox", 2],
        autoDownload: [0],
        next: ".updown_r>a",
        prev: ".updown_l>a",
        customTitle: () => fun.title(/,/, 1),
        category: "nsfw2"
    }, {
        name: "139人体艺术",
        host: ["www.139tu.com"],
        reg: /www\.139tu\.com\/\w+\/\d+\/\d+\.html/i,
        imgs: () => fun.getImg(".img_content img[alt]", fun.gt("#hover", 2).match(/\d+/)[0], 9),
        button: [4],
        insertImg: [".img_content", 2],
        customTitle: "#title>h1",
        category: "nsfw2"
    }, {
        name: "GOGO人体艺术网",
        host: ["gogo38.com"],
        reg: /(gogo38\.com|981070\.com)\/\w+\/\d+\//i,
        imgs: () => fun.getImg(".content_pic img[alt]", fun.gt(".current", 2).match(/\d+/)[0], 11),
        button: [4],
        insertImg: [".content_pic", 2],
        customTitle: ".content>h1>a",
        category: "nsfw2"
    }, {
        name: "488人体艺术",
        host: ["488xm.com"],
        reg: /488xm\.com\/\w+\/\d+\//i,
        imgs: () => fun.getImg("#content img[alt]", fun.gt(".pagelist>strong", 2).match(/\d+/)[0], 11),
        button: [4],
        insertImg: ["#content", 2],
        autoDownload: [0],
        next: "//span[contains(text(),'下一')]/a",
        prev: "//span[contains(text(),'上一')]/a",
        customTitle: () => fun.gt("h3>a").split(",")[0],
        category: "nsfw2"
    }, {
        name: "92人体艺术",
        host: ["renti92.com"],
        reg: /renti92\.com\/\w+\/\d+\//i,
        imgs: () => fun.getImg("#gallery img[alt]", fun.gt(".pagination>a").match(/\d+/)[0], 11),
        button: [4],
        insertImg: ["#gallery", 2],
        autoDownload: [0],
        next: ".other-prev a",
        prev: ".other-next a",
        customTitle: () => fun.title(/ - 92/, 1),
        category: "nsfw2"
    }, {
        name: "005人体艺术",
        host: ["005mm.com"],
        reg: /005mm\.com\/\w+\/\d+\//i,
        imgs: () => fun.getImg("#gallery img[alt]", fun.gt(".pagination>a").match(/\d+/)[0], 11),
        button: [4],
        insertImg: ["#gallery", 2],
        autoDownload: [0],
        next: ".other-prev a",
        prev: ".other-next a",
        customTitle: ".post-nav>a:nth-child(3)",
        category: "nsfw2"
    }, {
        name: "西西人体艺术/711人体艺术",
        host: ["xixi78.com", "7m11.com"],
        reg: /(xixi78\.com|7m11\.com)\/\w+\/\d+\//i,
        imgs: () => fun.getImg("#content img[alt]", fun.gt(".content-page>a").match(/\d+/)[0], 11),
        button: [4],
        insertImg: ["#content", 2],
        customTitle: () => fun.title(/ - 西西| - 711/, 1),
        category: "nsfw2"
    }, {
        name: "96人体艺术/61人体艺术",
        host: ["rtys96.com", "61ak.com"],
        reg: /(rtys96\.com|61ak.com)\/\w+\/\d+\//i,
        imgs: () => fun.getImg("#showimages img[alt]", fun.gt(".bigpages>a").match(/\d+/)[0], 11),
        button: [4],
        insertImg: ["#showimages", 2],
        autoDownload: [0],
        next: "#pageNum a",
        prev: 1,
        customTitle: () => fun.title(/ - 96| - 61/, 1),
        category: "nsfw2"
    }, {
        name: "999人体艺术/西西人体艺术",
        host: ["999zv.com", "34bu.com"],
        reg: /(999zv\.com|34bu.com)\/\w+\/\d+\//i,
        imgs: () => fun.getImg(".section.fix.tc img[alt]", fun.gt(".pages a").match(/\d+/)[0], 11),
        button: [4],
        insertImg: [".section.fix.tc", 2],
        autoDownload: [0],
        next: ".arcLocal.r a",
        prev: 1,
        customTitle: () => fun.title(",", 1),
        category: "nsfw2"
    }, {
        name: "454人体艺术/爱上人体艺术",
        host: ["454t.com", "23bp.com"],
        reg: /(454t\.com|23bp\.com)\/\w+\/\d+\//i,
        imgs: () => fun.getImg("#content-p img[alt]", fun.gt(".page a").match(/\d+/)[0], 11),
        button: [4],
        insertImg: ["#content-p", 2],
        customTitle: () => fun.title(",", 1),
        category: "nsfw2"
    }, {
        name: "748人体艺术/66人体艺术",
        host: ["784z.com", "rty6.com"],
        reg: /(784z\.com|rty6.com)\/\w+\/\d+\//i,
        imgs: () => fun.getImg(".image-view img[alt]", fun.gt(".pages a").match(/\d+/)[0], 11),
        button: [4],
        insertImg: [".image-view", 2],
        autoDownload: [0],
        next: ".i-digg>.article-adbottom a",
        prev: 1,
        customTitle: () => fun.title(/,|_/, 1),
        category: "nsfw2"
    }, {
        name: "34人体艺术/高清人体艺术",
        host: ["34tp.com", "22gs.com"],
        reg: /(34tp\.com|22gs.com)\/\w+\/\d+\//i,
        imgs: () => fun.getImg("#content-p img[alt]", fun.gt(".gengduo a").match(/\d+/)[0], 11),
        button: [4],
        insertImg: ["#content-p p", 2],
        autoDownload: [0],
        next: ".gg a",
        prev: 1,
        customTitle: () => fun.title(/ - 34|,/, 1),
        category: "nsfw2"
    }, {
        name: "22bb人体艺术",
        host: ["22bb.org"],
        reg: /22bb\.org\/\w+\/\d+\//i,
        imgs: () => fun.getImg(".content img[alt]", fun.gt(".page-show>a").match(/\d+/)[0], 11),
        button: [4],
        insertImg: [".content", 2],
        autoDownload: [0],
        next: "//span[contains(text(),'下一')]/a",
        prev: "//span[contains(text(),'上一')]/a",
        customTitle: () => fun.title(",", 1),
        category: "nsfw2"
    }, {
        name: "444人体艺术",
        host: ["444wp.com"],
        reg: /444wp\.com\/\w+\/\d+\//i,
        imgs: () => fun.getImg(".content img[alt]", fun.gt(".page a").match(/\d+/)[0], 11),
        button: [4],
        insertImg: [".content", 2],
        autoDownload: [0],
        next: ".page+.page a",
        prev: ".page+.page a+a",
        customTitle: "h2",
        category: "nsfw2"
    }, {
        name: "爱人体艺术",
        host: ["28xv.com"],
        reg: /28xv\.com\/\w+\/\d+\//i,
        imgs: () => fun.getImg(".imgTip+a>img[alt]", fun.gt(".page a").match(/\d+/)[0], 11),
        button: [4],
        insertImg: [".imgTip+a", 2],
        autoDownload: [0],
        next: ".updown_r>a",
        prev: ".updown_l>a",
        customTitle: () => fun.gt("h1").split(",")[0],
        category: "nsfw2"
    }, {
        name: "壹纳网",
        host: ["yinaw.com"],
        reg: () => /^https?:\/\/yinaw\.com\/\d+\.html$/.test(siteUrl) && fun.ge(".article-content img:not([src*='yinaw.png'])"),
        init: async () => {
            let baiduApi = "https://image.baidu.com/search/down?thumburl=https://baidu.com&url=";
            let links = fun.gau(".fenye>a");
            if (links.length > 0) {
                links = [...new Set(links)];
                await fun.getEle(links, ".article-content>*:not(.open-message,.fenye,.article-social)", [".open-message", 1], ".fenye");
            }
            let imgs = fun.gae(".article-content img:not([src*='yinaw.png'])");
            imgs.forEach(img => {
                if (/^https?:\/\/\w+\.sinaimg\.cn\//.test(img.src)) {
                    img.dataset.src = img.src.replace(/^(https?:\/\/\w+\.sinaimg\.cn\/)/, `${baiduApi}$1`).replace("/mw690/", "/large/");
                } else if (/^https?:\/\/i\d\.wp\.com\//.test(img.src)) {
                    img.dataset.src = img.src.replace("/mw690/", "/large/").replace(/\?w=.+$/, "").replace(/^https?:\/\/i\d\.wp\.com\//, `${baiduApi}https://`);
                } else {
                    img.dataset.src = img.src.replace("/mw690/", "/large/");
                }
            });
            if (setYinawSinaOriginalURL == 1) {
                imgs.forEach(img => (img.dataset.src = img.dataset.src.replace(baiduApi, "")));
            }
            imgs.forEach(img => {
                img.src = loading_bak;
                fun.imagesObserver.observe(img);
            });
        },
        imgs: ".article-content img:not([src*='yinaw.png'])",
        autoDownload: [0],
        next: ".article-nav-prev>a",
        prev: ".article-nav-next>a",
        customTitle: ".article-title",
        referer: "https://weibo.com/",
        category: "nsfw1"
    }, {
        name: "D哥新聞",
        host: ["dbro.news"],
        link: "https://dbro.news/category/p0-%e5%a5%97%e5%9c%96%e7%b3%bb%e5%88%97",
        reg: () => /^https?:\/\/dbro\.news\/\d+\/[^\.]+\.html/i.test(siteUrl) && fun.ge("p.pic_center,.content_left img,.container img.mt-1,.wp-block-gallery img,a.jig-link"),
        imgs: ".pic_center>img,.content_left img,.container img.mt-1,.wp-block-gallery img,a.jig-link",
        customTitle: ".post-title",
        category: "nsfw2"
    }, {
        name: "流量密碼",
        host: ["jo106.com"],
        link: "https://jo106.com/beauty-photo/",
        reg: () => /^https?:\/\/jo106\.com\/\d+\/$/i.test(siteUrl) && fun.ge("//div[@class='cat-links']/a[text()='美女圖片'][@rel='category tag']"),
        imgs: ".entry-content .col-md-12>img",
        button: [4],
        insertImg: [".entry-content", 2],
        customTitle: ".entry-title",
        category: "nsfw1"
    }, {
        name: "R18成人站-流量密碼",
        host: ["r18.jo106.com"],
        reg: () => /^https?:\/\/r18\.jo106\.com\/\d+\/$/i.test(siteUrl) && fun.ge("//div[@class='cat-links']/a[text()='成人漫畫' or text()='清涼寫真' or  text()='歐美寫真' or  text()='性感激情' or  text()='絲襪美腿'][@rel='category tag']"),
        imgs: ".entry-content .col-md-12>img",
        button: [4],
        insertImg: [".entry-content", 2],
        customTitle: () => fun.gt(".entry-title").replace(/\(\d+[\w\s\.\+-]+\)|\[\d+[\w\s\.\+-]+\]|【\d+[\w\s\.\+-]+】/, "").replace(/– 貼圖 –.+/, "").trim(),
        category: "nsfw2"
    }, {
        name: "尼克成人網 人體寫真",
        host: ["nick20.com"],
        link: "https://nick20.com/pic/index.html",
        reg: /^https?:\/\/nick20\.com\/pic\/pic\d+\.html$/i,
        imgs: () => {
            thumbnailsSrcArray = _unsafeWindow.Large_cgurl.filter(item => item);
            return thumbnailsSrcArray.map(e => e.replace("https://thumbs", "https://images").replace("_t.", "_o."));
        },
        button: [4],
        insertImg: ["//center[img]", 2],
        customTitle: ".bbs_entry_wrapper>h2",
        category: "nsfw2"
    }, {
        name: "尼克成人網 成人漫畫",
        reg: /^https?:\/\/nick20\.com\/bbs2\/index\.cgi\?read=\d+/i,
        imgs: "a[id][onclick]",
        button: [4],
        insertImg: ["p.img", 2],
        customTitle: ".bbs_entry_wrapper>h2",
        category: "nsfw2"
    }, {
        name: "尼克成人網 成人貼圖 本土自拍 走光偷拍",
        reg: /^https?:\/\/nick20\.com\/bbs(3|5)?\/\d+\.html/i,
        imgs: "p#img>img",
        button: [4],
        insertImg: ["p#img", 2],
        customTitle: ".bbs_entry_wrapper>h2",
        category: "nsfw2"
    }, {
        name: "尼克成人網M",
        host: ["m.nick20.com"],
        link: "https://nick20.com/pic/index.html",
        reg: /^https?:\/\/m\.nick20\.com\/pic\/index\.(html|cgi)\?read=\d+$|^https?:\/\/m\.nick20\.com\/bbs(2|3|5)?\/\d+\.html$/i,
        imgs: () => {
            let [bp] = fun.gae(".bbs_pictures");
            let imgs = fun.gae("img", bp);
            return fun.getImgSrcArr(imgs).filter(src => !/\/images\/share|\/add\/|aav999/.test(src));
        },
        button: [4],
        insertImg: [".bbs_pictures", 2],
        customTitle: ".entryBlock>strong",
        category: "nsfw2"
    }, {
        name: "五歌的开心网",
        host: ["happy.5ge.net"],
        reg: /^https?:\/\/happy\.5ge\.net\/archives\/\d+\.html$/,
        include: "//ul[@class='joe_bread__bread']//a[contains(text(),'图册')]",
        imgs: ".joe_detail__article img",
        button: [4],
        insertImg: [".joe_detail__article", 2],
        customTitle: ".joe_detail__title",
        fancybox: {
            v: 3,
            css: false
        },
        css: "div:has(>center>a>img){display:none!important;}",
        category: "nsfw2"
    }, {
        name: "我們的性愛日誌",
        host: ["www.sexdiary1769.com"],
        reg: /^https?:\/\/www\.sexdiary1769\.com\/article\/\d+$/,
        include: "//div[@class='category']/a[contains(text(),'寫真館')]",
        imgs: "#article-content img",
        button: [4],
        insertImg: ["#article-content", 2],
        customTitle: ".top-info h1",
        category: "nsfw2"
    }, {
        name: "湿女吧",
        host: ["shinv.link"],
        reg: /^https?:\/\/shinv\.link\/posts\/\w+\/$/i,
        imgs: "//div[@class='p-1 col-span-12 md:col-span-9']//img[@class='block my-2 mx-auto']",
        button: [4],
        insertImg: ["//div[@class='p-1 col-span-12 md:col-span-9']", 2],
        customTitle: "h1.text-xl",
        category: "nsfw2"
    }, {
        name: "粉色家园",
        host: ["www.top888.com", "top888.com"],
        reg: /^https?:\/\/(www\.)?top888\.com\/thread\/\d+/i,
        init: async () => {
            await fun.waitEle(".card-body");
            let code = fun.gst("author");
            let json = JSON.parse(code);
            siteJson = json;
            debug("\n此頁JSON資料\n", siteJson);
            await fun.waitEle("iframe[src*='sendvid']", 50);
        },
        imgs: () => siteJson.image,
        capture: () => siteJson.image,
        customTitle: () => siteJson.headline,
        category: "nsfw2"
    }, {
        name: "哔咔庇护所v2",
        host: ["ios.zzgo810.top"],
        reg: /\/content\/\?id=\w+&dname=comic(\w+)*&catid=\d+(&eps=\d+)?$/i,
        include: "//title[contains(text(),'哔咔庇护所')]",
        init: async () => {
            fun.remove("//div[@class='row'][div/a/img]");
            await fun.waitEle("#lightbox~img");
        },
        imgs: () => fun.ge("#lightbox a") ? fun.gae("#lightbox a") : fun.gae("#lightbox~img"),
        button: [4],
        insertImg: ["//div[div[@id='lightbox']]", 2],
        customTitle: "#comic-view-main .text-center",
        category: "nsfw2"
    }, {
        name: "福利中心",
        host: ["www.fulizx1.xyz", "www.fulizx101.cc"],
        reg: () => /^\/index\.php\/art\/detail\/id\/\d+\.html$/i.test(fun.lp) && fun.ge("//title[contains(text(),'福利中心')]") && fun.ge("#image_show"),
        imgs: "#image_show img",
        customTitle: () => fun.gt("#Video-Title,.area-title").replace(" - 查看图片", "").replace(/\s\(\d+[\w\s\.\+-]+\)/, "").replace(/《|》/g, ""),
        css: ".swing{display:none!important;}",
        category: "nsfw2"
    }, {
        name: "XO福利圖",
        host: ["diedk1123-ake33i.xofulitu2za222.sbs", "www.xofulitu9ok999.xyz"],
        link: "https://diedk1123-ake33i.xofulitu2za222.sbs/xoxo",
        reg: () => /\/art\/pic\/id\/\d+\/$/i.test(siteUrl) && fun.ge("//title[contains(text(),'XO福利圖')]"),
        imgs: ".picture-wrap img",
        button: [4],
        insertImg: [".container.clearfix", 2],
        go: 1,
        customTitle: ".main-title:not(.recommend-title)",
        category: "nsfw2"
    }, {
        name: "XO福利圖 分類自動翻頁",
        enable: 1,
        reg: () => /^https?:\/\/[^\/]+\/arttype\//.test(siteUrl) && fun.ge("//title[contains(text(),'XO福利圖')]"),
        autoPager: {
            ele: ".container.clearfix",
            observer: ".container.clearfix .album",
            next: ".paging-item--current+a",
            re: ".pagging-div",
            lazySrc: "img[data-src]",
            title: doc => "Page" + fun.gt(".paging-item--current", 1, doc)
        },
        openInNewTab: ".picture-list a:not([target=_blank])",
        category: "autoPager"
    }, {
        name: "MOMO图库",
        host: ["www.momotk.com", "momotk5.uno"],
        link: "https://www.rb1.es/momotk/",
        reg: /^https?:\/\/(www\.momotk\.com|momotk\d\.uno)\/\d+\.html$/i,
        imgs: async () => {
            await fun.getNP(".ngg-gallery-thumbnail-box", "span.current+a", null, ".ngg-navigation");
            let as = fun.gae(".ngg-gallery-thumbnail-box a");
            thumbnailsSrcArray = as.map(a => a.dataset.thumbnail);
            return as.map(a => a.dataset.src);
        },
        button: [4],
        insertImg: [".article-content", 2],
        go: 1,
        customTitle: ".article-title",
        css: ".asst-single-header{display:none!important;}",
        category: "nsfw2"
    }, {
        name: "魅影画廊",
        host: ["www.wc1.es", "myhl5.uno", "www.jb9.es"],
        link: "https://wc2.es/myhl",
        reg: /^https?:\/\/(www\.wc1\.es|myhl\d.uno|www\.jb\d\.es)\/\d+\.html$/i,
        imgs: () => {
            thumbnailsSrcArray = fun.gau(".gallery a");
            let xhrNum = 0;
            fun.showMsg("fun.xhrHEAD...", 0);
            return thumbnailsSrcArray.map(e => e.replace("-scaled", "")).map(async (src, i) => {
                let res = await fun.xhrHEAD(src);
                fun.showMsg(`fun.xhrHEAD(${xhrNum+=1}/${thumbnailsSrcArray.length})`, 0);
                let status = res.status;
                return status == 404 ? thumbnailsSrcArray[i] : src;
            });
        },
        button: [4],
        insertImg: [
            [".gallery", 2, ".gallery"], 2
        ],
        autoDownload: [0],
        next: ".article-nav-prev>a",
        prev: ".article-nav-next>a",
        customTitle: ".article-title",
        fancybox: {
            v: 3,
            css: false
        },
        css: "#FullPictureLoadEnd{color:rgb(255, 255, 255)}",
        category: "nsfw2"
    }, {
        name: "色色图库",
        host: ["www.sstuku13.xyz", "sstuku6.xyz", "sstuku7.xyz", "sstuku8.xyz", "sstuku9.xyz", "sstuku10.xyz", "sstuku11.xyz", "sstuku12.xyz", "sstuku13.xyz", "sstuku14.xyz", "sstuku15.xyz"],
        reg: /^https?:\/\/(www\.)?sstuku\d+\.xyz\/artshow-\d+\.html$/i,
        imgs: ".entry-media img",
        button: [4],
        insertImg: [".entry-content", 2],
        go: 1,
        customTitle: () => fun.gt(".single-post-detail").replace("😋 ", ""),
        category: "nsfw1"
    }, {
        name: "美女写真图集",
        host: ["www.112ze.com", "112ze.com"],
        reg: /^https?:\/\/(www\.)?112ze\.com\/index\.php\/\w+\/\d+\.html$/i,
        imgs: ".post-content img",
        button: [4],
        insertImg: [".post-content", 2],
        customTitle: ".mdui-text-black",
        fancybox: {
            v: 3,
            css: false
        },
        category: "nsfw1"
    }, {
        name: "聚姬集",
        host: ["18jjj.cyou", "18jjj.xyz"],
        reg: () => /^https?:\/\/18jjj\.\w+\/chapter\/\d+$/i.test(siteUrl) && fun.ge("#enc_img img"),
        init: () => {
            fun.clearAllTimer();
            fun.remove("//div[@class='comicpage']/a[img[@alt]] | //div[@class='comicpage']/div[script] | //div[@id='cp_img']/a[img[@alt]] | //div[@id='cp_img']/div[script]");
        },
        imgs: async () => {
            await fun.getNP("#enc_img>div,#enc_img>img", "//a[text()='下一页'][@href]", null, ".fanye,.view-bottom-bar");
            return fun.gae("#enc_img img");
        },
        button: [4],
        insertImg: ["#enc_img", 2],
        customTitle: () => fun.ge(".comic-name") ? fun.gt(".comic-name") : _unsafeWindow.bookInfo.book_name,
        css: "#pubcdnModal{display:none!important;}img{opacity:1!important;}",
        category: "nsfw1"
    }, {
        name: "adultspic色情成人圖片",
        host: ["adultspic.com"],
        reg: /^https?:\/\/adultspic\.com\/\d+\.html$/i,
        imgs: async () => {
            await fun.getNP(".wp-block-image", "//a[text()='下一頁']");
            return fun.gae(".wp-block-image img").map(e => e.src);
        },
        button: [4],
        insertImg: [".article-content", 2],
        autoDownload: [0],
        next: ".article-nav-prev>a",
        prev: ".article-nav-next>a",
        customTitle: ".article-title",
        css: ".ssr-content{display:none!important;}",
        category: "nsfw2"
    }, {
        name: "中国街拍",
        host: ["www.cnjiepai.xyz"],
        reg: /^https?:\/\/www\.cnjiepai\.xyz\/\d+\/[\w-]+\.html$/i,
        imgs: "a[data-fancybox]",
        button: [4],
        insertImg: [
            ["//p[a[img]]", 2, "//p[a[img]]"], 2
        ],
        customTitle: "article>h1",
        fancybox: {
            v: 3,
            css: false
        },
        css: "@media only screen and (max-width:480px){article{width:100%!important}}",
        category: "nsfw1"
    }, {
        name: "美图收藏夹",
        host: ["sifang.app"],
        reg: /^https?:\/\/sifang\.app\/node\/\d+$/i,
        imgs: "a[data-fancybox]",
        button: [4],
        insertImg: [
            ["//p[a[img]]", 2, "//p[a[img]]"], 2
        ],
        customTitle: ".page-title",
        fancybox: {
            v: 3,
            css: false
        },
        css: "@media only screen and (max-width:480px){article{width:100%!important}}",
        category: "nsfw1"
    }, {
        name: "名腿网",
        host: ["www.mingtuiw.com", "mingtui.net"],
        reg: /^https?:\/\/(www\.mingtuiw\.com|mingtui\.net)\/archives\/\d+$/,
        exclude: ".swpm-more-tag-not-logged-in,.swpm-more-tag-restricted-msg",
        imgs: () => {
            thumbnailsSrcArray = fun.getImgSrcArr(".entry-content img");
            return thumbnailsSrcArray.map(e => e.replace(/-\d+x\d+(\.\w+)$/, "$1"))
        },
        button: [4],
        insertImg: [".entry-content>p", 2],
        autoDownload: [0],
        next: ".nav-previous>a[rel=prev]",
        prev: ".nav-next>a[rel=next]",
        customTitle: () => fun.gt(".entry-title").replace(/(\d+图)/, "").trim(),
        category: "nsfw1"
    }, {
        name: "名腿网",
        host: ["www.mingtuiw.com"],
        reg: () => {
            if (/^https?:\/\/www\.mingtuiw\.com\/archives\/\d+$/.test(siteUrl)) {
                let num = fun.gt(".entry-title").match(/((\d+)图)/)[1];
                let tImgsNum = fun.gae(".entry-content img").length;
                if (num == tImgsNum) return true;
            }
            return false;
        },
        imgs: () => {
            thumbnailsSrcArray = fun.getImgSrcArr(".entry-content img");
            return thumbnailsSrcArray.map(e => e.replace(/-\d+x\d+(\.\w+)$/, "$1"))
        },
        button: [4],
        insertImg: [".entry-content>p", 2],
        autoDownload: [0],
        next: ".nav-previous>a[rel=prev]",
        prev: ".nav-next>a[rel=next]",
        customTitle: () => fun.gt(".entry-title").replace(/(\d+图)/, "").trim(),
        category: "nsfw1"
    }, {
        name: "名腿网",
        host: ["www.mingtuiw.com"],
        reg: /^https?:\/\/www\.mingtuiw\.com\/archives\/\d+\/.+$/,
        exclude: "#div_img_vip",
        imgs: async () => {
            let links = fun.gau("#thumb_imglist>a");
            let imgSrcs = await fun.getImgA(".entry-content img.attachment-large", links);
            return imgSrcs.map(e => e.replace(/-\d+x\d+(\.\w+)$/, "$1"))
        },
        button: [4],
        insertImg: [".entry-content", 2],
        customTitle: () => document.title.replace(/(\d+\/\d+).+/, "").trim(),
        category: "nsfw1"
    }, {
        name: "Ai19 Art/Ai art nude/Hentaimama",
        host: ["ai19.art", "ainudesporn.art", "hentaimama.xyz"],
        reg: /^https?:\/\/(ai19\.art|ainudesporn\.art|hentaimama\.xyz)\/news\//,
        imgs: ".entry-content img",
        button: [4],
        insertImg: [
            ["//p[img]", 2, "//p[img]"], 2
        ],
        customTitle: () => fun.gt(".entry-header").replaceAll("|", "-"),
        css: "#FullPictureLoadEnd{color:rgb(255, 255, 255)}",
        category: "nsfw1"
    }, {
        name: "Kungfutv",
        host: ["kungfutv.net"],
        reg: /^https?:\/\/kungfutv\.net\/cosplay\/[^\/]+\//,
        imgs: "#readerarea img",
        button: [4],
        insertImg: [
            ["#readerarea img", 1, ".ts-main-image"], 2
        ],
        customTitle: ".entry-title",
        css: "#FullPictureLoadEnd{color:rgb(255, 255, 255)}",
        category: "nsfw1"
    }, {
        name: "18Kami.com",
        host: ["18kami.com"],
        reg: /^https?:\/\/18kami\.com\/photo\/\d+/,
        init: () => {
            setTimeout(() => {
                fun.ge("#chk_cover").click();
            }, 1000);
        },
        imgs: ".thumb-overlay-albums img",
        button: [4],
        insertImg: [".thumb-overlay-albums", 2],
        customTitle: ".panel-heading>.pull-left",
        fetch: 1,
        css: "#FullPictureLoadEnd{color:rgb(255, 255, 255)}",
        category: "hcomic"
    }, {
        name: "逆次元逆ACG",
        host: ["www.nicohentai.com"],
        reg: /^https?:\/\/www\.nicohentai\.com\/(moeupup-\d-\d+\.html|showinfo-\d+-\d+-\d\.html)$/,
        include: ".row.thumb-overlay-albums",
        init: async () => await fun.getNP(".row.thumb-overlay-albums img", ".pagination li.active+li>a:not(.prevnext)"),
        imgs: ".row.thumb-overlay-albums img",
        button: [4],
        insertImg: [".row.thumb-overlay-albums", 2],
        next: "//a[span[text()='下一页']][@href]",
        prev: 1,
        customTitle: async () => {
            let text = await fun.fetchDoc(fun.gu("//a[span[text()='漫畫簡介']]")).then(albumDoc => {
                let comicName = fun.gt(".panel-heading h1", 1, albumDoc);
                let episode = fun.ge(".episode", albumDoc);
                return episode ? comicName + " - " + fun.gt(".panel-heading>.pull-left") : comicName;
            });
            return text.replace(/\(\d+[\w\s\.\+-]+\)/i, "").replace(/[\d+[\w\s\.\+-]+]/i, "").trim();
        },
        category: "hcomic"
    }, {
        name: "禁漫天堂",
        reg: () => {
            let hosts = ["18comic.vip", "18comic.org", "jmcomic.me", "18-comicfreedom.xyz", "18-comicfreedom.art", "18-comicfreedom.org"];
            return fun.indexOf(hosts, fun.lh) && /\/photo\/\d+/.test(fun.lp);
        },
        init: async () => {
            setTimeout(() => {
                fun.ge("#chk_cover").click();
                fun.ge("#chk_guide").click();
            }, 1000);
            fun.remove("//div[contains(text(),'插件')] | //div[@class='col-xs-6'][div[@data-group]] | //div[@class='panel-body']//div[@data-group] | //div[@class='row'][div[div[@data-group]]] | //div[@class='div_sticky2 hidden-lg']");
            await fun.getNP(".scramble-page", ".pagination li.active+li>a:not(.prevnext)");
        },
        imgs: async () => {
            fun.showMsg(displayLanguage.str_01, 0);
            const {
                aid,
                scramble_id,
                get_num
            } = _unsafeWindow;
            let arr = [];
            let fetchNum = 0;
            let imgs = fun.gae(".scramble-page img[id],.owl-item .center img[id]");
            for (let i = 0; i < imgs.length; i++) {
                let getRedraw = new Promise(async resolve => {
                    const url = imgs[i].dataset.original ?? imgs[i].dataset.src;
                    if (url.includes(".gif") || aid < scramble_id) {
                        resolve(url);
                    } else {
                        const blob = await fetch(url).then(res => res.blob());
                        const fileName = new URL(url).pathname.split("/").at(-1);
                        const [id, ex] = fileName.split(".");
                        const img = new Image();
                        img.src = URL.createObjectURL(blob);
                        await new Promise((resolve, reject) => {
                            (img.onload = resolve, img.onerror = reject)
                        });
                        const imgWidth = img.naturalWidth;
                        const imgHeight = img.naturalHeight;
                        const canvas = new OffscreenCanvas(imgWidth, imgHeight);
                        const canvas_2d = canvas.getContext("2d");
                        const num = get_num(btoa(aid), btoa(id));
                        const cropHeight = Number(imgHeight % num);
                        const sHeight = Math.floor(imgHeight / num);
                        let sy = imgHeight - cropHeight - sHeight;
                        let dy = cropHeight;
                        canvas_2d.drawImage(img, 0, sy, imgWidth, cropHeight + sHeight, 0, 0, imgWidth, cropHeight + sHeight);
                        for (let i = 1; i < num; ++i) {
                            canvas_2d.drawImage(img, 0, sy -= sHeight, imgWidth, sHeight, 0, dy += sHeight, imgWidth, sHeight);
                        }
                        URL.revokeObjectURL(img.src);
                        canvas.convertToBlob({
                            type: blob.type,
                            quality: 0.9
                        }).then(blob => {
                            fun.showMsg(`DrawImage ${fetchNum+=1}/${imgs.length}`, 0);
                            resolve(URL.createObjectURL(blob));
                        });
                    }
                });
                arr.push(getRedraw);
                await fun.delay(100);
            }
            return arr;
        },
        button: [4, "24%", 1],
        insertImg: ["//div[@class='panel-body'][div[@class='row thumb-overlay-albums']]", 0],
        next: "//a[span[text()='下一話']][@href]",
        prev: 1,
        customTitle: () => {
            return fun.fetchDoc(fun.gu("//a[span[text()='漫畫簡介']]")).then(albumDoc => {
                let comicName = fun.gt(".panel-heading h1", 1, albumDoc).replaceAll("/", "").replace(/\s?\[禁漫漢化組\]/, "");
                let episode = fun.ge(".episode", albumDoc);
                if (episode) {
                    let id = fun.lp.match(/\d+/)[0];
                    let selector = `.episode a[data-album="${id}"]`;
                    let text = fun.gt(selector, 1, albumDoc);
                    let chapterName = text.split("\n").filter(item => item)[0];
                    return comicName + " - " + chapterName.replace(/\[\d+[\w\s\.\+-]+\]/i, "").trim();
                } else {
                    return comicName.replace(/\[\d+[\w\s\.\+-]+\]/i, "").trim();
                }
            });
        },
        fetch: 1,
        css: ".hidden-lg:not(.panel)[style*='z-index']{display:none!important;}",
        category: "hcomic"
    }, {
        name: "禁漫天堂",
        reg: () => {
            let hosts = ["18comic.vip", "18comic.org", "18comic-cn.vip", "18comic-palworld.club", "18comic-c.xyz", "18comic-c.art", "18comic-fun.xyz", "jmcomic.me", "jmcomic1.me", "jm-comic1.art", "jm-comic2.art", "jm-comic3.art", "18comic-ff7rebirth.xyz", "18comic-ff7rebirth.quest", "18comic-ff7rebirth.club"];
            return fun.indexOf(hosts, fun.lh);
        },
        init: () => {
            setTimeout(() => {
                fun.ge("#chk_cover").click();
                fun.ge("#chk_guide").click();
            }, 1000);
            let selectors = [
                "//div[contains(text(),'插件')]",
                "//div[@class='col-xs-6'][div[@data-group]]",
                "//div[@class='panel-body']//div[@data-group]",
                "//div[@class='row'][div[div[@data-group]]][not(div[@id='album_photo_cover'])][not(div[*[@class='panel panel-default']])][not(div[@class='col-xs-12 col-md-9 col-sm-8' and div[@class='well well-sm']])]",
                "//div[@class='div_sticky2 hidden-lg']"
            ]
            fun.remove(selectors);
        },
        css: ".hidden-lg:not(.panel)[style*='z-index']{display:none!important;}",
        category: "ad"
    }, {
        name: "E-Hentai圖片清單頁",
        host: ["e-hentai.org", "exhentai.org"],
        reg: /(e-hentai|exhentai).org\/g\/\d+\/\w+\/$/,
        exclude: "//h1[text()='Content Warning']",
        imgs: async () => {
            await fun.getNP(".gdtm,.gdtl", ".ptds+td>a", null, "//tr[td[@class='ptds']]");
            if (options.fancybox == 1 && !isDownloading) {
                //預覽縮圖網址需要裁剪難弄...
                if (fun.ge(".gdtm img[style],.gdtl img[style]")) {
                    let thumbnailsHeightData = [...document.querySelectorAll(".gdtm img,.gdtl img")].map(e => Number(e.style.height.match(/\d+/)[0]));
                    let thumbnailUrls = [...document.querySelectorAll(".gdtm>div,.gdtl>div")].map(div => div.getAttribute("style").split("url(")[1].split(")")[0]);
                    thumbnailUrls = [...new Set(thumbnailUrls)];
                    let getThumbnai = 0;
                    fun.showMsg("Get Thumbnailsing...", 0);
                    let blobs = thumbnailUrls.map((url, i, arr) => {
                        return fun.xhr(url, {
                            responseType: "blob"
                        }).then(blob => {
                            fun.showMsg(`Get Thumbnails ${getThumbnai += 1}/${arr.length}`, 0);
                            return blob;
                        });
                    });
                    let heightIndex = 0;
                    let crop = 0;
                    await Promise.all(blobs).then(async blobArr => {
                        fun.hideMsg();
                        for (let blob of blobArr) {
                            fun.showMsg(`Thumbnails Crop ${crop += 1}/${blobArr.length}`, 0);
                            //console.log(`預覽縮圖裁切第${crop}張`);
                            let img = new Image();
                            img.src = URL.createObjectURL(blob);
                            await new Promise((resolve, reject) => {
                                (img.onload = resolve, img.onerror = reject);
                            });
                            for (let w = 0; w < img.width; w += 100) {
                                let canvas = document.createElement("canvas");
                                canvas.height = thumbnailsHeightData[heightIndex];
                                canvas.width = 100;
                                canvas.getContext("2d").drawImage(img, -Math.abs(w), 0);
                                let dataURL = canvas.toDataURL("image/webp", 0.5);
                                let thumbnailBlobURL = fun.dataURLtoBlobURL(dataURL);
                                thumbnailsSrcArray.push(thumbnailBlobURL);
                                //console.log(thumbnailBlobURL);
                                heightIndex++;
                            }
                        }
                    });
                } else {
                    thumbnailsSrcArray = [...document.querySelectorAll(".gdtm img,.gdtl img")].map(e => e.src);
                }
            }
            if (E_HENTAI_LoadOriginalImage == 1) {
                fun.showMsg(displayLanguage.str_01, 0);
                let fetchNum = 0;
                return fun.gae(".gdtm a,.gdtl a").map(async (a, i, arr) => {
                    await fun.delay(100 * i, 0);
                    return fun.fetchDoc(a.href).then(async doc => {
                        fun.showMsg(`${displayLanguage.str_02}${fetchNum+=1}/${arr.length}`, 0);
                        let fullimg = fun.ge("a[href*=fullimg]", doc);
                        let img = fun.ge("#img", doc);
                        if (fullimg) {
                            let url = fullimg.href;
                            let res = await fun.xhrHEAD(url);
                            let finalUrl = res.finalUrl;
                            return /login\.php/.test(finalUrl) ? img.src : url;
                        } else {
                            return img.src;
                        }
                    });
                });
            } else {
                return fun.getImgA("#img", ".gdtm a,.gdtl a", 100);
            }
        },
        button: [4],
        insertImg: [
            ["#gdt", 0], 3
        ],
        go: 1,
        customTitle: () => {
            let t = fun.gt("#gj").replace(/\/|\[\d+[\w\.\+\s-]+\]/i, "");
            return t.length > 0 ? t : fun.gt("#gn").replace(/\|.+|\[\d+[\w\.\+\s-]+\]/i, "").trim();
        },
        topButton: true,
        threading: 4,
        category: "hcomic"
    }, {
        name: "E-Hentai圖片清單頁",
        host: ["e-hentai.org"],
        link: "https://e-hentai.org/lofi/",
        reg: /^https?:\/\/e-hentai\.org\/lofi\/g\/\w+\/\w+\//,
        imgs: async () => {
            await fun.getNP(".gi", "//a[text()='Next Page >' or text()='下一页 >']", null, "#ia")
            return fun.getImgA("#sm", ".gi>a", 100);
        },
        button: [4],
        insertImg: [
            ["#ia", 2], 3
        ],
        customTitle: () => fun.title(" - E-Hentai", 1).replace(/\|.+/, "").replace(/\//, "").trim(),
        go: 1,
        topButton: true,
        threading: 8,
        category: "hcomic"
    }, {
        name: "nhentai圖片清單頁",
        host: ["nhentai.net", "nyahentai.red", "www.hentai.name", "nhentai.xxx", "nhentai.to", "simplyhentai.org"],
        reg: /(nhentai\.net|nyahentai\.red|www\.hentai\.name|nhentai\.xxx|nhentai\.to|simplyhentai\.org)\/g\/\d+\/?$/,
        imgs: async () => {
            thumbnailsSrcArray = fun.getImgSrcArr("a.gallerythumb>img");
            if (/nhentai\.net/.test(siteUrl)) {
                const hostArray = ["i", "i3", "i5", "i7"];
                const randomHost = arr => {
                    let choose = Math.floor(Math.random() * Math.floor(arr.length));
                    let rValue = arr[choose];
                    return rValue;
                };
                return _unsafeWindow._gallery.images.pages.map((e, i) => `https://${randomHost(hostArray)}.nhentai.net/galleries/${_unsafeWindow.gallery.media_id}/${i + 1}.${fun.ex(e.t)}`);
            } else if (/nyahentai\.red/.test(siteUrl)) {
                fun.showMsg(displayLanguage.str_05, 0);
                let [imgDir] = fun.ge(".gallerythumb>img").src.match(/.+\//);
                let url = fun.gu("a.gallerythumb");
                return fun.iframeVar(url, 1000, "images_ext").then(w => w.images_ext.map((e, i) => `${imgDir}${(i + 1)}.${fun.ex(e)}`));
            } else if (/nhentai\.xxx/.test(siteUrl)) {
                fun.showMsg(displayLanguage.str_05, 0);
                let [max] = fun.gt(".pages").match(/\d+/);
                let img = fun.ge(".gallery_thumbs img");
                let src = img.dataset.src ?? img.src;
                let [imgDir] = src.match(/.+\//);
                let url = fun.gu(".gallery_thumbs a");
                let iframe = await fun.iframeVar(url, 1000, "g_th");
                return fun.arr(max).map((_, i) => `${imgDir}${(i + 1)}.${fun.ex(iframe.g_th.fl[(i + 1)][0])}`);
            } else if (/nhentai\.to/.test(siteUrl)) {
                fun.showMsg(displayLanguage.str_05, 0);
                let url = fun.gu("a.gallerythumb");
                let iframe = await fun.iframeVar(url, 1000, "reader");
                let imgDir = iframe.reader.media_url + "/galleries/" + iframe.reader.gallery.media_id + "/";
                return iframe.reader.gallery.images.pages.map((e, i) => `${imgDir}${(i + 1)}.${fun.ex(e.t)}`);
            } else if (/simplyhentai\.org/.test(siteUrl)) {
                return fun.gae(".thumbs img,.thumb-container img").map(e => e.dataset.src ? e.dataset.src.replace(/t(\.\w+)$/, "$1") : e.src.replace(/t(\.\w+)$/, "$1"));
            } else if (/www\.hentai\.name/.test(siteUrl)) {
                return fun.gae(".thumb-container img").map(e => e.src.replace(/_thumb(\.\w+)$/, "$1"));
            }
        },
        button: [4],
        insertImg: [
            [".thumbs,#thumbnail-container,.outer_thumbs", 0], 2
        ],
        autoClick: ["#show-all-images-button,#show_all"],
        customTitle: () => {
            if (/nhentai\.net/.test(siteUrl)) {
                const {
                    gallery
                } = _unsafeWindow;
                return gallery.title.japanese ?? gallery.title.english;
            } else {
                let h2 = fun.gt("h2.title,h2");
                return h2.length > 4 ? h2 : fun.gt("h1.title,h1");
            }
        },
        threading: 8,
        go: 1,
        topButton: true,
        css: ".advt{display:none!important}",
        category: "hcomic"
    }, {
        name: "nhentai閱讀頁",
        host: ["nhentai.net"],
        reg: /^https?:\/\/nhentai\.net\/g\/\d+\/\d+\/$/,
        imgs: () => {
            const {
                _gallery
            } = _unsafeWindow;
            const hostArray = ["i", "i3", "i5", "i7"];
            const randomHost = arr => {
                let choose = Math.floor(Math.random() * Math.floor(arr.length));
                let rValue = arr[choose];
                return rValue;
            };
            return _gallery.images.pages.map((e, i) => `https://${randomHost(hostArray)}.nhentai.net/galleries/${_gallery.media_id}/${i + 1}.${fun.ex(e.t)}`);
        },
        button: [4],
        insertImg: ["#image-container", 2],
        customTitle: () => {
            const {
                _gallery
            } = _unsafeWindow;
            return _gallery.title.japanese ?? _gallery.title.english;
        },
        threading: 4,
        category: "hcomic"
    }, {
        name: "nyahentai.red閱讀頁",
        host: ["nyahentai.red"],
        reg: /^https?:\/\/nyahentai\.red\/g\/\d+\/\d+\/$/,
        imgs: () => {
            let imgDir = fun.ge("#image-container img").src.match(/.+\//)[0];
            return _unsafeWindow.images_ext.map((e, i) => `${imgDir}${(i + 1)}.${fun.ex(e)}`);
        },
        button: [4],
        insertImg: ["#image-container", 2],
        customTitle: () => fun.title(" » ", 1),
        threading: 4,
        category: "hcomic"
    }, {
        name: "www.hentai.name閱讀頁",
        host: ["www.hentai.name"],
        reg: /^https?:\/\/www\.hentai\.name\/g\/\d+\/\d+\/$/,
        imgs: () => {
            let max = fun.gt(".num-pages");
            let [, imgDir, ex] = fun.ge("#image-container img").src.match(/(.+\/)\d+(\.\w+)$/);
            return fun.arr(max).map((_, i) => `${imgDir}${(i + 1)}${ex}`);
        },
        button: [4],
        insertImg: ["#image-container", 2],
        customTitle: () => fun.title(" - Hentai.name"),
        threading: 4,
        category: "hcomic"
    }, {
        name: "simplyhentai.org閱讀頁",
        host: ["simplyhentai.org"],
        reg: /^https?:\/\/simplyhentai\.org\/g\/\d+\/\d+\/$/,
        imgs: () => {
            let max = fun.gt(".num-pages");
            let [, imgDir, ex] = fun.ge("#image-container img").src.match(/(.+\/)\d+(\.\w+)$/);
            return fun.arr(max).map((_, i) => `${imgDir}${(i + 1)}${ex}`);
        },
        button: [4],
        insertImg: ["#image-container", 2],
        customTitle: () => fun.title(" » ", 1),
        threading: 4,
        category: "hcomic"
    }, {
        name: "akuma.moe",
        host: ["akuma.moe"],
        reg: /^https?:\/\/akuma\.moe\/g\/\w+$/i,
        init: async () => await fun.waitEle("#pages"),
        imgs: async () => {
            fun.showMsg(displayLanguage.str_05, 0);
            const {
                pag,
                ajx
            } = _unsafeWindow;
            if (options.fancybox == 1 && !isDownloading) {
                let pages = pag.cnt;
                if (pages > 40) {
                    let max = Math.ceil(pages / 20);
                    let resArr = fun.arr(max).map((_, i) => {
                        return fetch(pag.act, {
                            "headers": {
                                "accept": "*/*",
                                "content-type": "application/x-www-form-urlencoded; charset=UTF-8",
                                "x-csrf-token": ajx.hdr["X-CSRF-TOKEN"],
                                "x-requested-with": "XMLHttpRequest"
                            },
                            "body": `index=${i}`,
                            "method": "POST",
                        }).then(res => res.text()).then(text => fun.doc(text)).then(doc => [...doc.images]);
                    });
                    thumbnailsSrcArray = await Promise.all(resArr).then(data => fun.getImgSrcArr(data.flat()));
                } else {
                    thumbnailsSrcArray = fun.getImgSrcArr("#pages img");
                }
            }
            let url = fun.gu("#pages a");
            let imgDir = await fun.iframeVar(url, 1000, "img_prt").then(w => w.img_prt + "/");
            return fetch(siteUrl, {
                "headers": {
                    "accept": "*/*",
                    "x-csrf-token": ajx.hdr["X-CSRF-TOKEN"],
                    "x-requested-with": "XMLHttpRequest"
                },
                "body": null,
                "method": "POST"
            }).then(res => res.json()).then(arr => arr.map(e => imgDir + e));
        },
        button: [4],
        insertImg: [
            ["#pages", 0], 2
        ],
        go: 1,
        customTitle: () => fun.ge(".entry-header>span") ? fun.gt(".entry-header>span") : fun.gt(".entry-title"),
        category: "hcomic"
    }, {
        name: "Anchira",
        host: ["anchira.to"],
        reg: /^https?:\/\/anchira\.to\/g\/\d+\/\w+$/i,
        init: async () => await fun.waitEle("#previews img"),
        imgs: async () => {
            if (!fun.ge("#previews img")) return [];
            let max = fun.gt("//strong[text()='Length']/following-sibling::div").match(/\d+/)[0];
            let sSrc = fun.attr("#previews img", "src");
            let sImgDir = sSrc.replace(/\d+$/, "");
            thumbnailsSrcArray = fun.arr(max).map((_, i) => sImgDir + (i + 1));
            let urlArr = siteUrl.split("/");
            let galleryId = urlArr.at(-2);
            let galleryKey = urlArr.at(-1);
            let res = await fetch(`/api/v1/library/${galleryId}/${galleryKey}/data`, {
                "headers": {
                    "x-requested-with": "XMLHttpRequest"
                }
            });
            if (res.status != 200) {
                alert("Trigger human-machine verification.\nPlease click Read button.\nAfter successful human-machine verification.\nReturn to gallery information page.\nReload.");
                return [];
            } else {
                let bSrc = fun.attr("#gallery img", "src");
                let imgOrigin = new URL(bSrc).origin;
                let json = await res.json();
                let gallerHash = json.hash;
                let gallerReadKey = json.key;
                return json.names.map(name => imgOrigin + "/" + galleryId + "/" + gallerReadKey + "/" + gallerHash + "/b/" + name);
            }
        },
        button: [4],
        insertImg: ["#previews", 2],
        customTitle: "#metadata span.s",
        threading: 6,
        category: "hcomic"
    }, {
        name: "Anchira 分類自動翻頁",
        enable: 1,
        reg: async () => /^https?:\/\/anchira\.to\/(trending|\?)/.test(siteUrl) && await fun.waitEle(".pagination") && await fun.waitEle(".galleries"),
        autoPager: {
            mode: 1,
            waitEle: ".galleries article img",
            ele: ".galleries>main",
            next: ".pagination a[aria-current='true']+a:not([title='Go to the next page'])",
            re: ".pagination",
            title: doc => "Page " + nextLink.match(/\d+$/)[0],
            bottom: screen.height * 3
        },
        openInNewTab: ".galleries a:not([target=_blank])",
        category: "autoPager"
    }, {
        name: "Cathentai/Hentaibeeg/Hentaicolor/Nyahentai/圖片清單頁",
        host: ["cathentai.net", "hentaibeeg.com", "hentaicolor.net", "nyahentai.info"],
        reg: /(cathentai\.net|hentaibeeg\.com|hentaicolor\.net|nyahentai\.info)\/[^/]+\/(#collapse)?$/i,
        imgs: () => {
            fun.showMsg(displayLanguage.str_05, 0);
            let url = fun.gu("//a[span[text()='List Read']]");
            return fun.fetchDoc(url).then(doc => {
                return fun.run(fun.gt("#listImgH", 1, doc));
            });
        },
        button: [4],
        insertImg: [
            ["#thumbnail-container", 2], 2
        ],
        go: 1,
        customTitle: () => fun.gt("#info>h4") || fun.gt("#info>h1"),
        autoClick: ["#showAll"],
        category: "hcomic"
    }, {
        name: "Cathentai/Hentaibeeg/Hentaicolor/Nyahentai/List Read頁",
        host: ["cathentai.net", "hentaibeeg.com", "hentaicolor.net", "nyahentai.info"],
        reg: /(cathentai\.net|hentaibeeg\.com|hentaicolor\.net|nyahentai\.info)\/read\/\d+\.html$/i,
        imgs: () => fun.run(fun.gt("#listImgH")),
        button: [4],
        insertImg: ["#image-container", 2],
        customTitle: () => fun.title(/ - Cathentai| - Hentaicolor| - Hentaibeeg| - Nyahentai.info/, 1),
        category: "hcomic"
    }, {
        name: "3hentai圖片清單頁",
        host: ["3hentai.net"],
        reg: /(www\.3hentai1\.buzz|3hentai\.net)\/\??d\/\d+$/,
        imgs: async () => {
            thumbnailsSrcArray = fun.getImgSrcArr(".single-thumb>a>img");
            fun.showMsg(displayLanguage.str_05, 0);
            let url = fun.gu(".single-thumb>a");
            let json = await fun.fetchDoc(url).then(doc => {
                let code = fun.gst("readerPages", doc);
                let jsonCode = code.match(/JSON[^;]+/)[0];
                return fun.run(jsonCode);
            });
            let max = json.lastPage;
            let imgDir = json.baseUriImg.replace("%s", "");
            return fun.arr(max).map((_, i) => imgDir + json.pages[(i + 1)].f);
        },
        button: [4],
        insertImg: [
            ["#thumbnail-gallery", 0], 2
        ],
        customTitle: () => fun.gt("#main-info>h1,#main-info>h2").replace("|", "-"),
        go: 1,
        topButton: true,
        threading: 4,
        //css: "#header-ban-agsy,#middle-ban-agsy,#footer-ban-agsy{display:none!important}.single-thumb-col{padding:0px!important;width:100%!important}",
        category: "hcomic"
    }, {
        name: "3hentai閱讀頁",
        host: ["3hentai.net"],
        reg: /^https?:\/\/3hentai\.net\/\??d\/\d+\/\d+$/,
        imgs: () => {
            const {
                readerPages
            } = _unsafeWindow;
            let max = readerPages.lastPage;
            let imgDir = readerPages.baseUriImg.replace("%s", "");
            return fun.arr(max).map((_, i) => imgDir + readerPages.pages[(i + 1)].f);
        },
        button: [4],
        insertImg: [".reader-image", 2],
        customTitle: () => fun.gt(".reader-title").replace("|", "-"),
        threading: 4,
        category: "hcomic"
    }, {
        name: "山寨3hentai圖片清單頁",
        host: ["www.hentai321.top"],
        reg: /^https?:\/\/www\.hentai321\.top\/\?d\/\d+$/,
        init: () => {
            fun.createImgBox("#thumbnail-gallery", 2);
            fun.remove("#header-ban-agsy,#middle-ban-agsy");
        },
        imgs: () => fun.getImgA(".js-main-img", ".single-thumb>a"),
        thums: ".single-thumb img",
        button: [4],
        insertImg: ["#FullPictureLoadMainImgBox", 2],
        customTitle: ".middle-title",
        go: 1,
        css: "#FullPictureLoadMainImgBox{max-width:1140px;margin-left:auto;margin-right:auto}ins,#doujin-page-footer-ban-agsy,#main-content+div~*:not(#FullPictureLoadOptions,#FullPictureLoad,#FullPictureLoadGoToFirstImage,#FullPictureLoadGoToLastImage,.FullPictureLoadMsg){display:none!important;}",
        category: "hcomic"
    }, {
        name: "HentaiFox圖片清單頁",
        host: ["hentaifox.com"],
        reg: () => /hentaifox\.com\/gallery\/\d+\/$/.test(siteUrl) && fun.ge("//a[text()=' Read Online']"),
        init: async () => {
            await fun.waitEle(".gallery_thumb img");
            await fun.waitVar("g_th");
            fun.createImgBox(".gallery_bottom");
        },
        imgs: async () => {
            fun.showMsg(displayLanguage.str_05, 0);
            let u_id = fun.ge("#gallery_id").value;
            let g_id = fun.ge("#load_id").value;
            let img_dir = fun.ge("#load_dir").value;
            let total_pages = fun.ge("#load_pages").value;
            thumbnailsSrcArray = await fetch("/includes/thumbs_loader.php", {
                "headers": {
                    "content-type": "application/x-www-form-urlencoded; charset=UTF-8",
                    "x-requested-with": "XMLHttpRequest"
                },
                "body": `u_id=${u_id}&g_id=${g_id}&img_dir=${img_dir}&visible_pages=0&total_pages=${total_pages}&type=2`,
                "method": "POST"
            }).then(res => res.text()).then(text => fun.doc(text)).then(doc => [...doc.images].map(e => e.dataset.src ?? e.src));
            let max = fun.gt(".pages").match(/\d+/)[0];
            let img = fun.ge(".gallery_thumb img");
            let src = img.dataset.src ?? img.src;
            let imgDir = src.match(/.+\//)[0];
            return fun.arr(max).map((_, i) => `${imgDir}${(i + 1)}.${fun.ex(_unsafeWindow.g_th[(i + 1)][0])}`);
        },
        button: [4],
        insertImg: ["#FullPictureLoadMainImgBox", 2],
        customTitle: () => fun.gt(".info>h1").replace("|", "-"),
        go: 1,
        topButton: true,
        threading: 4,
        category: "hcomic"
    }, {
        name: "HentaiFox閱讀頁",
        host: ["hentaifox.com"],
        reg: /^https?:\/\/hentaifox\.com\/g\/\d+\/\d+\/$/,
        imgs: async () => {
            let max = fun.ge("#pages").value;
            let img = fun.ge("#gimg");
            let src = img.dataset.src ?? img.src;
            let imgDir = src.match(/.+\//)[0];
            return fun.arr(max).map((_, i) => `${imgDir}${(i + 1)}.${fun.ex(_unsafeWindow.g_th[(i + 1)][0])}`);
        },
        button: [4],
        insertImg: [".full_image", 2],
        customTitle: () => fun.title(/ - Page \d+ - HentaiFox/).replace("|", "-"),
        threading: 4,
        category: "hcomic"
    }, {
        name: "HentaiZap圖片清單頁",
        host: ["hentaizap.com"],
        reg: /hentaizap\.com\/gallery\/\d+\/$/,
        inti: async () => {
            await fun.waitEle(".gp_th img");
            await fun.waitVar("g_th");
        },
        imgs: async () => {
            fun.showMsg(displayLanguage.str_05, 0);
            let _token = fun.attr('meta[name="csrf-token"]', "content");
            let server = fun.ge("#load_server").value;
            let u_id = fun.ge("#gallery_id").value;
            let g_id = fun.ge("#load_id").value;
            let img_dir = fun.ge("#load_dir").value;
            let total_pages = fun.ge("#load_pages").value;
            thumbnailsSrcArray = await fetch("/inc/thumbs_loader.php", {
                "headers": {
                    "content-type": "application/x-www-form-urlencoded; charset=UTF-8",
                    "x-requested-with": "XMLHttpRequest"
                },
                "body": `_token=${_token}&server=${server}&u_id=${u_id}&g_id=${g_id}&img_dir=${img_dir}&visible_pages=0&total_pages=${total_pages}&type=2`,
                "method": "POST"
            }).then(res => res.text()).then(text => fun.doc(text)).then(doc => [...doc.images].map(e => e.dataset.src ?? e.src));
            if (!fun.ge("#FullPictureLoadMainImgBox")) fun.createImgBox("#comments_div");
            let max = fun.gt(".info_pg").match(/\d+/)[0];
            let img = fun.ge(".gp_th img");
            let src = img.dataset.src ?? img.src;
            let imgDir = src.match(/.+\//)[0];
            return fun.arr(max).map((_, i) => `${imgDir}${(i + 1)}.${fun.ex(_unsafeWindow.g_th[(i + 1)][0])}`);
        },
        button: [4],
        insertImg: [
            ["#FullPictureLoadMainImgBox", 0], 2
        ],
        customTitle: () => fun.gt(".gp_top_right>h1").replace("|", "-"),
        go: 1,
        category: "hcomic"
    }, {
        name: "HentaiZap閱讀頁",
        host: ["hentaizap.com"],
        reg: /^https?:\/\/hentaizap\.com\/g\/\d+\/\d+\/$/,
        init: async () => await fun.waitVar("g_th"),
        imgs: async () => {
            let max = fun.ge("#pages").value;
            let img = fun.ge("#fimg");
            let src = img.dataset.src ?? img.src;
            let imgDir = src.match(/.+\//)[0];
            return fun.arr(max).map((_, i) => `${imgDir}${(i + 1)}.${fun.ex(_unsafeWindow.g_th[(i + 1)][0])}`);
        },
        button: [4],
        insertImg: [".mid_rd", 2],
        customTitle: () => fun.title(/ - Page \d+ - HentaiZap/).replace("|", "-"),
        category: "hcomic"
    }, {
        name: "HentaiRead閱讀頁",
        host: ["hentairead.com"],
        reg: /^https?:\/\/hentairead\.com\/hentai\/[^\/]+\/english\/p\/\d+\/$/,
        init: async () => {
            await fun.waitVar("chapter_preloaded_images");
            fun.remove(".page-link-hover,.bottom-nav,.ad");
        },
        imgs: () => _unsafeWindow.chapter_preloaded_images.map(e => e.src.replace(/\?quality=.+$/, "")),
        insertImg: ["#imagesList", 2],
        customTitle: () => fun.title(/ Page \d.+$/).trim(),
        category: "hcomic"
    }, {
        name: "HentaiRox圖片清單頁",
        host: ["HentaiRox.com"],
        reg: () => /hentairox\.com\/gallery\/\d+\/$/.test(siteUrl) && fun.ge("#append_thumbs"),
        init: () => fun.createImgBox("#comments_div", 0),
        imgs: async () => {
            fun.showMsg(displayLanguage.str_04, 0);
            await fun.waitEle("#append_thumbs img");
            fun.hideMsg();
            fun.showMsg(displayLanguage.str_05, 0);
            let server = fun.ge("#load_server").value;
            let u_id = fun.ge("#gallery_id").value;
            let g_id = fun.ge("#load_id").value;
            let img_dir = fun.ge("#load_dir").value;
            let total_pages = fun.ge("#load_pages").value;
            thumbnailsSrcArray = await fetch("/inc/thumbs_loader.php", {
                "headers": {
                    "content-type": "application/x-www-form-urlencoded; charset=UTF-8",
                    "x-requested-with": "XMLHttpRequest"
                },
                "body": `server=${server}&u_id=${u_id}&g_id=${g_id}&img_dir=${img_dir}&visible_pages=0&total_pages=${total_pages}&type=2`,
                "method": "POST"
            }).then(res => res.text()).then(text => fun.doc(text)).then(doc => [...doc.images].map(e => e.dataset.src ?? e.src));
            let max = fun.gt(".pages").match(/\d+/)[0];
            let img = fun.ge(".gthumb img");
            let src = img.dataset.src ?? img.src;
            let imgDir = src.match(/.+\//)[0];
            return fun.arr(max).map((_, i) => `${imgDir}${(i + 1)}.${fun.ex(_unsafeWindow.g_th[(i + 1)][0])}`);
        },
        button: [4],
        insertImg: ["#FullPictureLoadMainImgBox", 2],
        customTitle: () => fun.ge(".subtitle") ? fun.gt(".subtitle") : fun.gt("h1"),
        go: 1,
        topButton: true,
        threading: 4,
        category: "hcomic"
    }, {
        name: "HentaiRox閱讀頁",
        host: ["HentaiRox.com"],
        reg: /^https?:\/\/hentairox\.com\/view\/\d+\/\d+\/$/,
        imgs: async () => {
            let max = fun.ge("#pages").value;
            let img = fun.ge("#gimg");
            let src = img.dataset.src ?? img.src;
            let imgDir = src.match(/.+\//)[0];
            return fun.arr(max).map((_, i) => `${imgDir}${(i + 1)}.${fun.ex(_unsafeWindow.g_th[(i + 1)][0])}`);
        },
        button: [4],
        insertImg: [".pre_img", 2],
        customTitle: () => fun.title(/ - Page \d+ - HentaiRox/).replace("|", "-"),
        threading: 4,
        css: ".pre_img{max-height:unset!important}",
        category: "hcomic"
    }, {
        name: "HentaiEnvy圖片清單頁",
        host: ["hentaienvy.com"],
        reg: () => /hentaienvy\.com\/gallery\/\d+\/$/.test(siteUrl) && fun.ge(".gallery_thumbs"),
        init: () => fun.createImgBox(".gallery_thumbs", 0),
        imgs: async () => {
            fun.showMsg(displayLanguage.str_04, 0);
            await fun.waitEle("#thumbs_box img");
            fun.hideMsg();
            fun.showMsg(displayLanguage.str_05, 0);
            let _token = fun.attr('meta[name="csrf-token"]', "content");
            let server = fun.ge("#load_server").value;
            let u_id = fun.ge("#gallery_id").value;
            let g_id = fun.ge("#load_id").value;
            let img_dir = fun.ge("#load_dir").value;
            let total_pages = fun.ge("#load_pages").value;
            thumbnailsSrcArray = await fetch("/inc/thumbs_loader.php", {
                "headers": {
                    "content-type": "application/x-www-form-urlencoded; charset=UTF-8",
                    "x-requested-with": "XMLHttpRequest"
                },
                "body": `_token=${_token}&server=${server}&u_id=${u_id}&g_id=${g_id}&img_dir=${img_dir}&visible_pages=0&total_pages=${total_pages}&type=2`,
                "method": "POST"
            }).then(res => res.text()).then(text => fun.doc(text)).then(doc => [...doc.images].map(e => e.dataset.src ?? e.src));
            let max = fun.gt("//ul[span[text()='Pages:']]").match(/\d+/)[0];
            let img = fun.ge(".th_gp img");
            let src = img.dataset.src ?? img.src;
            let imgDir = src.match(/.+\//)[0];
            return fun.arr(max).map((_, i) => `${imgDir}${(i + 1)}.${fun.ex(_unsafeWindow.g_th[(i + 1)][0])}`);
        },
        button: [4],
        insertImg: ["#FullPictureLoadMainImgBox", 2],
        customTitle: () => fun.ge(".subtitle") ? fun.gt(".subtitle") : fun.gt("h1"),
        go: 1,
        topButton: true,
        threading: 4,
        category: "hcomic"
    }, {
        name: "HentaiEnvy閱讀頁",
        host: ["hentaienvy.com"],
        reg: /^https?:\/\/hentaienvy\.com\/g\/\d+\/\d+\/$/,
        imgs: async () => {
            let max = fun.ge("#pages").value;
            let img = fun.ge("#fimg");
            let src = img.dataset.src ?? img.src;
            let imgDir = src.match(/.+\//)[0];
            return fun.arr(max).map((_, i) => `${imgDir}${(i + 1)}.${fun.ex(_unsafeWindow.g_th[(i + 1)][0])}`);
        },
        button: [4],
        insertImg: [".rd_fimg", 2],
        customTitle: () => fun.title(/ - Page \d+ - HentaiEnvy/).replace("|", "-"),
        threading: 4,
        css: ".rd_fimg{max-height:unset!important}",
        category: "hcomic"
    }, {
        name: "lhentai.com/simplyhentai.red圖片清單頁",
        host: ["lhentai.com", "simplyhentai.red"],
        reg: /^https?:\/\/(lhentai\.com|simplyhentai\.red)\/g\/\d+$/,
        imgs: async () => {
            thumbnailsSrcArray = fun.getImgSrcArr(".gallerythumb img");
            fun.showMsg(displayLanguage.str_05, 0);
            let url = fun.gu("a.gallerythumb");
            let iframe = await fun.iframeVar(url, 1000, "images_ext");
            let imgDir = fun.ge(".fit-horizontal", iframe.document).src.match(/.+\//)[0];
            return iframe.images_ext.map((e, i) => `${imgDir}${(i + 1)}.${fun.ex(e)}`);
        },
        button: [4],
        insertImg: [
            [".thumbs", 2], 2
        ],
        go: 1,
        customTitle: () => fun.gt("#info>h2") || fun.gt("#info>h1"),
        category: "hcomic"
    }, {
        name: "lhentai.com/simplyhentai.red閱讀頁",
        host: ["lhentai.com", "simplyhentai.red"],
        reg: /^https?:\/\/(lhentai\.com|simplyhentai\.red)\/g\/\d+\/\d+\/$/,
        imgs: () => {
            let imgDir = fun.ge(".fit-horizontal").src.match(/.+\//)[0];
            return _unsafeWindow.images_ext.map((e, i) => `${imgDir}${(i + 1)}.${fun.ex(e)}`);
        },
        button: [4],
        insertImg: ["#page-container", 2],
        category: "hcomic"
    }, {
        name: "EAHentai",
        host: ["eahentai.com"],
        reg: /^https?:\/\/eahentai\.com\/a\/\d+$/,
        init: async () => {
            let id = fun.lp.match(/\d+/)[0];
            let fetchJson = await fetch(`/api/image/album/${id}`).then(res => res.json()).then(arr => arr[0]);
            siteJson = fetchJson;
            await fun.waitEle(".gallery-img");
            fun.createImgBox(".gallery-container", 2);
        },
        imgs: () => {
            thumbnailsSrcArray = siteJson.images.map(e => "https://i.eahentai.com/file/ea-gallery/" + e.thumbnailUri);
            return siteJson.images.map(e => "https://i.eahentai.com/file/ea-gallery/" + e.imageUri);
        },
        button: [4],
        insertImg: ["#FullPictureLoadMainImgBox", 2],
        go: 1,
        customTitle: () => siteJson.title,
        category: "hcomic"
    }, {
        name: "M-Hentai圖片清單頁",
        host: ["m-hentai.net"],
        reg: /^https?:\/\/m-hentai\.net\/gallery\?id=\d+$/,
        init: () => fun.createImgBox(".bookthumbnailcontainer", 2),
        imgs: async () => {
            thumbnailsSrcArray = fun.getImgSrcArr(".bookthumbnail .lazyloadimage");
            fun.showMsg(displayLanguage.str_05, 0);
            let url = fun.gu(".bookthumbnail>a");
            return fun.iframeVar(url, 1000, "displayimagelist").then(w => w.displayimagelist.map(e => e.image_url));
        },
        button: [4],
        insertImg: ["#FullPictureLoadMainImgBox", 2],
        go: 1,
        customTitle: () => {
            let str = fun.gt(".gallerysubtitle") ?? fun.gt(".gallerytitle");
            return str.trim();
        },
        category: "hcomic"
    }, {
        name: "M-Hentai閱讀頁",
        host: ["m-hentai.net"],
        reg: /^https?:\/\/m-hentai\.net\/read\?index=\d+/,
        imgs: () => _unsafeWindow.displayimagelist.map(e => e.image_url),
        button: [4],
        insertImg: [".imagereadercontainer", 2],
        insertImgAF: () => fun.run("$(document).off()"),
        customTitle: () => fun.title(/ - Page .+/),
        category: "hcomic"
    }, {
        name: "HentaiNexus圖片清單頁",
        host: ["hentainexus.com"],
        reg: /^https?:\/\/hentainexus\.com\/view\/\d+$/,
        init: () => fun.createImgBox("//div[div[@class='columns is-multiline']][@class='box']", 2),
        imgs: async () => {
            thumbnailsSrcArray = fun.getImgSrcArr(".card-image img");
            fun.showMsg(displayLanguage.str_05, 0);
            let url = fun.gu("//a[div[@class='card']]");
            let iframe = await fun.iframeVar(url, 1000, "pageData");
            let CDN_Srcs = iframe.pageData.map(e => e.image);
            let siteSrcs = CDN_Srcs.map(e => e.replace(/i\d\.wp\.com\/|\?filter=null/g, ""));
            fun.showMsg(displayLanguage.str_56, 0);
            let status = await fun.xhrHEAD(siteSrcs[0]).then(res => res.status);
            return status === 200 ? siteSrcs : CDN_Srcs;
        },
        button: [4],
        insertImg: ["#FullPictureLoadMainImgBox", 2],
        go: 1,
        customTitle: ".title",
        category: "hcomic"
    }, {
        name: "HentaiNexus閱讀頁",
        host: ["hentainexus.com"],
        reg: /^https?:\/\/hentainexus\.com\/read\/\d+/,
        imgs: async () => {
            let CDN_Srcs = _unsafeWindow.pageData.map(e => e.image);
            let siteSrcs = CDN_Srcs.map(e => e.replace(/i\d\.wp\.com\/|\?filter=null/g, ""));
            fun.showMsg(displayLanguage.str_56, 0);
            let status = await fun.xhrHEAD(siteSrcs[0]).then(res => res.status);
            return status === 200 ? siteSrcs : CDN_Srcs;
        },
        button: [4],
        insertImg: ["#pageChangeSnap", 2],
        customTitle: () => _unsafeWindow.baseTitle.replace(" :: HentaiNexus", ""),
        category: "hcomic"
    }, {
        name: "HentaiLoop圖片清單頁",
        host: ["hentailoop.com"],
        reg: /^https?:\/\/hentailoop\.com\/manga\/[^\/]+\/$/,
        init: () => fun.createImgBox(".preview", 2),
        imgs: async () => {
            fun.showMsg(displayLanguage.str_05, 0);
            thumbnailsSrcArray = await fetch("/wp-admin/admin-ajax.php", {
                "headers": {
                    "content-type": "application/x-www-form-urlencoded; charset=UTF-8",
                    "x-requested-with": "XMLHttpRequest"
                },
                "body": `action=loadpreviews&postID=${_unsafeWindow.ajaxData.postID}`,
                "method": "POST"
            }).then(res => res.text()).then(text => fun.doc(text)).then(doc => [...doc.images].map(e => e.src));
            let url = fun.gu(".previews>a");
            return fun.iframeVar(url, 1000, "ajax").then(w => {
                let html = w.ajax.pages.join("");
                let dom = fun.doc(html);
                return [...dom.images].map(e => e.dataset.src ?? e.src);
            });
        },
        button: [4],
        insertImg: ["#FullPictureLoadMainImgBox", 2],
        go: 1,
        customTitle: "//meta[@content='4']/preceding-sibling::span[1]",
        category: "hcomic"
    }, {
        name: "HentaiLoop閱讀頁",
        host: ["hentailoop.com"],
        reg: /^https?:\/\/hentailoop\.com\/manga\/[^\/]+\/read/,
        init: () => fun.createImgBox(".manga-read-wrapp", 2),
        imgs: () => {
            let html = _unsafeWindow.ajax.pages.join("");
            let dom = fun.doc(html);
            return [...dom.images].map(e => e.dataset.src ?? e.src);
        },
        button: [4],
        insertImg: [
            ["#FullPictureLoadMainImgBox", 0, ".manga-read-buttons,.manga-read-wrapp"], 2
        ],
        customTitle: () => fun.title(/Page \d+ of | - Hentai.+|\(by[\w\s]+\)/ig).trim(),
        category: "hcomic"
    }, {
        name: "nhentai.xxx閱讀頁",
        host: ["nhentai.xxx"],
        reg: /^https?:\/\/nhentai\.xxx\/g\/\d+\/\d+\/$/,
        imgs: () => {
            let img = fun.ge("#fimg");
            let src = img.dataset.src ?? img.src;
            let imgDir = src.match(/.+\//)[0];
            let max = fun.ge("#pages").value;
            return fun.arr(max).map((_, i) => `${imgDir}${(i + 1)}.${fun.ex(_unsafeWindow.g_th.fl[(i + 1)][0])}`);
        },
        button: [4],
        insertImg: [".reader_overlay", 2],
        category: "hcomic"
    }, {
        name: "nhentai.to閱讀頁",
        host: ["nhentai.to"],
        reg: /^https?:\/\/nhentai\.to\/g\/\d+\/\d+$/,
        init: async () => await fun.waitVar("reader"),
        imgs: () => {
            const {
                reader
            } = _unsafeWindow;
            let imgDir = reader.media_url + "/galleries/" + reader.gallery.media_id + "/";
            return reader.gallery.images.pages.map((e, i) => `${imgDir}${(i + 1)}.${fun.ex(e.t)}`);
        },
        button: [4],
        insertImg: ["#image-container", 2],
        customTitle: () => {
            const {
                reader
            } = _unsafeWindow;
            return reader.gallery.title.japanese ?? reader.gallery.title.english;
        },
        category: "hcomic"
    }, {
        name: "TMOHentai圖片清單頁",
        host: ["tmohentai.com"],
        reg: /^https?:\/\/tmohentai\.com\/contents\/\w+$/i,
        imgs: async () => {
            await fun.waitEle("div[style*='background']");
            let div = fun.ge("div[style*='background']");
            let src = div.style.background.split('"')[1];
            let imgDir = src.match(/.+\//)[0];
            let max = fun.gae("div[style*='background']").length;
            return fun.arr(max).map((_, i) => imgDir + String(i).padStart(3, "0") + ".webp");
        },
        button: [4],
        insertImg: [
            ["//div[div[@class='well']]", 2], 2
        ],
        go: 1,
        customTitle: ".panel-title h3",
        category: "hcomic"
    }, {
        name: "TMOHentai閱讀頁",
        host: ["tmohentai.com"],
        reg: /^https?:\/\/tmohentai\.com\/reader\/\w+\/paginated\//i,
        imgs: async () => {
            await fun.waitEle("img.content-image");
            let img = fun.ge("img.content-image");
            let src = img.dataset.original ?? img.src;
            let imgDir = src.match(/.+\//)[0];
            let max = fun.gae("#select-page option").length;
            return fun.arr(max).map((_, i) => imgDir + String(i).padStart(3, "0") + ".webp");
        },
        button: [4],
        insertImg: [".reader-info+.text-center", 2],
        customTitle: ".reader-title",
        category: "hcomic"
    }, {
        name: "Pururin圖片清單頁",
        host: ["pururin.to"],
        reg: /pururin\.to\/gallery\/\d+\/.+/,
        imgs: () => {
            let url = fun.gu(".gallery-preview>a");
            return fun.fetchDoc(url).then(doc => {
                let ele = fun.ge(".img-viewer", doc);
                let svr = ele.dataset.svr;
                let data = JSON.parse(ele.dataset.img);
                let arr = data.images.sort((a, b) => a.page - b.page);
                arr = arr.map(e => svr + "/" + data.directory + "/" + e.filename);
                thumbnailsSrcArray = arr.map(e => e.replace(/(\.\w+)$/, "t$1"));
                return arr;
            });
        },
        button: [4],
        insertImg: [
            [".gallery-preview", 2], 2
        ],
        go: 1,
        insertImgAF: () => {
            if (options.icon == 1 || siteData.icon == 1) addFullPictureLoadButton();
            if (!hasTouchEvents && ShowFullPictureLoadFixedMenu === 1) addFullPictureLoadFixedMenu();
        },
        customTitle: () => fun.ge("[placeholder=Japanese]").value || fun.ge("[placeholder='Alternative names']").value,
        css: "#FullPictureLoadEnd{color:rgb(255, 255, 255)}",
        autoClick: ["//button[contains(text(),'View all')]"],
        category: "none"
    }, {
        name: "Pururin閱讀頁",
        host: ["pururin.to"],
        reg: /pururin\.to\/read\/\d+\/\d+\/.+/,
        imgs: () => {
            let ele = fun.ge(".img-viewer");
            let svr = ele.dataset.svr;
            let data = JSON.parse(ele.dataset.img);
            //按頁數排列
            let arr = data.images.sort((a, b) => a.page - b.page);
            arr = arr.map(e => svr + "/" + data.directory + "/" + e.filename);
            thumbnailsSrcArray = arr.map(e => e.replace(/(\.\w+)$/, "t$1"));
            return arr;
        },
        button: [4],
        insertImg: [".img-viewer", 2],
        customTitle: () => fun.ge("[placeholder=Japanese]").value || fun.ge("[placeholder='Alternative names']").value,
        css: "#FullPictureLoadEnd{color:rgb(255, 255, 255)}.box.img-reader .img-viewer{position:unset!important;white-space:unset!important}",
        category: "hcomic"
    }, {
        name: "9hentai圖片清單頁",
        host: ["9hentai.com"],
        reg: /9hentai\.\w+\/g\/\d+\/$/,
        init: async () => {
            let json = await fetch("/api/getBookByID", {
                method: "POST",
                body: JSON.stringify({
                    id: Number(/\d+/.exec(fun.lp).at(0) ?? 0)
                }),
                headers: {
                    "Content-Type": "application/json"
                }
            }).then(res => res.json());
            debug("\n此頁JSON資料\n", json);
            siteJson = json;
        },
        imgs: () => {
            let arr = fun.arr(siteJson.results.total_page).map((_, i) => `${siteJson.results.image_server + siteJson.results.id}/${i + 1}.jpg`);
            thumbnailsSrcArray = arr.map(e => e.replace(/(\d+)(\.\w+)$/, "preview/$1t$2"));
            return arr;
        },
        button: [4],
        insertImg: [
            [".pt-0 .card-body", 2], 2
        ],
        go: 1,
        customTitle: () => siteJson.results.alt_title ?? siteJson.results.title,
        css: "#FullPictureLoadEnd{color:rgb(255, 255, 255)}",
        category: "hcomic"
    }, {
        name: "9hentai閱讀頁",
        host: ["9hentai.com"],
        reg: /9hentai\.\w+\/g\/\d+\/\d+\/$/,
        init: async () => {
            let json = await fetch("/api/getBookByID", {
                method: "POST",
                body: JSON.stringify({
                    id: Number(/\d+/.exec(fun.lp).at(0) ?? 0)
                }),
                headers: {
                    "Content-Type": "application/json"
                }
            }).then(res => res.json());
            debug("\n此頁JSON資料\n", json);
            siteJson = json;
        },
        imgs: () => {
            let arr = fun.arr(siteJson.results.total_page).map((_, i) => `${siteJson.results.image_server + siteJson.results.id}/${i + 1}.jpg`);
            thumbnailsSrcArray = arr.map(e => e.replace(/(\d+)(\.\w+)$/, "preview/$1t$2"));
            return arr;
        },
        button: [4],
        insertImg: [".image-viewer", 2],
        customTitle: () => siteJson.results.alt_title ?? siteJson.results.title,
        css: "#FullPictureLoadEnd{color:rgb(255, 255, 255)}",
        category: "hcomic"
    }, {
        name: "AsmHentai圖片清單頁",
        host: ["asmhentai.com"],
        reg: /asmhentai\.com\/g\/\d+\/$/,
        init: () => fun.createImgBox(".gallery"),
        imgs: async () => {
            fun.showMsg(displayLanguage.str_05, 0);
            let _token = fun.attr('meta[name="csrf-token"]', "content");
            let id = fun.ge("#load_id").value;
            let dir = fun.ge("#load_dir").value;
            let t_pages = fun.ge("#t_pages").value;
            thumbnailsSrcArray = await fetch("/inc/thumbs_loader.php", {
                "headers": {
                    "content-type": "application/x-www-form-urlencoded; charset=UTF-8",
                    "x-requested-with": "XMLHttpRequest"
                },
                "body": `_token=${_token}&id=${id}&dir=${dir}&visible_pages=0&t_pages=${t_pages}&type=2`,
                "method": "POST"
            }).then(res => res.text()).then(text => fun.doc(text)).then(doc => [...doc.images].map(e => e.dataset.src ?? e.src));
            return thumbnailsSrcArray.map(e => e.replace("t.", "."));
        },
        button: [4],
        insertImg: ["#FullPictureLoadMainImgBox", 2],
        go: 1,
        customTitle: () => fun.gt(".info>h2") || fun.gt(".info>h1"),
        css: "#FullPictureLoadEnd{color:rgb(255, 255, 255)}",
        category: "hcomic"
    }, {
        name: "AsmHentai閱讀頁",
        host: ["asmhentai.com"],
        reg: /asmhentai\.com\/gallery\/\d+\/\d+\/$/,
        imgs: async () => {
            fun.showMsg(displayLanguage.str_05, 0);
            let _token = fun.attr('meta[name="csrf-token"]', "content");
            let id = fun.ge("#gallery_id").value;
            let dir = fun.ge("#image_dir").value;
            let t_pages = fun.ge("#pages").value;
            thumbnailsSrcArray = await fetch("/inc/thumbs_loader.php", {
                "headers": {
                    "content-type": "application/x-www-form-urlencoded; charset=UTF-8",
                    "x-requested-with": "XMLHttpRequest"
                },
                "body": `_token=${_token}&id=${id}&dir=${dir}&visible_pages=0&t_pages=${t_pages}&type=2`,
                "method": "POST"
            }).then(res => res.text()).then(text => fun.doc(text)).then(doc => [...doc.images].map(e => e.dataset.src ?? e.src));
            return thumbnailsSrcArray.map(e => e.replace("t.", "."));
        },
        button: [4],
        insertImg: [".rd_fimg", 2],
        customTitle: () => fun.title(" Page", 1),
        css: "#FullPictureLoadEnd{color:rgb(255, 255, 255)}.preloader{text-indent:unset !important}",
        category: "hcomic"
    }, {
        name: "MultPorn閱讀頁",
        host: ["multporn.net"],
        reg: () => /multporn\.net\//.test(siteUrl) && fun.ge("//script[contains(text(),'configUrl')]"),
        imgs: () => {
            fun.showMsg(displayLanguage.str_05, 0);
            let url = fun.gst("configUrl").match(/configUrl":"[^,]+/g)[0].slice(12, -1).replaceAll("\\", "");
            return fetch(url).then(res => res.text()).then(text => {
                let xml = fun.xml(text);
                let imgs = fun.gae("image", xml);
                thumbnailsSrcArray = imgs.map(e => e.getAttribute("thumbURL"));
                return imgs.map(e => e.getAttribute("linkURL"));
            });
        },
        button: [4],
        insertImg: [
            [".juicebox-parent", 2], 2
        ],
        go: 1,
        autoDownload: [0],
        next: "//a[text()='Next Part']",
        prev: "//a[text()='Previous Part']",
        customTitle: "#page-title",
        css: "#FullPictureLoadEnd{color:rgb(255, 255, 255)}",
        category: "hcomic"
    }, {
        name: "KingComiX閱讀頁",
        host: ["kingcomix.com"],
        reg: /^https?:\/\/kingcomix\.com\/[^\/]+\/$/,
        imgs: "figure img, .entry-content img.lazy",
        button: [4],
        insertImg: [".entry-content", 2],
        customTitle: () => fun.gt("h1.singleTitle-h1").replace(" – Kingcomix", ""),
        category: "hcomic"
    }, {
        name: "HENTAISET.COM閱讀頁 / HENTAIVID.NET閱讀頁",
        host: ["www.hentaiset.com", "hentaivid.net"],
        reg: [
            /^https?:\/\/www\.hentaiset\.com\/\w+\/\w+\//i,
            /^https?:\/\/hentaivid\.net\/photo\/\w+\/[^\/]+\/$/i
        ],
        init: () => fun.createImgBox("#lightgallery", 2),
        imgs: "#lightgallery li.thumb,#lightgallery div.thumb",
        thums: "#lightgallery img[is='lazyload-image']",
        button: [4],
        insertImg: [
            ["#FullPictureLoadMainImgBox", 0, "#lightgallery"], 2
        ],
        customTitle: ".main-container h1",
        category: "hcomic"
    }, {
        name: "Neko Hentai閱讀頁",
        host: ["neko-hentai.net"],
        reg: /^https?:\/\/neko-hentai\.net\/[^\/]+\/$/i,
        imgs: "#manga-content img",
        button: [4],
        insertImg: ["#manga-content", 2],
        customTitle: "h1",
        css: "#FullPictureLoadEnd{color:rgb(255, 255, 255)}",
        category: "hcomic"
    }, {
        name: "Super Hentai閱讀頁",
        host: ["superhentai.blog"],
        reg: /^https?:\/\/superhentai\.blog\/[^\/]+\/$/i,
        include: ".gallery",
        imgs: ".gallery img",
        button: [4],
        insertImg: [".gallery", 2],
        customTitle: "#single h1",
        css: "#FullPictureLoadEnd{color:rgb(255, 255, 255)}",
        category: "hcomic"
    }, {
        name: "HENTAICELEB.COM閱讀頁",
        host: ["www.hentaiceleb.com"],
        reg: /^https?:\/\/www\.hentaiceleb\.com\/\w+\/\w+\/[^\.]+\.html$/i,
        imgs: ".gallery-thumbs a[data-src]",
        button: [4],
        insertImg: [".media-bg", 2],
        customTitle: ".full-main-col h1",
        css: "#FullPictureLoadEnd{color:rgb(255, 255, 255)}",
        category: "hcomic"
    }, {
        name: "HENTAIVSMANGA.COM圖片清單頁",
        host: ["hentaivsmanga.com"],
        reg: /^https?:\/\/hentaivsmanga\.com\/content\/\w+\/[^\/]+\/$/i,
        imgs: () => fun.getImgA("#image-container img", "#thumbnail-container a"),
        thums: "#thumbnail-container img[is='lazyload-image']",
        button: [4],
        insertImg: [
            ["#thumbnail-container", 2], 2
        ],
        go: 1,
        customTitle: () => fun.gt("#info>h2") ?? fun.gt("#info>h1"),
        category: "hcomic"
    }, {
        name: "HENTAIVSMANGA.COM閱讀頁",
        host: ["hentaivsmanga.com"],
        reg: /^https?:\/\/hentaivsmanga\.com\/content\/\w+\/[^\/]+\/\d+\/$/i,
        imgs: () => {
            let max = fun.gt(".num-pages");
            let url = fun.url.replace(/\d+\/$/, "");
            let links = fun.arr(max).map((_, i) => url + (i + 1) + "/");
            return fun.getImgA("#image-container img", links);
        },
        button: [4],
        insertImg: ["#image-container", 2],
        customTitle: () => fun.title(" XXX Manga and Hentai"),
        category: "hcomic"
    }, {
        name: "HENTAICREDO.COM圖片清單頁",
        host: ["www.hentaicredo.com"],
        reg: /^https?:\/\/www\.hentaicredo\.com\/content\/\w+\/[^\/]+\/$/i,
        imgs: () => {
            let [thumbs] = fun.gae(".thumbs");
            let imgs = fun.gae("img", thumbs);
            let links = fun.gau("a", thumbs);
            thumbnailsSrcArray = fun.getImgSrcArr(imgs);
            return fun.getImgA(".big-picture>img", links);
        },
        button: [4],
        insertImg: [".thumbs", 2],
        customTitle: "h2",
        category: "hcomic"
    }, {
        name: "HentaiHere閱讀頁",
        host: ["hentaihere.com"],
        reg: () => /hentaihere\.com\/m\/\w+\/\d+\/\d+\/$/i.test(siteUrl),
        init: async () => {
            await fun.waitVar("rff_imageList");
            await fun.waitVar("jQuery");
            setTimeout(() => fun.run("jQuery(document).off();"), 1000);
        },
        imgs: () => _unsafeWindow.rff_imageList.map(e => "https://hentaicdn.com/hentai" + e),
        button: [4],
        insertImg: ["#reader-content", 2],
        autoDownload: [0],
        next: "//li[a[@class='bg-info']]/following-sibling::li[1]/a",
        prev: 1,
        customTitle: () => fun.gt("#detail span") + " - " + fun.gt("#chapter span"),
        css: ".afs_ads,[data-type]{display:none!important}",
        category: "hcomic"
    }, {
        name: "HentaiPaw圖片清單頁",
        host: ["hentaipaw.com"],
        reg: /hentaipaw\.com\/articles\/\d+/i,
        init: async () => await fun.waitEle("next-route-announcer"),
        imgs: async () => {
            fun.showMsg("獲取數據中...", 0);
            let url = fun.gu(".gallery-image-container a");
            let doc = await fun.fetchDoc(url);
            try {
                let [data] = fun.gst("startingPage", doc).replace(/\\/g, "").match(/\[{.+"}]/);
                return JSON.parse(data).map(e => e.src);
            } catch (e) {
                doc = await fun.iframeDoc(url, ".yarl__slide_image");
                return fun.gae(".yarl__slide_image", doc).map(e => e.src).sort((a, b) => a.match(/(\d+)\.\w+$/)[1] - b.match(/(\d+)\.\w+$/)[1]);
            }
        },
        thums: ".gallery-image-container a>img",
        button: [4],
        insertImg: [
            [".detail-gallery-list", 2], 2
        ],
        go: 1,
        customTitle: () => fun.gt(".detail-ttl").replace(/\/|\|/g, " "),
        category: "hcomic"
    }, {
        name: "HDpornComics圖片清單頁",
        host: ["hdporncomics.com"],
        reg: () => /hdporncomics\.com\/[^/]+\/([^/]+\/)?$/i.test(siteUrl) && fun.ge(".my-gallery.scrollmenu"),
        imgs: ".my-gallery a[data-size]",
        thums: ".my-gallery a[data-size] img",
        button: [4],
        insertImg: [
            [".postContent>.items-center,#likeDislikeVue", 2], 2
        ],
        go: 1,
        customTitle: () => fun.gt("#infoBox>h1").replace(" – Gay Manga", "").replace(" Comic Porn", ""),
        category: "hcomic"
    }, {
        name: "HDpornComics閱讀頁",
        host: ["hdporncomics.com"],
        reg: /hdporncomics\.com\/manhwa\/[^/]+\/chapter/i,
        imgs: "#imageContainer>img",
        button: [4],
        insertImg: ["#imageContainer", 2],
        autoDownload: [0],
        next: "//a[contains(text(),'Next')]",
        prev: "//a[contains(text(),'Prev')]",
        customTitle: () => fun.gt(".list-reset li:nth-child(5)>a") + " - " + fun.gt("option[selected]"),
        category: "hcomic"
    }, {
        name: "Doujins圖片清單頁",
        host: ["doujins.com"],
        reg: () => /doujins\.com\/.+\/.+/i.test(siteUrl) && fun.ge("#thumbnails"),
        autoClick: ["button.loadmore"],
        init: async () => await fun.waitEle(".doujin"),
        imgs: () => {
            thumbnailsSrcArray = fun.gae("div[data-hash]").map(e => "https://static.doujins.com/t-" + e.dataset.hash + ".jpg");
            return fun.gae(".doujin[data-file]").map(e => e.dataset.file);
        },
        button: [4],
        insertImg: [
            ["#thumbnails", 2], 2
        ],
        go: 1,
        customTitle: ".folder-title>a:last-child",
        category: "hcomic"
    }, {
        name: "Simply Hentai閱讀頁",
        host: ["www.simply-hentai.com"],
        reg: /^https?:\/\/www.simply-hentai.com\/[^\/]+\/[^\/]+\/page\/\d+/i,
        init: async () => {
            await fun.waitEle("#__NEXT_DATA__");
            let json = JSON.parse(fun.gt("#__NEXT_DATA__"));
            debug("\n此頁JSON資料\n", json);
            siteJson = json;
        },
        imgs: () => {
            thumbnailsSrcArray = siteJson.props.pageProps.data.pages.map(e => e.sizes.small_thumb);
            return siteJson.props.pageProps.data.pages.map(e => e.sizes.full)
        },
        button: [4],
        insertImg: ["#reader-image", 2],
        insertImgAF: () => {
            let loop = setInterval(() => !fun.ge(".FullPictureLoadImage") ? fun.immediateInsertImg() : null, 500);
            setTimeout(() => clearInterval(loop), 10000);
        },
        customTitle: () => siteJson.props.pageProps.data.title.replace(/\/|\|/g, "-"),
        category: "hcomic"
    }, {
        name: "Hanime1圖片清單頁",
        host: ["hanime1.me"],
        link: "https://hanime1.me/comics",
        reg: /hanime1\.me\/comic\/\d+$/,
        imgs: async () => {
            thumbnailsSrcArray = fun.gae(".comics-thumbnail-wrapper img[data-srcset]").map(e => e.dataset.srcset);
            fun.showMsg(displayLanguage.str_05, 0);
            let url = fun.gu(".comics-thumbnail-wrapper>a");
            return fun.fetchDoc(url).then(doc => {
                let imgDir = fun.ge("#current-page-image", doc).dataset.prefix;
                let code = fun.gst("extensions", doc);
                let extensions = fun.run(code.match(/\[.+\]/)[0].replaceAll("&quot;", '"'));
                return extensions.map((e, i) => {
                    if (imgDir.includes("nhentai")) {
                        return `${imgDir}${(i + 1)}.${fun.ex(e)}`;
                    } else {
                        return imgDir + e + ".jpg";
                    }
                });
            });
        },
        button: [4],
        insertImg: [".comics-thumbnail-wrapper", 2, 1000],
        go: 1,
        autoClick: "#show-all-comics-btn",
        customTitle: "h4.title",
        threading: 4,
        referer: "src",
        css: "#FullPictureLoadEnd{color:rgb(255, 255, 255)}",
        category: "hcomic"
    }, {
        name: "Hanime1閱讀頁",
        host: ["hanime1.me"],
        link: "https://hanime1.me/comics",
        reg: /hanime1\.me\/comic\/\d+\/\d+$/,
        imgs: async () => {
            let imgDir = fun.ge("#current-page-image").dataset.prefix;
            return _unsafeWindow.extensions.map((e, i) => {
                if (imgDir.includes("nhentai")) {
                    return `${imgDir}${(i + 1)}.${fun.ex(e)}`;
                } else {
                    return imgDir + e + ".jpg";
                }
            });
        },
        button: [4],
        insertImg: ["#comic-content-wrapper", 2],
        customTitle: () => fun.ge("//meta[@property='og:title']").content.replace(/第\d+頁 - /, ""),
        threading: 4,
        referer: "src",
        css: "#FullPictureLoadEnd{color:rgb(255, 255, 255)}",
        category: "hcomic"
    }, {
        name: "Hentai-One圖片清單頁",
        host: ["ch.hentai-one.com"],
        reg: /^https?:\/\/ch\.hentai-one\.com\/articles\/\d+$/,
        imgs: async () => {
            let url = fun.gu(".detail-gallery-item a");
            fun.showMsg(displayLanguage.str_05, 0);
            return fun.fetchDoc(url).then(doc => {
                let code = fun.gst("slides", doc);
                let arr = JSON.parse(code.match(/\\"slides\\":([^\]]+\])/)[1].replaceAll("\\", ""));
                return arr.map(e => e.src);
            });
        },
        thums: ".detail-gallery-item img",
        button: [4],
        insertImg: [
            [".detail-gallery", 2], 2
        ],
        insertImgAF: () => {
            fun.css(".detail-gallery{display:none!important;}");
            let loop = setInterval(() => {
                if (!fun.ge(".FullPictureLoadImage")) {
                    if (options.icon == 1 || siteData.icon == 1) addFullPictureLoadButton();
                    if (!hasTouchEvents) addFullPictureLoadFixedMenu();
                    fun.immediateInsertImg();
                }
            }, 500);
            setTimeout(() => clearInterval(loop), 10000);
        },
        customTitle: () => {
            let text = fun.gt("h1.detail-ttl");
            return text.indexOf("|") != -1 ? text.split("|")[1].trim() : text;
        },
        css: "#FullPictureLoadEnd{color:rgb(255, 255, 255)}.header-ad,.middle-ad{display:none!important;}",
        category: "hcomic"
    }, {
        name: "My Hentai Gallery圖片清單頁",
        host: ["myhentaigallery.com"],
        reg: /^https?:\/\/myhentaigallery\.com\/g\/\d+$/,
        imgs: () => {
            thumbnailsSrcArray = fun.gae(".comic-thumb>img").map(e => e.src);
            return thumbnailsSrcArray.map(e => e.replace("thumbnail", "original"));
        },
        button: [4],
        insertImg: [
            ["//div[@class='comic-listing'][center[center[ul[@class='comics-grid clear']]]]", 0], 2
        ],
        go: 1,
        customTitle: ".comic-description>h1",
        css: "#FullPictureLoadEnd{color:rgb(255, 255, 255)}",
        category: "hcomic"
    }, {
        name: "XYZ PORN COMICS圖片清單頁",
        host: ["xyzcomics.com"],
        reg: /^https?:\/\/xyzcomics\.com\/[^\/]+\/$/,
        include: ".jig-link>img",
        imgs: ".jig-link",
        thums: ".jig-link>img",
        button: [4],
        insertImg: [
            [".entry-content", 0], 2
        ],
        go: 1,
        customTitle: ".entry-title",
        css: "#FullPictureLoadEnd{color:rgb(255, 255, 255)}",
        category: "hcomic"
    }, {
        name: "IMHentai圖片清單頁",
        host: ["imhentai.xxx"],
        reg: /imhentai\.xxx\/gallery\/\d+\//,
        init: async () => {
            await fun.waitVar("g_th");
            fun.createImgBox("#comments_div", 0);
        },
        imgs: async () => {
            fun.showMsg(displayLanguage.str_05, 0);
            let server = fun.ge("#load_server").value;
            let u_id = fun.ge("#gallery_id").value;
            let g_id = fun.ge("#load_id").value;
            let img_dir = fun.ge("#load_dir").value;
            let total_pages = fun.ge("#load_pages").value;
            thumbnailsSrcArray = await fetch("/inc/thumbs_loader.php", {
                "headers": {
                    "content-type": "application/x-www-form-urlencoded; charset=UTF-8",
                    "x-requested-with": "XMLHttpRequest"
                },
                "body": `server=${server}&u_id=${u_id}&g_id=${g_id}&img_dir=${img_dir}&visible_pages=0&total_pages=${total_pages}&type=2`,
                "method": "POST"
            }).then(res => res.text()).then(text => fun.doc(text)).then(doc => [...doc.images].map(e => e.dataset.src ?? e.src));
            return fun.getImhentaiSrc();
        },
        button: [4],
        insertImg: ["#FullPictureLoadMainImgBox", 2],
        customTitle: async () => {
            let t = fun.gt(".subtitle");
            return t.length > 0 ? t : fun.gt("h1").replace(/\||\+/g, "");
        },
        go: 1,
        topButton: true,
        threading: 4,
        category: "hcomic"
    }, {
        name: "IMHentai閱讀頁",
        host: ["imhentai.xxx"],
        reg: /imhentai\.xxx\/view\/\d+\/\d+\//,
        init: "setTimeout(()=>{fun.ge('.pre_img').removeAttribute('style');$('a.next_img').unbind('click');},1000)",
        imgs: () => fun.getImhentaiSrc(),
        button: [4],
        insertImg: [".pre_img", 2],
        customTitle: () => fun.title("-", 1),
        threading: 4,
        category: "hcomic"
    }, {
        name: "HentaiEra圖片清單頁",
        host: ["hentaiera.com"],
        reg: /^https?:\/\/hentaiera\.com\/gallery\/\d+\/$/,
        include: "#append_thumbs",
        init: async () => {
            await fun.waitVar("g_th");
            fun.createImgBox("#thumbs_gallery_div", 2);
        },
        imgs: async () => {
            fun.showMsg(displayLanguage.str_05, 0);
            let server = fun.ge("#load_server").value;
            let u_id = fun.ge("#gallery_id").value;
            let g_id = fun.ge("#load_id").value;
            let img_dir = fun.ge("#load_dir").value;
            let total_pages = fun.ge("#load_pages").value;
            thumbnailsSrcArray = await fetch("/inc/thumbs_loader.php", {
                "headers": {
                    "content-type": "application/x-www-form-urlencoded; charset=UTF-8",
                    "x-requested-with": "XMLHttpRequest"
                },
                "body": `server=${server}&u_id=${u_id}&g_id=${g_id}&img_dir=${img_dir}&visible_pages=0&total_pages=${total_pages}&type=2`,
                "method": "POST"
            }).then(res => res.text()).then(text => fun.doc(text)).then(doc => [...doc.images].map(e => e.dataset.src ?? e.src));
            let max = fun.ge("#load_pages").value;
            let img = fun.ge(".gthumb img");
            let src = img.dataset.src ?? img.src;
            let imgDir = src.match(/^.+\//)[0];
            return fun.arr(max).map((_, i) => `${imgDir}${(i + 1)}.${fun.ex(_unsafeWindow.g_th[(i + 1)][0])}`);
        },
        button: [4],
        insertImg: ["#FullPictureLoadMainImgBox", 2],
        go: 1,
        customTitle: () => fun.gt(".subtitle") ?? fun.gt("h1"),
        category: "hcomic"
    }, {
        name: "HentaiEra閱讀頁",
        host: ["hentaiera.com"],
        reg: /^https?:\/\/hentaiera\.com\/view\/\d+\/\d+\/$/,
        init: async () => {
            await fun.waitVar("g_th");
            let html = fun.ge(".pre_img img").outerHTML;
            fun.ge(".pre_img").outerHTML = `<div class="imgBox">${html}</div>`;
        },
        imgs: () => {
            let max = fun.ge("#pages").value;
            let img = fun.ge("#gimg");
            let src = img.dataset.src ?? img.src;
            let imgDir = src.match(/.+\//)[0];
            return fun.arr(max).map((_, i) => `${imgDir}${(i + 1)}.${fun.ex(_unsafeWindow.g_th[(i + 1)][0])}`);
        },
        button: [4],
        insertImg: [".imgBox", 2],
        customTitle: () => fun.title(/ - Page \d+ - HentaiEra/),
        category: "hcomic"
    }, {
        name: "TSUMINO圖片清單頁",
        host: ["www.tsumino.com"],
        reg: /^https?:\/\/www\.tsumino\.com\/entry\/\d+/,
        include: "#thumbnails-container",
        delay: 300,
        autoClick: "#btn-view-all",
        imgs: async () => {
            let prges = fun.ge("div[data-pages]").dataset.pages;
            fun.showMsg(displayLanguage.str_05, 0);
            let imgDir;
            let key = await fun.fetchDoc(fun.gu("#thumbnails-container a")).then(doc => {
                let url = fun.ge("div[data-cdn]", doc).dataset.cdn;
                let newUrl = new URL(url);
                imgDir = newUrl.origin + newUrl.pathname.replace("[PAGE]", "");
                return newUrl.search;
            });
            return fun.arr(prges).map((_, i) => imgDir + (i + 1) + key);
        },
        thums: "#thumbnails-container img",
        button: [4],
        insertImg: [
            ["#thumbnails-container", 2], 2, 1000
        ],
        go: 1,
        customTitle: () => {
            let title = fun.gt(".book-data");
            if (/ \/ /.test(title)) {
                return title.split(" / ").at(-1);
            } else if (/ \| /.test(title)) {
                let s = title.split(" | ");
                return s.length == 2 ? s.at(-1) : title;
            }
            return title;
        },
        category: "hcomic"
    }, {
        name: "TSUMINO閱讀頁",
        host: ["www.tsumino.com"],
        reg: /^https?:\/\/www\.tsumino\.com\/Read\/Index\/\d+\?page=\d+$/,
        imgs: async () => {
            await fun.waitEle(".reader-img");
            let max = fun.gt("//h1[span[@id='pageNumberText']]").match(/\d+$/)[0];
            let url = fun.ge("div[data-cdn]").dataset.cdn;
            let newUrl = new URL(url);
            let imgDir = newUrl.origin + newUrl.pathname.replace("[PAGE]", "");
            let key = newUrl.search;
            return fun.arr(max).map((_, i) => imgDir + (i + 1) + key);
        },
        button: [4],
        insertImg: [".reader-page", 2],
        category: "hcomic"
    }, {
        name: "nhentai/HentaiHand圖片清單頁",
        host: ["nhentai.com", "hentaihand.com"],
        reg: /^https?:\/\/(nhentai\.com|hentaihand\.com)\/en\/comic\/[^\/]+$/,
        init: async () => {
            let comic = fun.lp.split("/").at(3);
            let csrfToken = fun.ge("meta[name='csrf-token']").content;
            let xsrfToken = document.cookie.match(/XSRF-TOKEN=(\w+)/)[1];
            let json = await fetch(`/api/comics/${comic}/images`, {
                "headers": {
                    "accept": "application/json, text/plain, */*",
                    "x-csrf-token": csrfToken,
                    "x-requested-with": "XMLHttpRequest",
                    "x-xsrf-token": xsrfToken
                }
            }).then(res => res.json());
            debug("\n此頁JSON資料\n", json);
            siteJson = json;
        },
        imgs: async () => {
            await fun.waitEle(".comic-gallery img");
            thumbnailsSrcArray = siteJson.images.map(e => e.thumbnail_url);
            return siteJson.images.map(e => e.source_url);
        },
        button: [4],
        insertImg: [
            ["//div[div[contains(@class,'comic-gallery')]]", 0], 2, 1000
        ],
        go: 1,
        customTitle: () => siteJson.comic.alternative_title ?? siteJson.comic.title,
        category: "hcomic"
    }, {
        name: "nhentai/HentaiHand閱讀頁",
        host: ["nhentai.com", "hentaihand.com"],
        reg: /(nhentai\.com|hentaihand\.com)\/\w+\/comic\/[^/]+\/reader\//i,
        init: async () => {
            let comic = fun.lp.split("/").at(3);
            let csrfToken = fun.ge("meta[name='csrf-token']").content;
            let xsrfToken = document.cookie.match(/XSRF-TOKEN=(\w+)/)[1];
            let json = await fetch(`/api/comics/${comic}/images`, {
                "headers": {
                    "accept": "application/json, text/plain, */*",
                    "x-csrf-token": csrfToken,
                    "x-requested-with": "XMLHttpRequest",
                    "x-xsrf-token": xsrfToken
                }
            }).then(res => res.json());
            debug("\n此頁JSON資料\n", json);
            siteJson = json;
        },
        imgs: async () => {
            await fun.waitEle(".vertical-image img[data-src]");
            thumbnailsSrcArray = siteJson.images.map(e => e.thumbnail_url);
            return siteJson.images.map(e => e.source_url);
        },
        button: [4],
        insertImg: [".reader", 2],
        customTitle: () => siteJson.comic.alternative_title ?? siteJson.comic.title,
        category: "hcomic"
    }, {
        name: "同人エロ漫画・エロ同人誌ならエロコミックハンター",
        host: ["ero-comic-hunter.net"],
        reg: /^https?:\/\/ero-comic-hunter\.net\/\d+\.html$/,
        imgs: "#single-more_wid~a[href*='/wp-content/uploads/']",
        customTitle: ".kijibox_title a",
        category: "hcomic"
    }, {
        name: "エロ漫画コング|無料エロマンガ",
        host: ["eromanga-kong.com"],
        reg: /^https?:\/\/eromanga-kong\.com\/[^\/]+\/[^\/]+\/$/,
        include: "#article",
        imgs: "//article[@id='article']//a[img]",
        customTitle: "header>h2",
        category: "hcomic"
    }, {
        name: "Hentai2Read",
        host: ["hentai2read.com"],
        reg: /hentai2read\.com\/\w+\/\d+\/(\d+\/)?$/,
        imgs: () => _unsafeWindow.gData.images.map(e => "https://static.hentai.direct/hentai" + e),
        button: [4],
        insertImg: ["#js-reader", 2],
        autoDownload: [0],
        next: "//li[a[contains(@class,'bg-info')]]/preceding-sibling::li[1]/a",
        prev: 1,
        customTitle: () => fun.gt(".reader-left-text.text-ellipsis").replace(/\//g, "-"),
        //threading: 4,
        category: "hcomic"
    }, {
        name: "XlecX",
        host: ["xlecx.one"],
        reg: /xlecx\.one\/[\w-]+\.html$/,
        imgs: ".ug-thumb-image,img[data-src]",
        button: [4],
        insertImg: [
            [".page__col-left", 0], 2
        ],
        go: 1,
        customTitle: ".page__col-left>h1",
        category: "hcomic"
    }, {
        name: "HentaiPal.com",
        host: ["hentaipal.com"],
        reg: /^https?:\/\/hentaipal\.com\/viewalbum\/\w+\/[^\/]+\/index\.html$/,
        init: () => fun.remove("iframe[src*='ad'],font[color=red]"),
        imgs: async () => {
            let max;
            try {
                max = fun.gu(".imgpagebar>a:last-child").match(/page-(\d+)/)[1];
            } catch (e) {
                max = 1;
            }
            if (max > 1) {
                let links = [];
                let url = siteUrl.replace("index.html", "");
                for (let i = 2; i <= max; i++) {
                    links.push(url + "page-" + i + ".html");
                }
                await fun.getEle(links, ".justify-content-center img:not([src*=logo])", ["//div[@class='row justify-content-center'][not(a[img])]", 0]);
            }
            return fun.gae("//div[@class='row justify-content-center'][not(a[img])]//img");
        },
        button: [4],
        insertImg: ["//div[@class='row justify-content-center'][not(a[img])]", 2],
        customTitle: () => fun.title("HentaiPal.com - "),
        category: "hcomic"
    }, {
        name: "HentaiPal.com 分類自動翻頁",
        enable: 1,
        reg: /^https?:\/\/hentaipal\.com\//,
        init: () => fun.remove("iframe[src*='ad']"),
        autoPager: {
            ele: "//div[@class='col-6 col-sm-3'][a[img]]",
            observer: "//div[@class='col-6 col-sm-3'][a[img]]",
            next: "//a[h3[span[@class='bi bi-caret-right-fill']]]",
            re: "//div[div[@class='imgpagebar']]",
            title: () => "Page" + nextLink.match(/page-(\d+)/)[1]
        },
        css: ".autoPagerTitle{width:100%!important}",
        category: "autoPager"
    }, {
        name: "HentaiPorns",
        host: ["hentaiporns.net"],
        reg: /hentaiporns\.net\/[^\/]+\/$/,
        include: ".gallery",
        init: () => fun.createImgBox(".gallery", 2),
        imgs: ".gallery-item a",
        thums: ".gallery-item a>img",
        button: [4],
        insertImg: [
            ["#FullPictureLoadMainImgBox", 0, ".gallery"], 2, 1000
        ],
        customTitle: () => fun.ge("#gn+h1") ? fun.gt("#gn+h1") : fun.gt("#gn,.entry-title"),
        fancybox: {
            v: 3,
            css: false
        },
        category: "hcomic"
    }, {
        name: "8muses",
        host: ["comics.8muses.com"],
        reg: /^https?:\/\/comics\.8muses\.com\/comics\/album\/[\w-]+\/[\w-]+\//i,
        include: ".gallery",
        exclude: ".image-title>.title-text",
        imgs: () => {
            let th = fun.gae("img[data-src]").map(e => e.dataset.src.replace("/image/th/", "https://comics.8muses.com/image/fl/"));
            let arr = [];
            let loadnum = 0;
            fun.showMsg("Loading...", 0);
            for (let src of th) {
                let promise = new Promise(resolve => {
                    let temp = new Image();
                    temp.src = src;
                    temp.onload = () => {
                        loadnum++;
                        fun.showMsg(`Loading ${loadnum}/${th.length}`, 0);
                        resolve(src);
                    }
                    temp.onerror = () => {
                        loadnum++;
                        fun.showMsg(`Loading ${loadnum}/${th.length}`, 0);
                        resolve(src.replace("/fl/", "/fm/"));
                    }
                });
                arr.push(promise);
            }
            return arr;
        },
        button: [4],
        insertImg: [
            [".gallery", 2], 1
        ],
        go: 1,
        css: "#FullPictureLoadEnd{color:rgb(255, 255, 255)}",
        category: "hcomic"
    }, {
        name: "Hentai.bang14.com",
        host: ["hentai.bang14.com"],
        reg: /^https?:\/\/hentai\.bang14\.com\/[^\/]+\/$/,
        include: ".entry-content",
        imgs: ".entry-content img",
        button: [4],
        insertImg: [".entry-content", 2],
        autoDownload: [0],
        next: ".nav-previous a[rel=prev]",
        prev: ".nav-previous a[rel=next]",
        customTitle: "h1.entry-title",
        category: "hcomic"
    }, {
        name: "AllPornComic",
        host: ["allporncomic.com"],
        reg: /^https?:\/\/allporncomic\.com\/porncomic\/[^\/]+\/[^\/]+\/$/i,
        include: ".read-container",
        imgs: ".wp-manga-chapter-img",
        button: [4],
        insertImg: [".read-container", 2],
        autoDownload: [0],
        next: "a.next_page",
        prev: "a.prev_page",
        customTitle: "#chapter-heading",
        css: "#FullPictureLoadEnd{color:rgb(255, 255, 255)}",
        category: "hcomic"
    }, {
        name: "Hachirumi.com",
        host: ["hachirumi.com"],
        reg: /^https?:\/\/hachirumi.com\/read\/manga\/[^\/]+\/.+/,
        init: async () => await fun.waitVar("Reader"),
        imgs: () => {
            const chapters = Object.values(_unsafeWindow.Reader.current.chapters);
            return chapters.map(e => Object.values(e.images)[0]).flat().map(url => fun.lo + url);
        },
        capture: () => _this.imgs(),
        customTitle: () => _unsafeWindow.Reader.current.title,
        category: "hcomic"
    }, {
        name: "7mmtvH漫畫貼圖",
        host: ["7mmtv.sx"],
        reg: /7mmtv\.sx\/.*hcomic/,
        include: "//script[contains(text(),'Large_cgurl')]",
        imgs: () => {
            const {
                Large_cgurl
            } = _unsafeWindow;
            let arr = Large_cgurl.map(e => /imgur/.test(e) ? e : null).filter(item => item);
            return arr.length == 0 ? Large_cgurl : arr;
        },
        button: [4],
        insertImg: ["#show_cg_html", 2],
        customTitle: () => fun.title(" - 7mmtv.sx", 1).replace(/\s?\(\d+P\)/i, ""),
        css: ".ut1_img_content_js,.ut_cg1_top{display:none!important}",
        category: "hcomic"
    }, {
        name: "18H",
        host: ["18h.mm-cg.com"],
        reg: /18h\.mm-cg\.com\/(zh\/?)\w+_content\/\d+\/content\.html/i,
        imgs: () => _unsafeWindow.Large_cgurl,
        button: [4],
        insertImg: ["#show_cg_html", 2],
        customTitle: () => fun.title("-", 1),
        category: "hcomic"
    }, {
        name: "H 次元",
        host: ["h-ciyuan.com"],
        reg: /h-ciyuan\.com\/\d+\/\d+\/.+\//,
        include: "a[data-fancybox],.rl-gallery-container a",
        imgs: "a[data-fancybox],.rl-gallery-container a",
        thums: "a[data-fancybox] img,.rl-gallery-container a img",
        button: [4],
        //insertImg: [".entry-content", 2],
        insertImg: [
            [".entry-content,.rl-gallery-container", 2], 2
        ],
        go: 1,
        next: ".nav-previous>a",
        prev: ".nav-next>a",
        customTitle: ".post-title",
        category: "hcomic"
    }, {
        name: "淫漫画",
        host: ["www.yinmh.com", "www.yinmh.top", "www.yinmh.xyz"],
        reg: /www\.yinmh\.(com|top|xyz)\/\d+\.html/,
        imgs: () => fun.fetchDoc(siteUrl).then(doc => fun.gae(".left>.image img.lazy", doc).map(e => e.getAttribute("img") ?? e.src)),
        button: [4],
        insertImg: [".left>.image", 2],
        customTitle: ".box>h1",
        category: "hcomic"
    }, {
        name: "漫畫車",
        host: ["www.manhuache.com", "m.manhuache.com", "www.mh100.top"],
        reg: /^https?:\/\/(www\.mh100\.top|(www|m)\.manhuache\.com)\/chapter\/\d+/,
        init: () => {
            let ele = fun.ge(".chapter-nav");
            if (ele) ele.removeAttribute("style");
        },
        imgs: async () => {
            let chapterName = fun.gt(".chapter-name");
            if (chapterName.includes("第1章") && fun.ge("//a[button[span[text()='下一話']]][not(contains(@href,'javascript'))]")) {
                await fun.getNP(".chapter-content img", "//a[button[span[text()='下一話']]][not(contains(@href,'javascript'))]");
                return fun.gae(".chapter-content img");
            } else {
                return fun.gae(".chapter-content img");
            }
        },
        button: [4],
        insertImg: [".chapter-content", 2],
        next: () => {
            let next = fun.ge("//a[button[span[text()='下一話']]][not(contains(@href,'javascript'))]");
            return next ? next.href : null;
        },
        prev: 1,
        referrerpolicy: "no-referrer",
        customTitle: () => document.title.replace(/\(\d+P\)|第.章/g, "").trim(),
        category: "hcomic"
    }, {
        name: "漫畫聯合國",
        host: ["www.comicun.com"],
        reg: /www\.comicun\.com\/index-look(-cid)?-name-.+/,
        FixURL: url => {
            if (/index-look-cid-name-/.test(url)) {
                let arr = url.split("-");
                let str = "";
                for (let i = 0; i < arr.length; i++) {
                    if (i == 7) {
                        str += arr[i];
                    } else if (i == 5) {
                        str += "cid-" + arr[i] + "-";
                    } else if (i != 2) {
                        str += arr[i] + "-";
                    }
                }
                return decodeURIComponent(str);
            } else {
                return decodeURIComponent(url);
            }
        },
        init: () => {
            fun.run("$(document).unbind('click');");
            if (/index-look-cid-name-/.test(siteUrl)) location.href = _this.FixURL(siteUrl);
            fun.gae("//a[text()='下一章'] | //a[text()='上一章']").forEach(a => (a.href = _this.FixURL(a.href)));
        },
        imgs: (url = siteUrl, doc, msg = 1, request = 0) => fun.getImg("#ComicPic", fun.ge("#total", doc).value, 20, null, 20, url, msg, request),
        button: [4, "24%", 1],
        insertImg: [".e", 2],
        autoDownload: [0],
        next: "//a[text()='下一章']",
        prev: 1,
        customTitle: doc => {
            let arr = fun.gt(".b", 1, doc).split("-");
            return arr[2].trim() + " - " + arr[3].trim();
        },
        preloadNext: async (nextDoc, obj) => fun.picPreload(await obj.imgs(nextLink, nextDoc, 0, 1), obj.customTitle(nextDoc), "next"),
        css: "body{overflow:unset!important}.awesome970{display:none!important;}",
        category: "comic"
    }, {
        name: "丽图·污漫画",
        host: ["litu100.xyz"],
        reg: /litu\d+\.xyz\/comic\/id-\w+\/\d+\.html/,
        imgs: ".article.comic img",
        button: [4],
        insertImg: [".article.comic", 2],
        autoDownload: [0],
        next: "a.next",
        prev: "a.prev",
        customTitle: () => fun.gt(".breadcrumb span:nth-child(2)").replace("首页", ""),
        css: ".banner_ad{display:none!important;}",
        category: "hcomic"
    }, {
        name: "久久漫画网/漫小肆",
        host: ["www.jjmhw.cc", "www.ikanmh.xyz", "www.hmfby.com", "web.hmfby.com", "www.freexcomic.com"],
        reg: /(www\.jjmhw\.cc|www\.ikanmh\.xyz|www\.mxshm\.site|www\.mxs\d+\.cc|www\.92hm\.life|www\.ikanhm\.xyz|592mh\.top|592hm\.top|52wxz\.top|52kanmh\.top|52kanhm\.top|52hmw\.top|92comic\.top|91comic\.top|18comic2\.top|ikanyy\.top|18hm\.top|yycomic\.top|18hcomic\.top|18xcomic\.top|18xmh\.top|18xhm\.top|iikanwxz\.top|ikwxz\.top|wxzmh\.top|mxsmh\d.com|mxsmh\d+.top|mxs\d+\.top)\/chapter\/\d+/,
        init: () => fun.remove("//body/div[div[@id][@style][a]]|//body/div[div[@id][@style]][a[@id][@style]]"),
        imgs: "img[data-original]",
        button: [4],
        insertImg: [".comicpage,#cp_img", 2],
        autoDownload: [0],
        next: "//a[text()='下一章']",
        prev: "//a[text()='上一章']",
        customTitle: () => {
            const {
                bookInfo
            } = _unsafeWindow;
            return fun.ge("h1.title") ? fun.gt("h1.title") : bookInfo.book_name + " - " + bookInfo.chapter_name;
        },
        referer: "src",
        category: "hcomic"
    }, {
        name: "Avbebe",
        host: ["avbebe.com"],
        link: "https://avbebe.com/archives/category/%e6%88%90%e4%ba%bah%e6%bc%ab%e7%95%ab",
        reg: /avbebe\.com\/archives\/\d+/,
        include: "//a[@rel='category tag' and text()='成人漫畫']",
        imgs: ".elementor-widget-container>p>img,.content-inner>p>img",
        button: [4],
        insertImg: [
            ["//p[img]", 2, "//p[img]"], 2
        ],
        customTitle: ".jeg_post_title",
        fancybox: {
            v: 3,
            css: false
        },
        category: "hcomic"
    }, {
        name: "ACG漫画网",
        host: ["www.acgmhs.com", "www.acgomh.com", "www.acgxmh.com", "www.acgsmh.com", "www.cool-manga.com", "www.porn-comic.com", "porn-comic.com"],
        reg: /((www\.)?acg[a-z]mh\.com|(www\.)?acgmh[a-z]\.com|(www\.)?cool-manga\.com|(www\.)?porn-comic\.com)\/([\w-]+\/)?(h|hentai|cos|western)\/\d+\.html/,
        imgs: () => fun.getImg(".manga-page img", fun.gt("#pages>*:last-child", 2), 5),
        button: [4],
        insertImg: [".manga-page", 1],
        autoDownload: [0],
        next: ".next_pics>.fr>a[href$=html]",
        prev: ".next_pics>.fl>a[href$=html]",
        customTitle: () => fun.gt("h2.title,h1.title").replace(/_\d+P$/i, ""),
        category: "hcomic"
    }, {
        name: "ACG漫画网",
        host: ["www.acgnbus.com"],
        reg: () => /^https?:\/\/www\.acgnbus\.com\/\w+\/\d+\.html$/.test(siteUrl) && fun.ge(".main-picture"),
        imgs: () => fun.getImg(".main-picture img", fun.gt("//a[text()='下一页'][@class='a1']", 2), 5),
        button: [4],
        insertImg: [".entry-content", 2],
        next: ".post-next a",
        prev: ".post-pre a",
        customTitle: ".entry-header>h1",
        css: ".adbox{display:none!important;}",
        category: "hcomic"
    }, {
        name: "天黑漫画",
        host: "tianhei-acg.com",
        reg: /^https?:\/\/tianhei-acg\.com\/[^\/]+\/$/,
        imgs: ".wp-posts-content img[data-src]",
        button: [4],
        insertImg: [".wp-posts-content", 2],
        autoDownload: [0],
        next: "//a[p[text()='上一篇']]",
        prev: "//a[p[text()='下一篇']]",
        customTitle: () => fun.gt("h1.article-title").replace(/\|\s?/, ""),
        fancybox: {
            blacklist: 1
        },
        category: "nsfw1"
    }, {
        name: "NiceCat",
        host: "web.nicecat.cc",
        reg: /^https?:\/\/web\.nicecat\.cc\//,
        imgs: () => {
            if (/\/ComicDetailed\//.test(document.URL)) {
                if (!fun.ge("#FullPictureLoadMainImgBox")) {
                    fun.createImgBox("#recommend-info-body", 1);
                }
                fun.showMsg(displayLanguage.str_05, 0);
                let touristId = document.cookie.match(/tourist-id=([^;]+)/)[1];
                let comicUid = document.URL.match(/\/id\.(.+)$/)[1];
                return fetch("/api/ComicOrder/getComicOrder", {
                    "headers": {
                        "accept": "application/json, text/plain, */*",
                        "content-type": "multipart/form-data; boundary=---------------------------300774294838202879722552710792",
                        "n-application-type": "web",
                        "tourist-id": touristId
                    },
                    "body": `-----------------------------300774294838202879722552710792\r\nContent-Disposition: form-data; name=\"comicUid\"\r\n\r\n${comicUid}\r\n-----------------------------300774294838202879722552710792\r\nContent-Disposition: form-data; name=\"sort\"\r\n\r\n0\r\n-----------------------------300774294838202879722552710792\r\nContent-Disposition: form-data; name=\"dateKey\"\r\n\r\nTBMdP46lH10qtE/QgeAGiBXc7fz0OBNyTygV892JQac=\r\n-----------------------------300774294838202879722552710792--\r\n`,
                    "method": "POST"
                }).then(res => res.json()).then(json => json.data.imageData.map(e => e.imageUrl));
            } else {
                return [];
            }
        },
        repeat: 1,
        button: [4],
        insertImg: ["#FullPictureLoadMainImgBox", 3],
        customTitle: () => {
            if (/\/ComicDetailed\//.test(document.URL)) {
                let touristId = document.cookie.match(/tourist-id=([^;]+)/)[1];
                let comicUid = document.URL.match(/\/id\.(.+)$/)[1];
                return fetch("/api/ComicInfo/info", {
                    "headers": {
                        "content-type": "multipart/form-data; boundary=---------------------------127241532924823760192176152950",
                        "n-application-type": "web",
                        "tourist-id": touristId
                    },
                    "body": `-----------------------------127241532924823760192176152950\r\nContent-Disposition: form-data; name=\"uid\"\r\n\r\n${comicUid}\r\n-----------------------------127241532924823760192176152950--\r\n`,
                    "method": "POST"
                }).then(res => res.json()).then(json => json.data.comicData.name_two ?? json.data.comicData.name_one).then(str => str.replaceAll("/", "∕"));
            } else {
                return "";
            }
        },
        observerURL: true,
        category: "hcomic"
    }, {
        name: "紳士漫畫 圖片清單頁",
        host: ["wnacg.com", "www.wnacg.com", "www.htmanga3.top", "www.htmanga4.top", "www.htmanga5.top", "www.hentaicomic.ru", "www.hm1.lol", "www.wn05.lol"],
        link: "https://wnacg01.org/",
        reg: /^https?:\/\/((www\.)?wnacg\.com|www\.htmanga\d\.top|www\.hentaicomic\.ru|(www\.)?wn\d{1,2}\.lol|(www\.)?hm\d{1,2}\.lol)\/photos-index(-page-\d+)?-aid-\d+\.html/,
        init: async () => {
            fun.remove(".dlh,iframe:not(#FullPictureLoadIframe)");
            fun.remove("//body/div[a[img]] | //div[@class='Introduct']/a[div[img]] | //div[a[img[@alt='Game Tip']]]");
            fun.addMutationObserver(() => fun.remove(".dlh,iframe:not(#FullPictureLoadIframe)"));
            await fun.getNP(".gallary_item", ".thispage+a", null, ".paginator");
        },
        imgs: async () => {
            fun.showMsg(displayLanguage.str_05, 0);
            let url = fun.gu("a[href*='slide'],a[href*='slist']");
            return fun.iframeVar(url, 1000, "imglist").then(w => w.imglist.map(e => e.url));
        },
        thums: ".gallary_item img",
        button: [4],
        insertImg: [
            [".gallary_wrap,.Introduct", 0], 2
        ],
        go: 1,
        customTitle: () => fun.title(/ - 紳士漫畫| - 绅士漫画|-紳士漫畫|-绅士漫画/, 1).replace(/\d+P/i, "").trim(),
        category: "hcomic"
    }, {
        name: "紳士漫畫 下拉閱讀頁",
        host: ["wnacg.com", "www.wnacg.com", "www.htmanga3.top", "www.htmanga4.top", "www.htmanga5.top", "www.hentaicomic.ru", "www.hm1.lol", "www.wn05.lol"],
        reg: /^https?:\/\/((www\.)?wnacg\.com|www\.htmanga\d\.top|www\.hentaicomic\.ru|(www\.)?wn\d{1,2}\.lol|(www\.)?hm\d{1,2}\.lol)\/photos-(slide|slidelow|list|slist)-aid-\d+\.html/,
        imgs: () => _unsafeWindow.imglist.map(e => e.url),
        button: [4],
        insertImg: ["#img_list", 2],
        customTitle: () => fun.title(" - 列表", 1).replace(/\d+P/i, "").trim(),
        css: "div[align=center],#control_block{display:none!important;}",
        category: "hcomic"
    }, {
        name: "包子漫畫",
        host: ["bunmh.com"],
        reg: /^https?:\/\/bunmh\.com\/read\/\d+\/\d+\.html$/,
        init: () => fun.createImgBox("#article"),
        imgs: async () => {
            let drawing = 0;
            const _restoreShuffledImage = async (shuffledImageUrl, base64Str, total) => {
                return new Promise(resolve => {
                    const img = new Image();
                    img.setAttribute("crossOrigin", "anonymous");
                    img.src = shuffledImageUrl;
                    img.onload = () => {
                        const imageWidth = img.width;
                        const imageHeight = img.height;
                        const restoreOrder = JSON.parse(atob(base64Str));
                        const keys = Object.keys(restoreOrder);
                        const num = keys.length;
                        let blockWidth, blockHeight, extraPixels;
                        if (num % 2 === 0) {
                            blockWidth = Math.floor(imageWidth / num);
                            extraPixels = imageWidth % num;
                        } else {
                            blockHeight = Math.floor(imageHeight / num);
                            extraPixels = imageHeight % num;
                        }
                        const blocks = [];
                        let startX = 0;
                        let startY = 0;
                        keys.forEach((key, index) => {
                            const originalPosition = restoreOrder[key];
                            if (originalPosition >= 0 && originalPosition < num) {
                                if (num % 2 === 0) {
                                    const currentBlockWidth = blockWidth + (originalPosition < extraPixels ? 1 : 0);
                                    const canvas = document.createElement('canvas');
                                    canvas.width = currentBlockWidth;
                                    canvas.height = imageHeight;
                                    const ctx = canvas.getContext('2d');
                                    ctx.drawImage(img, startX, 0, currentBlockWidth, imageHeight, 0, 0, currentBlockWidth, imageHeight);
                                    blocks[originalPosition] = canvas;
                                    startX += currentBlockWidth;
                                } else {
                                    const currentBlockHeight = blockHeight + (originalPosition < extraPixels ? 1 : 0);
                                    const canvas = document.createElement('canvas');
                                    canvas.width = imageWidth;
                                    canvas.height = currentBlockHeight;
                                    const ctx = canvas.getContext('2d');
                                    ctx.drawImage(img, 0, startY, imageWidth, currentBlockHeight, 0, 0, imageWidth, currentBlockHeight);
                                    blocks[originalPosition] = canvas;
                                    startY += currentBlockHeight;
                                }
                            } else {
                                console.error(`Invalid originalPosition: ${originalPosition}`);
                            }
                        });
                        const restoredCanvas = document.createElement('canvas');
                        restoredCanvas.width = imageWidth;
                        restoredCanvas.height = imageHeight;
                        const ctx = restoredCanvas.getContext('2d');
                        startX = 0;
                        startY = 0;
                        Object.keys(blocks).sort((a, b) => a - b).forEach(key => {
                            const block = blocks[key];
                            if (num % 2 === 0) {
                                const currentBlockWidth = block.width;
                                ctx.drawImage(block, 0, 0, currentBlockWidth, imageHeight, startX, 0, currentBlockWidth, imageHeight);
                                startX += currentBlockWidth;
                            } else {
                                const currentBlockHeight = block.height;
                                ctx.drawImage(block, 0, 0, imageWidth, currentBlockHeight, 0, startY, imageWidth, currentBlockHeight);
                                startY += currentBlockHeight;
                            }
                        });
                        let dataURL = restoredCanvas.toDataURL("image/jpeg", 0.9);
                        let dataURL_Split = dataURL.split(",");
                        let bstr = atob(dataURL_Split[1]);
                        let n = bstr.length;
                        let u8arr = new Uint8Array(n);
                        while (n--) {
                            u8arr[n] = bstr.charCodeAt(n);
                        }
                        let blobUrl = URL.createObjectURL(new Blob([u8arr], {
                            type: "image/jpeg"
                        }));
                        fun.showMsg(`DrawImage ${drawing += 1}/${total}`, 0);
                        resolve(blobUrl);
                    };
                    img.onerror = () => {
                        resolve(null);
                    };
                });
            };
            fun.showMsg(displayLanguage.str_05, 0);
            let [articleid, chapterid] = fun.lp.match(/\d+/g);
            let max = document.querySelector(".text_title>p").innerText.match(/\d+/g).at(-1);
            let fetchNum = 0;
            let resArr = fun.arr(max).map((_, i) => {
                return fetch("/api/reader_js.php", {
                    "headers": {
                        "content-type": "application/x-www-form-urlencoded; charset=UTF-8",
                        "x-requested-with": "XMLHttpRequest"
                    },
                    "body": `action=show&articleid=${articleid}&chapterid=${chapterid}&pid=${i+1}`,
                    "method": "POST"
                }).then(res => res.text()).then(text => {
                    fun.showMsg(`${displayLanguage.str_06}${fetchNum+=1}/${max}`, 0);
                    try {
                        return JSON.parse(text);
                    } catch (e) {
                        return {
                            error: "ERROR"
                        }
                    }
                }).then(json => !!json.error ? [] : json.data.image_list.sort((a, b) => a.order - b.order));
            });
            let allData = await Promise.all(resArr).then(data => data.flat());
            if (allData.length > 0) {
                fun.showMsg(displayLanguage.str_53, 0);
                return allData.map(async (obj, i, _arr) => {
                    if (obj.arr === "") {
                        return obj.pic;
                    } else {
                        await fun.delay(200 * i, 0);
                        return _restoreShuffledImage(obj.pic, obj.arr, _arr.length);
                    }
                });
            } else {
                return [];
            }
        },
        button: [4],
        insertImg: ["#FullPictureLoadMainImgBox", 2],
        insertImgAF: () => {
            let max = document.querySelector(".text_title>p").innerText.match(/\d+/g).at(-1);
            let lastUrl = fun.url.replace(".html", "") + "_" + max + ".html";
            fun.fetchDoc(lastUrl).then(doc => {
                fun.ge(".text_title>p").innerText = fun.ge(".text_title>p", doc).innerText;
                fun.ge("#next_url").outerHTML = fun.ge("#next_url", doc).outerHTML;
                nextLink = fun.gu("#next_url", doc);
            });
        },
        autoDownload: [0],
        next: "#next_url",
        observerNext: ".read_nav",
        prev: "#prev_url",
        customTitle: () => fun.ge("meta[property='og:comic:book_name']").content + " - " + fun.ge("meta[property='og:comic:chapter_name']").content,
        css: "#article>canvas,.chapterpic{display:none!important;}",
        category: "hcomic"
    }, {
        name: "头牌漫画网",
        link: "https://xs8.me/",
        reg: () => {
            let hosts = ["tptoon.com", "www.x88du.com", "81tsw.com", "www.81xxs.com", "www.mttoon.com", "biqu.in", "www.dybqg.com", "toupaimh.com", "tpmhw.com", "toupai8.com", "www.dmmtu.com", "www.kkmnt.com"];
            return hosts.includes(fun.lh) && /^\/chapter\/\d+\.html$/.test(fun.lp);
        },
        init: async () => {
            await fun.getNP(".mip-box-body img", "//a[text()='下一页']", null, ".info");
            fun.createImgBox(".info", 2);
        },
        imgs: ".mip-box-body img",
        button: [4],
        insertImg: [
            ["#FullPictureLoadMainImgBox", 0, ".mip-box-body>img"], 2
        ],
        autoDownload: [0],
        next: "a[title='下一章']",
        prev: "a[title='上一章']",
        customTitle: ".mip-box-heading",
        fancybox: {
            blacklist: 1
        },
        category: "hcomic"
    }, {
        name: "VN漫画网 下拉阅读",
        host: ["www.vnacg.com"],
        reg: /(www|m)\.vnacg\.com\/show\/\d+\.html/,
        imgs: async () => {
            fun.showMsg(displayLanguage.str_05, 0);
            let api = `/e/extend/api/show.php?id=${_unsafeWindow.info.id}&page=`;
            let max = await fetch(`${api}1`).then(res => res.json()).then(res => res.pages);
            let fetchNum = 0;
            let resArr = fun.arr(max).map((_, i) => {
                return fetch(`${api + (i + 1)}`).then(res => res.json()).then(json => {
                    fun.showMsg(`${displayLanguage.str_06}${fetchNum+=1}/${max}`, 0);
                    return json.data;
                });
            });
            return Promise.all(resArr).then(data => data.flat().map(e => e.src));
        },
        button: [4],
        insertImg: [".show,.read", 2],
        customTitle: () => fun.title("_免费阅读", 1),
        category: "hcomic"
    }, {
        name: "VN漫画网 清單頁 www.vnacg.com",
        host: ["www.vnacg.com"],
        reg: /www\.vnacg\.com\/detail\/\d+\.html/,
        observerClick: ".layui-flow-more>a",
        category: "autoPager"
    }, {
        name: "TWHentai/台灣成人H漫/十八禁成人H漫 圖片清單頁",
        host: ["twhentai.com", "mttang.club", "hentai.desi"],
        reg: /^https?:\/\/(twhentai\.com|mttang\.club|(\w+\.)?hentai\.desi)\/\??(hentai_manga|hentai_doujin|hentai_western)\/\d+\/$/,
        imgs: async () => {
            await fun.getNP("//div[div[a[@class='thumbnail'][img]]]", ".pagination li.active+li:not(.disabled)>a", null, ".pagination");
            thumbnailsSrcArray = fun.getImgSrcArr(".recommended img");
            return thumbnailsSrcArray.map(e => e.replace("-thumb265x385", ""));
        },
        button: [4],
        insertImg: [
            [".footer", 1], 2
        ],
        go: 1,
        customTitle: () => {
            if (/twhentai|mttang/.test(fun.lh)) {
                return fun.gt(".recommended-info h3");
            } else {
                let h3s = fun.gae(".recommended-info h3");
                return h3s.length > 1 ? h3s[1].innerText : h3s[0].innerText;
            }
        },
        category: "hcomic"
    }, {
        name: "松鼠症倉庫",
        host: ["ahri8.top"],
        reg: /\/readOnline\d\.php\?ID=\d+&host_id=\d+/,
        include: "//div[@id='logo-group']//a[contains(text(),'松鼠症倉庫') or contains(text(),'松鼠症仓库')]",
        imgs: () => {
            const {
                Original_Image_List,
                HTTP_IMAGE
            } = _unsafeWindow;
            return Original_Image_List.map(e => HTTP_IMAGE + e.new_filename + "_w1500." + e.extension);
        },
        button: [4],
        insertImg: ["#Big_Image", 2],
        customTitle: () => fun.gt(".page-header").replace("線上閱讀", ""),
        css: "#content>.col-lg-12,[id^=read_online_ads_area],#Big_Image~*{display:none!important}",
        category: "hcomic"
    }, {
        name: "91漫屋/欲漫涩/腐漫屋",
        host: ["91manwu.com", "yumanse.com", "fumanwu.org", "18comic.tw"],
        reg: /^https?:\/\/(91manwu\.com|yumanse\.com|fumanwu\.org|18comic\.tw)\/vodplay\/[\d-]+\.html$/,
        include: "//div[div[img[@class='lazy chapter-img']]]",
        init: () => fun.addMutationObserver(() => fun.remove("//div[div[@id and a[@id and img]]]")),
        imgs: ".chapter-img",
        button: [4],
        insertImg: ["//div[div[img[@class='lazy chapter-img']]]", 2],
        autoDownload: [0],
        next: "//a[span[text()='下一话']][contains(@href,'html')]",
        prev: "//a[span[text()='上一话']][contains(@href,'html')]",
        customTitle: () => fun.gt(".hl-vod-name") + " - " + fun.gt(".hl-vod-name+li").replace("章节:  ", ""),
        css: ".hl-pops-bg,.hl-poptips-wrap{display:none!important;}",
        category: "hcomic"
    }, {
        name: "Caitlin.top",
        host: ["caitlin.top"],
        reg: /caitlin\.top\/index\.php\?route=comic\/readOnline&comic_id=\d+/,
        imgs: () => {
            const {
                Image_List,
                HTTP_IMAGE
            } = _unsafeWindow;
            return Image_List.map(e => location.protocol + HTTP_IMAGE + e.sort + "." + e.extension);
        },
        button: [4],
        insertImg: ["#Big_Image", 2],
        customTitle: ".page-header",
        css: "#content>.col-lg-12,[id^=read_online_ads_area],#Big_Image~*{display:none!important}",
        category: "hcomic"
    }, {
        name: "C3manga",
        host: ["c3manga.com"],
        reg: /^https?:\/\/c3manga\.com\/[^\/]+\/$/,
        init: async () => await fun.waitEle("#chapter option[selected]"),
        include: "#readerarea",
        imgs: "#readerarea img",
        button: [4],
        insertImg: ["#readerarea", 2],
        autoDownload: [0],
        next: "a.ch-next-btn",
        prev: "a.ch-prev-btn",
        customTitle: () => fun.gt(".entry-title") + " - " + fun.gt("#chapter option[selected]"),
        category: "hcomic"
    }, {
        name: "ACG糖",
        host: ["acghtang.com", "acgntoon.com", "acgtoon.com"],
        reg: /^https?:\/\/(acghtang|acgntoon|acgtoon)\.com\/\w+\/\w+\.html$/,
        imgs: () => {
            let max = fun.gt("//a[text()='下一页']", 2);
            return fun.getImg(".manga-picture img", max, 5);
        },
        button: [4],
        insertImg: [".manga-page", 2],
        autoDownload: [0],
        next: ".next-toon a",
        prev: ".pre-toon a",
        customTitle: ".title",
        category: "hcomic"
    }, {
        name: "Roku Hentai",
        host: ["rokuhentai.com"],
        reg: /^https?:\/\/rokuhentai\.com\/\w+$/,
        imgs: () => {
            thumbnailsSrcArray = fun.gae(".site-page-card__media").map(e => e.style.backgroundImage.split('"')[1]);
            fun.showMsg(displayLanguage.str_05, 0);
            let url = fun.url + "/0";
            return fun.fetchDoc(url).then(doc => fun.gae(".site-reader__image", doc).map(e => e.dataset.src ?? e.src));
        },
        button: [4],
        insertImg: [
            [".site-manga-info+.mdc-layout-grid", 2], 2
        ],
        go: 1,
        customTitle: () => fun.title(" - Roku Hentai"),
        css: ".site-bottom-ad-slot{display:none!important}",
        category: "hcomic"
    }, {
        name: "Roku Hentai",
        host: ["rokuhentai.com"],
        reg: /^https?:\/\/rokuhentai\.com\/\w+\/\d+$/,
        imgs: ".site-reader__image",
        button: [4],
        insertImg: [".site-reader", 2],
        css: ".site-reader--right-to-left,.site-reader--left-to-right{overflow-x:auto!important;overflow-y:auto!important}.site-reader{padding-bottom:0px!important}.site-reader{display:block!important;}.site-bottom-ad-slot{display:none!important}",
        category: "hcomic"
    }, {
        name: "177 漫画/XXIAV寫真館",
        host: ["www.177pica.com", "www.177picyy.com", "www.xxiav.com"],
        reg: /www\.(177pica|177picyy|xxiav)\.com\/html\/\d+\/\d+\/\d+\.html/,
        imgs: () => fun.getImg(".single-content img[data-lazy-src]", (fun.gt(".page-links>*:last-child", 2) || 1), 10),
        button: [4],
        insertImg: [".single-content", 2],
        autoDownload: [0],
        next: "a[rel=prev]",
        prev: 1,
        customTitle: ".entry-title",
        category: "hcomic"
    }, {
        name: "18H 宅宅愛動漫",
        host: ["18h.animezilla.com"],
        reg: /18h\.animezilla\.com\/manga\/\d+/,
        imgs: () => {
            let max;
            try {
                max = fun.gu(".last").split("/").at(-1);
            } catch (e) {
                max = 1;
            }
            return fun.getImgO("#comic", max, "4", null, 0, ".entry-title,.wp-pagenavi", siteUrl, 0);
        },
        button: [4],
        insertImg: ["#page-current", 1],
        customTitle: () => fun.gt("h1.entry-title").replace(/\s?\[\d+P\](\s?-\s?\d+\/\d+\s?)?/i, ""),
        category: "hcomic"
    }, {
        name: "18 禁漫",
        host: ["www.18mh.cc"],
        reg: /www\.18mh\.cc\/index-look-name-/,
        imgs: () => {
            let url = fun.attr("img[data-url]", "data-url");
            let [, path, start, ex] = url.match(/(^.+\/)(\d+)(\.\w{2,4})$/);
            let ps = fun.gae("select[onchange]>option").length;
            let end = Number(start) + ps;
            let arr = [];
            for (let i = start; i < end; i++) {
                arr.push(path + i + ex);
            }
            return arr;
        },
        button: [4],
        insertImg: [".e", 2],
        autoDownload: [0],
        next: "//a[text()='下一章']",
        prev: "//a[text()='上一章']",
        customTitle: () => {
            let s = fun.gt(".b").split(" - ");
            return s[2] + " - " + s[3];
        },
        css: ".p.fanye,select[onchange],.c_p.k_pag{display:none!important}",
        category: "hcomic"
    }, {
        name: "18 禁漫M",
        host: ["m.18mh.cc"],
        reg: /^https?:\/\/m\.18mh\.cc\/look\/name\//,
        imgs: () => {
            let url = fun.attr("#manga img", "src");
            let [, path, start, ex] = url.match(/(^.+\/)(\d+)(\.\w{2,4})$/);
            let ps = Number(fun.gt(".manga-page").match(/(\d+)P/)[1]);
            let end = Number(start) + ps;
            let arr = [];
            for (let i = start; i < end; i++) {
                arr.push(path + i + ex);
            }
            return arr;
        },
        button: [4],
        insertImg: ["#manga", 2],
        autoDownload: [0],
        next: "//a[text()='下一章']",
        prev: "//a[text()='上一章']",
        customTitle: "#mangaTitle",
        css: ".action-list li{width:50% !important}#action>ul>li:nth-child(n+2):nth-child(-n+3){display:none !important}",
        category: "hcomic"
    }, {
        name: "色漫网",
        host: ["www.cartoon18.com"],
        reg: () => /^https?:\/\/www\.cartoon18\.com\/([\w-]+\/)?v\/\w+$/i.test(siteUrl) && fun.ge("#links+.title+div>a>i.fa-play"),
        imgs: () => {
            fun.showMsg(displayLanguage.str_05, 0);
            let url = fun.gu("#links+.title+div>a");
            return fun.fetchDoc(url).then(doc => fun.ge("img[data-src]", doc) ? fun.gae("img[data-src]", doc) : fun.gae("#lightgallery a", doc));
        },
        button: [4],
        insertImg: ["//div[a[img]]", 2],
        insertImgAF: () => {
            fun.ge("#FullPictureLoadOptionsButtonParentDiv").parentNode.className = "";
            let modalOpen = fun.ge(".modal-open");
            if (modalOpen) modalOpen.classList.remove("modal-open");
        },
        css: "#chromeModal,.modal-backdrop{display:none!important;}",
        category: "hcomic"
    }, {
        name: "色漫网",
        host: ["www.cartoon18.com"],
        reg: /www\.cartoon18\.com\/([\w-]+\/)?story\/\d+\/full/,
        imgs: () => fun.ge("img[data-src]") ? fun.gae("img[data-src]") : fun.gae("#lightgallery a"),
        button: [4],
        insertImg: ["#lightgallery", 2],
        category: "hcomic"
    }, {
        name: "韓漫射/绅士同人H漫",
        host: ["h-webtoon.com", "h-doujinshi.xyz"],
        reg: /(h-webtoon\.com|h-doujinshi\.xyz)\/.+\//,
        init: "setTimeout(()=>{fun.gae('.g1-nav-single a').forEach(e=>{e.removeAttribute('target')})},2000)",
        include: ".g1-content-narrow",
        imgs: ".g1-content-narrow p img",
        button: [4],
        insertImg: [".g1-content-narrow", 2],
        autoDownload: [0],
        next: "#content .g1-teaser-next",
        prev: "#content .g1-teaser-prev",
        customTitle: "h1.entry-title",
        css: "#simple-banner,.touchy-wrapper,.touchy-wrapper~*:not([id^='pv-']):not([class^='pv-']):not(.pagetual_tipsWords):not(#comicRead):not(#fab):not(.FullPictureLoadMsg):not(.FullPictureLoadFixedBtn):not(#FullPictureLoadOptions):not(#FullPictureLoadFixedMenu):not(*[class^=fancybox]),.code-block,#secondary{display:none!important}",
        category: "hcomic"
    }, {
        name: "18H漫画",
        host: ["18hmanga.click"],
        reg: /(18hmanga\.click)\/.+\//,
        init: "setTimeout(()=>{fun.gae('.g1-nav-single a').forEach(e=>{e.removeAttribute('target')})},2000)",
        include: ".g1-content-narrow",
        imgs: () => {
            let selector = "//div[@itemprop='articleBody']//noscript[contains(text(),'upload')]";
            return fun.ge(selector) ? fun.gae(selector).map(e => e.innerText.match(/src="([^"]+)/)[1]) : fun.gae("div[itemprop=articleBody] img[src*=upload]");
        },
        button: [4],
        insertImg: ["div[itemprop=articleBody]", 2],
        autoDownload: [0],
        next: "#content .g1-teaser-prev",
        prev: "#content .g1-teaser-next",
        customTitle: "h1.entry-title",
        css: "#simple-banner,.touchy-wrapper,.touchy-wrapper~*:not([id^='pv-']):not([class^='pv-']):not(.pagetual_tipsWords):not(#comicRead):not(#fab):not(.FullPictureLoadMsg):not(.FullPictureLoadFixedBtn):not(#FullPictureLoadOptions):not(#FullPictureLoadFixedMenu):not(*[class^=fancybox]),.code-block,#secondary{display:none!important}",
        category: "hcomic"
    }, {
        name: "18H漫画",
        host: ["18hmanga.click"],
        reg: /(18hmanga\.click)\/.+\//,
        init: "setTimeout(()=>{fun.gae('.g1-nav-single a').forEach(e=>{e.removeAttribute('target')})},2000)",
        imgs: () => {
            fun.showMsg(displayLanguage.str_01, 0);
            let fetchNum = 0;
            let resArr = fun.gae("//a[contains(text(),'Read More')]", doc, doc).map((a, i, arr) => {
                return fun.fetchDoc(a.href).then(doc => {
                    fun.showMsg(`${displayLanguage.str_02}${fetchNum+=1}/${arr.length}`, 0);
                    let selector = "//div[@itemprop='articleBody']//noscript[contains(text(),'upload')]";
                    return fun.ge(selector, doc, doc) ? fun.gae(selector, doc, doc).map(e => e.innerText.match(/src="([^"]+)/)[1]) : fun.gae("div[itemprop=articleBody] img[src*=upload]", doc);
                });
            })
            return Promise.all(resArr).then(arr => arr.flat());
        },
        button: [4],
        insertImg: [
            ["#primary", 0], 2
        ],
        go: 1,
        customTitle: ".g1-breadcrumbs-item>span[itemprop=name]",
        css: "div[class][id][style*=fixed]{display:none!important;}",
        category: "hcomic"
    }, {
        name: "Hitomi.la",
        host: ["hitomi.la"],
        reg: /hitomi\.la\/reader\/\d+\.html/,
        init: "setTimeout(()=>{$(document).unbind('keydown');$(document).unbind('click')},1000)",
        imgs: async () => {
            await fun.waitEle("#mobileImages .lillie", 11);
            const {
                galleryinfo,
                url_from_url_from_hash,
                our_galleryinfo
            } = _unsafeWindow;
            fun.ge("#comicImages").setAttribute("class", "fitVertical");
            fun.ge("#mobileImages").setAttribute("class", "hidden");
            if (options.fancybox == 1) {
                fun.showMsg("Get Thumbnailsing...");
                let url = fun.gu("//a[text()='Gallery Info']");
                let doc = await fun.iframeDoc(url, ".gallery-preview img");
                thumbnailsSrcArray = fun.gae(".gallery-preview img", doc).map(e => e.dataset.src ?? e.src);
            }
            return galleryinfo.files.map((e, i) => url_from_url_from_hash(galleryinfo.id, our_galleryinfo[i], "webp", undefined, "a"));
        },
        button: [4],
        insertImg: ["#comicImages", 2],
        customTitle: () => fun.title("|", 1),
        css: "body{overflow:unset!important}#FullPictureLoadEnd{color:rgb(255, 255, 255)}",
        threading: 5,
        category: "hcomic"
    }, {
        name: "Orzqwq List模式",
        host: ["orzqwq.com"],
        reg: /orzqwq\.com\/manga\/.+style=list/,
        include: "//option[@selected and text()='List style']",
        imgs: async () => {
            fun.showMsg(displayLanguage.str_04, 0);
            await fun.waitEle(".img-responsive", 600);
            return fun.gae("img[data-src]");
        },
        insertImg: [".reading-content", 2],
        customTitle: ".breadcrumb>li:nth-child(2)",
        category: "hcomic"
    }, {
        name: "HO5HO",
        host: ["www.ho5ho.com"],
        reg: /www\.ho5ho\.com\/.+\/.+\/server.+\//,
        include: "//script[contains(text(),'chapter_preloaded_images')]",
        imgs: () => _unsafeWindow.chapter_preloaded_images,
        button: [4],
        insertImg: [".entry-content", 2],
        customTitle: ".breadcrumb>li:nth-child(2)",
        category: "hcomic"
    }, {
        name: "成人漫画 圖片清單頁",
        host: ["bad.news"],
        link: "https://bad.news/mh",
        reg: /^https?:\/\/bad\.news\/mh\/\w+\/id-\d+$/,
        imgs: () => {
            let link = [fun.gu("a.post-thumb")];
            return fun.getImgA("img.img-responsive", link);
        },
        thums: "img.img-responsive",
        button: [4],
        insertImg: [
            ["//div[div[article[div[div[a[img[@class='img-responsive']]]]]]]", 2], 2
        ],
        go: 1,
        threading: 4,
        category: "hcomic"
    }, {
        name: "成人漫画 閱讀頁",
        host: ["bad.news"],
        link: "https://bad.news/mh",
        reg: /bad\.news\/mh\/view\/id-\d+/,
        imgs: ".img-responsive",
        button: [4],
        insertImg: ["//div[img[@class='img-responsive']]", 2],
        threading: 4,
        category: "hcomic"
    }, {
        name: "JComic",
        host: ["jcomic.net"],
        reg: /^https?:\/\/jcomic\.net\/page\/[^\/]+$/,
        imgs: ".comic-view,.comic-thumb",
        button: [4],
        insertImg: ["//div[img[@class='img-responsive comic-thumb']]", 2],
        threading: 10,
        customTitle: "//ol/li[2]/a",
        category: "hcomic"
    }, {
        name: "JComic",
        host: ["jcomic.net"],
        reg: /^https?:\/\/jcomic\.net\/page\/[^\/]+\/[0-9\.]+$/,
        imgs: ".comic-view,.comic-thumb",
        button: [4],
        insertImg: ["//div[img[@class='img-responsive comic-thumb']]", 2],
        autoDownload: [0],
        next: () => {
            let next = fun.ge("//a[button[text()='下一章']]");
            return next && next.href != siteUrl ? next.href : null;
        },
        prev: 1,
        threading: 10,
        customTitle: () => fun.gt("//ol/li[2]/a") + " - " + fun.gt("//ol/li[3]"),
        category: "hcomic"
    }, {
        name: "一之涩漫画/哈塔兹漫画/布罗塔漫画/物二漫画",
        host: ["1zse.com", "hatazi.com", "www.bulota.com", "522160.xyz", "522161.xyz", "522162.xyz", "522163.xyz", "522164.xyz", "522168.xyz", "522168.xyz", "522167.xyz", "522168.xyz", "522169.xyz"],
        reg: /^https?:\/\/(1zse\.com|hatazi\.com|www\.bulota\.com|52216\d\.xyz)\/index\.php\/\d+\.html/,
        init: () => {
            fun.addMutationObserver(() => fun.remove("#eruda,.__chobitsu-hide__,#lightboxOverlay,#lightbox"));
            fun.clearAllTimer();
        },
        imgs: () => fun.getImg(".context img", fun.gt(".pages").match(/\d+/g)[1], 7),
        button: [4],
        insertImg: [".context", 2],
        autoDownload: [0],
        next: ".post-previous a",
        prev: ".post-next a",
        customTitle: () => fun.gt("#content h1").replace(/\[\d+P\]|〈|〉/gi, ""),
        css: "body>*:not(#head,.container,#footer,#tbox,#FullPictureLoadOptions,#FullPictureLoadFixedMenu,.FullPictureLoadFixedBtn,.FullPictureLoadMsg,[class^='fancybox']){display:none!important;}",
        category: "hcomic"
    }, {
        name: "那露漫画",
        host: ["naluhd.com"],
        reg: /^https?:\/\/naluhd\.com\/index\.php\/\d+\.html/,
        imgs: () => fun.getImgA(".article-content img", "a.post-page-numbers"),
        button: [4],
        insertImg: [".article-content", 2],
        autoDownload: [0],
        next: "//a[p[text()='上一篇'] and not(starts-with(@href,'java'))]",
        prev: "//a[p[text()='下一篇'] and not(starts-with(@href,'java'))]",
        customTitle: ".article-title>a",
        category: "hcomic"
    }, {
        name: "色色漫画/最新韩漫网",
        host: ["www.sesemanhua.com", "www.xindehanman.com", "aicomic.org"],
        reg: /^https:\/\/www\.sesemanhua\.com\/index\.php\/chapter\/\d+|^https?:\/\/www\.xindehanman\.com\/chapter_\d+\.html/,
        include: ".rd-article-wr,.comic-list",
        imgs: ".rd-article-wr img,.comic-list img",
        button: [4],
        insertImg: [".rd-article-wr,.comic-list", 2],
        autoDownload: [0],
        next: ".j-rd-next,.next-btn",
        prev: ".j-rd-prev,.prev-btn",
        customTitle: ".comic-title>a,.comic-name,.mip-shell-header-title",
        category: "hcomic"
    }, {
        name: "九妖漫画",
        host: ["mobile.jymhapp.com", "xn--ihqy4c7yra.jyaaa.info"],
        reg: /^https?:\/\/(mobile\.jymhapp\.com|xn--ihqy4c7yra\.jyaaa\.info)\/chapter\/\d+/,
        include: ".rd-article-wr,.comic-list",
        imgs: ".rd-article-wr img,.comic-list img",
        button: [4],
        insertImg: [".rd-article-wr,.comic-list", 2],
        autoDownload: [0],
        next: ".j-rd-next,.next-btn",
        prev: ".j-rd-prev,.prev-btn",
        customTitle: () => fun.title(" - 九妖漫画网"),
        css: "[class^=ad],.m-hm-ad1,p.result{display:none!important;}",
        category: "hcomic"
    }, {
        name: "韩漫库/3N漫画网/哇漫画/很多漫/爱看韩漫",
        host: ["se8.us", "3456nnn3.com", "wamanhua.com", "henduoman.com", "aikanhanman1.com"],
        reg: [
            /^https?:\/\/(se8\.us|3456nnn3\.com|wamanhua\.com|aikanhanman\d?\.com)\/index\.php\/chapter\/\d+/,
            /^https?:\/\/henduoman\.com\/chapter-\d+\.html/
        ],
        imgs: ".rd-article-wr img,.comic-list img,.episode-detail img",
        button: [4],
        insertImg: [".rd-article-wr,.comic-list,.episode-detail", 1],
        autoDownload: [0],
        next: ".j-rd-next,.next-btn,a.next[href^='/']",
        prev: ".j-rd-prev,.prev-btn,a.prev[href^='/']",
        customTitle: async () => {
            if (fun.ge(".rd-article-wr")) {
                return fun.gt(".read__crumb").replace("首页  ", "").replace("  ", " - ");
            } else {
                try {
                    return _unsafeWindow.shareArr[0].match(/《([^》]+)/)[1] + " - " + fun.gt(".comic-name");
                } catch (e) {
                    let url = fun.gu("//a[contains(text(),'全集')]");
                    let comicName = await fun.fetchDoc(url).then(doc => fun.gt("h1.title", 1, doc));
                    return comicName + " - " + fun.gt(".center-title");
                }
            }
        },
        css: "body>ins,div[id^='show']{display:none!important;}",
        category: "hcomic"
    }, {
        name: "福利漫画",
        host: ["flmh.xyz"],
        reg: /^https?:\/\/flmh\.xyz\/chapter_\d+\.html/,
        imgs: ".rd-article-wr img,.comic-list img",
        button: [4],
        insertImg: [".rd-article-wr,.comic-list", 1],
        autoDownload: [0],
        next: ".j-rd-next,.next-btn",
        prev: ".j-rd-prev,.prev-btn",
        customTitle: () => fun.ge(".rd-article-wr") ? fun.gt(".comic-title").replace(/\s-\s.+$/, "") : fun.gt(".comic-name").replace(/\s-\s.+$/, ""),
        css: "body>ins,div[id^='show']{display:none!important;}",
        category: "hcomic"
    }, {
        name: "日漫之家",
        host: ["rimanzhijia.com"],
        reg: /^https?:\/\/rimanzhijia\.com\/index\.php\/chapter\/\d+/,
        imgs: "#comic_pic",
        button: [4],
        insertImg: [
            ["#comic_pic", 2, "#comic_pic"], 2
        ],
        autoDownload: [0],
        next: "//a[contains(text(),'下一章')][starts-with(@href,'/')]",
        prev: "//a[contains(text(),'上一章')][starts-with(@href,'/')]",
        customTitle: () => fun.gt(".bo_tit").replace(">", "-"),
        css: "img[src*='/ad/']{display:none!important;}.bo_nav{width:97%!important;padding:10px!important}",
        category: "hcomic"
    }, {
        name: "最新韩漫网M",
        host: ["www.zuixinhanman.com", "www.xinhanman.com"],
        reg: /^https?:\/\/www\.(zui)?xinhanman\.com\/chapter_\d+\.html/,
        delay: 300,
        imgs: "#comic_pic",
        button: [4],
        insertImg: [
            [".bo_tit", 2, "#comic_pic"], 2,
        ],
        autoDownload: [0],
        next: "//a[contains(text(),'下一章')][contains(@href,'html')]",
        prev: "//a[contains(text(),'上一章')][contains(@href,'html')]",
        customTitle: ".mip-shell-header-title",
        fancybox: {
            blacklist: 1
        },
        category: "hcomic"
    }, {
        name: "韩漫100",
        host: ["hanman100.com"],
        reg: /^https?:\/\/hanman100\.com\/index\.php\/chapter-\d+\.html/,
        imgs: "#img-content img,.comic-list img",
        button: [4, "24%", 4],
        insertImg: ["#img-content,.comic-list", 1],
        autoDownload: [0],
        next: ".pnext.next+a[href$=html],.next-btn",
        prev: 1,
        customTitle: () => fun.gt("h1.text-center,.comic-name").replace("漫画 ", ""),
        css: "#left,#right{display:none!important;}",
        category: "hcomic"
    }, {
        name: "免费韩漫看",
        host: ["www.hanmanmianfei.com"],
        reg: /^https?:\/\/www\.hanmanmianfei\.com\/index\.php\/chapter\/\d+/,
        imgs: "#ChapterContent img,.readForm img",
        button: [4],
        insertImg: ["#ChapterContent,.readForm", 2],
        autoDownload: [0],
        next: "//a[text()='下一章'][starts-with(@href,'/')]",
        prev: "//a[text()='上一章'][starts-with(@href,'/')]",
        customTitle: () => fun.ge("#ChapterContent") ? fun.gt(".arthor") + " - " + fun.gt(".title") : fun.title("免费观看 "),
        category: "hcomic"
    }, {
        name: "韩漫推荐",
        host: ["www.hanmantop.com"],
        reg: /^https?:\/\/www\.hanmantop\.com\/index\.php\/chapter\/\d+/,
        include: "//div/div[@style]/img[@style]",
        imgs: "//div/div[@style]/img[@style]",
        button: [4],
        insertImg: ["//div[div[@style]/img[@style]]", 2],
        autoDownload: [0],
        next: "//a[text()='下一章'][starts-with(@href,'/')]",
        prev: "//a[text()='上一章'][starts-with(@href,'/')]",
        customTitle: "h1[style]",
        category: "hcomic"
    }, {
        name: "韩漫推荐M",
        host: ["www.hanmantop.com"],
        reg: /^https?:\/\/www\.hanmantop\.com\/index\.php\/chapter\/\d+/,
        imgs: ".chapterbox img",
        button: [4],
        insertImg: [
            [".chapterbox>*:first-child", 1, ".pic"], 2
        ],
        autoDownload: [0],
        next: "//a[text()='继续阅读下一章节']",
        prev: 1,
        customTitle: () => fun.title("韩漫 "),
        category: "hcomic"
    }, {
        name: "韓漫天堂/51漫画/爱漫画",
        host: ["18jin.top", "51comic.org", "aicomic.org"],
        reg: /^https?:\/\/(18jin\.top|aicomic\.org)\/index\.php\/chapter\/\d+|^https?:\/\/51comic\.org\/chapter\/\d+/,
        imgs: () => fun.ge(".rd-article-wr") ? fun.gae(".rd-article-wr img") : fun.gae(".comic-list img:not([src$='empty.png'])"),
        button: [4],
        insertImg: [".rd-article-wr,.comic-list", 1],
        autoDownload: [0],
        next: ".j-rd-next:not([style]):not(.hide),.next-btn",
        prev: ".j-rd-prev,.prev-btn",
        customTitle: () => fun.ge(".rd-article-wr") ? fun.gt(".j-comic-title") + " - " + fun.gt(".comic-title>a").replace(/\d+p/i, "") : _unsafeWindow.shareArr[0].match(/《([^》]+)/)[1] + " - " + fun.gt(".comic-name").replace(/\d+p/i, ""),
        css: ".image-container{display:none!important;}",
        category: "hcomic"
    }, {
        name: "琴瑟漫畫/琴瑟書庫",
        host: ["sixcomic.com", "sixacg.com", "www.sixacg.org", "6acg.top"],
        reg: /^https?:\/\/((www\.)?sixcomic\.com|(www\.)?sixacg\.com|(www\.)?sixacg\.org|6acg\.top)\/chapter\/\d+$/,
        imgs: ".comicpage img:not([data-original*='qssk.top']),#cp_img img:not([data-original*='qssk.top'])",
        button: [4],
        insertImg: [".comicpage,#cp_img", 2],
        autoDownload: [0],
        next: "//a[@href and not(starts-with(@href,'java')) and text()='下一章']",
        prev: "//a[@href and not(starts-with(@href,'java')) and text()='上一章']",
        customTitle: () => fun.title(/免费阅读|在线阅读/, 1),
        category: "hcomic"
    }, {
        name: "特漫网",
        host: ["www.44te.com"],
        reg: /^https?:\/\/www\.44te\.com\/chapter\/\d+$/,
        imgs: ".comicpage img:not([src*='/banner/']),#cp_img img:not([src*='/banner/'])",
        button: [4],
        insertImg: [".comicpage,#cp_img", 2],
        autoDownload: [0],
        next: "//a[@href and not(starts-with(@href,'java')) and text()='下一章']",
        prev: "//a[@href and not(starts-with(@href,'java')) and text()='上一章']",
        customTitle: () => fun.title(/无删减/, 1),
        css: "body>div[style^=background],[id^=ad]{display:none!important;}",
        category: "hcomic"
    }, {
        name: "香香腐宅",
        host: ["boylove.cc", "boylove1.mobi"],
        reg: /^https?:\/\/boylove\d?\.\w+\/home\/book\/capter\/id\/\d+/,
        imgs: "img[data-original]",
        button: [4],
        insertImg: [".reader-cartoon-chapter", 2],
        autoDownload: [0],
        next: "a[data-value=next]",
        prev: "a[data-value=prev]",
        customTitle: ".title a",
        category: "hcomic"
    }, {
        name: "一耽女孩",
        host: ["yidan.in", "yidan.one", "yidan.app"],
        reg: /^https?:\/\/yidan\.(in|one|app)\/#\/pages\/read\/read\?no=\d+&id=\d+(&episodesId=\d+)?/,
        init: async () => {
            await fun.waitEle(".read-article img");
            await fun.waitEle("uni-view.last-bum");
            fun.ge("uni-view.last-bum").addEventListener("click", () => setTimeout(() => location.reload(), 300));
            fun.showMsg(displayLanguage.str_05, 0);
            let [, no, mhid] = fun.url.match(/no=(\d+)&id=(\d+)/);
            let api = `/prod-api/app-api/vv/mh-episodes/get?jiNo=${no}&mhid=${mhid}&id=`;
            let fetchJson = await fetch(api).then(res => res.json());
            debug("\n此頁JSON資料\n", fetchJson);
            siteJson = fetchJson;
        },
        imgs: () => siteJson.data.pics.split(",").map(e => fun.lo + e),
        button: [4],
        insertImg: [".read-article", 2],
        autoDownload: [0],
        next: () => {
            let next = fun.ge("//a[text()='继续看下一话']");
            if (next) {
                let [, mhid] = fun.url.match(/&id=(\d+)/);
                let url = `https://${fun.lh}/#/pages/read/read?no=${siteJson.data.next}&id=${mhid}`;
                return url;
            }
            return null;
        },
        prev: 1,
        customTitle: () => fun.title(" - 一耽女孩_好看的一耽漫画官网").trim(),
        css: ".page-pagination{display:none!important}",
        category: "hcomic"
    }, {
        name: "91禁漫",
        host: ["www.91jinman.com"],
        reg: /^https?:\/\/www\.91jinman\.com\/\d+\.html/,
        imgs: ".wp-posts-content img",
        button: [4],
        insertImg: [".wp-posts-content", 2],
        autoDownload: [0],
        next: "//a[p[text()='上一篇']]",
        prev: "//a[p[text()='下一篇']]",
        customTitle: ".article-title",
        css: ".wp-posts-content{max-height:unset!important}",
        category: "hcomic"
    }, {
        name: "鸟鸟韩漫",
        host: ["nnhanman.org"],
        reg: /^https?:\/\/nnhanman\.\w+\/comic\/[^\/]+\/chapter-\d+\.html/,
        imgs: async () => {
            if (/章$/.test(fun.gt(".BarTit>h1"))) {
                await fun.getNP("img[data-original]", "#k_Pic_nextArr", null, "#action");
                return fun.gae("img[data-original]");
            } else {
                return fun.gae("img[data-original]");
            }
        },
        button: [4],
        insertImg: ["//td[img] | //div[@class='view-imgBox']", 2],
        autoDownload: [0],
        next: "#k_Pic_nextArr",
        prev: 1,
        customTitle: () => fun.gt(".BarTit>h1").replace(" - 第1章", ""),
        category: "hcomic"
    }, {
        name: "肉漫画网",
        host: ["www.roumanhua.com", "m.roumanhua.com"],
        reg: /^https?:\/\/(www|m)\.roumanhua\.com\/(wap)?chapter\/\d+/,
        imgs: "img[data-original]",
        button: [4],
        insertImg: [
            ["img[data-original]", 2, "img[data-original]"], 2
        ],
        autoDownload: [0],
        next: "//a[text()='下一章节'] | //a[@class='s_page2']",
        prev: "//a[text()='上一章节'] | //a[@class='s_page1']",
        customTitle: () => fun.title("|韩国漫画网"),
        category: "hcomic"
    }, {
        name: "漫香阁",
        host: ["xn--wgv69rba1382b.com", "韩漫日漫.com"],
        reg: /^https?:\/\/[^\/]+\/content-[\w-]+\.html/,
        include: "//title[contains(text(),'漫香阁')]",
        imgs: "#contentimg img",
        button: [4],
        insertImg: ["#contentimg", 2],
        customTitle: ".services-desc",
        category: "hcomic"
    }, {
        name: "頂點漫畫",
        host: ["www.apexmh.com"],
        reg: /^https?:\/\/www\.apexmh\.com\/comic\/\d+\.html/,
        imgs: () => fun.getImg("#showimg img", fun.gt("//p[contains(text(),'图片数量') or contains(text(),'圖片數量')]").match(/\d+/)[0], 9),
        button: [4],
        insertImg: ["#showimg", 2],
        customTitle: "h1",
        category: "hcomic"
    }, {
        name: "亲亲漫画",
        host: ["m.qinqinmanhua.xyz"],
        reg: /^https?:\/\/m\.qinqinmanhua\.xyz\/view\/\d+\.html/,
        imgs: ".showimg img",
        autoDownload: [0],
        next: ".BtnBox>.next[href*=view]",
        prev: ".BtnBox>.prev[href*=view]",
        customTitle: () => document.title.match(/《(.+)》/)[1],
        category: "hcomic"
    }, {
        name: "ok漫画網",
        host: ["www.okcomic.net", "m.okcomic.net"],
        reg: /^https?:\/\/(www|m)\.okcomic\.net\/\w+\/\d+\/\d+\.html/,
        delay: 1000,
        init: async () => {
            await fun.waitEle("//script[contains(text(),'qTcms_S_m_murl_e')]");
            fun.run("document.onkeydown=null");
            fun.remove(".imgBox");
        },
        imgs: () => {
            const {
                base64_decode,
                qTcms_S_m_murl_e
            } = _unsafeWindow;
            return base64_decode(qTcms_S_m_murl_e).split("$qingtiandy$").map(e => e.replace("////", "//"));
        },
        button: [4],
        insertImg: ["//td[//img[@onclick]]", 2],
        go: 1,
        autoDownload: [0],
        next: "#k_Pic_nextArr",
        prev: "#k_Pic_backArr",
        customTitle: () => {
            const {
                qTcms_S_m_name,
                qTcms_S_m_playm
            } = _unsafeWindow;
            return qTcms_S_m_name + " - " + qTcms_S_m_playm
        },
        category: "hcomic"
    }, {
        name: "狮城漫画",
        host: ["hdcomic.com"],
        reg: /^https?:\/\/hdcomic\.com\/chapter\/\d+/,
        init: () => fun.clearAllTimer(),
        imgs: ".comicpage img,#cp_img img",
        button: [4],
        insertImg: [".comiclist,#cp_img", 2],
        autoDownload: [0],
        next: "//a[text()='下一章'][@href]",
        prev: "//a[text()='上一章'][@href]",
        customTitle: () => fun.title(/免费阅读-狮城漫画|在线阅读-狮城漫画/).replace(/\s-\s\(\d+P\)-高清全集/i, ""),
        category: "hcomic"
    }, {
        name: "韩漫连连看",
        host: ["www.hmllk.com"],
        reg: /^https?:\/\/www\.hmllk\.com\/chapter\/\d+/,
        init: () => fun.clearAllTimer(),
        imgs: ".comicpage img,#cp_img img",
        button: [4],
        insertImg: [".comiclist,#cp_img", 2],
        autoDownload: [0],
        next: "//a[text()='下一章'][@href]",
        prev: "//a[text()='上一章'][@href]",
        customTitle: () => fun.title(/免费阅读-连连看.+|免费在线看.+/).replace(/\s-\s\(\d+P\)-高清全集/i, ""),
        category: "hcomic"
    }, {
        name: "顶通漫画",
        host: ["toptoon.shop", "toptoon.buzz", "toptooncn.club", "toptooncn.info", "toptooncn.life", "toptooncn.top", "toptoonapp.com", "toptoon123.xyz", "toptooncn.xyz", "toptoon123.link", "toptoonapp.club"],
        reg: /^https?:\/\/toptoon(\w+)?\.\w+\/\w+\/\d+\.html/,
        imgs: "#txtbox img",
        button: [4],
        insertImg: ["#txtbox", 2],
        autoDownload: [0],
        next: "a.nexturl.on",
        prev: "a.prevurl.on",
        customTitle: () => {
            let arr = fun.gt(".place").split(" > ");
            return arr[2] + " - " + arr[3];
        },
        css: ".ads_plugin,.ad-top-info{display:none!important;}",
        category: "hcomic"
    }, {
        name: "H肉番动漫",
        host: ["www.rhmanhua11.xyz", "www.rhmanhua12.xyz"],
        reg: /^https?:\/\/www\.rhmanhua(\d+)?\.xyz\/artshow-\d+\.html/,
        imgs: () => {
            thumbnailsSrcArray = fun.getImgSrcArr(".margin-fix img");
            return thumbnailsSrcArray.map(e => e.replace(/t(\.\w+)$/, "$1"));
        },
        button: [4],
        insertImg: [".list-videos", 2],
        go: 1,
        customTitle: ".headline>h2",
        category: "hcomic"
    }, {
        name: "色漫集",
        host: ["semanji.com"],
        reg: /^https?:\/\/semanji\.com\/\w+\/[^\.]+\.html/,
        imgs: ".post-content a",
        button: [4],
        insertImg: [".post-content", 2],
        customTitle: () => fun.title(" - 色漫集"),
        fancybox: {
            v: 3,
            css: false
        },
        category: "hcomic"
    }, {
        name: "155漫画",
        host: ["155comic.com", "155comic.bio", "155comic.cfd", "155comic.buzz", "155comic.autos", "155.lat"],
        reg: /^https?:\/\/155comic\.\w+\/\d+\.html/,
        imgs: "#post-comic img",
        button: [4],
        insertImg: ["#post-comic", 2],
        customTitle: "#post-data>h1",
        css: ".contentsad{display:none!important;}",
        category: "hcomic"
    }, {
        name: "18H汉化漫画 介紹頁",
        host: ["manhua.sexbook.top", "18manga.top", "mt91.top", "kk4.top"],
        reg: /^https?:\/\/(manhua\.sexbook\.top|18manga\.top|mt91\.top|kk4\.top)\/cont\.php\?id=/,
        imgs: async () => {
            let max = fun.gt("#td-Act+#td-Series").match(/\d+/)[0];
            let [, imgDir, , ex] = fun.gu(".article-content a").match(/^(.+\/)(\d+)(\.\w+)$/);
            return fun.arr(max).map((_, i) => imgDir + (i + 1) + ex);
        },
        button: [4],
        insertImg: [
            [".content", 0, ".article-content>a"], 2
        ],
        go: 1,
        customTitle: () => fun.gt(".article-content>h3").split("|")[1],
        fancybox: {
            blacklist: 1
        },
        css: "#FullPictureLoadEnd{color:rgb(255, 255, 255)}.sidebar,.modown-ad{display:none!important;}.single .content{margin-right:0px!important;}",
        category: "hcomic"
    }, {
        name: "18H汉化漫画 閱讀頁",
        host: ["manhua.sexbook.top", "18manga.top", "mt91.top", "kk4.top"],
        reg: /^https?:\/\/(manhua\.sexbook\.top|18manga\.top|mt91\.top|kk4\.top)\/imgs\.php\?id=/,
        imgs: async () => {
            let next = fun.ge("li.active+li");
            if (next) {
                let last = fun.ge("//a[contains(text(),'最大頁') or contains(text(),'最大页')]");
                let lastDoc = await fun.fetchDoc(last.href);
                let lastFn = fun.gst("decodeBinaryString", lastDoc).match(/decodeBinaryString\('[^;]+/g)[0];
                let html = fun.run(lastFn);
                let tempDoc = fun.doc(html);
                let lastA = fun.gae("a", tempDoc).at(-1);
                let max = lastA.href.match(/(\d+)\.\w+$/)[1];
                let [, imgDir, , ex] = fun.gu("#imgs>a").match(/^(.+\/)(\d+)(\.\w+)$/);
                return fun.arr(max).map((_, i) => imgDir + (i + 1) + ex);
            } else {
                return fun.gae("#imgs>a");
            }
        },
        button: [4],
        insertImg: ["#imgs", 2],
        customTitle: ".article-content>h3",
        fancybox: {
            blacklist: 1
        },
        css: "#FullPictureLoadEnd{color:rgb(255, 255, 255)}.sidebar,.modown-ad{display:none!important;}.single .content{margin-right:0px!important;}",
        category: "hcomic"
    }, {
        name: "hanime1",
        host: ["hanime1.biz", "h202326.xyz"],
        reg: /^https?:\/\/(hanime1\.biz|h202326\.xyz)\/book\/\d+$/,
        init: async () => {
            fun.ge(".blog").scrollIntoView({
                block: "end"
            });
            await fun.delay(1000);
        },
        imgs: async () => {
            await fun.waitEle(".blog_section img[title]:not([src*=cover])");
            thumbnailsSrcArray = fun.getImgSrcArr(".blog_section img[title]:not([src*=cover])");
            return thumbnailsSrcArray.map(e => e.replace(/t(\d+\.\w+)$/, "$1"));
        },
        button: [4],
        insertImg: [
            [".m-1>.blog_section", 2], 2
        ],
        go: 1,
        customTitle: ".blog_section h1,.blog_section h3",
        css: ".blog_section.max-w-7xl.mx-auto.rounded-sm.p-2.pb-3,.flex.flex-row.flex-wrap.items-center.text-center.justify-center{display:none!important;}",
        category: "hcomic"
    }, {
        name: "JavABC",
        host: ["javabc.club"],
        reg: /^https?:\/\/javabc\.club\/chapter\/\d+$/i,
        include: "#enc_img img",
        init: () => {
            fun.clearAllTimer();
            fun.remove("//div[@class='comicpage']/a[img] | //div[@class='comicpage']/div[script] | //div[@id='cp_img']/a[img] | //div[@id='cp_img']/div[script]");
        },
        imgs: async () => {
            await fun.getNP("#enc_img>div,#enc_img>img", "//a[text()='下一页'][@href]", null, ".fanye,.view-bottom-bar");
            return fun.gae("#enc_img img");
        },
        button: [4],
        insertImg: ["#enc_img", 2],
        customTitle: () => fun.ge(".comic-name") ? fun.gt(".comic-name") : _unsafeWindow.bookInfo.book_name,
        css: "img{opacity:1!important;}",
        category: "hcomic"
    }, {
        name: "桃心漫画",
        host: ["txcomic.com"],
        reg: /^https?:\/\/txcomic\.com\/chapter\/\d+$/i,
        include: "#enc_img img",
        init: () => fun.remove("//div[@class='comicpage']/a[img] | //div[@class='comicpage']/div[script] | //div[@id='cp_img']/a[img] | //div[@id='cp_img']/div[script]"),
        imgs: "#enc_img img",
        button: [4],
        insertImg: ["#enc_img", 2],
        autoDownload: [0],
        next: "//a[text()='下一章'][@href]",
        prev: "//a[text()='上一章'][@href]",
        customTitle: () => {
            const {
                bookInfo
            } = _unsafeWindow;
            return fun.ge(".title") ? fun.gt(".title") : bookInfo.book_name + " - " + bookInfo.chapter_name;
        },
        css: "#pubcdnModal{display:none!important;}",
        category: "hcomic"
    }, {
        name: "嘿嘿漫画",
        host: ["www.topcomic.online"],
        reg: /^https?:\/\/www\.topcomic\.online\/chapter\/\d+$/i,
        include: "#enc_img img",
        init: () => fun.clearAllTimer(),
        imgs: "#enc_img img",
        button: [4],
        insertImg: ["#enc_img", 2],
        autoDownload: [0],
        next: "//a[text()='下一章'][@href]",
        prev: "//a[text()='上一章'][@href]",
        customTitle: () => {
            const {
                bookInfo
            } = _unsafeWindow;
            return fun.ge(".title") ? fun.gt(".title") : bookInfo.book_name + " - " + bookInfo.chapter_name;
        },
        category: "hcomic"
    }, {
        name: "日本禁漫屋",
        host: ["javcomics.site"],
        reg: /^https?:\/\/javcomics\.site\/chapter\/\d+$/i,
        include: "#enc_img img",
        imgs: async () => {
            await fun.getNP("#enc_img>div,#enc_img>img", "//a[text()='下一页'][@href]", null, ".fanye,.view-bottom-bar");
            return fun.gae("#enc_img img");
        },
        button: [4],
        insertImg: ["#enc_img", 2],
        autoDownload: [0],
        next: "//a[text()='下一章'][@href]",
        prev: "//a[text()='上一章'][@href]",
        css: "img{opacity:1!important;}",
        category: "hcomic"
    }, {
        name: "顶漫漫画",
        host: ["www.viptoon.bond"],
        reg: /^https?:\/\/www\.viptoon\.bond\/chapter\/\d+$/i,
        include: "#enc_img img",
        init: () => fun.clearAllTimer(),
        imgs: "#enc_img img",
        button: [4],
        insertImg: ["#enc_img", 2],
        autoDownload: [0],
        next: "//a[text()='下一章'][@href]",
        prev: "//a[text()='上一章'][@href]",
        customTitle: () => {
            const {
                bookInfo
            } = _unsafeWindow;
            return fun.ge(".title") ? fun.gt(".title") : bookInfo.book_name + " - " + bookInfo.chapter_name;
        },
        category: "hcomic"
    }, {
        name: "有色漫画网",
        host: ["yousemanhua.com"],
        reg: /^https?:\/\/yousemanhua\.com\/index\.php\/chapter\/\d+$/i,
        imgs: "img[data-original]:not([data-original*='empty.png'])",
        button: [4],
        insertImg: [".rd-article-wr,.chapter_content", 2],
        autoDownload: [0],
        next: "//a[contains(@class,'j-rd-next')][@_href] | //a[div[span[contains(text(),'下一篇')]]]",
        prev: "//a[contains(@class,'j-rd-prev')][@_href] | //a[div[span[contains(text(),'上一篇')]]]",
        customTitle: async () => {
            if (fun.ge(".read__crumb")) {
                let arr = fun.gt(".read__crumb").split("  ");
                return arr[1] + " - " + arr[2];
            } else {
                let doc = await fun.fetchDoc(fun.gu(".nav_left>a"));
                return fun.title(" - 有色漫画", 0, doc) + " - " + fun.title(" - 有色漫画");
            }
        },
        category: "hcomic"
    }, {
        name: "污污漫畫",
        host: ["www.55comic.com", "www.comicbox.xyz", "www.wuwucomic.xyz"],
        reg: /^https?:\/\/(www\.55comic\.com|www\.comicbox\.xyz|www\.wuwucomic\.xyz)\/chapter\/\d+$/i,
        include: ".comiclist",
        init: () => fun.remove("//div[div[@class='CarouselView center']]"),
        imgs: async () => {
            let arr = [];
            await fun.aotoScrollEles(".comiclist div[data-src]", (ele) => {
                let canvas = fun.ge("canvas", ele);
                if (canvas) {
                    arr.push(canvas.toDataURL("image/jpeg"));
                    return true;
                }
                return false;
            });
            _unsafeWindow.scrollTo({
                top: 0
            });
            return arr.map(e => fun.dataURLtoBlobURL(e));
        },
        button: [4],
        insertImg: [".comicpage", 0],
        autoDownload: [0],
        next: "//a[text()='下一章']",
        prev: "//a[text()='上一章']",
        customTitle: ".title",
        fetch: 1,
        category: "hcomic"
    }, {
        name: "污污漫畫M",
        host: ["www.55comic.com", "www.comicbox.xyz"],
        reg: /^https?:\/\/(www\.55comic\.com|www\.comicbox\.xyz)\/chapter\/\d+$/i,
        include: "#cp_img",
        imgs: async () => {
            let arr = [];
            await fun.aotoScrollEles(".cropped[data-src]", (ele) => {
                let canvas = fun.ge("canvas", ele);
                if (canvas) {
                    arr.push(canvas.toDataURL("image/jpeg"));
                    return true;
                }
                return false;
            });
            _unsafeWindow.scrollTo({
                top: 0
            });
            return arr.map(e => fun.dataURLtoBlobURL(e));
        },
        button: [4],
        insertImg: ["#cp_img", 0],
        autoDownload: [0],
        next: "//a[text()='下一章']",
        prev: "//a[text()='上一章']",
        customTitle: () => fun.title(" - 污污漫畫"),
        fetch: 1,
        category: "hcomic"
    }, {
        name: "污污漫书/55漫書",
        host: ["www.55comics.com", "www.55manshu.com"],
        reg: [
            /^https?:\/\/www\.55comics\.com\/chapter\/\d+\.html$/,
            /^https?:\/\/www\.55manshu\.com\/chapter\/\d+\.html$/
        ],
        imgs: async () => {
            let max = fun.gt("//li[a[text()='下一页»' or text()='下一頁»']]", 2);
            let links = fun.arr(max).map((_, i) => i == 0 ? fun.url : fun.url + "?p=" + (i + 1));
            return fun.getImgA(".scramble-page img", links);
        },
        button: [4],
        insertImg: [
            [".scramble-page", 2, ".scramble-page"], 2
        ],
        insertImgAF: () => {
            let arr = ["//div[div[@class='ads']]", "//div[ul[ul[@class='pagination']]]"];
            fun.remove(arr);
        },
        autoDownload: [0],
        next: "//a[text()='下一话»' or text()='下一話»']",
        prev: "//a[text()='上一话»' or text()='上一話»']",
        customTitle: () => {
            let str = fun.gt(".chapter-left h1");
            let strArr = str.split(">");
            strArr = strArr.map(str => str.trim());
            return strArr[2] + " - " + strArr[3];
        },
        category: "hcomic"
    }, {
        name: "400漫画网",
        host: ["400manhua.com"],
        reg: /^https?:\/\/400manhua\.com\/chapter_\d+\.html$/i,
        include: ".rd-article-wr",
        init: () => fun.clearAllTimer(),
        imgs: ".rd-article-wr img",
        button: [4],
        insertImg: [".rd-article-wr", 2],
        autoDownload: [0],
        next: () => {
            let next = fun.ge(".j-rd-next[_href$='html']");
            return next ? location.origin + next.getAttribute("_href") : null;
        },
        prev: ".j-rd-prev",
        customTitle: () => fun.gt(".j-comic-title") + " - " + fun.gt(".last-crumb"),
        category: "hcomic"
    }, {
        name: "400漫画网M",
        host: ["400manhua.com"],
        reg: /^https?:\/\/400manhua\.com\/chapter_\d+\.html$/i,
        init: async () => {
            await fun.waitEle(".chapter-end[style]");
            fun.clearAllTimer();
        },
        imgs: ".comic-list img",
        button: [4],
        insertImg: [".comic-list", 2],
        autoDownload: [0],
        next: () => {
            let next = fun.ge(".next-chapter[_href$='html']");
            return next ? location.origin + next.getAttribute("_href") : null;
        },
        prev: "li.prev",
        customTitle: () => fun.gt("//p[@class='end-txt'][span[contains(text(),'阅读')]]").replace("您已阅读完:", "").replace("漫画", " - "),
        css: ".cnt-4,.comic-list~div[style],.cnt-4~div[style]{display:none!important;}",
        category: "hcomic"
    }, {
        name: "日韩漫画/歪歪漫画",
        host: ["www.diyihm.com", "www.lltoon.com", "www.rrtoon.com", "wwtoon.com", "www.zztoon.com", "www.vvtoon.com"],
        reg: /^https?:\/\/(www\.diyihm\.com|www\.(ll|rr)toon\.com|wwtoon\.com|www\.(zz|vv)toon\.com)\/view\/\d+\/\d+$/i,
        init: async () => {
            await fun.waitEle(".charpetBox img");
            let code = fun.gt("//script[contains(text(),'$(document).ready')]");
            let objStr = code.match(/window\.\w+\s?=\s?([^;]+)/)[1];;
            let json = JSON.parse(objStr);
            debug("\n此頁JSON資料\n", json);
            siteJson = json;
        },
        imgs: () => siteJson.volume.pages,
        button: [4, "24%", 3],
        insertImg: [".charpetBox", 2],
        autoDownload: [0],
        next: "#loadNextChapter",
        prev: "#loadPrevChapter",
        customTitle: () => siteJson.comic.title + " - " + siteJson.volume.title,
        css: ".letchepter[style*='20px']{display:none!important;}",
        category: "hcomic"
    }, {
        name: "嗨皮漫畫閱讀",
        host: ["m.happymh.com"],
        enable: 0,
        reg: /m\.happymh\.com\/reads/,
        include: "#root",
        exclude: ".no-js",
        fetchJson: (url = siteUrl) => {
            let [, , mangaCode, id] = new URL(url).pathname.split("/");
            let api = `/v2.0/apis/manga/read?code=${mangaCode}&cid=${id}&v=v2.13`;
            return fetch(api, {
                "headers": {
                    "accept": "application/json, text/plain, */*",
                    "x-requested-id": new Date().getTime(),
                    "x-requested-with": "XMLHttpRequest"
                }
            }).then(res => res.json());
        },
        init: async () => {
            let json = await _this.fetchJson();
            debug("\n此頁JSON資料\n", json);
            siteJson = json;
            fun.picPreload(json.data.scans.map(e => e.url), json.data.manga_name + " - " + json.data.chapter_name);
            if (await fun.waitEle("#page-area")) {
                new IntersectionObserver((entries, observer) => {
                    if (entries[0].isIntersecting) {
                        observer.unobserve(entries[0].target);
                        let f = ge("footer>article");
                        let item = ge("footer>article>div:nth-child(2)");
                        item.querySelectorAll("a").forEach(a => a.classList.add("MuiButton-containedPrimary"));
                        let p = gx("//a[span[text()='上一话' or text()='上一話'] and contains(@href,'reads')]");
                        if (p) p.classList.add("MuiButton-containedPrimary");
                        let n = gx("//a[span[text()='下一话' or text()='下一話'] and contains(@href,'readMore')]");
                        if (n) {
                            n.classList.remove("MuiButton-containedPrimary");
                            n.firstChild.innerText = "^_^感谢您的阅读~已经没有下一话了哦~";
                        }
                    }
                }).observe(ge('#page-area'));
            }
        },
        imgs: () => siteJson.status == 0 ? siteJson.data.scans.map(e => e.url.replace(/\?q=\d+/, "")) : [],
        referrerpolicy: "origin",
        button: [4],
        insertImg: ["//article[div[contains(@id,'imageLoader')]]", 3],
        autoDownload: [0],
        next: "//a[span[text()='下一話' or text()='下一话']][contains(@href,'reads')]",
        prev: "//a[span[text()='上一話' or text()='上一话']]",
        customTitle: () => siteJson.data.manga_name + " - " + siteJson.data.chapter_name,
        preloadNext: async (nextDoc, obj) => {
            let json = await obj.fetchJson(nextLink);
            json.status == 0 ? fun.picPreload(json.data.scans.map(e => e.url), json.data.manga_name + " - " + json.data.chapter_name, "next") : debug("預讀下一頁失敗");
        },
        css: "footer>article>div{padding: 0.5rem 0 !important}",
        category: "comic"
    }, {
        name: "嗨皮漫畫更新頁,自動點擊載入更多,鏈接新分頁打開",
        host: ["m.happymh.com"],
        reg: /m\.happymh\.com\/latest/,
        enable: 0,
        icon: 0,
        key: 0,
        observerClick: ".more-div-btn",
        openInNewTab: ".manga-cover>a:not([target=_blank])",
        category: "comic"
    }, {
        name: "嗨皮漫畫展開目錄",
        reg: /m\.happymh\.com\/manga\//,
        enable: 0,
        icon: 0,
        key: 0,
        init: () => {
            window.addEventListener("load", async () => {
                await fun.delay(1000, 0);
                if (fun.ge("//div[contains(text(),'给本王显示全部章节')]")) {
                    fun.ge('#expandButton').click();
                }
            });
        },
        category: "comic"
    }, {
        name: "嗨皮漫畫,鏈接新分頁打開",
        reg: /m\.happymh\.com\//,
        enable: 0,
        icon: 0,
        key: 0,
        openInNewTab: ".home-banner a:not([target=_blank]),.manga-rank a:not([target=_blank]),.manga-cover a:not([target=_blank])",
        category: "comic"
    }, {
        name: "COLAMANHUA", //方向鍵上一章下一章、反反偵錯,下載需先手動觸發全部載入圖片,圖址如為blob函式會使用到canvas需要繪製過程會有點卡。
        host: ["www.colamanga.com"],
        enable: 1,
        reg: /www\.colamanga\.com\/manga-.+\.html$/,
        init: () => {
            fun.clearAllTimer(1);
            if (autoScrollAllElement === 1) _this.scrollEle();
        },
        imgs: () => fun.ge(".mh_comicpic img[src^=blob]") ? fun.imgBlobArr(".mh_comicpic img[src^=blob]") : fun.gae(".mh_comicpic img[src]"),
        //scrollEle: [".mh_comicpic img", 600],
        scrollEle: () => fun.aotoScrollEles(".mh_comicpic", (ele) => isEle(fun.ge("img[src]", ele)), 10000),
        next: "//a[text()='下一章']",
        prev: "//a[text()='上一章']",
        customTitle: () => fun.title(" COLAMANGA", 1),
        threading: 10,
        css: ".mh_wrap{width:100%!important;min-width:100%!important}",
        category: "comic"
    }, {
        name: "COLAMANHUA 目錄鏈結新分頁開啟",
        reg: /^https?:\/\/www\.colamanga\.com\/manga-\w+\/$/,
        openInNewTab: ".all_data_list a:not([target=_blank])",
        category: "none"
    }, {
        name: "8Comic無限動漫",
        host: ["www.comicabc.com"],
        enable: 1,
        reg: () => /(a|www)\.(comicabc|twobili)\.com\/(ReadComic|online)/.test(fun.url) && comicInfiniteScrollMode != 1,
        frameCode: `
let code = [...document.scripts].find(s => s.innerHTML.includes("ge(e)")).innerHTML;
let [, keyCode] = code.match(/ge\\([^.]+\\.src\\s?=\\s?([^;]+)/);
let imgSrcArr = [];
for (let i = 1; i <= ps; i++) {
    let r = "(" + i + ")";
    let src = new Function("return " + keyCode.replace(/\\(pp?\\)/g, r))();
    imgSrcArr.push(src);
}
window.newImgs = imgSrcArr;
let next = document.querySelector("#nextvol:not([style])");
if (next && /ReadComic/.test(location.pathname)) {
    window.nextLink = location.origin + rp + ni + "/" + ni + (fz + fz).substr((3 * ni) % fz.length, 10) + ".html";
} else if (next) {
    window.nextLink = reurl("ch", ni);
} else {
    window.nextLink = null;
}
        `,
        init: () => {
            fun.script(_this.frameCode, 0, 1);
            fun.remove("//div[@class='text-center'] | //p[@class='text-center']");
            let x = fun.ge("#TheTable").parentNode;
            let e = fun.ge(".navtopbar2").cloneNode(true);
            x.parentNode.insertBefore(e, x.nextSibling);
        },
        imgs: () => _unsafeWindow.newImgs,
        button: [4],
        insertImg: ["//td[img[@id='TheImg']]", 2],
        autoDownload: [0],
        next: () => _unsafeWindow.nextLink,
        prev: "#prevvol",
        customTitle: () => fun.gt(".text-view-title", 1) + " - 第" + fun.gt("#lastchapter", 1) + "集",
        preloadNext: () => {
            if (!!_unsafeWindow.nextLink) {
                fun.iframe(_unsafeWindow.nextLink, {
                    waitVar: "ge",
                    waitEle: "#TheImg",
                    cb: async (dom, frame) => {
                        fun.script(_this.frameCode, 0, 1, dom);
                        fun.picPreload(frame.newImgs, "第" + frame.ch + "集", "next");
                    }
                });
            }
        },
        css: "td[style^=width],.view_gg_content{display:none!important}",
        infiniteScroll: true,
        category: "comic"
    }, {
        name: "8Comic無限動漫 自動翻頁",
        reg: () => /(a|www)\.(comicabc|twobili)\.com\/(ReadComic|online)/.test(fun.url) && comicInfiniteScrollMode == 1,
        frameCode: `
let code = [...document.scripts].find(s => s.innerHTML.includes("ge(e)")).innerHTML;
let [, keyCode] = code.match(/ge\\([^.]+\\.src\\s?=\\s?([^;]+)/);
let imgSrcArr = [];
for (let i = 1; i <= ps; i++) {
    let r = "(" + i + ")";
    let src = new Function("return " + keyCode.replace(/\\(pp?\\)/g, r))();
    imgSrcArr.push(src);
}
window.newImgs = imgSrcArr;
let next = document.querySelector("#nextvol:not([style])");
if (next && /ReadComic/.test(location.pathname)) {
    window.nextLink = location.origin + rp + ni + "/" + ni + (fz + fz).substr((3 * ni) % fz.length, 10) + ".html";
} else if (next) {
    window.nextLink = reurl("ch", ni);
} else {
    window.nextLink = null;
}
        `,
        init: async () => {
            fun.remove("//div[@class='text-center'] | //p[@class='text-center']");
            fun.script(_this.frameCode, 0, 1);
            let imgs = fun.createImgArray(frameWindow.newImgs);
            let tE = fun.ge("//td[img[@id='TheImg']]");
            tE.innerHTML = "";
            tE.append(...imgs);
            await fun.lazyload();
            _this.autoPager.preloadNextPage();
        },
        autoPager: {
            mode: 1,
            waitEle: "#TheImg",
            ele: () => fun.createImgArray(frameWindow.newImgs),
            pos: ["//td[img[@id='TheImg' or contains(@class,'FullPictureLoadImage')]]", 0],
            observer: "//td[img[@id='TheImg' or contains(@class,'FullPictureLoadImage')]]/img",
            next: () => frameWindow.nextLink,
            title: () => fun.gt(".text-view-title") + ` - 第${frameWindow.ch}集`,
            aF: () => {
                _unsafeWindow.ch = frameWindow.ch;
            },
            hide: "div:has(>.item_eps_top_bar),.comment_block",
            preloadNextPage: () => {
                if (!!frameWindow.nextLink) {
                    fun.iframe(frameWindow.nextLink, {
                        waitVar: "ge",
                        waitEle: "#TheImg",
                        cb: async (dom, frame) => {
                            fun.script(_this.frameCode, 0, 1, dom);
                            fun.picPreload(frame.newImgs, fun.gt(".text-view-title") + ` - 第${frame.ch}集`, "next");
                        }
                    });
                }
            }
        },
        css: "td[style^=width],.view_gg_content{display:none!important}",
        category: "comic autoPager"
    }, {
        name: "8Comic無限動漫 手機版",
        host: ["m.comicabc.com"],
        enable: 1,
        reg: () => /8\.twobili\.com\/comic\/insurance/.test(fun.url) && comicInfiniteScrollMode != 1,
        frameCode: `
let imgSrcArr = [];
for (let i = 1; i <= ps; i++) {
    let imgSrc = "https://img" + ss(c, 4, 2) + ".8comic.com/" + ss(c, 6, 1) + "/" + ti + "/" + ss(c, 0, 4) + "/" + nn([i]) + "_" + ss(c, mm([i]) + 10, 3, f) + ".jpg";
    imgSrcArr.push(imgSrc);
}
window.newImgs = imgSrcArr;
let next = document.querySelector("#nextvol:not([style])");
if (next) {
    window.nextLink = replaceurl("ch", ni);
} else {
    window.nextLink = null;
}
        `,
        init: () => {
            fun._8ComicM_UI();
            fun.script(_this.frameCode, 0, 1);
        },
        button: [4],
        imgs: () => _unsafeWindow.newImgs,
        button: [4],
        insertImg: ["//li[img[@id='TheImg']]", 2],
        autoDownload: [0],
        next: () => _unsafeWindow.nextLink,
        prev: "#prevvol",
        customTitle: (doc = document) => {
            let t = doc.title.split(" ")[0];
            let n = fun.gt("#chapter", 1, doc);
            return t + " - " + n;
        },
        preloadNext: () => {
            if (!!_unsafeWindow.nextLink) {
                fun.iframe(_unsafeWindow.nextLink, {
                    waitVar: "ge",
                    waitEle: "#TheImg",
                    cb: async (dom, frame) => {
                        fun.script(_this.frameCode, 0, 1, dom);
                        fun.picPreload(frame.newImgs, "第" + frame.ch + "集", "next");
                    }
                });
            }
        },
        css: ".pinch-zoom-container{height:auto !important;display:contents !important}.view_tmenu+div[style],#pagenum,[onclick^='j'],#pageindex,ico+a+.material-icons.right-logo,.cd-popup,.ls-link-div{display:none !important}.view_menut a{width:33.3% !important;max-width:33.3% !important}",
        infiniteScroll: true,
        category: "comic"
    }, {
        name: "8Comic無限動漫 手機版 自動翻頁",
        reg: () => /8\.twobili\.com\/comic\/insurance/.test(fun.url) && comicInfiniteScrollMode == 1,
        frameCode: `
let imgSrcArr = [];
for (let i = 1; i <= ps; i++) {
    let imgSrc = "https://img" + ss(c, 4, 2) + ".8comic.com/" + ss(c, 6, 1) + "/" + ti + "/" + ss(c, 0, 4) + "/" + nn([i]) + "_" + ss(c, mm([i]) + 10, 3, f) + ".jpg";
    imgSrcArr.push(imgSrc);
}
window.newImgs = imgSrcArr;
let next = document.querySelector("#nextvol:not([style])");
if (next) {
    window.nextLink = replaceurl("ch", ni);
} else {
    window.nextLink = null;
}
        `,
        init: async () => {
            fun._8ComicM_UI();
            fun.script(_this.frameCode, 0, 1);
            let imgs = fun.createImgArray(frameWindow.newImgs);
            let tE = fun.ge("//li[img[@id='TheImg']]");
            tE.innerHTML = "";
            tE.append(...imgs);
            await fun.lazyload();
            _this.autoPager.preloadNextPage();
        },
        autoPager: {
            mode: 1,
            waitEle: "#TheImg",
            ele: () => fun.createImgArray(frameWindow.newImgs),
            pos: ["//li[img[@id='TheImg' or contains(@class,'FullPictureLoadImage')]]", 0],
            observer: "//li[img[@id='TheImg' or contains(@class,'FullPictureLoadImage')]]/img",
            next: () => frameWindow.nextLink,
            title: () => "第" + frameWindow.ch + "集",
            aF: (dom) => {
                fun.gae("#chapter").forEach(e => (e.innerText = fun.ge("#chapter", dom).innerText));
                fun.gae("#nextname").forEach(e => (e.innerText = fun.ge("#nextname", dom).innerText));
                fun.gae("#prevname").forEach(e => (e.innerText = fun.ge("#prevname", dom).innerText));
                _unsafeWindow.ch = frameWindow.ch;
            },
            hide: ".book_inc_title",
            preloadNextPage: () => {
                if (!!frameWindow.nextLink) {
                    fun.iframe(frameWindow.nextLink, {
                        waitVar: "ge",
                        waitEle: "#TheImg",
                        cb: async (dom, frame) => {
                            fun.script(_this.frameCode, 0, 1, dom);
                            fun.picPreload(frame.newImgs, "第" + frame.ch + "集", "next");
                        }
                    });
                }
            }
        },
        css: ".pinch-zoom-container{height:auto !important;display:contents !important}.view_tmenu+div[style],#pagenum,[onclick^='j'],#pageindex,ico+a+.material-icons.right-logo,.cd-popup,.ls-link-div{display:none !important}.view_menut a{width:33.3% !important;max-width:33.3% !important}",
        category: "comic autoPager"
    }, {
        name: "Mangabz",
        host: ["www.mangabz.com", "mangabz.com"],
        enable: 1,
        reg: () => /^https?:\/\/(www\.)?mangabz\.com\/m\d+/.test(fun.url) && comicInfiniteScrollMode != 1,
        include: ".container",
        init: () => fun.MangabzUI(),
        imgs: (msg = 1) => {
            if (msg == 1) fun.showMsg(displayLanguage.str_05, 0);
            const {
                MANGABZ_IMAGE_COUNT,
                MANGABZ_CURL,
                MANGABZ_CID,
                MANGABZ_MID,
                MANGABZ_VIEWSIGN_DT,
                MANGABZ_VIEWSIGN
            } = _unsafeWindow;
            let fetchNum = 0;
            let resArr = fun.arr(MANGABZ_IMAGE_COUNT).map((_, i) => {
                let searchParams = new URLSearchParams({
                    cid: MANGABZ_CID,
                    page: i + 1,
                    key: "",
                    _cid: MANGABZ_CID,
                    _mid: MANGABZ_MID,
                    _dt: MANGABZ_VIEWSIGN_DT,
                    _sign: MANGABZ_VIEWSIGN
                });
                let apiUrl = `${MANGABZ_CURL}chapterimage.ashx?${searchParams}`;
                return fetch(apiUrl).then(res => res.text()).then(res => {
                    if (msg == 1) fun.showMsg(`${displayLanguage.str_06}(${fetchNum+=1}/${MANGABZ_IMAGE_COUNT})`, 0);
                    return fun.run(res)[0];
                });
            });
            return Promise.all(resArr).then(arr => {
                if (msg == 1) fun.hideMsg();
                return arr;
            });
        },
        button: [4],
        insertImg: ["#cp_img", 2],
        autoDownload: [0],
        next: "//a[img[contains(@src,'xiayizhang')]][starts-with(@href,'/m')]",
        prev: "//a[img[contains(@src,'shangyizhang')]][starts-with(@href,'/m')]",
        customTitle: (doc = document) => fun.title("_", 2, doc).replace("漫畫", ""),
        preloadNext: async (nextDoc, obj) => {
            let code = fun.gst("MANGABZ_IMAGE_COUNT", nextDoc);
            fun.script(code, 0, 1);
            fun.picPreload(await obj.imgs(0), obj.customTitle(nextDoc), "next");
        },
        css: "#FullPictureLoadEnd{color:rgb(255, 255, 255)}a[href^='j']{display:none !important}body{overflow:unset!important}",
        infiniteScroll: true,
        category: "comic"
    }, {
        name: "Mangabz 自動翻頁",
        reg: () => /^https?:\/\/(www\.)?mangabz\.com\/m\d+/.test(fun.url) && comicInfiniteScrollMode == 1,
        include: ".container",
        getSrcs: (dom) => {
            let code = fun.gst("MANGABZ_IMAGE_COUNT", dom);
            let imagesNum = code.match(/MANGABZ_IMAGE_COUNT[\s\=]+(\d+)/)[1];
            let chapterURL = code.match(/MANGABZ_CURL[\s\="]+([^"]+)/)[1];
            let cid = code.match(/MANGABZ_CID[\s\=]+(\d+)/)[1];
            let mid = code.match(/MANGABZ_MID[\s\=]+(\d+)/)[1];
            let dt = encodeURIComponent(code.match(/MANGABZ_VIEWSIGN_DT[\s\="]+([^"]+)/)[1]);
            let sing = code.match(/MANGABZ_VIEWSIGN[\s\="]+([^"]+)/)[1];
            let resArr = [];
            for (let i = 1; i <= imagesNum; i++) {
                let searchParams = new URLSearchParams({
                    cid: cid,
                    page: i,
                    key: "",
                    _cid: cid,
                    _mid: mid,
                    _dt: dt,
                    _sign: sing
                });
                let api = `${chapterURL}chapterimage.ashx?${searchParams}`;
                let res = fetch(api).then(res => res.text()).then(text => {
                    let srcArr = fun.run(text);
                    return srcArr[0];
                });
                resArr.push(res);
            }
            return Promise.all(resArr);
        },
        getImgs: async (dom = document) => {
            let srcs = await _this.getSrcs(dom);
            return fun.createImgArray(srcs);
        },
        init: async () => {
            fun.MangabzUI();
            fun.showMsg("自動翻頁初始化中...", 0);
            await _this.getImgs().then(async imgs => {
                let tE = fun.ge("#cp_img");
                tE.innerHTML = "";
                tE.append(...imgs);
                fun.hideMsg();
                await fun.lazyload();
                _this.autoPager.preloadNextPage();
            });
        },
        autoPager: {
            ele: (dom) => _this.getImgs(dom),
            pos: ["#cp_img", 0],
            observer: "#cp_img>img",
            next: "//a[img[contains(@src,'xiayizhang')]][starts-with(@href,'/m')]",
            re: ".container",
            title: (dom) => {
                let code = fun.gst("MANGABZ_CTITLE", dom);
                let title = code.match(/MANGABZ_CTITLE[\s\="]+([^"]+)/)[1];
                return title;
            },
            preloadNextPage: (dom) => {
                let next = fun.ge(_this.autoPager.next, dom, dom);
                if (!!next) {
                    fun.fetchDoc(next.href).then(async nextDoc => {
                        let srcs = await _this.getSrcs(nextDoc);
                        let text = _this.autoPager.title(nextDoc);
                        fun.picPreload(srcs, text, "next");
                    });
                }
            }
        },
        css: "a[href^='j']{display:none !important}body{overflow:unset!important}",
        category: "comic autoPager"
    }, {
        name: "Xmanhua",
        host: ["www.xmanhua.com", "xmanhua.com"],
        enable: 1,
        reg: () => /^https?:\/\/(www\.)?xmanhua\.com\/m\d+/.test(fun.url) && comicInfiniteScrollMode != 1,
        include: ".reader-bottom-page-list",
        init: () => fun.XmanhuaUI(),
        imgs: (msg = 1) => {
            if (msg == 1) fun.showMsg(displayLanguage.str_05, 0);
            const {
                XMANHUA_IMAGE_COUNT,
                XMANHUA_CURL,
                XMANHUA_CID,
                XMANHUA_MID,
                XMANHUA_VIEWSIGN_DT,
                XMANHUA_VIEWSIGN
            } = _unsafeWindow;
            let fetchnUm = 0;
            let resArr = fun.arr(XMANHUA_IMAGE_COUNT).map((_, i) => {
                let searchParams = new URLSearchParams({
                    cid: XMANHUA_CID,
                    page: i + 1,
                    key: "",
                    _cid: XMANHUA_CID,
                    _mid: XMANHUA_MID,
                    _dt: XMANHUA_VIEWSIGN_DT,
                    _sign: XMANHUA_VIEWSIGN
                });
                let apiUrl = `${XMANHUA_CURL}chapterimage.ashx?${searchParams}`;
                return fetch(apiUrl).then(res => res.text()).then(res => {
                    if (msg == 1) fun.showMsg(`${displayLanguage.str_06}(${fetchnUm+=1}/${XMANHUA_IMAGE_COUNT})`, 0);
                    return fun.run(res)[0];
                });
            });
            return Promise.all(resArr).then(arr => {
                if (msg == 1) fun.hideMsg();
                return arr;
            });
        },
        button: [4],
        insertImg: ["#cp_img", 2],
        autoDownload: [0],
        next: "//a[img[contains(@src,'reader-bottom-right-2')]][starts-with(@href,'/m')]",
        prev: "//a[img[contains(@src,'reader-bottom-right-1')]][starts-with(@href,'/m')]",
        customTitle: (doc = document) => fun.title("_", 2, doc).replace("漫畫", ""),
        preloadNext: async (nextDoc, obj) => {
            let code = fun.gst("XMANHUA_IMAGE_COUNT", nextDoc);
            fun.script(code, 0, 1);
            fun.picPreload(await obj.imgs(0), obj.customTitle(nextDoc), "next");
        },
        css: "#FullPictureLoadEnd{color:rgb(255, 255, 255)}.relative>a{display:none!important}.reader-img-con{padding:64px 0 50px !important;}",
        infiniteScroll: true,
        category: "comic"
    }, {
        name: "Xmanhua 自動翻頁",
        reg: () => /^https?:\/\/(www\.)?xmanhua\.com\/m\d+/.test(fun.url) && comicInfiniteScrollMode == 1,
        include: ".reader-bottom-page-list",
        getSrcs: (dom) => {
            let code = fun.gst("XMANHUA_IMAGE_COUNT", dom);
            let imagesNum = code.match(/XMANHUA_IMAGE_COUNT[\s\=]+(\d+)/)[1];
            let chapterURL = code.match(/XMANHUA_CURL[\s\="]+([^"]+)/)[1];
            let cid = code.match(/XMANHUA_CID[\s\=]+(\d+)/)[1];
            let mid = code.match(/XMANHUA_MID[\s\=]+(\d+)/)[1];
            let dt = encodeURIComponent(code.match(/XMANHUA_VIEWSIGN_DT[\s\="]+([^"]+)/)[1]);
            let sing = code.match(/XMANHUA_VIEWSIGN[\s\="]+([^"]+)/)[1];
            let resArr = [];
            for (let i = 1; i <= imagesNum; i++) {
                let searchParams = new URLSearchParams({
                    cid: cid,
                    page: i,
                    key: "",
                    _cid: cid,
                    _mid: mid,
                    _dt: dt,
                    _sign: sing
                });
                let api = `${chapterURL}chapterimage.ashx?${searchParams}`;
                let res = fetch(api).then(res => res.text()).then(text => {
                    let srcArr = fun.run(text);
                    return srcArr[0];
                });
                resArr.push(res);
            }
            return Promise.all(resArr)
        },
        getImgs: async (dom = document) => {
            let srcs = await _this.getSrcs(dom);
            return fun.createImgArray(srcs);
        },
        init: async () => {
            fun.XmanhuaUI();
            fun.showMsg("自動翻頁初始化中...", 0);
            await _this.getImgs().then(async imgs => {
                let tE = fun.ge("#cp_img");
                tE.innerHTML = "";
                tE.append(...imgs);
                fun.hideMsg();
                await fun.lazyload();
                _this.autoPager.preloadNextPage();
            });
        },
        autoPager: {
            ele: (dom) => _this.getImgs(dom),
            pos: ["#cp_img", 0],
            observer: "#cp_img>img",
            next: "//a[img[contains(@src,'reader-bottom-right-2')]][starts-with(@href,'/m')]",
            re: ".container",
            title: (dom) => {
                let code = fun.gst("XMANHUA_CTITLE", dom);
                let title = code.match(/XMANHUA_CTITLE[\s\="]+([^"]+)/)[1];
                return title;
            },
            preloadNextPage: (dom) => {
                let next = fun.ge(_this.autoPager.next, dom, dom);
                if (!!next) {
                    fun.fetchDoc(next.href).then(async nextDoc => {
                        let srcs = await _this.getSrcs(nextDoc);
                        let text = _this.autoPager.title(nextDoc);
                        fun.picPreload(srcs, text, "next");
                    });
                }
            }
        },
        css: ".relative>a{display:none!important}.reader-img-con{padding:64px 0 50px !important;}",
        category: "comic autoPager"
    }, {
        name: "DM5/極速 分頁模式",
        host: ["www.dm5.com", "m.dm5.com", "www.dm5.cn", "m.dm5.cn", "en.dm5.com", "cnc.dm5.com", "hk.dm5.com", "www.1kkk.com", "m.1kkk.com", "tel.1kkk.com", "en.1kkk.com", "cnc.1kkk.com", "hk.1kkk.com"],
        enable: 1,
        reg: () => /^https?:\/\/(www|tel|en|cnc|hk|m)?\.?(dm5|1kkk)\.(com|cn)\/(m|ch|vol|other)[-_0-9p]+\//.test(fun.url) && comicInfiniteScrollMode != 1,
        include: "#chapterpager",
        imgs: (msg = 1) => {
            if (msg == 1) fun.showMsg(displayLanguage.str_05, 0);
            const {
                DM5_IMAGE_COUNT,
                DM5_CURL,
                DM5_CID,
                DM5_MID,
                DM5_VIEWSIGN_DT,
                DM5_VIEWSIGN
            } = _unsafeWindow;
            let fetchNum = 0;
            let keyE = fun.ge("#dm5_key");
            let key = keyE.value;
            let resArr = fun.arr(DM5_IMAGE_COUNT).map((_, i) => {
                let searchParams = new URLSearchParams({
                    cid: DM5_CID,
                    page: i + 1,
                    key: key,
                    language: 1,
                    gtk: 6,
                    _cid: DM5_CID,
                    _mid: DM5_MID,
                    _dt: DM5_VIEWSIGN_DT,
                    _sign: DM5_VIEWSIGN
                });
                let api = `${DM5_CURL}chapterfun.ashx?${searchParams}`;
                return fetch(api).then(res => res.text()).then(res => {
                    if (msg == 1) fun.showMsg(`${displayLanguage.str_06}(${fetchNum+=1}/${DM5_IMAGE_COUNT})`, 0);
                    return fun.run(res)[0];
                });
            });
            return Promise.all(resArr).then(arr => {
                if (msg == 1) fun.hideMsg();
                return arr;
            });
        },
        button: [4],
        insertImg: ["#cp_img", 2],
        autoDownload: [0],
        next: "//a[text()='下一章']",
        prev: "//a[text()='上一章']",
        customTitle: (doc = document) => fun.title("_", 2, doc),
        preloadNext: async (nextDoc, obj) => {
            let code = fun.gst("DM5_IMAGE_COUNT", nextDoc);
            fun.script(code, 0, 1);
            fun.picPreload(await obj.imgs(0), obj.customTitle(nextDoc), "next");
        },
        topButton: true,
        css: "body{overflow:unset!important}",
        infiniteScroll: true,
        category: "comic"
    }, {
        name: "DM5/極速 分頁模式 自動翻頁",
        reg: () => /^https?:\/\/(www|tel|en|cnc|hk|m)?\.?(dm5|1kkk)\.(com|cn)\/(m|ch|vol|other)[-_0-9p]+\//.test(fun.url) && comicInfiniteScrollMode == 1,
        include: "#chapterpager",
        getSrcs: (dom) => {
            let code = fun.gst("DM5_IMAGE_COUNT", dom);
            let imagesNum = code.match(/DM5_IMAGE_COUNT[\s\=]+(\d+)/)[1];
            let chapterURL = code.match(/DM5_CURL[\s\="]+([^"]+)/)[1];
            let cid = code.match(/DM5_CID[\s\=]+(\d+)/)[1];
            let mid = code.match(/DM5_MID[\s\=]+(\d+)/)[1];
            let dt = code.match(/DM5_VIEWSIGN_DT[\s\="]+([^"]+)/)[1];
            let sing = code.match(/DM5_VIEWSIGN[\s\="]+([^"]+)/)[1];
            let keyE = fun.ge("#dm5_key");
            let key = keyE.value;
            let resArr = [];
            for (let i = 1; i <= imagesNum; i++) {
                let searchParams = new URLSearchParams({
                    cid: cid,
                    page: i,
                    key: key,
                    language: 1,
                    gtk: 6,
                    _cid: cid,
                    _mid: mid,
                    _dt: dt,
                    _sign: sing
                });
                let api = `${chapterURL}chapterfun.ashx?${searchParams}`;
                let res = fetch(api).then(res => res.text()).then(text => {
                    let srcArr = fun.run(text);
                    return srcArr[0];
                });
                resArr.push(res);
            }
            return Promise.all(resArr)
        },
        getImgs: async (dom = document) => {
            let srcs = await _this.getSrcs(dom);
            return fun.createImgArray(srcs)
        },
        init: async () => {
            fun.showMsg("自動翻頁初始化中...", 0);
            await _this.getImgs().then(async imgs => {
                let tE = fun.ge("#cp_img");
                tE.innerHTML = "";
                tE.append(...imgs);
                fun.hideMsg();
                await fun.lazyload();
                _this.autoPager.preloadNextPage();
            });
        },
        autoPager: {
            ele: (dom) => _this.getImgs(dom),
            pos: ["#cp_img", 0],
            observer: "#cp_img>img",
            next: "//a[text()='下一章']",
            re: ".active.right-arrow,.view-paging",
            title: (dom) => fun.gt(".title", 1, dom).replace("首页 ", ""),
            hide: ".view-comment",
            preloadNextPage: (dom) => {
                let next = fun.ge(_this.autoPager.next, dom, dom);
                if (!!next) {
                    fun.fetchDoc(next.href).then(async nextDoc => {
                        let srcs = await _this.getSrcs(nextDoc);
                        let text = _this.autoPager.title(nextDoc).replace(/\s+/g, " ").trim();
                        fun.picPreload(srcs, text, "next");
                    });
                }
            }
        },
        css: "body{overflow:unset!important}a[href^='javascript:Show'],.chapterpager{display:none!important;}",
        category: "comic autoPager"
    }, {
        name: "DM5/極速 條漫模式",
        host: ["www.dm5.com", "m.dm5.com", "www.dm5.cn", "m.dm5.cn", "en.dm5.com", "cnc.dm5.com", "hk.dm5.com", "www.1kkk.com", "m.1kkk.com", "tel.1kkk.com", "en.1kkk.com", "cnc.1kkk.com", "hk.1kkk.com"],
        enable: 1,
        reg: () => /^https?:\/\/(www|tel|en|cnc|hk|m)?\.?(dm5|1kkk)\.(com|cn)\/(m|ch|vol|other)[-_0-9]+\//.test(fun.url) && comicInfiniteScrollMode != 1,
        include: ["#barChapter"],
        imgs: "#barChapter>img",
        button: [4],
        insertImg: ["#barChapter", 2],
        autoDownload: [0],
        next: "//a[text()='下一章']",
        prev: "//a[text()='上一章']",
        customTitle: (doc = document) => fun.title("_", 2, doc),
        preloadNext: (nextDoc, obj) => fun.picPreload(fun.getImgSrcArr(obj.imgs, nextDoc), obj.customTitle(nextDoc), "next"),
        css: "body{overflow:unset!important}",
        infiniteScroll: true,
        category: "comic"
    }, {
        name: "DM5/極速 條漫模式 自動翻頁",
        reg: () => /^https?:\/\/(www|tel|en|cnc|hk|m)?\.?(dm5|1kkk)\.(com|cn)\/(m|ch|vol|other)[-_0-9]+\//.test(fun.url) && comicInfiniteScrollMode == 1,
        include: ["#barChapter"],
        getSrcs: (dom) => fun.gae("img.load-src[data-src]", dom).map(e => e.dataset.src),
        getImgs: (dom = document) => {
            let srcs = _this.getSrcs(dom);
            return fun.createImgArray(srcs);
        },
        init: async () => {
            let imgs = _this.getImgs();
            let tE = fun.ge("#barChapter");
            tE.innerHTML = "";
            tE.append(...imgs);
            await fun.lazyload();
            _this.autoPager.preloadNextPage();
        },
        autoPager: {
            ele: (dom) => _this.getImgs(dom),
            pos: ["#barChapter", 0],
            observer: "#barChapter>img",
            next: "//a[text()='下一章']",
            re: ".view-paging",
            title: (dom) => fun.gt(".title", 1, dom).replace("首页 ", ""),
            hide: ".view-comment",
            preloadNextPage: (dom) => {
                let next = fun.ge(_this.autoPager.next, dom, dom);
                if (!!next) {
                    fun.fetchDoc(next.href).then(async nextDoc => {
                        let srcs = await _this.getSrcs(nextDoc);
                        let text = _this.autoPager.title(nextDoc).replace(/\s+/g, " ").trim();
                        fun.picPreload(srcs, text, "next");
                    });
                }
            }
        },
        css: "body{overflow:unset!important}",
        category: "comic autoPager"
    }, {
        name: "YYMANGA",
        enable: 1,
        host: ["www.yymanhua.com", "yymanhua.com"],
        reg: () => /(www\.)?yymanhua\.com\/m\d+/.test(fun.url) && comicInfiniteScrollMode != 1,
        include: ".reader-bottom-page-list",
        init: () => fun.XmanhuaUI(),
        imgs: (msg = 1) => {
            if (msg == 1) fun.showMsg(displayLanguage.str_05, 0);
            const {
                YYMANHUA_IMAGE_COUNT,
                YYMANHUA_CURL,
                YYMANHUA_CID,
                YYMANHUA_MID,
                YYMANHUA_VIEWSIGN_DT,
                YYMANHUA_VIEWSIGN
            } = _unsafeWindow;
            let fetchnUm = 0;
            let resArr = fun.arr(YYMANHUA_IMAGE_COUNT).map((_, i) => {
                let searchParams = new URLSearchParams({
                    cid: YYMANHUA_CID,
                    page: i + 1,
                    key: "",
                    _cid: YYMANHUA_CID,
                    _mid: YYMANHUA_MID,
                    _dt: YYMANHUA_VIEWSIGN_DT,
                    _sign: YYMANHUA_VIEWSIGN
                });
                let apiUrl = `${YYMANHUA_CURL}chapterimage.ashx?${searchParams}`;
                return fetch(apiUrl).then(res => res.text()).then(res => {
                    if (msg == 1) fun.showMsg(`${displayLanguage.str_06}(${fetchnUm+=1}/${YYMANHUA_IMAGE_COUNT})`, 0);
                    return fun.run(res)[0];
                });
            });
            return Promise.all(resArr).then(arr => {
                if (msg == 1) fun.hideMsg();
                return arr;
            });
        },
        button: [4],
        insertImg: ["#cp_img", 2],
        autoDownload: [0],
        next: "//a[img[contains(@src,'reader-bottom-right-2')]][starts-with(@href,'/m')]",
        prev: "//a[img[contains(@src,'reader-bottom-right-1')]][starts-with(@href,'/m')]",
        customTitle: (doc = document) => fun.title("_", 2, doc).replace("漫畫", ""),
        preloadNext: async (nextDoc, obj) => {
            let code = fun.gst("YYMANHUA_IMAGE_COUNT", nextDoc);
            fun.script(code, 0, 1);
            fun.picPreload(await obj.imgs(0), obj.customTitle(nextDoc), "next");
        },
        css: "#FullPictureLoadEnd{color:rgb(255, 255, 255)}.relative>a{display:none!important}.reader-img-con{padding:64px 0 50px !important;}",
        infiniteScroll: true,
        category: "comic"
    }, {
        name: "YYMANGA 自動翻頁",
        reg: () => /(www\.)?yymanhua\.com\/m\d+/.test(fun.url) && comicInfiniteScrollMode == 1,
        include: ".reader-bottom-page-list",
        getSrcs: (dom) => {
            let code = fun.gst("YYMANHUA_IMAGE_COUNT", dom);
            let imagesNum = code.match(/YYMANHUA_IMAGE_COUNT[\s\=]+(\d+)/)[1];
            let chapterURL = code.match(/YYMANHUA_CURL[\s\="]+([^"]+)/)[1];
            let cid = code.match(/YYMANHUA_CID[\s\=]+(\d+)/)[1];
            let mid = code.match(/YYMANHUA_MID[\s\=]+(\d+)/)[1];
            let dt = encodeURIComponent(code.match(/YYMANHUA_VIEWSIGN_DT[\s\="]+([^"]+)/)[1]);
            let sing = code.match(/YYMANHUA_VIEWSIGN[\s\="]+([^"]+)/)[1];
            let resArr = [];
            for (let i = 1; i <= imagesNum; i++) {
                let searchParams = new URLSearchParams({
                    cid: cid,
                    page: i,
                    key: "",
                    _cid: cid,
                    _mid: mid,
                    _dt: dt,
                    _sign: sing
                });
                let api = `${chapterURL}chapterimage.ashx?${searchParams}`;
                let res = fetch(api).then(res => res.text()).then(text => {
                    let srcArr = fun.run(text);
                    return srcArr[0];
                });
                resArr.push(res);
            }
            return Promise.all(resArr)
        },
        getImgs: async (dom = document) => {
            let srcs = await _this.getSrcs(dom);
            return fun.createImgArray(srcs);
        },
        init: async () => {
            fun.XmanhuaUI();
            fun.showMsg("自動翻頁初始化中...", 0);
            await _this.getImgs().then(async imgs => {
                let tE = fun.ge("#cp_img");
                tE.innerHTML = "";
                tE.append(...imgs);
                fun.hideMsg();
                await fun.lazyload();
                _this.autoPager.preloadNextPage();
            });
        },
        autoPager: {
            ele: (dom) => _this.getImgs(dom),
            pos: ["#cp_img", 0],
            observer: "#cp_img>img",
            next: "//a[img[contains(@src,'reader-bottom-right-2')]][starts-with(@href,'/m')]",
            re: ".container",
            title: (dom) => {
                let code = fun.gst("YYMANHUA_CTITLE", dom);
                let title = code.match(/YYMANHUA_CTITLE[\s\="]+([^"]+)/)[1];
                return title;
            },
            preloadNextPage: (dom) => {
                let next = fun.ge(_this.autoPager.next, dom, dom);
                if (!!next) {
                    fun.fetchDoc(next.href).then(async nextDoc => {
                        let srcs = await _this.getSrcs(nextDoc);
                        let text = _this.autoPager.title(nextDoc);
                        fun.picPreload(srcs, text, "next");
                    });
                }
            }
        },
        css: ".relative>a{display:none!important}.reader-img-con{padding:64px 0 50px !important;}",
        category: "comic autoPager"
    }, {
        name: "DM5/極速/Mangabz/Xmanhua/yymanhua/漫画人/漫本 手機版",
        host: ["www.dm5.com", "m.dm5.com", "www.dm5.cn", "m.dm5.cn", "en.dm5.com", "cnc.dm5.com", "hk.dm5.com", "www.1kkk.com", "m.1kkk.com", "tel.1kkk.com", "en.1kkk.com", "cnc.1kkk.com", "hk.1kkk.com", "www.mangabz.com", "mangabz.com", "www.xmanhua.com", "xmanhua.com", "www.yymanhua.com", "yymanhua.com", "www.manben.com", "www.manhuaren.com"],
        enable: 1,
        reg: () => /(www|tel|en|cnc|hk|m)?\.?(dm5|1kkk|mangabz|xmanhua|yymanhua|manhuaren|manben)\.(com|cn)\/(m|ch|vol|other)?[-_0-9]+\//.test(fun.url) && comicInfiniteScrollMode != 1,
        delay: 300,
        include: "//script[contains(text(),'newImgs')]",
        init: () => {
            if (fun.gae(".view-bottom-bar>li").length == 4) {
                fun.css(".view-bottom-bar>li:nth-child(n+2):nth-child(-n+3){display:none!important}.view-bottom-bar li{width:50%!important}");
            }
        },
        imgs: () => _unsafeWindow.newImgs,
        button: [4],
        insertImg: ["#cp_img,.main_img,#comicContain,.comic-list", 2],
        autoDownload: [0],
        next: () => {
            let next = fun.ge("//a[text()='下一章'] | //a[img[@alt='下一章']]");
            if (next) return /pushHistory/.test(next.href) ? location.origin + next.href.split("'")[1] : next.href;
            return null;
        },
        prev: "//a[text()='上一章'] | //a[img[@alt='上一章']]",
        customTitle: (doc = document) => {
            let host = fun.lh;
            if (/dm5|manhuaren|1kkk|mangabz|xmanhua|yymanhua/.test(host) && !/sixmanhua/.test(host)) {
                return fun.title("_", 2, doc);
            } else if (/sixmanhua/.test(host)) {
                return fun.title("_", 3, doc);
            } else if (/manben/.test(host)) {
                if (fun.ge("#comicTitle")) {
                    return fun.gt("#chapter", 1, doc) + " " + fun.gt(".title-comicHeading", 1, doc);
                } else {
                    return fun.title(" ", 2, doc);
                }
            }
        },
        preloadNext: async (nextDoc, obj) => {
            let code = fun.gst("newImgs", nextDoc);
            fun.script(code, 0, 1);
            fun.picPreload(obj.imgs(), obj.customTitle(nextDoc), "next");
        },
        infiniteScroll: true,
        category: "comic"
    }, {
        name: "DM5/極速/Mangabz/Xmanhua/yymanhua/漫画人/漫本 手機版 自動翻頁",
        reg: () => /(www|tel|en|cnc|hk|m)?\.?(dm5|1kkk|mangabz|xmanhua|yymanhua|manhuaren|manben)\.(com|cn)\/(m|ch|vol|other)?[-_0-9]+\//.test(fun.url) && comicInfiniteScrollMode == 1,
        delay: 300,
        include: "//script[contains(text(),'newImgs')]",
        getSrcs: (dom) => {
            let code = fun.gst("newImgs", dom);
            code = code.replace("eval", "");
            let text = fun.run(code);
            let arrText = text.replace(/var newImgs=|;$/g, "");
            let srcs = fun.run(arrText);
            return srcs;
        },
        getImgs: (dom = document) => {
            let srcs = _this.getSrcs(dom);
            return fun.createImgArray(srcs);
        },
        init: async () => {
            let imgs = _this.getImgs();
            let tE = fun.ge("#cp_img");
            tE.innerHTML = "";
            tE.append(...imgs);
            await fun.lazyload();
            _this.autoPager.preloadNextPage();
            if (fun.gae(".view-bottom-bar>li").length == 4) {
                fun.css(".view-bottom-bar>li:nth-child(n+2):nth-child(-n+3){display:none!important}.view-bottom-bar li{width:50%!important}");
            }
            let b = fun.ge("body.viewbody");
            if (fun.lh.includes("mangabz") && b) {
                b.innerHTML = b.innerHTML.replace("<!--", "").replace("-->", "");
                $(".top-bar-tool").removeAttr("style");
                $(".bottom-bar").removeAttr("style");
                const showtoolbar = () => {
                    let t = fun.ge("body.toolbar");
                    if (t) {
                        $("body").removeClass("toolbar");
                    } else {
                        $('body').addClass("toolbar");
                    }
                };
                document.addEventListener('click', showtoolbar);
            }
        },
        autoPager: {
            ele: (dom) => _this.getImgs(dom),
            pos: ["#cp_img", 0],
            observer: "#cp_img>img",
            next: (dom) => {
                let next = fun.ge("//a[text()='下一章'] | //a[img[@alt='下一章']]", dom, dom);
                if (next) {
                    let url = /pushHistory/.test(next.href) ? fun.lo + next.href.split("'")[1] : next.href;
                    if (!/-end/.test(url)) {
                        return url;
                    }
                }
                return null;
            },
            re: ".view-fix-top-bar-title,.top-title,.view-bottom-bar,.view-fix-bottom-bar,.bottom-bar-tool",
            title: (dom) => {
                let tt = fun.gt(".top-title", 1, dom);
                if (fun.lh.includes("xmanhua") && tt) {
                    return tt.replaceAll("?", "-").replace("XManhua-", "");
                } else if (fun.lh.includes("mangabz") && tt) {
                    return tt.replaceAll("?", "-").replace("Mangabz-", "");
                } else if (fun.lh.includes("yymanhua") && tt) {
                    return tt.replaceAll("?", "-").replace("YYManhua-", "");
                }
                return dom.title.replace(/,?_在线漫画.+/, "").replace("漫画", "").replace(/^[^_]+_/, "");
            },
            bF: (dom) => {
                let b = fun.ge("body.viewbody", dom);
                if (fun.lh.includes("mangabz") && b) {
                    b.innerHTML = b.innerHTML.replace("<!--", "").replace("-->", "");
                }
            },
            preloadNextPage: (dom) => {
                let next = _this.autoPager.next(dom);
                if (!!next) {
                    fun.fetchDoc(next).then(async nextDoc => {
                        let srcs = await _this.getSrcs(nextDoc);
                        let text = _this.autoPager.title(nextDoc);
                        fun.picPreload(srcs, text, "next");
                    });
                }
            }
        },
        category: "comic autoPager"
    }, {
        name: "mh234",
        host: ["mh234.top"],
        enable: 0,
        reg: /^https?:\/\/mh234\.top\/m\d+\//,
        include: ".container",
        imgs: (msg = 1) => {
            if (msg == 1) fun.showMsg(displayLanguage.str_05, 0);
            let fetchNum = 0;
            const {
                MH234_IMAGE_COUNT,
                MH234_CURL,
                MH234_CID,
                MH234_MID,
                MH234_VIEWSIGN_DT,
                MH234_VIEWSIGN
            } = _unsafeWindow;
            let resArr = fun.arr(MH234_IMAGE_COUNT).map((_, i) => {
                let searchParams = new URLSearchParams({
                    cid: MH234_CID,
                    page: i + 1,
                    key: "",
                    _cid: MH234_CID,
                    _mid: MH234_MID,
                    _dt: MH234_VIEWSIGN_DT,
                    _sign: MH234_VIEWSIGN
                });
                let apiUrl = `${MH234_CURL}chapterimage.ashx?${searchParams}`;
                return fetch(apiUrl).then(res => res.text()).then(res => {
                    if (msg == 1) fun.showMsg(`${displayLanguage.str_06}(${fetchNum+=1}/${MH234_IMAGE_COUNT})`, 0);
                    return fun.run(res)[0];
                });
            });
            return Promise.all(resArr).then(arr => {
                if (msg == 1) fun.hideMsg();
                return arr;
            });
        },
        button: [4],
        insertImg: ["#cp_img", 2],
        autoDownload: [0],
        next: "//a[img[contains(@src,'xiayizhang')]][starts-with(@href,'/m')]",
        prev: "//a[img[contains(@src,'shangyizhang')]][starts-with(@href,'/m')]",
        customTitle: (doc = document) => fun.title("_", 2, doc).replace("漫畫", ""),
        preloadNext: async (nextDoc, obj) => {
            let code = fun.gst("MH234_IMAGE_COUNT", nextDoc);
            fun.script(code, 0, 1);
            fun.picPreload(await obj.imgs(0), obj.customTitle(nextDoc), "next");
        },
        css: "#FullPictureLoadEnd{color:rgb(255, 255, 255)}a[href^='j']{display:none !important}body{overflow:unset!important}",
        category: "comic"
    }, {
        name: "动漫之家M",
        host: ["m.idmzj.com"],
        enable: 0,
        //reg: () => /m\.i?dmzj\.com\/view\/\d+\/\d+\.html/.test(fun.url) && comicInfiniteScrollMode != 1,
        reg: /m\.i?dmzj\.com\/view\/\d+\/\d+\.html/,
        init: "$('body').unbind('keydown');",
        imgs: () => {
            let code = fun.gst("initData");
            return fun.run(code.match(/page_url.+(\[.+\])/)[1]);
        },
        button: [4, "24%", 3],
        insertImg: ["#commicBox", 2],
        autoDownload: [0],
        next: ".afterChapter",
        prev: ".beforeChapter",
        customTitle: () => fun.title("-", 1),
        css: "#khdDown,.appTil,#m_r_bottom,#m_r_panelbox,.control_panel.alpha{display:none!important}",
        //infiniteScroll: true,
        category: "comic"
    }, {
        name: "动漫之家M 自動翻頁",
        enable: 0,
        reg: () => /m\.i?dmzj\.com\/view\/\d+\/\d+\.html/.test(fun.url) && comicInfiniteScrollMode == 1,
        getImgs: (dom = document) => {
            let code = fun.gst("initData", dom);
            let srcs = fun.run(code.match(/page_url.+(\[.+\])/)[1]);
            return fun.createImgArray(srcs);
        },
        init: async () => {
            fun.run("$('body').unbind('keydown');");
            let imgs = _this.getImgs();
            let tE = fun.ge("#commicBox");
            tE.innerHTML = "";
            tE.append(...imgs);
            await fun.lazyload();
        },
        autoPager: {
            ele: (dom) => _this.getImgs(dom),
            observer: "#commicBox>img",
            pos: ["#commicBox", 0],
            next: (dom) => {
                let code = fun.gst("comic_id", dom).replaceAll('\"', '');
                let next_chap = code.search(/next_chap/);
                if (next_chap > -1) {
                    let cm = code.match(/comic_id:(\d+)/)[1];
                    let nm = code.match(/next_chap_id:(\d+)/)[1];
                    return fun.lo + "/view/" + cm + "/" + nm + ".html";
                } else {
                    return null;
                }
            },
            stop: async (dom) => {
                if (!fun.ge("//script[contains(text(),'page_url')]", dom)) {
                    let yes = await confirm(`Full Picture Load\n可能遇到 "请登录后观看!" 的情況。\n下一頁鏈結:\n${nextLink}\n是否前往下一頁?`);
                    if (yes) {
                        setTimeout(() => {
                            location.href = nextLink;
                        }, 1000);
                    }
                    return true;
                }
                return false;
            },
            re: "a.BarTit,.botNav .tc",
            title: (dom) => fun.gt(".BarTit", 1, dom),
            aF: (dom) => {
                let code = [...dom.scripts].find(s => s.innerHTML.includes("initData")).innerHTML;
                code = code.match(/mReader[^;]+;/)[0];
                fun.script(code, 0, 1);
            }
        },
        css: "#khdDown,.appTil,#m_r_bottom,#m_r_panelbox,.control_panel.alpha{display:none!important}",
        category: "comic autoPager"
    }, {
        name: "漫畫狗",
        host: ["dogemanga.com"],
        enable: 1,
        reg: /dogemanga\.com\/p\/[\w-]+/i,
        init: () => {
            fun.ge(".site-reader").setAttribute("class", "imgBox");
            fun.addUrlHtml(location.origin, ".imgBox", 1, "首頁");
            _this.next() ? fun.addUrlHtml(_this.next(), ".imgBox", 1) : null;
        },
        imgs: () => fun.gae(".site-reader__image").map(e => e.dataset.pageImageUrl),
        button: [4, "24%", 1],
        insertImg: [".imgBox", 2],
        autoDownload: [0],
        next: () => {
            let next = fun.ge("//select[@data-kind='publication']/option[@selected]/preceding-sibling::option[1]");
            return next ? next.value : null;
        },
        prev: 1,
        customTitle: () => fun.title(" - 漫畫狗"),
        threading: 1,
        css: ".imgBox{height:auto!important}.fixed-bottom{display:none!important}",
        category: "comic"
    }, {
        name: "明日方舟泰拉记事社",
        host: ["terra-historicus.hypergryph.com"],
        enable: 1,
        reg: /^https?:\/\/terra-historicus\.hypergryph\.com\/comic\/\d+\/episode\/\d+/,
        imgs: () => {
            let max = fun.gt(".HG_COMIC_READER_indicator>div:last-child");
            let fetchNum = 0;
            return fun.arr(max).map((_, i) => {
                return fetch(`/api${fun.lp}/page?pageNum=${(i + 1)}`).then(res => res.json()).then(json => {
                    fun.showMsg(`${displayLanguage.str_06}${fetchNum+=1}/${max}`, 0);
                    return json.data.url;
                });
            });
        },
        capture: () => _this.imgs(),
        autoDownload: [0],
        next: () => {
            let next = fun.ge("//a[text()='下一话']") || fun.ge("//a[text()='下一张']");
            return next ? next.href : null;
        },
        prev: 1,
        customTitle: async () => {
            await fun.waitEle(".HG_COMIC_READER_episodeTitle");
            return fun.gt(".HG_COMIC_READER_comicTitle") + " - " + fun.gt(".HG_COMIC_READER_episodeTitle");
        },
        category: "comic"
    }, {
        name: "Manhuagui看漫画M",
        host: ["m.manhuagui.com"],
        enable: 1,
        reg: () => /m\.manhuagui\.com\/comic\/\d+\/\d+.html/.test(fun.url) && comicInfiniteScrollMode != 1,
        json: (doc = document) => {
            let code = fun.gst("x6c", doc).trim().slice(26);
            return JSON.parse(fun.run(code).slice(11, -12));
        },
        init: () => {
            siteJson = _this.json();
        },
        imgs: (json = siteJson) => json.images.map(e => `https://i.hamreus.com${e}?e=${json.sl.e}&m=${json.sl.m}`),
        button: [4],
        insertImg: ["#manga", 2],
        autoDownload: [0],
        next: () => siteJson.nextId == 0 ? null : fun.ge("#mangaTitle a").href + siteJson.nextId + ".html",
        prev: "//a[text()='上一章']",
        customTitle: (doc = document) => fun.gt("#mangaTitle", 1, doc),
        preloadNext: (nextDoc, obj) => {
            let json = obj.json(nextDoc);
            let arr = obj.imgs(json);
            fun.picPreload(arr, obj.customTitle(nextDoc), "next");
        },
        threading: 3,
        css: ".action-list li{width:50% !important}#action>ul>li:nth-child(n+2):nth-child(-n+3),.manga-page,.clickforceads{display:none !important}",
        infiniteScroll: true,
        category: "comic"
    }, {
        name: "Manhuagui看漫画M 自動翻頁",
        host: ["m.manhuagui.com"],
        reg: () => /m\.manhuagui\.com\/comic\/\d+\/\d+.html/.test(fun.url) && comicInfiniteScrollMode == 1,
        json: (dom = document) => {
            let code = fun.gst("x6c", dom).trim().slice(26);
            let json = JSON.parse(fun.run(code).slice(11, -12));
            return json;
        },
        getSrcs: (dom = document) => {
            let json = _this.json(dom);
            let srcs = json.images.map(e => `https://i.hamreus.com${e}?e=${json.sl.e}&m=${json.sl.m}`);
            return srcs;
        },
        getImgs: (dom = document) => {
            let srcs = _this.getSrcs(dom);
            return fun.createImgArray(srcs);
        },
        init: async () => {
            let imgs = _this.getImgs();
            let tE = fun.ge("#manga");
            tE.innerHTML = "";
            tE.append(...imgs);
            await fun.lazyload();
            _this.autoPager.preloadNextPage();
        },
        autoPager: {
            ele: (dom) => _this.getImgs(dom),
            pos: ["#manga", 0],
            observer: "#manga>img",
            next: (dom, r = 1) => {
                let json = _this.json(dom);
                if (json.nextId == 0) {
                    if (r === 1) {
                        let e = fun.ge("a[data-action='chapter.next']");
                        e.href = fun.ge("#mangaTitle a").href;
                        e.innerText = "返回目录";
                    }
                    return null;
                } else {
                    return fun.gu("#mangaTitle a") + json.nextId + ".html";
                }
            },
            re: "#mangaTitle",
            title: (dom) => fun.ge("#mangaTitle>a", dom)?.nextSibling?.data?.trim(),
            aF: (dom) => {
                let json = _this.json(dom);
                let cUrl = fun.gu("#mangaTitle a");
                let ne = fun.ge("a[data-action='chapter.next']");
                ne.href = cUrl + json.nextId + ".html";
                let pe = fun.ge("a[data-action='chapter.prev']");
                pe.href = cUrl + json.prevId + ".html";
            },
            preloadNextPage: (dom) => {
                let next = _this.autoPager.next(dom, 0);
                if (!!next) {
                    fun.fetchDoc(next).then(nextDoc => {
                        let srcs = _this.getSrcs(nextDoc);
                        let text = _this.autoPager.title(nextDoc).replace(/\s+/g, " ").trim();
                        fun.picPreload(srcs, text, "next");
                    });
                }
            }
        },
        css: ".action-list li{width:50% !important}#action>ul>li:nth-child(n+2):nth-child(-n+3),.manga-page,.clickforceads{display:none !important}",
        category: "comic autoPager"
    }, {
        name: "Manhuagui看漫画M 点击查看下20条记录",
        host: ["m.manhuagui.com"],
        reg: /m\.manhuagui\.com\/(update|list|rank|user)\//,
        icon: 0,
        key: 0,
        observerClick: "#more:not([style*=none])>.more-go",
        openInNewTab: "#detail a:not([target=_blank])",
        category: "comic"
    }, {
        name: "Manhuagui看漫画/COCOMANGA",
        host: ["www.manhuagui.com", "tw.manhuagui.com", "www.mhgui.com", "cocomanga.xyz"],
        enable: 1,
        reg: () => /((www|tw)\.manhuagui\.com)|www\.mhgui\.com\/comic\/\d+\/\d+.html|cocomanga\.xyz\/comic\/\d+\/\d+\.html/.test(fun.url) && comicInfiniteScrollMode != 1,
        init: "$(document).unbind('keydown');",
        imgs: (doc = document) => {
            let code = fun.gst("x6c", doc).slice(26, -1);
            let json = fun.run(fun.run(code).slice(11, -11));
            let domain;
            /manhuagui|mhgui/.test(fun.lh) ? domain = "https://i.hamreus.com" : domain = "https://i1.cocomanga.xyz";
            return json.files.map(e => `${domain+json.path+e}?e=${json.sl.e}&m=${json.sl.m}`);
        },
        button: [4],
        insertImg: ["#tbBox", 2],
        autoDownload: [0],
        threading: 3,
        next: () => {
            const {
                cInfo
            } = _unsafeWindow;
            return cInfo.nextId == 0 ? null : location.origin + "/comic/" + cInfo.bid + "/" + cInfo.nextId + ".html";
        },
        prev: "//a[text()='上一章']",
        customTitle: (doc = document) => fun.gt("h1>a", 1, doc) + " - " + fun.gt("h2", 1, doc),
        preloadNext: true,
        css: ".tbCenter{max-width:1400px!important;width:auto!important;height:auto!important}",
        infiniteScroll: true,
        category: "comic"
    }, {
        name: "Manhuagui看漫画/COCOMANGA 自動翻頁",
        host: ["www.manhuagui.com", "tw.manhuagui.com", "www.mhgui.com", "cocomanga.xyz"],
        reg: () => /((www|tw)\.manhuagui\.com)|www\.mhgui\.com\/comic\/\d+\/\d+.html|cocomanga\.xyz\/comic\/\d+\/\d+\.html/.test(fun.url) && comicInfiniteScrollMode == 1,
        json: (dom = document) => {
            let code = fun.gst("x6c", dom).slice(26, -1);
            let json = fun.run(fun.run(code).slice(11, -11));
            return json;
        },
        getSrcs: (dom = document) => {
            let json = _this.json(dom);
            let domain;
            /manhuagui|mhgui/.test(fun.lh) ? domain = "https://i.hamreus.com" : domain = "https://i1.cocomanga.xyz";
            let srcs = json.files.map(e => `${domain+json.path+e}?e=${json.sl.e}&m=${json.sl.m}`);
            return srcs;
        },
        getImgs: (dom = document) => {
            let srcs = _this.getSrcs(dom);
            return fun.createImgArray(srcs);
        },
        init: async () => {
            let imgs = _this.getImgs();
            let tE = fun.ge("#tbBox");
            tE.innerHTML = "";
            tE.append(...imgs);
            await fun.lazyload();
            fun.run("$(document).unbind('keydown');");
            _this.autoPager.preloadNextPage();
        },
        autoPager: {
            ele: (dom) => _this.getImgs(dom),
            pos: ["#tbBox", 0],
            observer: "#tbBox>img",
            next: (dom, r = 1) => {
                let json = _this.json(dom);
                let n = json.nextId;
                if (n == 0) {
                    if (r === 1) {
                        fun.ge("#pagination").outerHTML = fun.ge(".main-btn").outerHTML;
                    }
                    return null;
                } else {
                    return fun.url.replace(/\d+\.html$/, "") + n + ".html";
                }
            },
            re: ".title h2",
            title: (dom) => _this.json(dom).cname,
            preloadNextPage: (dom) => {
                let next = _this.autoPager.next(dom, 0);
                if (!!next) {
                    fun.fetchDoc(next).then(async nextDoc => {
                        let srcs = await _this.getSrcs(nextDoc);
                        let text = _this.autoPager.title(nextDoc);
                        fun.picPreload(srcs, text, "next");
                    });
                }
            }
        },
        css: ".tbCenter{max-width:1400px!important;width:auto!important;height:auto!important}#prev,#pageSelect,#next,.pager>*:not([onclick]){display:none!important;}",
        category: "comic autoPager"
    }, {
        name: "包子漫画 閱讀",
        host: ["cn.baozimh.com", "cn.webmota.com", "tw.baozimh.com", "tw.webmota.com", "www.baozimh.com", "www.webmota.com", "cn.kukuc.co", "tw.kukuc.co", "www.kukuc.co", "tw.czmanga.com", "cn.czmanga.com", "www.czmanga.com", "tw.dzmanga.com", "cn.dzmanga.com", "www.dzmanga.com", "tw.dociy.net", "cn.dociy.net", "www.dociy.net", "tw.twmanga.com", "cn.twmanga.com", "www.twmanga.com"],
        enable: 1,
        reg: () => /\/comic\/chapter\/[^/]+\/\w+\.html/i.test(fun.url) && fun.ge("//title[contains(text(),'包子')]") && comicInfiniteScrollMode != 1,
        init: async () => {
            fun.run("document['onkeydown']=null;");
            await fun.getNP(".comic-contain>div:not(.mobadsq)", "//a[contains(text(),'下一頁') or contains(text(),'下一页')]", null, ".comic-chapter>.next_chapter,.bottom-bar-tool");
        },
        imgs: (doc = document) => [...new Set(fun.gae(".comic-contain amp-img", doc).map(e => e.dataset.src ?? e.getAttribute("src")))],
        button: [4],
        insertImg: [".comic-contain", 2],
        autoDownload: [0],
        next: "//div[@class='next_chapter']/a[contains(text(),'下一話') or contains(text(),'下一话')]",
        prev: 1,
        customTitle: (doc = document) => fun.title(" - ", 3, doc),
        preloadNext: true,
        css: ".chapter-main.scroll-mode~*:not(.next_chapter):not(.bottom-bar){display:none!important}",
        infiniteScroll: true,
        category: "comic"
    }, {
        name: "包子漫画 閱讀 自動翻頁",
        reg: () => /\/comic\/chapter\/[^/]+\/\w+\.html/i.test(fun.url) && comicInfiniteScrollMode == 1,
        include: ["//title[contains(text(),'包子')]"],
        getSrcs: (dom) => fun.gae(".comic-contain amp-img", dom).map(e => e.dataset.src ?? e.getAttribute("src")),
        getImgs: (dom = document) => {
            let srcs = _this.getSrcs(dom);
            if (fun.ge(".FullPictureLoadImage")) {
                let currentLastSrc = fun.gae(".FullPictureLoadImage").at(-1).dataset.src;
                let nextFirstNum = Number(srcs[0].match(/(\d)\.\w+$/)[1]);
                if (/\/(50|100|150|200|250|300)\.[a-z]{3,5}$/i.test(currentLastSrc) && nextFirstNum == 7 && nextFirstNum != 1) {
                    srcs = srcs.slice(4);
                }
            }
            return fun.createImgArray(srcs);
        },
        init: async () => {
            fun.run("document['onkeydown']=null;");
            let imgs = _this.getImgs();
            let tE = fun.ge(".comic-contain");
            tE.innerHTML = "";
            tE.append(...imgs);
            await fun.lazyload();
            _this.autoPager.preloadNextPage();
        },
        autoPager: {
            ele: (dom) => _this.getImgs(dom),
            pos: [".comic-contain", 0],
            observer: ".comic-contain>img",
            next: (dom) => {
                let next = fun.ge("a#next-chapter", dom);
                return next ? next.pathname : null;
            },
            re: "//div[@class='text']/span[@class='title'] | //div[@class='comic-chapter']/div[@class='next_chapter'] | //div[@class='bottom-bar-tool']",
            title: (dom) => {
                let titleText = fun.gt("span.title", 1, dom).replace(/\(\d\/\d+\)/, "");
                return {
                    ok: /\/\d+_\d+\.html$/.test(nextLink),
                    text: titleText
                }
            },
            hide: ".comic-chapter>.l-content",
            preloadNextPage: (dom) => {
                let next = _this.autoPager.next(dom);
                if (!!next) {
                    fun.fetchDoc(next).then(async nextDoc => {
                        let srcs = await _this.getSrcs(nextDoc);
                        fun.picPreload(srcs, nextDoc.title, "next");
                    });
                }
            }
        },
        css: ".chapter-main.scroll-mode~*:not(.next_chapter,.bottom-bar,.l-content),.mobadsq{display:none!important}.comic-contain{width: 100%;margin: 0 auto;max-width:970px;",
        category: "comic autoPager"
    }, {
        name: "包子漫画 展開目錄",
        icon: 0,
        key: 0,
        reg: /\/comic\/[-\w]+$/i,
        include: "//title[contains(text(),'包子')]",
        autoClick: ["#button_show_all_chatper", 1000],
        category: "comic"
    }, {
        name: "包子漫画,鏈接新分頁打開",
        icon: 0,
        key: 0,
        reg: /(cn|tw|www)\.(baozimh|webmota|kukuc|czmanga|dzmanga|dociy|twmanga|hcmanga)\.(co|com|net)/,
        openInNewTab: ".comics-card a:not([target=_blank]),.bookshelf-items a:not(.remove-img):not([target=_blank])",
        category: "comic"
    }, {
        name: "Komiic",
        host: ["komiic.com"],
        enable: 1,
        reg: /komiic\.com\/comic\/\d+\/chapter\//,
        init: async () => await fun.waitEle(".v-breadcrumbs"),
        imgs: async (url = siteUrl) => {
            fun.showMsg(displayLanguage.str_05, 0);
            let chapterId = url.match(/chapter\/(\d+)\/images/)[1];
            let body = {
                operationName: "imagesByChapterId",
                variables: {
                    chapterId: `${chapterId}`
                },
                query: "query imagesByChapterId($chapterId: ID!) {\n  imagesByChapterId(chapterId: $chapterId) {\n    id\n    kid\n    height\n    width\n    __typename\n  }\n}\n"
            };
            let json = await fetch("/api/query", {
                "headers": {
                    "content-type": "application/json"
                },
                "body": JSON.stringify(body),
                "method": "POST"
            }).then(res => res.json());
            debug("\nimages JSON\n", json);
            return json.data.imagesByChapterId.map(e => "https://komiic.com/api/image/" + e.kid);
        },
        repeat: 1,
        autoDownload: [0],
        next: async () => {
            let mhId = siteUrl.match(/comic\/(\d+)/)[1];
            let body = {
                operationName: "chapterByComicId",
                variables: {
                    comicId: `${mhId}`
                },
                query: "query chapterByComicId($comicId: ID!) {\n  chaptersByComicId(comicId: $comicId) {\n    id\n    serial\n    type\n    dateCreated\n    dateUpdated\n    size\n    __typename\n  }\n}\n"
            };
            let json = await fetch("/api/query", {
                "headers": {
                    "content-type": "application/json"
                },
                "body": JSON.stringify(body),
                "method": "POST"
            }).then(res => res.json());
            debug("\nchapter JSON\n", json);
            let chapterId = siteUrl.match(/chapter\/(\d+)\/images/)[1];
            let chapters = json.data.chaptersByComicId;
            let nextUrl;
            for (let i = 0; i < chapters.length; i++) {
                if (new RegExp(chapterId).test(chapters[i].id)) {
                    try {
                        let nextId = chapters[i + 1].id;
                        nextUrl = siteUrl.replace(new RegExp(`/${chapterId}/`), `/${nextId}/`).replace(/\?page=\d+/, "");
                    } catch (e) {
                        nextUrl = null;
                    }
                    break;
                }
            }
            return nextUrl;
        },
        observerURL: true,
        prev: 1,
        customTitle: () => {
            let textArr = fun.gt(".v-breadcrumbs").split("\n");
            return textArr[1] + " - " + textArr[2];
        },
        observerTitle: true,
        threading: 2,
        category: "comic"
    }, {
        name: "LINE WEBTOON / 咚漫",
        host: ["www.webtoons.com", "www.dongmanmanhua.cn"],
        enable: 0,
        reg: /www\.(webtoons|dongmanmanhua)\.(com|cn)\/[^&]+&episode/,
        imgs: "._images[data-url]",
        autoDownload: [0],
        next: "//div[@class='episode_cont']//li[a[starts-with(@class,'on')]]/following-sibling::li[1]/a",
        prev: "//div[@class='episode_cont']//li[a[starts-with(@class,'on')]]/preceding-sibling::li[1]/a",
        customTitle: () => fun.title("|", 3).replace(/ - \d+/, "").replace("|", " - "),
        category: "comic"
    }, {
        name: "LINE WEBTOON 目錄聚集所有章節",
        host: ["www.webtoons.com"],
        enable: 0,
        icon: 0,
        key: 0,
        reg: /www\.webtoons\.com\/.+\/list\?title_no=\d+/,
        init: "fun.getNP('._episodeItem',\"//div[@class='paginate']/a[span[@class='on']]/following-sibling::a[1]\",null,'.paginate',0,null,0);",
        category: "comic"
    }, {
        name: "動漫狂",
        host: ["www.cartoonmad.com", "cc.fun8.us"],
        enable: 1,
        reg: () => /^https?:\/\/www\.cartoonmad\.com\/comic\/\d+\.html|^https?:\/\/cc\.fun8\.us\/post\/\d+\.html/.test(fun.url) && comicInfiniteScrollMode != 1,
        exclude: "#info table[align]",
        init: () => fun.cartoonmadUI(),
        imgs: (doc = document) => {
            let imgDir = fun.ge("img[onload],img[oncontextmenu]", doc).src.match(/.+\//)[0];
            let max = fun.ge(".onpage", doc).parentNode.lastElementChild.previousElementSibling.innerText;
            fun.remove("//tr[td[a[@class='onpage']]]");
            return fun.arr(max).map((_, i) => imgDir + String((i + 1)).padStart(3, "0") + ".jpg");
        },
        button: [4],
        insertImg: ["//td[a[img[@oncontextmenu]]] | //td[a[img[@oncontextmenu]]]", 2],
        autoDownload: [0],
        next: "//td[@width='150' and a[img[@src='/image/rad.gif']]]/a | //a[b]",
        prev: "//td[@width='150' and a[img[@src='/image/rad1.gif']]]/a",
        customTitle: async (doc = document) => {
            let src = fun.ge("img[onload],img[oncontextmenu]", doc).src;
            let comicId = new URL(src).pathname.split("/")[3];
            let comicIdData = JSON.parse(localStorage.getItem("comicIdData")) ?? {};
            if (comicIdData[comicId] === null || comicIdData[comicId] === undefined) {
                if (/TW|HK/.test(language)) {
                    fun.showMsg("首次取得漫畫名稱", 0);
                } else if (/zh/.test(language)) {
                    fun.showMsg("首次取得漫画名称", 0);
                } else {
                    fun.showMsg("First time Get ComicName", 0);
                }
                let comicName = await fun.xhrDoc(`https://www.cartoonmad.com/comic/${comicId}.html`, "", PCUA).then(comicDoc => fun.ge("meta[name=Keywords]", comicDoc).content.split(",")[0]);
                comicIdData[comicId] = comicName;
                localStorage.setItem("comicIdData", JSON.stringify(comicIdData));
                return comicName + " - " + doc.title;
            } else {
                let comicName = comicIdData[comicId];
                return comicName + " - " + doc.title;
            }
        },
        preloadNext: true,
        infiniteScroll: true,
        category: "comic"
    }, {
        name: "動漫狂 自動翻頁",
        reg: () => /^https?:\/\/www\.cartoonmad\.com\/comic\/\d+\.html|^https?:\/\/cc\.fun8\.us\/post\/\d+\.html/.test(fun.url) && comicInfiniteScrollMode == 1,
        exclude: "#info table[align]",
        getSrcs: (dom) => {
            let imgDir = fun.ge("img[onload],img[oncontextmenu]", dom).src.match(/.+\//)[0];
            let max = fun.ge(".onpage", dom).parentNode.lastElementChild.previousElementSibling.innerText;
            let srcs = fun.arr(max).map((_, i) => imgDir + String((i + 1)).padStart(3, "0") + ".jpg");
            return srcs;
        },
        getImgs: (dom = document) => {
            let srcs = _this.getSrcs(dom);
            return fun.createImgArray(srcs);
        },
        init: async () => {
            fun.cartoonmadUI();
            let imgs = _this.getImgs();
            let tE = fun.ge("//td[a[img[@oncontextmenu]]] | //td[a[img[@oncontextmenu]]]");
            tE.innerHTML = "";
            tE.append(...imgs);
            await fun.lazyload();
            fun.remove("//tr[td[a[@class='onpage']]]");
            _this.autoPager.preloadNextPage();
        },
        autoPager: {
            ele: (dom) => _this.getImgs(dom),
            pos: ["//td[img]", 0],
            observer: "//td[img]/img",
            next: "//td[@width='150' and a[img[@src='/image/rad.gif']]]/a | //a[b]",
            aF: (dom) => {
                fun.gae("//tr[td[@bgcolor='#EAEAEA']] | //tr[td[@bgcolor='#EBEBEB']]").forEach(e => (e.innerHTML = fun.ge("//tr[td[@bgcolor='#EAEAEA']] | //tr[td[@bgcolor='#EBEBEB']]", dom, dom).innerHTML));
                fun.remove("//td[div[@id='sidebar-follow']] | //td[ins[@class='adsbygoogle']] | //tr[td[script]] | //select");
            },
            preloadNextPage: (dom) => {
                let next = fun.ge(_this.autoPager.next, dom, dom);
                if (!!next) {
                    fun.fetchDoc(next.href).then(async nextDoc => {
                        let srcs = await _this.getSrcs(nextDoc);
                        fun.picPreload(srcs, nextDoc.title, "next");
                    });
                }
            }
        },
        category: "comic autoPager"
    }, {
        name: "動漫啦",
        host: ["www.dongman.la"],
        enable: 0,
        reg: /^https?:\/\/www\.dongman\.la\/manhua\/chapter\/\d+\/\d+\//,
        imgs: (link = siteUrl, msg = 1, request = 0) => {
            let links = [link.replace("all.html", "") + "all.html"];
            return fun.getImgA(".imgListBox img", links, 0, null, msg, request);
        },
        button: [4],
        insertImg: [".imgListBox", 2],
        autoDownload: [0],
        next: "//a[label[text()='下一章']][contains(@href,'chapter')]",
        prev: "//a[label[text()='上一章']][contains(@href,'chapter')]",
        customTitle: (doc = document) => fun.attr("meta[name='description']", "content", doc),
        preloadNext: async (nextDoc, obj) => fun.picPreload(await obj.imgs(nextLink, 0, 1), obj.customTitle(nextDoc), "next"),
        css: ".mdui-container .mdui-col-xs-4:nth-child(2){display:none!important;}.mdui-col-xs-4{width:50%!important}",
        category: "comic"
    }, {
        name: "動漫戲說",
        host: ["comic.acgn.cc"],
        enable: 0,
        reg: /comic\.acgn\.cc\/view/,
        imgs: (doc = document) => fun.gae(".pic[_src][id]", doc).map(e => e.getAttribute("_src")),
        button: [4],
        insertImg: ["#pic_list", 2],
        autoDownload: [0],
        next: ".display_right>a",
        prev: ".display_left>a",
        customTitle: (doc = document) => fun.gt(".hotrmtexth1>a", 1, doc),
        preloadNext: true,
        css: ".btn_wrap{display:none!important}",
        category: "comic"
    }, {
        name: "98漫畫網",
        host: ["www.98comic.com"],
        enable: 0,
        reg: /www\.98comic\.com\/comic\/\d+\/\w+\.html$/,
        imgs: () => {
            const {
                cInfo
            } = _unsafeWindow;
            return cInfo.fs.map(e => "https://www.98comic.com/g.php?" + cInfo.cid + "/" + e);
        },
        button: [4],
        insertImg: ["//td[img[@id='manga']]", 2],
        autoDownload: [0],
        next: () => {
            const {
                cInfo
            } = _unsafeWindow;
            return cInfo.ncid.length >= 2 ? location.origin + cInfo.burl + cInfo.ncid + ".html" : null;
        },
        prev: ".prevC",
        customTitle: () => {
            const {
                cInfo
            } = _unsafeWindow;
            return cInfo.btitle + " - " + cInfo.ctitle;
        },
        preloadNext: (nextDoc, obj) => {
            let code = fun.gst("cInfo", nextDoc);
            fun.script(code, 0, 1);
            fun.picPreload(obj.imgs(), obj.customTitle(), "next");
        },
        css: ".bd_960_90{display:none!important}",
        category: "comic"
    }, {
        name: "国漫吧",
        host: ["www.guoman8.cc", "m.guoman8.cc"],
        enable: 1,
        reg: () => /(www|m)\.guoman8\.cc\/\d+\/\d+\.html$/.test(fun.url) && comicInfiniteScrollMode != 1,
        init: () => setTimeout(() => fun.run("$(document).off();"), 5000),
        imgs: () => {
            const {
                cInfo,
                pageConfig
            } = _unsafeWindow;
            return cInfo.fs.map(e => /^http/.test(e) ? e : location.protocol + "//" + pageConfig.host.auto[0] + e);
        },
        button: [4],
        insertImg: ["//td[img[@id='manga']]", 2],
        autoDownload: [0],
        next: "a.nextC:not([href^=java])",
        prev: ".prevC",
        customTitle: () => {
            const {
                cInfo
            } = _unsafeWindow;
            return cInfo.btitle + " - " + cInfo.ctitle;
        },
        preloadNext: async (nextDoc, obj) => {
            let code = fun.gst("cInfo", nextDoc);
            fun.script(code, 0, 1);
            fun.picPreload(obj.imgs(), obj.customTitle(), "next");
        },
        css: ".action-list li{width:50%!important}#action>ul>li:nth-child(n+2):nth-child(-n+3),.bd_960_90,body>section,#action~*:not(#pageNo),footer~*{display:none!important}",
        infiniteScroll: true,
        category: "comic"
    }, {
        name: "国漫吧 自動翻頁",
        reg: () => /(www|m)\.guoman8\.cc\/\d+\/\d+\.html$/.test(fun.url) && comicInfiniteScrollMode == 1,
        json: (dom = document) => {
            let code = fun.gst("eval", dom);
            let codeText = code.match(/eval(\(.+\)\))/)[0].slice(4);
            let objText = fun.run(codeText);
            objText = objText.replace(/var\scInfo\s?=|;/g, "");
            let json = fun.run(objText);
            return json;
        },
        getSrcs: (dom = document) => {
            let json = _this.json(dom);
            const {
                pageConfig
            } = _unsafeWindow;
            let srcs = json.fs.map(e => /^http/.test(e) ? e : "//" + pageConfig.host.auto[0] + e);
            return srcs;
        },
        getImgs: (dom = document) => {
            let srcs = _this.getSrcs(dom);
            return fun.createImgArray(srcs);
        },
        init: async () => {
            let imgs = _this.getImgs();
            let tE = fun.ge("//td[img[@id='manga']]");
            tE.innerHTML = "";
            tE.append(...imgs);
            await fun.lazyload();
            _this.autoPager.preloadNextPage();
            setTimeout(() => fun.run("$(document).off();"), 5000);
        },
        autoPager: {
            ele: (dom) => _this.getImgs(dom),
            pos: ["//td[img]", 0],
            observer: "//td[img]/img",
            next: (dom, r = 1) => {
                let nextE = fun.ge("a.nextC:not([href^=java])", dom);
                if (nextE) {
                    return nextE.href;
                } else {
                    if (r === 1) {
                        let curl = fun.lp.replace(/\d+\/$|\d+\.html$/, "");
                        let mn = fun.ge("a.nextC");
                        if (mn) {
                            mn.href = curl;
                            mn.innerText = "返回目录";
                        }
                        if (fun.lh === "www.guoman8.cc") {
                            mn.remove();
                            let pn = fun.ge("//a[text()='下一章']");
                            pn.setAttribute("onclick", "");
                            pn.href = fun.ge("//a[text()='返回目录']").pathname;
                            pn.innerText = "返回目录";
                        }
                    }
                    return null;
                }
            },
            re: ".title h2,.main-btn,#mangaTitle,#action",
            title: (dom) => _this.json(dom).ctitle,
            preloadNextPage: (dom) => {
                let next = _this.autoPager.next(dom, 0);
                if (!!next) {
                    fun.fetchDoc(next).then(nextDoc => {
                        let srcs = _this.getSrcs(nextDoc);
                        let text = _this.autoPager.title(nextDoc);
                        fun.picPreload(srcs, text, "next");
                    });
                }
            }
        },
        css: ".action-list li{width:50%!important}#imgLoading,#manga,.action,#action>ul>li:nth-child(n+2):nth-child(-n+3),.bd_960_90,body>section,#action~*:not(#pageNo,.FullPictureLoadMsg),footer~*:not(.FullPictureLoadMsg),#prev,#pageSelect,#next,#pager>*:not([onclick]),#pager>*[onclick*='next()'],.backToTop~div[style*='overflow']{display:none!important}",
        category: "comic autoPager"
    }, {
        name: "亲亲漫画",
        host: ["www.acgwd.com", "m.acgwd.com"],
        enable: 0,
        reg: /^https?:\/\/(www|m)\.acgwd\.com\/manhua\/\d+\/\d+\.html/,
        init: () => {
            fun.clearAllTimer(3);
            let div = document.createElement("div");
            div.id = "imgBox";
            let x = fun.ge("#images");
            x.parentNode.insertBefore(div, x.nextSibling);
        },
        imgs: () => {
            const {
                chapterImages,
                SinConf,
                chapterPath
            } = _unsafeWindow;
            return chapterImages.map(e => SinConf.resHost[0].domain + "/" + chapterPath + e);
        },
        button: [4],
        insertImg: ["#imgBox", 2],
        autoDownload: [0],
        next: () => {
            const {
                nextChapterData,
                comicUrl
            } = _unsafeWindow;
            return nextChapterData.id && nextChapterData.id > 0 ? comicUrl + nextChapterData.id + ".html" : null;
        },
        prev: "//a[contains(text(),'上一章')]",
        customTitle: (doc = document) => {
            let code = fun.gst("jmzz20191018", doc);
            let arr = code.match(/jmzz20191018\(([^\)]+)\)/)[1].replaceAll('"', "").split(",");
            return arr[3] + " - " + arr[1];
        },
        preloadNext: async (nextDoc, obj) => {
            const {
                jmzz20191018
            } = _unsafeWindow;
            let code = fun.gst("chapterImages", nextDoc);
            fun.script(code, 0, 1);
            jmzz20191018();
            fun.picPreload(obj.imgs(), obj.customTitle(nextDoc), "next");
            _unsafeWindow._0x5097 = null;
        },
        css: "#images,.img_land_prev,.img_land_next,#action li:nth-child(2),#action li:nth-child(3),.control_bottom~*,.chapter-view~*:not([id^='pv-']):not([class^='pv-']):not(.pagetual_tipsWords):not(#comicRead):not(#fab):not(.FullPictureLoadMsg):not(.FullPictureLoadFixedBtn):not(#FullPictureLoadOptions):not(#FullPictureLoadFixedMenu):not(*[class^=fancybox]){display:none!important}#action li{width:50%!important}",
        category: "comic"
    }, {
        name: "古风漫画网",
        host: ["www.gufengmh.com", "m.gufengmh.com", "www.gufengmh9.com", "m.gufengmh9.com"],
        enable: 1,
        reg: () => /^https?:\/\/(www|m)\.gufengmh\d?\.com\/manhua\/\w+\/\d+\.html/.test(fun.url) && comicInfiniteScrollMode != 1,
        init: () => {
            fun.run("$(document).off();$('#images').off();");
            fun.remove("#skin");
            fun.createImgBox("#images", 2);
        },
        imgs: () => {
            const {
                chapterImages,
                SinConf,
                chapterPath
            } = _unsafeWindow;
            return chapterImages.map(e => SinConf.resHost[0].domain + "/" + chapterPath + e);
        },
        button: [4],
        insertImg: [
            ["#FullPictureLoadMainImgBox", 0, "#images"], 2
        ],
        autoDownload: [0],
        next: () => {
            const {
                nextChapterData,
                comicUrl
            } = _unsafeWindow;
            return nextChapterData.id && nextChapterData.id > 0 ? comicUrl + nextChapterData.id + ".html" : null;
        },
        prev: "//a[contains(text(),'上一章')]",
        customTitle: (doc = document) => {
            if (/^https?:\/\/www/.test(siteUrl)) {
                let arr = fun.gt(".title", 1, doc).split(" / ");
                return arr[0] + " - " + arr[1];
            } else {
                let code = fun.gst("SinMH.initChapter", doc);
                let arr = code.match(/SinMH.initChapter\(([^\)]+)\)/)[1].replaceAll('"', "").split(",");
                return arr[3] + " - " + arr[1];
            }
        },
        preloadNext: async (nextDoc, obj) => {
            let title;
            /^https?:\/\/www/.test(siteUrl) ? title = nextDoc.title.split("在线")[0] : title = obj.customTitle(nextDoc);
            let code = fun.gst("chapterImages", nextDoc);
            fun.script(code, 0, 1);
            fun.picPreload(obj.imgs(), title, "next");
        },
        css: ".nav-pagination,.pageSelect,.nav-pagination,.img_land_prev,.img_land_next,#action li:nth-child(2),#action li:nth-child(3),.control_bottom~*,.chapter-view~*:not(.footer):not([id^='pv-']):not([class^='pv-']):not(.pagetual_tipsWords):not(#comicRead):not(#fab):not(.FullPictureLoadMsg):not(.FullPictureLoadFixedBtn):not(#FullPictureLoadOptions):not(#FullPictureLoadFixedMenu):not(*[class^=fancybox]),.img_info{display:none!important}#action li{width:50%!important}",
        infiniteScroll: true,
        category: "comic"
    }, {
        name: "古风漫画网 自動翻頁",
        reg: () => /^https?:\/\/(www|m)\.gufengmh\d?\.com\/manhua\/\w+\/\d+\.html/.test(fun.url) && comicInfiniteScrollMode == 1,
        getSrcs: (dom) => {
            let code = fun.gst("chapterImages", dom);
            let imagesArrText = code.match(/chapterImages[\s=]+([^;]+)/)[1];
            let cImages = fun.run(imagesArrText);
            let cPath = code.match(/chapterPath[\s="]+([^"]+)/)[1];
            let domain = code.match(/pageImage[\s="]+(https?:\/\/\w+\.\w+\.\w+\/)/)[1];
            let srcs = cImages.map(e => domain + cPath + e);
            return srcs;
        },
        getImgs: (dom = document) => {
            let srcs = _this.getSrcs(dom);
            return fun.createImgArray(srcs);
        },
        init: async () => {
            fun.run("$(document).off();$('#images').off();");
            fun.remove("#skin");
            fun.createImgBox("#images", 2);
            fun.remove("#images");
            let imgs = _this.getImgs();
            let tE = fun.ge("#FullPictureLoadMainImgBox");
            tE.innerHTML = "";
            tE.append(...imgs);
            await fun.lazyload();
            _this.autoPager.preloadNextPage();
        },
        autoPager: {
            script: "//script[contains(text(),'chapterImages')]",
            ele: (dom) => _this.getImgs(dom),
            pos: ["#FullPictureLoadMainImgBox", 0],
            observer: "#FullPictureLoadMainImgBox>img",
            next: (dom, r = 1) => {
                let code = fun.gst("nextChapterData", dom);
                let nextText = code.match(/nextChapterData[\s=]+([^;]+)/)[1];
                let cUrlText = code.match(/comicUrl[\s="]+([^"]+)/)[1];
                let nextrData = JSON.parse(nextText);
                if (nextrData?.id && nextrData?.id > 0) {
                    return cUrlText + nextrData.id + ".html";
                } else {
                    if (/^m\./.test(fun.lh) && r === 1) {
                        let n = fun.ge("//a[text()='下一章']");
                        n.href = fun.lp.replace(/\d+\.html$/, "");
                        n.innerText = "返回目录";
                    }
                    return null;
                }
            },
            re: ".title,.BarTit",
            title: (dom) => {
                if (/^https?:\/\/www/.test(siteUrl)) {
                    return fun.gt(".title>h1>a", 1, dom) + " - " + fun.gt(".title>h2", 1, dom);
                } else {
                    let code = fun.gst("SinMH.initChapter", dom);
                    let arr = code.match(/SinMH.initChapter\(([^\)]+)\)/)[1].replaceAll('"', "").split(",");
                    return arr[1];
                }
            },
            hide: ".comic-comment,.chapter-content+.imgBox",
            preloadNextPage: (dom) => {
                let next = _this.autoPager.next(dom, 0);
                if (!!next) {
                    fun.fetchDoc(next).then(nextDoc => {
                        let srcs = _this.getSrcs(nextDoc);
                        let text = _this.autoPager.title(nextDoc);
                        fun.picPreload(srcs, text, "next");
                    });
                }
            }
        },
        css: ".nav-pagination,.pageSelect,.nav-pagination,.img_land_prev,.img_land_next,#action li:nth-child(2),#action li:nth-child(3),.control_bottom~*,.chapter-view~*:not(.footer):not([id^='pv-']):not([class^='pv-']):not(.pagetual_tipsWords):not(#comicRead):not(#fab):not(.FullPictureLoadMsg):not(.FullPictureLoadFixedBtn):not(#FullPictureLoadOptions):not(#FullPictureLoadFixedMenu):not(*[class^=fancybox]),.img_info{display:none!important}#action li{width:50%!important}",
        category: "comic autoPager"
    }, {
        name: "漫画456",
        host: ["www.manhua456.com"],
        enable: 0,
        reg: /www\.manhua456\.com\/manhua\/\w+\/\d+\.html/,
        delay: 1000,
        init: "setTimeout(()=>{$(document).unbind('keyup');$(document).unbind('keydown')},4000)",
        imgs: async () => {
            await fun.waitEle("//script[contains(text(),'chapterImages')]");
            const {
                SinConf,
                chapterImages,
                chapterPath
            } = _unsafeWindow;
            let host = SinConf.resHost1 ?? SinConf.resHost[0].domain;
            return chapterImages.map(e => /^http/.test(e) ? e : host + "/" + chapterPath + e);
        },
        button: [4],
        insertImg: ["#images", 2],
        next: () => {
            const {
                nextChapterData,
                comicUrl
            } = _unsafeWindow;
            if (nextChapterData.id && nextChapterData.id > 0) {
                let url = new URL(comicUrl + nextChapterData.id + ".html");
                return url.protocol != location.protocol ? url.href.replace(url.protocol, location.protocol) : url;
            }
            return null;
        },
        prev: "//a[text()='上一章']",
        customTitle: () => fun.title(" - ", 3),
        preloadNext: async (nextDoc, obj) => {
            const callback = (doc, fun) => {
                const code = `
let host = SinConf.resHost1 ?? SinConf.resHost[0].domain;
window.parent.postMessage({
    iframePicArr: chapterImages.map(e => /^http/.test(e) ? e : host + "/" + chapterPath + e),
    title: document.title
}, "https://www.manhua456.com");
               `;
                fun.script(code, 0, 1, doc);
            };
            fun.iframeDoc(nextLink, "//script[contains(text(),'chapterImages')]", 30000, callback);
        },
        css: ".img_land_prev,.img_land_next{display:none!important}",
        category: "comic"
    }, {
        name: "漫画456M m.manhua456.com",
        host: ["m.manhua456.com"],
        enable: 0,
        reg: /m\.manhua456\.com\/manhua\/\w+\/\d+\.html/,
        delay: 300,
        init: async () => {
            await fun.waitEle("//script[contains(text(),'chapterImages')]");
            fun.run("$('#images').unbind('click');");
        },
        imgs: () => {
            const {
                chapterImages,
                SinConf,
                chapterPath
            } = _unsafeWindow;
            return chapterImages.map(e => /^http/.test(e) ? e : SinConf.resHost[0].domain + "/" + chapterPath + e);
        },
        button: [4],
        insertImg: ["#images", 2],
        next: () => {
            const {
                nextChapterData,
                comicUrl
            } = _unsafeWindow;
            if (nextChapterData.id && nextChapterData.id > 0) {
                let url = new URL(comicUrl + nextChapterData.id + ".html");
                return url.protocol != location.protocol ? url.href.replace(url.protocol, location.protocol) : url;
            }
            return null;
        },
        prev: "//a[text()='上一章']",
        customTitle: () => {
            const {
                pagtitle
            } = _unsafeWindow;
            let s = pagtitle.split(" - ");
            return s[1] + " - " + s[0];
        },
        preloadNext: async (nextDoc, obj) => {
            const callback = (doc, fun) => {
                const code = `
window.parent.postMessage({
    iframePicArr: chapterImages.map(e => /^http/.test(e) ? e : SinConf.resHost1 + "/" + chapterPath + e),
    title: document.title
}, "https://m.manhua456.com");
               `;
                fun.script(code, 0, 1, doc);
            };
            fun.iframeDoc(nextLink, "//script[contains(text(),'chapterImages')]", 30000, callback);
        },
        css: ".img_land_prev,.img_land_next{display:none!important}",
        category: "comic"
    }, {
        name: "漫画1234",
        host: ["www.gmh1234.com", "m.gmh1234.com"],
        enable: 0,
        reg: /(www|m)\.\wmh1234\.com\/comic\/\d+\/\d+\.html/i,
        init: async () => {
            await fun.waitVar("chapterImages", 600);
            fun.run("$(document).unbind('keydown');$(document).unbind('keyup');$('#images').unbind('click');");
        },
        imgs: () => {
            const {
                chapterImages,
                SinConf,
                chapterPath
            } = _unsafeWindow;
            return chapterImages.map(e => {
                if (/^http/.test(e)) {
                    return e;
                } else {
                    return SinConf.resHost[0].domain + "/" + chapterPath + e;
                }
            });
        },
        button: [4],
        insertImg: ["#images", 2],
        insertImgAF: () => {
            if (fun.lh == "m.gmh1234.com") fun.run("$('#images').off()");
            if (fun.lh == "www.gmh1234.com" && _this.next()) fun.addUrlHtml(_this.next(), "#images", 1);
        },
        autoDownload: [0],
        next: () => {
            const {
                nextChapterData
            } = _unsafeWindow;
            return nextChapterData.id > 0 ? nextChapterData.url : null;
        },
        prev: 1,
        customTitle: (doc = document) => {
            if (fun.lh == "m.gmh1234.com") {
                let s = fun.gst("initChapter", doc).match(/SinTheme\.initChapter\(([^\)]+)\);/)[1].replaceAll('"', "").split(",");
                return s[3] + " - " + s[1];
            } else {
                let data = JSON.parse(localStorage.history)[0];
                return data.comic_name + " - " + data.read_chapter;
            }
        },
        preloadNext: async (nextDoc, obj) => {
            let code = fun.gst("chapterImages", nextDoc);
            fun.script(code, 0, 1);
            fun.picPreload(await obj.imgs(), obj.customTitle(nextDoc), "next");
        },
        css: ".globalPadding,.img_info,#imgLoading,#loading{display:none!important;}.action-list li{width:50% !important}#action>ul>li:nth-child(n+2):nth-child(-n+3){display:none !important}",
        category: "comic"
    }, {
        name: "92漫画",
        host: ["www.92mh.com"],
        enable: 0,
        reg: /^https?:\/\/www\.92mh\.com\/manhua\/\d+\/\d+\.html/i,
        init: "$(document).unbind('keydown');$(document).unbind('keyup');$('#images').unbind('click');",
        imgs: () => {
            const {
                chapterImages,
                SinConf
            } = _unsafeWindow;
            return chapterImages.map(e => /^http/.test(e) ? e : SinConf.resHost[0].domain + "/" + e);
        },
        button: [4],
        insertImg: ["#images", 2],
        autoDownload: [0],
        next: () => {
            const {
                nextChapterData
            } = _unsafeWindow;
            return nextChapterData.id > 0 ? nextChapterData.url : null;
        },
        prev: 1,
        customTitle: () => {
            let data = JSON.parse(localStorage.history)[0];
            return data.comic_name + " - " + data.read_chapter;
        },
        preloadNext: (nextDoc, obj) => {
            let code = fun.gst("chapterImages", nextDoc);
            fun.script(code, 0, 1);
            fun.picPreload(obj.imgs(), nextDoc.title, "next");
        },
        category: "comic"
    }, {
        name: "92漫画M",
        host: ["m.92mh.com"],
        enable: 0,
        reg: /^https?:\/\/m\.92mh\.com\/manhua\/\d+\/\d+\.html/i,
        imgs: (url = siteUrl, doc = document, msg = 1, request = 0) => {
            let max = fun.gt(".image-content p", 1, doc).match(/\/(\d+)/)[1];
            return fun.getImg("#manga-image", max, 5, null, 20, url, msg, request);
        },
        button: [4],
        insertImg: ["#images", 2],
        autoDownload: [0],
        next: () => {
            let next = fun.ge("//a[text()='下一章'][contains(@href,'html')]");
            return next ? next.href : null;
        },
        prev: 1,
        customTitle: (doc = document) => fun.title("在线", 1, doc),
        preloadNext: async (nextDoc, obj) => fun.picPreload(await obj.imgs(nextLink, nextDoc, 0, 1), obj.customTitle(nextDoc), "next"),
        css: ".action-list li{width:50% !important}div[style*='text-align: left;'],.UnderPage~*:not([id^='pv-']):not([class^='pv-']):not(.pagetual_tipsWords):not(#comicRead):not(#fab):not(.FullPictureLoadMsg):not(.FullPictureLoadFixedBtn):not(#FullPictureLoadOptions):not(#FullPictureLoadFixedMenu):not(*[class^=fancybox]),.action-list>ul>li:nth-child(n+2):nth-child(-n+3){display:none!important}body{padding:0!important}",
        category: "comic"
    }, {
        name: "90漫画",
        host: ["www.90mh.com", "www.90mh.org"],
        enable: 0,
        reg: /www\.90mh\.(com|org)\/manhua\/\w+\/\d+\.html/i,
        imgs: () => {
            const {
                chapterImages,
                SinConf,
                chapterPath
            } = _unsafeWindow;
            return chapterImages.map(e => SinConf.resHost[0].domain + "/" + chapterPath + e);
        },
        button: [4],
        insertImg: ["#images", 2],
        autoDownload: [0],
        next: () => {
            const {
                nextChapterData,
                comicUrl
            } = _unsafeWindow;
            return nextChapterData.id && nextChapterData.id > 0 ? comicUrl + nextChapterData.id + ".html" : null;
        },
        prev: ".prevC",
        customTitle: (doc = document) => fun.title(" - ", 3, doc),
        preloadNext: async (nextDoc, obj) => {
            let code = fun.gst("chapterImages", nextDoc);
            fun.script(code, 0, 1);
            fun.picPreload(obj.imgs(), obj.customTitle(nextDoc), "next");
        },
        category: "comic"
    }, {
        name: "90漫画M",
        host: ["wap.90mh.com", "m.90mh.org"],
        enable: 0,
        reg: /(wap|m)\.90mh\.(com|org)\/manhua\/\w+\/\d+\.html/i,
        init: () => _this.next() ? fun.addUrlHtml(_this.next(), "#chapter-image", 1) : null,
        imgs: (url = siteUrl, doc = document, msg = 1, request = 0) => fun.getImg("#chapter-image img", fun.gt("#k_total", 1, doc), 5, null, 20, url, msg, request),
        button: [4],
        insertImg: ["#chapter-image", 2],
        autoDownload: [0],
        next: () => {
            let next = fun.ge("//a[text()='下一章'][contains(@href,'html')]");
            return next ? next.href : null;
        },
        prev: 1,
        customTitle: (doc = document) => fun.title("在线", 1, doc),
        preloadNext: async (nextDoc, obj) => fun.picPreload(await obj.imgs(nextLink, nextDoc, 0, 1), obj.customTitle(nextDoc), "next"),
        css: ".a-90mh{display:none!important}",
        category: "comic"
    }, {
        name: "优酷漫画",
        host: ["www.ykmh.com"],
        enable: 0,
        reg: /www\.ykmh\.com\/manhua\/\w+\/\d+\.html/i,
        init: "$(document).unbind('keydown');$(document).unbind('keyup');",
        imgs: () => {
            const {
                chapterImages,
                SinConf
            } = _unsafeWindow;
            return chapterImages.map(e => SinConf.resHost[0].domain + e);
        },
        button: [4],
        insertImg: ["#images", 2],
        autoDownload: [0],
        next: ".next>a",
        prev: ".pre>a",
        customTitle: (doc = document) => fun.title(" - ", 3, doc),
        preloadNext: (nextDoc, obj) => {
            let code = fun.gst("chapterImages", nextDoc);
            fun.script(code, 0, 1);
            fun.picPreload(obj.imgs(), obj.customTitle(nextDoc), "next");
        },
        css: ".img_land_prev,.img_land_next{display:none!important}",
        category: "comic"
    }, {
        name: "优酷漫画M",
        host: ["h5.ykmh.com"],
        enable: 0,
        reg: /h5\.ykmh\.com\/manhua\/\w+\/\d+\.html/i,
        init: "$('#images').unbind('click');",
        imgs: () => {
            const {
                chapterImages,
                SinConf
            } = _unsafeWindow;
            return chapterImages.map(e => SinConf.resHost[0].domain + e);
        },
        button: [4],
        insertImg: ["#images", 2],
        autoDownload: [0],
        next: () => {
            const {
                nextChapterData,
                comicUrl
            } = _unsafeWindow;
            return nextChapterData.id && nextChapterData.id > 0 ? comicUrl + nextChapterData.id + ".html" : null;
        },
        prev: "//a[text()='上一章']",
        customTitle: () => {
            const {
                pagtitle
            } = _unsafeWindow;
            let s = pagtitle.split(" - ");
            return s[1] + " - " + s[0];
        },
        preloadNext: (nextDoc, obj) => {
            let code = fun.gst("chapterImages", nextDoc);
            fun.script(code, 0, 1);
            fun.picPreload(obj.imgs(), nextDoc.title, "next");
        },
        css: ".letchepter>div,.letchepter>section,#FullPictureLoad~*{display:none!important}",
        category: "comic"
    }, {
        name: "最漫画M / 拼拼漫画M",
        host: ["m.zuimh.com", "m.pinmh.com"],
        enable: 0,
        reg: /(m\.zuimh\.com|m.pinmh.com)\/manhua\/\w+\/\d+\.html/i,
        imgs: (url = siteUrl, doc = document, msg = 1, request = 0) => {
            let max = fun.gt(".image-content p", 1, doc).match(/\/(\d+)/)[1];
            return fun.getImg("#image", max, 5, null, 20, url, msg, request);
        },
        button: [4],
        insertImg: ["#images", 2],
        autoDownload: [0],
        next: "//a[text()='下一章'][contains(@href,'html')] | //a[img[contains(@src,'icon_xz.png')]][contains(@href,'html')]",
        prev: "//a[text()='上一章'][contains(@href,'html')] | //a[img[contains(@src,'icon_sz.png')]][contains(@href,'html')]",
        customTitle: (doc = document) => fun.title("在线", 1, doc),
        preloadNext: async (nextDoc, obj) => fun.picPreload(await obj.imgs(nextLink, nextDoc, 0, 1), obj.customTitle(nextDoc), "next"),
        css: "body{padding:0!important}div[style*='text-align']:not(#images),.UnderPage~*:not([id^='pv-']):not([class^='pv-']):not(.pagetual_tipsWords):not(#comicRead):not(#fab):not(.FullPictureLoadMsg):not(.FullPictureLoadFixedBtn):not(#FullPictureLoadOptions):not(#FullPictureLoadFixedMenu):not(*[class^=fancybox]){display:none!important}",
        category: "comic"
    }, {
        name: "零点漫画M",
        host: ["m.0dmh.com"],
        enable: 0,
        reg: /(m\.0dmh\.com)\/manhua\/\w+\/\d+\.html/i,
        imgs: (url = siteUrl, doc = document, msg = 1, request = 0) => {
            let max = Math.ceil(fun.gt("#images p", 1, doc).match(/\/(\d+)/)[1] / 3);
            return fun.getImg("#images img", max, 5, null, 20, url, msg, request);
        },
        button: [4],
        insertImg: ["#images", 2],
        autoDownload: [0],
        next: "//a[text()='下一章'][contains(@href,'html')]",
        prev: "//a[text()='上一章'][contains(@href,'html')]",
        customTitle: (doc = document) => fun.title("-零点漫画", 0, doc).trim(),
        preloadNext: async (nextDoc, obj) => fun.picPreload(await obj.imgs(nextLink, nextDoc, 0, 1), obj.customTitle(nextDoc), "next"),
        css: ".action-list li{width:50% !important}div[style*='text-align']:not(#images),.action-list>ul>li:nth-child(n+2):nth-child(-n+3){display:none!important}",
        category: "comic"
    }, {
        name: "漫画连M / 果果漫画M",
        host: ["m.100mhl.com", "m.guoguomh.com"],
        enable: 0,
        reg: /(m\.100mhl\.com|m\.guoguomh\.com)\/manhua\/\w+\/\d+\.html/i,
        imgs: (url = siteUrl, doc = document, msg = 1, request = 0) => {
            let num = fun.gt("#images p", 1, doc).match(/\/(\d+)/)[1];
            let max = Math.ceil(num / 5);
            return fun.lh == "m.100mhl.com" ? fun.getImg("#images img", max, 5, null, 20, url, msg, request) : fun.getImg("#images img", num, 5, null, 20, url, msg, request);
        },
        button: [4],
        insertImg: ["#images", 2],
        autoDownload: [0],
        next: () => {
            let next = fun.ge("//a[text()='下一章'][contains(@href,'html')]");
            return next ? next.href : null;
        },
        prev: 1,
        customTitle: () => {
            let comic_name;
            fun.lh == "m.100mhl.com" ? comic_name = document.title.split("漫画")[0] : comic_name = fun.attr("meta[name='keywords']", "content").split(" ")[0];
            return comic_name + " - " + fun.gt(".BarTit").trim();
        },
        preloadNext: async (nextDoc, obj) => fun.picPreload(await obj.imgs(nextLink, nextDoc, 0, 1), nextDoc.title, "next"),
        css: "#addMoney,#images~div[style*=blur],div[style*='text-align: left;']{display:none!important}",
        category: "comic"
    }, {
        name: "爱米推漫画M/下拉式漫画M/冰氪漫画M/狗狗漫画M/悠闲漫画M",
        host: ["m.imitui.com", "m.xlsmh.com", "m.icekr.com", "m.gougoumh.com", "m.yxtun.com"],
        enable: 0,
        reg: /(m\.imitui\.com|m\.xlsmh\.com|m\.icekr\.com|m\.gougoumh\.com|m\.yxtun\.com)\/manhua\/\w+\/\d+\.html/i,
        imgs: doc => {
            let imgs = fun.getImgSrcArr("#images img:not([src*=loading]),#scroll-image img", doc);
            fun.remove("#scroll-image");
            return imgs;
        },
        button: [4],
        insertImg: ["#images", 2],
        autoDownload: [0],
        next: () => {
            try {
                const {
                    nextChapterData
                } = _unsafeWindow;
                return nextChapterData.id > 0 ? nextChapterData.url : null;
            } catch (e) {
                let next = fun.ge("//a[text()='下一章 > '][contains(@href,'html')]");
                return next ? next.href : null;
            }
        },
        prev: 1,
        customTitle: doc => /xlsmh|gougoumh|yxtun/.test(fun.lh) ? fun.gt("#panel-title span,.title3 span", 1, doc).replace(">", " - ") : fun.title("在线", 1, doc),
        preloadNext: async (nextDoc, obj) => fun.picPreload(obj.imgs(nextDoc), obj.customTitle(nextDoc), "next"),
        css: "body{padding:0!important}.UnderPage~*:not([id^='pv-']):not([class^='pv-']):not(.pagetual_tipsWords):not(#comicRead):not(#fab):not(.FullPictureLoadMsg):not(.FullPictureLoadFixedBtn):not(#FullPictureLoadOptions):not(#FullPictureLoadFixedMenu):not(*[class^=fancybox]),.bottom~*:not([id^='pv-']):not([class^='pv-']):not(.pagetual_tipsWords):not(#comicRead):not(#fab):not(.FullPictureLoadMsg):not(.FullPictureLoadFixedBtn):not(#FullPictureLoadOptions):not(#FullPictureLoadFixedMenu):not(*[class^=fancybox]),div[style*='text-align: left;']{display:none!important}",
        category: "comic"
    }, {
        name: "前未漫画/最漫画/爱米推漫画/下拉式漫画/漫画连/拼拼漫画/零点漫画/雪儿漫画/狗狗漫画/悠闲漫画/漫画看/果果漫画",
        host: ["www.qianmh.com", "www.zuimh.com", "www.imitui.com", "imitui.com", "www.xlsmh.com", "www.100mhl.com", "www.pinmh.com", "www.0dmh.com", "www.xuermh.com", "www.gougoumh.com", "www.yxtun.com", "www.bukamh.com", "www.mhkan.com", "www.guoguomh.com"],
        enable: 0,
        reg: /www\.(qianmh|zuimh|imitui|xlsmh|100mhl|pinmh|0dmh|xuermh|gougoumh|yxtun|mhkan|guoguomh)\.com\/manhua\/\w+\/\d+\.html/i,
        init: "try{$(document).unbind('keydown');$(document).unbind('keyup')}catch(e){}fun.remove(\"//div[@class='main'][h3]\");",
        imgs: () => _unsafeWindow.chapterImages,
        button: [4],
        insertImg: [
            ["#images,#imagesOld", 2, "#images,#imagesOld"], 2
        ],
        autoDownload: [0],
        next: () => {
            const {
                nextChapterData,
                comicUrl
            } = _unsafeWindow;
            let next = fun.ge(".next>a,a.next,a.nextC");
            if (next) {
                if (/SinTheme\.nextChapter/.test(next.href)) {
                    return nextChapterData.id && nextChapterData.id > 0 ? comicUrl + nextChapterData.id + ".html" : null;
                } else {
                    return next.href;
                }
            }
            return null;
        },
        prev: ".pre>a,a.prev,a.prevC",
        autoClick: "#chapter-pagination:not(.active),#mode_pagination",
        customTitle: () => {
            let host = fun.lh;
            if (/pinmh|guoguomh/.test(host)) {
                return fun.gt(".head_title").replace("-", " -");
            } else if (/qianmh|xlsmh|100mhl|0dmh|xuermh|gougoumh/.test(host)) {
                //return fun.gt("h1").trim();
                let data = JSON.parse(localStorage.history)[0];
                return data.comic_name + " - " + data.read_chapter
            } else if (/zuimh|imitui|dmhua|yxtun|mhkan/.test(host)) {
                return fun.gt(".title h1") + " - " + fun.gt(".title h2");
            }
        },
        preloadNext: (nextDoc, obj) => {
            let code = fun.gst("chapterImages", nextDoc);
            fun.script(code, 0, 1);
            fun.picPreload(obj.imgs(), nextDoc.title, "next");
        },
        css: "#qTcms_picID{display:none!important}",
        category: "comic"
    }, {
        name: "雪儿漫画M",
        host: ["m.xuermh.com"],
        enable: 0,
        reg: /m\.xuermh\.com\/manhua\/\w+\/\d+\.html/i,
        init: async () => {
            let a = fun.ge(".erPag a");
            let img = fun.ge(".erPag a img:last-child");
            a.outerHTML = img.outerHTML;
            await fun.getNP(".erPag mip-link img:not([style*=position])", "//mip-link[text()='下一页'][contains(@href,'-')] | //a[text()='下一页'][contains(@href,'-')]", null, "#action", 0, null, 0);
        },
        imgs: () => fun.gae(".erPag mip-link img:not([style*=position])"),
        button: [4],
        insertImg: [".erPag", 2],
        autoDownload: [0],
        next: "//a[text()='下一章']",
        prev: "//a[text()='上一章']",
        customTitle: () => fun.gt("h1").replace(">", " - ").trim(),
        css: "div[style*='text-align: left;'],#action li:nth-child(2),#action li:nth-child(3),span.right{display:none!important}#action li{width:50%!important}",
        category: "comic"
    }, {
        name: "来漫画",
        host: ["www.laimanhua8.com"],
        enable: 1,
        reg: () => /www\.laimanhua\d?\.(net|com)\/kanmanhua\/\w+\/\d+\.html/i.test(fun.url) && comicInfiniteScrollMode != 1,
        init: () => {
            fun.clearAllTimer();
            fun.createImgBox("#pic-list", 2);
        },
        imgs: () => {
            const {
                base64_decode,
                picTree,
                getpicdamin
            } = _unsafeWindow;
            return base64_decode(picTree).split("$qingtiandy$").map(e => getpicdamin() + e);
        },
        button: [4],
        insertImg: [
            ["#FullPictureLoadMainImgBox", 0, "#pic-list"], 2
        ],
        autoDownload: [0],
        next: () => {
            const {
                nextUrlid
            } = _unsafeWindow;
            return nextUrlid == "" ? null : fun.gu("a#cartoon_url") + nextUrlid + ".html";
        },
        prev: ".btn-prev",
        customTitle: (doc = document) => fun.title(",", 1, doc).replace("漫画", ""),
        preloadNext: (nextDoc, obj) => {
            let code = fun.gst("picTree", nextDoc);
            fun.script(code, 0, 1);
            fun.picPreload(obj.imgs(), obj.customTitle(nextDoc), "next");
        },
        css: "#FullPictureLoadEnd{color:rgb(255, 255, 255)}#loading,#pre-loading,.img_info,.blank20,#udbsdk_login{display:none!important}",
        infiniteScroll: true,
        category: "comic"
    }, {
        name: "来漫画 自動翻頁",
        reg: () => /www\.laimanhua\d?\.(net|com)\/kanmanhua\/\w+\/\d+\.html/i.test(fun.url) && comicInfiniteScrollMode == 1,
        getSrcs: (dom) => {
            const {
                base64_decode,
                getpicdamin
            } = _unsafeWindow;
            let code = fun.gst("picTree", dom);
            let base64Text = code.match(/picTree[\s\=]+([^;]+)/)[1].replaceAll('"', "").replaceAll("'", "");
            let srcs = base64_decode(base64Text).split("$qingtiandy$").map(e => getpicdamin() + e);
            return srcs;
        },
        getImgs: (dom = document) => {
            let srcs = _this.getSrcs(dom);
            return fun.createImgArray(srcs);
        },
        init: async () => {
            fun.clearAllTimer();
            fun.createImgBox("#pic-list", 2);
            fun.remove("#pic-list");
            let imgs = _this.getImgs();
            let tE = fun.ge("#FullPictureLoadMainImgBox");
            tE.append(...imgs);
            await fun.lazyload();
            _this.autoPager.preloadNextPage();
        },
        autoPager: {
            script: "//script[contains(text(),'picTree')]",
            ele: (dom) => _this.getImgs(dom),
            pos: ["#FullPictureLoadMainImgBox", 0],
            observer: "#FullPictureLoadMainImgBox>img",
            next: (dom) => {
                let code = fun.gst("nextUrlid", dom);
                let comicURL = fun.gu("#position a");
                let cidText = code.match(/nextUrlid[\s\=]+([^,;]+)/)[1];
                if (/\d+/.test(cidText)) {
                    let cid = cidText.match(/\d+/)[0];
                    return comicURL + cid + ".html";
                } else {
                    return null;
                }
            },
            re: "#bottom_chapter",
            title: (dom) => fun.gt("#position", 1, dom).replaceAll("\n", "").replaceAll(">", "").replace("漫画", ""),
            preloadNextPage: (dom) => {
                let next = _this.autoPager.next(dom);
                if (!!next) {
                    fun.fetchDoc(next).then(nextDoc => {
                        let srcs = _this.getSrcs(nextDoc);
                        let text = _this.autoPager.title(nextDoc);
                        fun.picPreload(srcs, text, "next");
                    });
                }
            }
        },
        css: "#loading,#pre-loading,.img_info,.blank20,#udbsdk_login{display:none!important}",
        category: "comic autoPager"
    }, {
        name: "来漫画M",
        host: ["m.laimanhua8.com"],
        enable: 1,
        reg: () => /m\.laimanhua8\.com\/kanmanhua\/\w+\/\d+\.html/i.test(fun.url) && comicInfiniteScrollMode != 1,
        init: () => fun.clearAllTimer(),
        imgs: () => {
            const {
                mhInfo,
                realurl
            } = _unsafeWindow;
            return mhInfo.images.map(e => realurl + mhInfo.path + e);
        },
        button: [4],
        insertImg: ["#manga", 2],
        autoDownload: [0],
        next: () => {
            const {
                mhInfo
            } = _unsafeWindow;
            return mhInfo.nextUrlid == "" ? null : fun.gu("#mangaTitle>a") + mhInfo.nextUrlid + ".html";
        },
        prev: "//a[text()='上一章']",
        customTitle: (doc = document) => fun.gt("#mangaTitle", 1, doc),
        preloadNext: (nextDoc, obj) => {
            let code = fun.gst("mhInfo", nextDoc);
            fun.script(code, 0, 1);
            fun.picPreload(obj.imgs(), obj.customTitle(nextDoc), "next");
        },
        css: "#jusha1{display:none!important}.action-list li{width:50% !important}#action>ul>li:nth-child(n+2):nth-child(-n+3){display:none !important}",
        infiniteScroll: true,
        category: "comic"
    }, {
        name: "来漫画M 自動翻頁",
        reg: () => /m\.laimanhua8\.com\/kanmanhua\/\w+\/\d+\.html/i.test(fun.url) && comicInfiniteScrollMode == 1,
        json: (dom = document) => {
            let code = fun.gst("mhInfo", dom);
            let objText = code.match(/mhInfo[\s=]+([^;]+)/)[1];
            let json = JSON.parse(objText);
            return json;
        },
        getSrcs: (dom = document) => {
            let json = _this.json(dom);
            let srcs = json.images.map(e => _unsafeWindow.realurl + json.path + e);
            return srcs;
        },
        getImgs: (dom = document) => {
            let srcs = _this.getSrcs(dom);
            return fun.createImgArray(srcs);
        },
        init: async () => {
            fun.clearAllTimer();
            let imgs = _this.getImgs();
            let tE = fun.ge("#manga");
            tE.innerHTML = "";
            tE.append(...imgs);
            await fun.lazyload();
            _this.autoPager.preloadNextPage();
        },
        autoPager: {
            script: "//script[contains(text(),'mhInfo')]",
            ele: (dom) => _this.getImgs(dom),
            pos: ["#manga", 0],
            observer: "#manga>img",
            next: (dom, r = 1) => {
                let json = _this.json(dom);
                let cUrl = fun.gu("#mangaTitle>a");
                if (json.nextUrlid == "") {
                    if (r === 1) {
                        fun.remove("//li[a[text()='下一章']]");
                        let html = `<li><a href="${cUrl}">返回目录</a></li>`;
                        fun.ge("#action>ul").insertAdjacentHTML("beforeend", html);
                    }
                    return null;
                } else {
                    return cUrl + json.nextUrlid + ".html";
                }
            },
            title: (dom) => _this.json(dom).chapterTitle,
            hide: "#slider",
            preloadNextPage: (dom) => {
                let next = _this.autoPager.next(dom, 0);
                if (!!next) {
                    fun.fetchDoc(next).then(nextDoc => {
                        let srcs = _this.getSrcs(nextDoc);
                        let text = _this.autoPager.title(nextDoc);
                        fun.picPreload(srcs, text, "next");
                    });
                }
            }
        },
        css: "#jusha1{display:none!important}.action-list li{width:50% !important}#action>ul>li:nth-child(n+2):nth-child(-n+3){display:none !important}",
        category: "comic autoPager"
    }, {
        name: "漫画看M",
        host: ["m.mhkan.com"],
        enable: 0,
        reg: /^https?:\/\/m\.mhkan\.com\/manhua\/\w+\/\d+\.html/i,
        imgs: () => _unsafeWindow.chapterImages,
        button: [4],
        insertImg: [".chapter-content", 2],
        autoDownload: [0],
        next: () => {
            const {
                nextChapterData,
                comicUrl
            } = _unsafeWindow;
            return nextChapterData.id && nextChapterData.id > 0 ? comicUrl + nextChapterData.id + ".html" : null;
        },
        prev: "//a[text()='上一章']",
        customTitle: () => {
            let data = JSON.parse(localStorage.history)[0];
            return data.comic_name + " - " + data.read_chapter
        },
        preloadNext: (nextDoc, obj) => {
            let code = fun.gst("chapterImages", nextDoc);
            fun.script(code, 0, 1);
            fun.picPreload(obj.imgs(), nextDoc.title, "next");
        },
        category: "comic"
    }, {
        name: "漫客栈",
        host: ["www.mkzhan.com"],
        enable: 0,
        reg: /www\.mkzhan\.com\/\d+\/\d+\.html/i,
        fetchJson: async (lp = new URL(siteUrl).pathname) => {
            let lps = lp.split("/");
            let comic_id = lps[1];
            let chapter_id = lps[2].match(/\d+/)[0];
            let apiUrl = `https://comic.mkzcdn.com/chapter/content/v1/?chapter_id=${chapter_id}&comic_id=${comic_id}&format=1&quality=1&type=1`;
            return fetch(apiUrl).then(res => res.json());
        },
        init: async () => {
            let json = await _this.fetchJson();
            debug("\n此頁JSON資料\n", json);
            siteJson = json;
        },
        imgs: (json = siteJson) => json.code == 302 ? [] : json.data.page.map(e => e.image),
        insertImg: ["#pages-tpl", 2],
        autoDownload: [0],
        next: ".rd-aside a.j-rd-next",
        prev: ".rd-aside a.j-rd-prev",
        autoClick: "//div[@class='rd-aside__item j-rd-mod'][span[text()='卷轴']]",
        customTitle: (doc = document) => fun.title(" - ", 1, doc),
        preloadNext: async (nextDoc, obj) => {
            let json = await obj.fetchJson(new URL(nextLink).pathname);
            fun.picPreload(obj.imgs(json), obj.customTitle(nextDoc), "next")
        },
        category: "comic"
    }, {
        name: "797漫画网",
        host: ["797mh.com"],
        enable: 0,
        reg: /^https?:\/\/797mh\.com\/chapter\/\d+$/i,
        init: () => fun.createImgBox("#comic_pic", 1),
        imgs: "#comic_pic",
        button: [4],
        insertImg: [
            ["#FullPictureLoadMainImgBox", 0, "#comic_pic"], 2
        ],
        autoDownload: [0],
        next: "//a[contains(text(),'下一章')]",
        prev: "//a[contains(text(),'上一章')]",
        customTitle: (doc = document) => fun.gt(".bo_tit", 1, doc).replace("\\n", "").replace(">", "-"),
        preloadNext: true,
        css: ".addg{display:none!important;}",
        category: "comic"
    }, {
        name: "漫画屋格式",
        host: ["www.mhua5.com", "www.mhw1.com", "www.cmh5.com", "www.umh5.com", "www.manshiduo.net", "www.obq8.com", "mh.9xxsm.com", "www.wujinmanhua.com", "comics.veryim.com"],
        enable: 0,
        reg: [
            /(www\.mhua5\.com|www\.mhw\d?\.com|www\.cmh5\.com|www\.umh5\.com|mh\.9xxsm\.com)\/index\.php\/chapter\/\d+/i,
            /www\.manshiduo\.net\/chapter_\d+\.html/i,
            /www\.obq8\.com\/index\.php\/chapter-\d+.html/i,
            /www\.wujinmanhua\.com\/\d+-\d+\.html/i,
            /comics\.veryim\.com\/\w+\/\d+\/\d+\.html/
        ],
        include: ".rd-article-wr",
        init: "document.onkeydown=null;",
        imgs: (doc = document) => fun.getImgSrcArr("img[data-original]:not([data-original*='/template/pc/default/']),.lazy-read:not([data-original*='/template/pc/default/']),img[data-src]", doc),
        button: [4],
        insertImg: [".rd-article-wr", 2],
        autoDownload: [0],
        //next: ".btn--next-chapter,.rd-aside a.j-rd-next",
        next: () => {
            let next1 = fun.ge("a.j-rd-next[_href]:not([style])");
            let next2 = fun.ge("a.j-rd-next[href]:not([href^=java])");
            if (/mh\.9xxsm\.com/.test(fun.lh)) {
                let next = fun.ge("a.j-rd-prev[_href]:not([style])");
                return next ? location.origin + next.getAttribute("_href") : null;
            } else if (next1) {
                let href = fun.attr("a.j-rd-next[_href]", "_href");
                return href == "" ? null : location.origin + href;
            } else if (next2) {
                return next2.href;
            }
            return null;
        },
        prev: ".rd-aside a.j-rd-prev",
        autoClick: "//div[@class='rd-aside__item j-rd-mod'][span[text()='卷轴']]",
        customTitle: (doc = document) => {
            if (/www\.mhua5\.com|www\.mhw\d\.com/.test(fun.lh)) {
                return fun.title(" - 漫画屋", 0, doc).replace("-", " - ");
            } else if (/www\.cmh5\.com/.test(fun.lh)) {
                return fun.attr("meta[name=description]", "content", doc).split(" - 漫画屋")[0].replace("当前阅读的是", "").replace("的", " - ");
            } else if (/www\.umh5\.com|www\.biqug\.org|mh\.9xxsm\.com/.test(fun.lh)) {
                return fun.gt(".j-comic-title", 1, doc) + " - " + fun.gt(".last-crumb", 1, doc);
            } else {
                return fun.title(/下拉|在线/, 1, doc).replace("-", " - ").replace(/漫画|\[\d+P\]/i, "");
            }
        },
        preloadNext: true,
        css: "#FullPictureLoadEnd{color:rgb(255, 255, 255)}",
        category: "comic"
    }, {
        name: "漫画屋M格式",
        host: ["m.mkzhan.com", "www.mhua5.com", "www.mhw1.com", "www.cmh5.com", "www.umh5.com", "www.manshiduo.net", "www.biqug.org", "mh.9xxsm.com", "m.wujinmanhua.com", "wap.veryim.com"],
        enable: 0,
        reg: [
            /m\.mkzhan\.com\/\d+\/\d+\.html/i,
            /(www\.mhua5\.com|www\.mhw\d?\.com|www\.cmh5\.com|www\.umh5\.com|mh\.9xxsm\.com)\/index\.php\/chapter\/\d+/i,
            /www\.manshiduo\.net\/chapter_\d+\.html/i,
            /www\.biqug\.org\/index\.php\/chapter-\d+.html/i,
            /m\.wujinmanhua\.com\/\d+-\d+\.html/i,
            /wap\.veryim\.com\/\w+\/\d+\/\d+\.html/i
        ],
        imgs: (doc = document) => fun.getImgSrcArr(".comic-page img,img[data-src],img[data-original]", doc),
        autoDownload: [0],
        next: async () => {
            if (/www\.mhua5\.com|www\.cmh5\.com|www\.umh5\.com|www\.mhw\d\.com|www\.biqug\.org|mh\.9xxsm\.com/.test(fun.lh)) {
                let next = fun.attr(".next-chapter", "_href");
                return next !== "" ? location.origin + next : null;
            } else if (/m\.mkzhan\.com/.test(fun.lh)) {
                await fun.waitEle(".next-chapter[data-href]", 10)
                let next = fun.ge(".next-chapter").dataset.href;
                return next !== "" || next != 0 ? location.origin + next : null;
            } else if (/www\.manshiduo\.net|www..cmh5\.com/.test(fun.lh)) {
                let next = fun.attr(".next-chapter", "_href");
                return next !== "" ? location.origin + next : null;
            } else {
                let next = fun.ge("//a[text()='下一章']");
                return next ? next.href : null;
            }
        },
        prev: 1,
        customTitle: (doc = document) => {
            if (/www\.mhua5\.com|www\.cmh5\.com/.test(fun.lh)) {
                return fun.title(" - 漫画屋", 0, doc).replace("-", " - ");
            } else if (/m\.mkzhan\.com/.test(fun.lh)) {
                return fun.title(" - 漫客栈", 0, doc).trim();
            } else if (/www\.umh5\.com|www\.mhw\d\.com|www\.biqug\.org|mh\.9xxsm\.com|m\.cuiman\.com/.test(fun.lh)) {
                return _unsafeWindow.shareArr[0].match(/《([^》]+)/)[1] + " - " + fun.gt(".comic-name", 1, doc);
            } else {
                return fun.title(/下拉|在线/, 1, doc).trim().replace("-", " - ");
            }
        },
        preloadNext: (nextDoc, obj) => fun.iframeDoc(nextLink, ".comic-page img,img[data-src],img[data-original],canvas[data-src]", 30000).then(nextIframeDoc => fun.picPreload(obj.imgs(nextIframeDoc), obj.customTitle(nextIframeDoc), "next")),
        css: "body>ins,#mainView>.read,.chapter-end .read,#chapter1,#chapter3,.cnt-4,.comic-list a,.chapter-end>a,div[style^=height]{display:none!important}",
        category: "comic"
    }, {
        name: "漫百库M",
        host: ["www.manhuabaiku.com"],
        enable: 0,
        reg: /www\.manhuabaiku\.com\/chapter\/\w+\.html/i,
        init: () => {
            $("body").on("click", ".FullPictureLoadImage", () => {
                if ($(".top-tool-bar").css("top") == "0px") {
                    $(".top-tool-bar").animate({
                        top: "-100px"
                    }, 500);
                    $(".bottom-tool-bar").animate({
                        bottom: "-100px"
                    }, 500);
                } else {
                    $(".top-tool-bar").animate({
                        top: "0px"
                    }, 500);
                    $(".bottom-tool-bar").animate({
                        bottom: "0px"
                    }, 500);
                }
            });
        },
        imgs: (doc = document) => fun.gae(".readForm canvas", doc).map(e => atob(e.dataset.sc)),
        button: [4],
        insertImg: [".readForm", 2],
        autoDownload: [0],
        next: "//a[text()='下一章'][contains(@href,'html')]",
        prev: "//a[text()='上一章'][contains(@href,'html')]",
        customTitle: (doc = document) => doc.title.split("漫画章节")[0] + " - " + fun.gt(".comic-name", 1, doc),
        preloadNext: true,
        category: "comic"
    }, {
        name: "vomic漫画",
        host: ["www.vomicmh.com"],
        enable: 0,
        reg: /^http:\/\/www\.vomicmh\.com\/m_\w+\//i,
        imgs: "#showimage img",
        button: [4],
        insertImg: ["#showimage", 2],
        autoDownload: [0],
        next: "a#next_c[href]",
        prev: "a#last_c[href]",
        customTitle: (doc = document) => fun.title(" - ", 3, doc).trim(),
        preloadNext: (nextDoc, obj) => fun.iframeSrcDoc(nextLink, "#showimage img", 30000).then(nextIframeDoc => fun.picPreload(fun.getImgSrcArr(obj.imgs, nextIframeDoc), obj.customTitle(nextIframeDoc), "next")),
        css: "#FullPictureLoadEnd{color:rgb(255, 255, 255)}",
        category: "comic"
    }, {
        name: "爱国漫",
        host: ["www.guoman.net"],
        enable: 1,
        reg: () => /www\.guoman\.net\/chapter\/.+\.html/i.test(fun.url) && comicInfiniteScrollMode != 1,
        imgs: () => _unsafeWindow.newImgs.map(e => e.url),
        button: [4, "24%", 1],
        insertImg: [".main-scroll_mode", 2],
        autoDownload: [0],
        next: "a.J_next_eposide_btn[href*=chapter]",
        prev: "a.J_prev_eposide_btn[href*=chapter]",
        customTitle: (doc = document) => fun.gt(".cartoon-title>a:first-child", 1, doc) + " - " + fun.gt(".cartoon-title>a:last-child", 1, doc),
        preloadNext: (nextDoc, obj) => {
            fun.iframeVar(nextLink, 1000, "newImgs").then(w => {
                let srcs = w.newImgs.map(e => e.url);
                fun.picPreload(srcs, obj.customTitle(nextDoc), "next");
            });
        },
        infiniteScroll: true,
        css: "a:has(>img[alt*='APP']){display:none!important;}#FullPictureLoadEnd{color:rgb(255, 255, 255)}",
        category: "comic"
    }, {
        name: "爱国漫 自動翻頁",
        reg: () => /www\.guoman\.net\/chapter\/.+\.html/i.test(fun.url) && comicInfiniteScrollMode == 1,
        getImgs: () => {
            let srcs = frameWindow.newImgs.map(e => e.url);
            return fun.createImgArray(srcs);
        },
        init: async () => {
            let imgs = _this.getImgs();
            let tE = fun.ge(".main-scroll_mode");
            tE.innerHTML = "";
            tE.append(...imgs);
            await fun.lazyload();
            _this.autoPager.preloadNextPage();
        },
        autoPager: {
            mode: 1,
            waitEle: ".main-item>img:not([src*='.gif'])",
            ele: () => _this.getImgs(),
            pos: [".main-scroll_mode", 0],
            observer: ".main-scroll_mode>img",
            next: (dom) => {
                let nextE = fun.ge("a.J_next_eposide_btn[href*=chapter]", dom);
                if (nextE) {
                    return nextE.href;
                } else {
                    fun.remove("li:has(>a.J_next_eposide_btn)");
                    return null;
                }
            },
            re: ".chapter-sub,.nav-bottom-ul",
            title: (dom) => fun.gt(".cartoon-title>a:first-child", 1, dom) + " - " + fun.gt(".cartoon-title>a:last-child", 1, dom),
            preloadNextPage: (dom) => {
                let next = _this.autoPager.next(dom);
                if (!!next) {
                    fun.iframe(next, {
                        waitVar: "newImgs",
                        cb: async (dom, frame) => {
                            let srcs = frame.newImgs.map(e => e.url);
                            let text = _this.autoPager.title(dom);
                            fun.picPreload(srcs, text, "next");
                        }
                    });
                }
            }
        },
        css: "a:has(>img[alt*='APP']){display:none!important;}",
        category: "comic autoPager"
    }, {
        name: "爱国漫M",
        host: ["m.guoman.net"],
        enable: 1,
        reg: () => /m\.guoman\.net\/chapter\/.+\.html/i.test(fun.url) && comicInfiniteScrollMode != 1,
        imgs: () => _unsafeWindow.newImgs.map(e => e.url),
        capture: () => _this.imgs(),
        autoDownload: [0],
        next: "//a[text()='下一章'][contains(@href,'html')]",
        prev: "//a[text()='上一章'][contains(@href,'html')]",
        customTitle: (doc = document) => doc.title.split("免费")[0].replace("漫画", ""),
        preloadNext: (nextDoc, obj) => {
            fun.iframeVar(nextLink, 1000, "newImgs").then(w => {
                let srcs = w.newImgs.map(e => e.url);
                fun.picPreload(srcs, obj.customTitle(nextDoc), "next");
            });
        },
        infiniteScroll: true,
        category: "comic"
    }, {
        name: "爱国漫M 自動翻頁",
        reg: () => /m\.guoman\.net\/chapter\/.+\.html/i.test(fun.url) && comicInfiniteScrollMode == 1,
        getImgs: () => {
            let srcs = frameWindow.newImgs.map(e => e.url);
            return fun.createImgArray(srcs);
        },
        init: async () => {
            await fun.waitEle("#chapterPic>img:not([src*='.gif'])");
            let imgs = _this.getImgs();
            let tE = fun.ge("#chapterPic");
            tE.innerHTML = "";
            tE.append(...imgs);
            await fun.lazyload();
            _this.autoPager.preloadNextPage();
        },
        autoPager: {
            mode: 1,
            waitEle: "#chapterPic>img:not([src*='.gif'])",
            ele: () => _this.getImgs(),
            pos: ["#chapterPic", 0],
            observer: "#chapterPic>img",
            next: (dom) => {
                let nextE = fun.ge("//a[text()='下一章'][contains(@href,'html')]", dom);
                if (nextE) {
                    return nextE.href;
                } else {
                    let ne = fun.ge("//a[text()='下一章']");
                    ne.innerText = "无";
                    return null;
                }
            },
            re: ".bottom-bar",
            title: (dom) => dom.title.split("免费")[0].replace("漫画", ""),
            preloadNextPage: (dom) => {
                let next = _this.autoPager.next(dom);
                if (!!next) {
                    fun.iframe(next, {
                        waitVar: "newImgs",
                        cb: async (dom, frame) => {
                            let srcs = frame.newImgs.map(e => e.url);
                            let text = _this.autoPager.title(dom);
                            fun.picPreload(srcs, text, "next");
                        }
                    });
                }
            }
        },
        css: ".FullPictureLoadImage~.lazy{display:none!important;}",
        category: "comic autoPager"
    }, {
        name: "新新漫画",
        host: ["www.77mh.nl", "m.77mh.nl", "www.77mh.xyz", "m.77mh.xyz", "www.77mh.me", "m.77mh.me"],
        enable: 0,
        reg: /(www|m)\.77mh\.[a-z]{2,3}\/\d+\/\d+\.html/i,
        init: async () => await fun.waitVar("msg"),
        imgs: async () => {
            let status;
            if (fun.ge(".FullPictureLoadImage")) {
                status = 200;
            } else {
                let src = fun.attr("#comicImg img,.mg-co img", "src");
                status = await fun.xhrHEAD(src).then(res => res.status);
            }
            return status === 200 ? _unsafeWindow.msg.split("|").map(e => fun.indexOf(fun.lh, "m.77mh") ? _unsafeWindow.ImgSvrList + e : _unsafeWindow.img_qianz + e) : [];
        },
        button: [4],
        insertImg: ["#comicImg,.mg-co", 2],
        insertImgAF: () => {
            if (fun.indexOf(fun.lh, "m.77mh")) {
                let p = fun.ge(".page_num");
                let m = fun.ge(".mg-co");
                p ? m.parentNode.insertBefore(p.cloneNode(true), m.nextSibling) : null;
                let selectors = [".pagelist", "//div[div[@style and a[img[@width]]]]"];
                fun.remove(selectors);
            } else {
                let str = "try{$(document).unbind('keydown');$(document).unbind('keyup')}catch(e){}";
                new Function(str)();
                let p = fun.ge("#pnpage");
                let m = fun.ge("#main");
                p ? m.parentNode.insertBefore(p.cloneNode(true), m.nextSibling) : null;
                let selectors = [".qrcode_div", "#bdcotopnew", "#main>*:not(#comicImg)"];
                fun.remove(selectors);
            }
        },
        autoDownload: [0],
        next: () => {
            const {
                nextLink_b
            } = _unsafeWindow;
            return nextLink_b == "" ? null : location.origin + nextLink_b;
        },
        prev: "//a[contains(text(),'上一章')]",
        customTitle: (doc = document) => fun.title(" - ", 3, doc),
        preloadNext: async (nextDoc, obj) => {
            let code = fun.gst("eval", nextDoc);
            fun.script(code, 0, 1);
            fun.picPreload(await obj.imgs(), obj.customTitle(nextDoc), "next");
        },
        category: "comic"
    }, {
        name: "漫漫聚/KuKu动漫",
        enable: 1,
        reg: () => {
            let hosts = ["www.manmanju.cc", "a.manmanju.cc", "b.manmanju.cc", "www.ikukudm.cc", "a.ikukudm.cc", "b.ikukudm.cc"];
            return hosts.includes(fun.lh) && /\/comiclist\/\d+\/\d+\/1\.htm$/.test(fun.lp) && comicInfiniteScrollMode != 1;
        },
        include: "td img",
        comicListUrl: () => `/comiclist/${siteUrl.split("/")[4]}/index.htm`,
        imgs: () => fun.getKukudmSrc(),
        button: [4],
        insertImg: ["//td[input]", 2],
        insertImgAF: async () => {
            let cUrl = _this.comicListUrl();
            let nextUrl = await _this.next();
            if (nextUrl) {
                fun.addUrlHtml(nextUrl, "body", 2);
                fun.addUrlHtml(cUrl, "body", 2, "目錄");
            } else {
                fun.addUrlHtml(cUrl, "body", 2, "目錄");
                fun.addUrlHtml(location.origin, "body", 2, "首頁");
            }
        },
        autoDownload: [0],
        next: () => {
            let chapterId = siteUrl.split("/")[5];
            let host = 1;
            if (/^a\./.test(fun.lh)) {
                host = 2;
            } else if (/^b\./.test(fun.lh)) {
                host = 3;
            }
            let nextXPath = `//dd[a[contains(@href,'${chapterId}')]]/following-sibling::dd[1]/a[${host}]`;
            return fun.xhrDoc(_this.comicListUrl()).then(doc => {
                let next = fun.ge(nextXPath, doc, doc);
                return next ? next.href : null;
            })
        },
        prev: 1,
        preloadNext: async (nextDoc, obj) => fun.picPreload(await fun.getKukudmSrc(nextLink, nextDoc, 0), nextDoc.title, "next"),
        css: "body{background-image:unset}body>table:nth-child(1),body>table:nth-child(3){display:none!important}body>table:nth-child(2),body>table:nth-child(2)>tbody>tr>td{width:100%!important;}body{scrollbar-width:none;-ms-overflow-style:none;overflow-x:hidden;overflow-y:auto}",
        infiniteScroll: true,
        category: "comic"
    }, {
        name: "漫漫聚/KuKu动漫 自動翻頁",
        reg: () => {
            let hosts = ["www.manmanju.cc", "a.manmanju.cc", "b.manmanju.cc", "www.ikukudm.cc", "a.ikukudm.cc", "b.ikukudm.cc"];
            return hosts.includes(fun.lh) && /\/comiclist\/\d+\/\d+\/1\.htm$/.test(fun.lp) && comicInfiniteScrollMode == 1;
        },
        include: "td img",
        comicListUrl: () => `/comiclist/${siteUrl.split("/")[4]}/index.htm`,
        init: async () => {
            fun.showMsg("自動翻頁初始化中...", 0);
            await fun.getKukudmSrc(siteUrl, document, 0).then(srcs => fun.createImgArray(srcs)).then(async imgs => {
                let tE = fun.ge("//td[input]");
                tE.innerHTML = "";
                tE.append(...imgs);
                fun.hideMsg();
                await fun.lazyload();
                _this.autoPager.preloadNextPage();
            });
            let cUrl = _this.comicListUrl();
            fun.addUrlHtml(cUrl, "body", 2, "目錄");
            fun.addUrlHtml(location.origin, "body", 2, "首頁");
        },
        autoPager: {
            ele: (dom) => fun.getKukudmSrc(nextLink, dom, 0).then(srcs => fun.createImgArray(srcs)),
            pos: ["//td[img]", 0],
            observer: "//td[img]/img",
            next: () => {
                let chapterId = (nextLink ?? siteUrl).split("/")[5];
                let host = 1;
                if (/^a\./.test(fun.lh)) {
                    host = 2;
                } else if (/^b\./.test(fun.lh)) {
                    host = 3;
                }
                let nextXPath = `//dd[a[contains(@href,'${chapterId}')]]/following-sibling::dd[1]/a[${host}]`;
                return fun.xhrDoc(_this.comicListUrl()).then(doc => {
                    let next = fun.ge(nextXPath, doc, doc);
                    return next ? next.href : null;
                })
            },
            stop: (dom) => !fun.ge("//td[input]//img", dom),
            preloadNextPage: async (dom) => {
                let next = await _this.autoPager.next();
                if (!!next) {
                    fun.xhrDoc(next).then(async nextDoc => {
                        let srcs = await fun.getKukudmSrc(next, nextDoc, 0);
                        fun.picPreload(srcs, nextDoc.title, "next");
                    });
                }
            }
        },
        css: "body{background-image:unset}body>table:nth-child(1),body>table:nth-child(3){display:none!important}body>table:nth-child(2),body>table:nth-child(2)>tbody>tr>td{width:100%!important;}body{scrollbar-width:none;-ms-overflow-style:none;overflow-x:hidden;overflow-y:auto}",
        category: "comic autoPager"
    }, {
        name: "漫漫聚M/KuKu动漫M",
        enable: 1,
        reg: () => {
            let hosts = ["m.manmanju.cc", "s1.m.manmanju.cc", "s2.m.manmanju.cc", "s3.m.manmanju.cc", "m.ikukudm.cc", "m.3840p.xyz", "sbxrb11.3840p.xyz", "wap.ikukudm.cc", "s1.wap.ikukudm.cc", "s2.wap.ikukudm.cc", "s3.wap.ikukudm.cc"];
            return hosts.includes(fun.lh) && /\/comiclist\/\d+\/\d+\/1\.htm$/.test(fun.lp) && comicInfiniteScrollMode != 1;
        },
        include: ".classBox img,.imgBox",
        init: () => fun.remove("//center[iframe]"),
        imgs: () => {
            fun.remove("//a[img] | //ul[center[li]]");
            return fun.getKukudmSrc();
        },
        button: [4],
        insertImg: [".imgBox", 2],
        insertImgAF: async () => {
            fun.remove(".bottom .subNav~div[style*=height],.bottom .pageLine,.bottom .subNav");
            let nav = fun.ge("ul.subNav").cloneNode(true);
            let tE = fun.ge("div.bottom");
            tE.parentNode.insertBefore(nav, tE);
            await fun.remove("meta[name=viewport]");
            const meta = document.createElement("meta");
            meta.name = "viewport";
            meta.content = "width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=2.0,user-scalable=no";
            document.head.appendChild(meta);
            let url = await _this.next();
            if (url) fun.addUrlHtml(url, ".bottom", 0);
        },
        autoDownload: [0],
        next: () => {
            let comicListUrl = fun.gu(".subNav a");
            let chapterId = siteUrl.split("/")[5];
            let nextXPath = `//li[a[contains(@href,'${chapterId}')]]/preceding-sibling::li[1]/a`;
            return fun.xhrDoc(comicListUrl).then(doc => {
                let next = fun.ge(nextXPath, doc, doc);
                return next ? next.href : null;
            })
        },
        prev: 1,
        customTitle: () => fun.title("在线", 1),
        preloadNext: async (nextDoc, obj) => fun.picPreload(await fun.getKukudmSrc(nextLink, nextDoc, 0), nextDoc.title.split("在线")[0], "next"),
        css: ".imgBox{margin-bottom:0px!important}.subNav{border-top:1px solid #dcdcde}body{scrollbar-width:none;overflow-x:hidden;overflow-y:auto}",
        infiniteScroll: true,
        category: "comic"
    }, {
        name: "漫漫聚/KuKu动漫M 404",
        enable: 1,
        reg: () => {
            let hosts = ["m.manmanju.cc", "s1.m.manmanju.cc", "s2.m.manmanju.cc", "s3.m.manmanju.cc", "m.ikukudm.cc", "m.3840p.xyz", "sbxrb11.3840p.xyz", "wap.ikukudm.cc", "s1.wap.ikukudm.cc", "s2.wap.ikukudm.cc", "s3.wap.ikukudm.cc"];
            return hosts.includes(fun.lh) && /\/comiclist\/\d+\/\d+\/1\.htm$/.test(fun.lp) && comicInfiniteScrollMode != 1;
        },
        include: [
            "td img",
            "iframe[src='/top.htm']"
        ],
        comicListUrl: () => `/comiclist/${siteUrl.split("/")[4]}/index.htm`,
        imgs: () => fun.getKukudmSrc(),
        button: [4],
        insertImg: ["//td[input]", 2],
        insertImgAF: async () => {
            let cUrl = _this.comicListUrl();
            let nextUrl = await _this.next();
            if (nextUrl) {
                fun.addUrlHtml(nextUrl, "body", 2);
                fun.addUrlHtml(cUrl, "body", 2, "目錄");
            } else {
                fun.addUrlHtml(cUrl, "body", 2, "目錄");
                fun.addUrlHtml(location.origin, "body", 2, "首頁");
            }
        },
        autoDownload: [0],
        next: () => {
            let chapterId = siteUrl.split("/")[5];
            let nextXPath = `//li[a[contains(@href,'${chapterId}')]]/preceding-sibling::li[1]/a`;
            return fun.xhrDoc(_this.comicListUrl()).then(doc => {
                let next = fun.ge(nextXPath, doc, doc);
                return next ? next.href : null;
            })
        },
        prev: 1,
        preloadNext: async (nextDoc, obj) => fun.picPreload(await fun.getKukudmSrc(nextLink, nextDoc, 0), nextDoc.title.split("在线")[0], "next"),
        css: "body{background-image:unset}body>table:nth-child(1),body>table:nth-child(3){display:none!important}body>table:nth-child(2),body>table:nth-child(2)>tbody>tr>td{width:100%!important;}body{scrollbar-width:none;-ms-overflow-style:none;overflow-x:hidden;overflow-y:auto}",
        infiniteScroll: true,
        category: "comic"
    }, {
        name: "漫漫聚M/KuKu动漫M 自動翻頁",
        reg: () => {
            let hosts = ["m.manmanju.cc", "s1.m.manmanju.cc", "s2.m.manmanju.cc", "s3.m.manmanju.cc", "m.ikukudm.cc", "m.3840p.xyz", "sbxrb11.3840p.xyz", "wap.ikukudm.cc", "s1.wap.ikukudm.cc", "s2.wap.ikukudm.cc", "s3.wap.ikukudm.cc"];
            return hosts.includes(fun.lh) && /\/comiclist\/\d+\/\d+\/1\.htm$/.test(fun.lp) && comicInfiniteScrollMode == 1;
        },
        include: ".classBox img,.imgBox",
        init: async () => {
            fun.remove("//center[iframe] | //a[img] | //ul[center[li[@class='txtA']]]");
            fun.showMsg("自動翻頁初始化中...", 0);
            await fun.getKukudmSrc(siteUrl, document, 0).then(urls => fun.createImgArray(urls)).then(async imgs => {
                let tE = fun.ge(".imgBox");
                tE.innerHTML = "";
                tE.append(...imgs);
                fun.hideMsg();
                await fun.lazyload();
                _this.autoPager.preloadNextPage();
            });
            fun.remove(".bottom .subNav~div[style*=height],.bottom .pageLine,.bottom .subNav");
            let nav = fun.ge("ul.subNav").cloneNode(true);
            let tE = fun.ge("div.bottom");
            tE.parentNode.insertBefore(nav, tE);
            await fun.remove("meta[name=viewport]");
            const meta = document.createElement("meta");
            meta.name = "viewport";
            meta.content = "width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=2.0,user-scalable=no";
            document.head.appendChild(meta);
        },
        autoPager: {
            ele: (dom) => fun.getKukudmSrc(nextLink, dom, 0).then(urls => fun.createImgArray(urls)),
            pos: [".imgBox", 0],
            observer: ".imgBox>img",
            next: () => {
                let comicListUrl = fun.gu(".subNav a");
                let chapterId = (nextLink ?? siteUrl).split("/")[5];
                let nextXPath = `//li[a[contains(@href,'${chapterId}')]]/preceding-sibling::li[1]/a`;
                return fun.xhrDoc(comicListUrl).then(doc => {
                    let next = fun.ge(nextXPath, doc, doc);
                    return next ? next.href : null;
                })
            },
            title: (dom) => dom.title.replace(/在线漫画.+$/, ""),
            preloadNextPage: async (dom) => {
                let next = await _this.autoPager.next();
                if (!!next) {
                    fun.xhrDoc(next).then(async nextDoc => {
                        let srcs = await fun.getKukudmSrc(next, nextDoc, 0);
                        let text = _this.autoPager.title(nextDoc);
                        fun.picPreload(srcs, text, "next");
                    });
                }
            }
        },
        css: ".imgBox{margin-bottom:0px!important}.subNav{border-top:1px solid #dcdcde}body{scrollbar-width:none;overflow-x:hidden;overflow-y:auto}",
        category: "comic autoPager"
    }, {
        name: "仙漫网",
        host: ["www.gaonaojin.com"],
        enable: 0,
        reg: /www\.gaonaojin\.com\/\w+\/\d+\.html/i,
        imgs: (url = fun.url) => {
            const {
                imgDomain,
                picdata
            } = _unsafeWindow;
            if (imgDomain === "") {
                url = url.replace("www.gaonaojin.com", "m.gaonaojin.com");
                fun.showMsg(displayLanguage.str_05, 0);
                return fun.xhrDoc(url, {
                    headers: {
                        "Referer": url,
                        "User-Agent": MobileUA
                    }
                }).then(doc => {
                    let code = fun.gst("eval", doc).match(/eval.+\)\)/)[0].slice(4);
                    let imgData = fun.run(fun.run(code).match(/picdata[^;]+/)[0]);
                    return imgData.map(e => "https://res.xiaoqinre.com/" + e);
                });
            } else if (imgDomain === "https://res.xiaoqinre.com/") {
                return picdata.map(e => imgDomain + e);
            } else {
                return [];
            }
        },
        button: [4],
        insertImg: [".comicpage", 2],
        insertImgAF: () => nextLink ? fun.addUrlHtml(nextLink, ".comicpage", 1) : null,
        autoDownload: [0],
        next: "//li[a[@class='active']]/preceding-sibling::li[1]/a",
        prev: "//li[a[@class='active']]/following-sibling::li[1]/a",
        customTitle: "h1.title",
        preloadNext: async (nextDoc, obj) => {
            let url = nextLink.replace("www.gaonaojin.com", "m.gaonaojin.com");
            let arr = await fun.xhrDoc(url, {
                headers: {
                    "Referer": url,
                    "User-Agent": MobileUA
                }
            }).then(doc => {
                let code = fun.gst("eval", doc).match(/eval.+\)\)/)[0].slice(4);
                let imgData = fun.run(fun.run(code).match(/picdata[^;]+/)[0]);
                return imgData.map(e => "https://res.xiaoqinre.com/" + e);
            });
            fun.picPreload(arr, nextDoc.title, "next");
        },
        css: ".dropload-down{display:none!important;}",
        category: "comic"
    }, {
        name: "仙漫网M",
        host: ["m.gaonaojin.com"],
        enable: 1,
        reg: () => /m\.gaonaojin\.com\/\w+\/\d+\.html/i.test(fun.url) && comicInfiniteScrollMode != 1,
        init: () => fun.createImgBox("#cp_img", 2),
        imgs: (doc = document) => {
            let code = fun.gst("eval", doc).match(/eval.+\)\)/)[0].slice(4);
            let imgData = fun.run(fun.run(code).match(/picdata[^;]+/)[0]);
            return imgData.map(e => "https://res.xiaoqinre.com/" + e);
        },
        button: [4],
        insertImg: [
            ["#FullPictureLoadMainImgBox", 0, "#cp_img"], 2
        ],
        autoDownload: [0],
        next: "a.btn.next",
        prev: "a.btn.prev",
        customTitle: (doc = document) => fun.title("免费", 1, doc),
        preloadNext: true,
        infiniteScroll: true,
        category: "comic"
    }, {
        name: "仙漫网M 自動翻頁",
        reg: () => /m\.gaonaojin\.com\/\w+\/\d+\.html/i.test(fun.url) && comicInfiniteScrollMode == 1,
        getSrcs: (dom) => {
            let code = fun.gst("eval", dom).match(/eval.+\)\)/)[0].slice(4);
            let imgData = fun.run(fun.run(code).match(/picdata[^;]+/)[0]);
            let srcs = imgData.map(e => "https://res.xiaoqinre.com/" + e);
            return srcs;
        },
        getImgs: (dom = document) => {
            let srcs = _this.getSrcs(dom);
            return fun.createImgArray(srcs);
        },
        init: async () => {
            fun.createImgBox("#cp_img", 2);
            await fun.remove("#cp_img");
            let imgs = _this.getImgs();
            let tE = fun.ge("#FullPictureLoadMainImgBox");
            tE.innerHTML = "";
            tE.append(...imgs);
            await fun.lazyload();
            _this.autoPager.preloadNextPage();
        },
        autoPager: {
            ele: (dom) => _this.getImgs(dom),
            pos: ["#FullPictureLoadMainImgBox", 0],
            observer: "#FullPictureLoadMainImgBox>img",
            next: "a.btn.next",
            re: "#title+#title,.pagenation",
            title: (dom) => fun.gt("#title+#title", 1, dom),
            hide: ".recommendList:has(h2)",
            bF: (dom) => fun.gae(".pagenation", dom).forEach(e => e.setAttribute("class", "pagenation")),
            preloadNextPage: (dom) => {
                let next = fun.ge(_this.autoPager.next, dom);
                if (!!next) {
                    fun.fetchDoc(next.href).then(nextDoc => {
                        let srcs = _this.getSrcs(nextDoc);
                        let text = _this.autoPager.title(nextDoc);
                        fun.picPreload(srcs, text, "next");
                    });
                }
            }
        },
        css: "#cp_img>div[style]{display:none!important;}",
        category: "comic autoPager"
    }, {
        name: "漫画台",
        host: ["manhuat.cc", "www.manhuat.cc"],
        enable: 0,
        reg: /manhuat\.cc\/manhua\/\d+\/\d+\.html/i,
        imgs: () => [...fun.doc(_unsafeWindow.imgs.join("")).images],
        button: [4],
        insertImg: ["#content", 2],
        autoDownload: [0],
        next: "a[rel=next][href$=html],#next_url",
        prev: "a[rel=prev][href$=html],#prev_url",
        customTitle: (doc = document) => {
            let s = fun.gt(".info-title,.con_top", 1, doc).split(/\s?>/);
            return (s[2] + s[3]).trim();
        },
        preloadNext: async (nextDoc, obj) => {
            let code = fun.gst("imgs", nextDoc);
            fun.script(code, 0, 1);
            let arr = [...fun.doc(_unsafeWindow.imgs.join("")).images].map(e => e.src);
            fun.picPreload(arr, obj.customTitle(nextDoc), "next");
        },
        category: "comic"
    }, {
        name: "漫画哥",
        host: ["www.manhuag.cc", "m.manhuag.cc"],
        enable: 0,
        reg: /^https?:\/\/(www|m)\.manhuag\.cc\/\d+\/\d+\/\d+\.html/i,
        imgs: (url = siteUrl, doc = document, msg = 1, request = 0) => {
            let max = fun.gt("//a[text()='下一页']", 2, doc) || 1;
            return /www\.manhuag\.cc/.test(fun.lh) ? fun.getImg(".img img", max, 9, null, 20, url, msg, request) : fun.getImg(".img img", max, 5, null, 20, url, msg, request);
        },
        button: [4],
        insertImg: ["//div[div[@id='nr'][p[@class='img']]] | //div[@id][p[@class='img']][not(@style)]", 2],
        autoDownload: [0],
        next: "//a[text()='下一章']",
        prev: "//a[text()='上一章']",
        customTitle: (doc = document) => {
            if (/www\.manhuag\.cc/.test(fun.lh)) {
                let s = doc.title.split("|");
                let comic_name = s[1];
                let comic_chapter = s[0];
                return comic_name + " - " + comic_chapter;
            } else {
                return fun.gt(".nav_name>h1", 1, doc) + " - " + fun.gt("h3", 1, doc);
            }
        },
        preloadNext: async (nextDoc, obj) => fun.picPreload(await obj.imgs(nextLink, nextDoc, 0, 1), obj.customTitle(nextDoc), "next"),
        category: "comic"
    }, {
        name: "大树漫画/世伦漫画",
        host: ["www.dashumanhua.com", "www.shilunart.com"],
        enable: 1,
        reg: () => /(www\.dashumanhua\.com|www\.shilunart\.com)\/comic\/\w+\/.+\.html/i.test(fun.url) && comicInfiniteScrollMode != 1,
        imgs: (doc = document) => {
            let code = fun.gst("picTree", doc);
            let m = code.match(/eval.+\)\)/)[0].slice(4);
            return fun.run(fun.run(m).slice(12, -1));
        },
        button: [4],
        insertImg: ["#pic-list", 2],
        autoDownload: [0],
        next: "//a[text()='下一话' and not(contains(@href,'--1'))]",
        prev: "//a[text()='上一话' and not(contains(@href,'--1'))]",
        customTitle: (doc = document) => fun.gt(".setnmh-bookname h1", 1, doc) + " - " + fun.gt(".setnmh-bookname h2", 1, doc),
        preloadNext: true,
        infiniteScroll: true,
        category: "comic"
    }, {
        name: "大树漫画/世伦漫画 自動翻頁",
        host: ["www.dashumanhua.com", "www.shilunart.com"],
        enable: 1,
        reg: () => /(www\.dashumanhua\.com|www\.shilunart\.com)\/comic\/\w+\/.+\.html/i.test(fun.url) && comicInfiniteScrollMode == 1,
        getSrcs: (dom = document) => {
            let code = fun.gst("picTree", dom);
            let m = code.match(/eval.+\)\)/)[0].slice(4);
            let srcs = fun.run(fun.run(m).slice(12, -1));
            return srcs;
        },
        getImgs: (dom = document) => {
            let srcs = _this.getSrcs(dom);
            return fun.createImgArray(srcs);
        },
        init: async () => {
            fun.createImgBox("#pic-list", 2);
            fun.remove("#pic-list,.loading-box");
            let imgs = _this.getImgs();
            let tE = fun.ge("#FullPictureLoadMainImgBox");
            tE.append(...imgs);
            await fun.lazyload();
            _this.autoPager.preloadNextPage();
        },
        autoPager: {
            ele: (dom) => _this.getImgs(dom),
            pos: ["#FullPictureLoadMainImgBox", 0],
            observer: "#FullPictureLoadMainImgBox>img",
            next: "//a[text()='下一话' and not(contains(@href,'--1'))]",
            re: ".setnmh-headsee,.setnmh-controlbottomn>.prev,.setnmh-controlbottomn>.huiname,.setnmh-controlbottomn>.next",
            aF: () => {
                let n = fun.ge(".next>.tandiv>a");
                if (n) {
                    fun.ge(".next>a").href = n.href;
                    fun.remove(".next>a+span,a[v-if=booknext]+span");
                } else {
                    fun.ge(".next>a").classList.add("hui");
                    fun.remove("div[v-if=booknext]");
                }
            },
            title: (dom) => {
                if (hasTouchEvents) {
                    return fun.gt(".setnmh-bookname h2", 1, dom);
                } else {
                    return fun.gt(".setnmh-bookname h1", 1, dom) + " - " + fun.gt(".setnmh-bookname h2", 1, dom);
                }
            },
            hide: ".setnmh-detailspage,#setnmh-footer>nav",
            preloadNextPage: (dom) => {
                let next = fun.ge(_this.autoPager.next, dom, dom);
                if (!!next) {
                    fun.fetchDoc(next.href).then(nextDoc => {
                        let srcs = _this.getSrcs(nextDoc);
                        let text = _this.autoPager.title(nextDoc);
                        fun.picPreload(srcs, text, "next");
                    });
                }
            }
        },
        category: "comic autoPager"
    }, {
        name: "Godamanga.ART 英文漫画",
        host: ["godamanga.art"],
        enable: 0,
        reg: /^https?:\/\/godamanga\.art\/manga\/[a-z0-9-_]+\/[a-z0-9-_]+(\/|\.html)$/i,
        delay: 300,
        imgs: "//img[@decoding and @layout] | //img[@decoding and contains(@class,'img_content_jpg')]",
        button: [4],
        insertImg: ["//div[div[div[div[div[img[@decoding and @layout]]]]]] | //div[div[div[div[div[img[@decoding and contains(@class,'img_content_jpg')]]]]]]", 2],
        autoDownload: [0],
        next: "//a[span[text()='下一话']] | //a[span[text()='NEXT']]",
        prev: "//a[span[text()='上一话']] | //a[span[text()='PREV']]",
        customTitle: (doc = document) => fun.gt("h1", 1, doc),
        preloadNext: (nextDoc, obj) => fun.iframeDoc(nextLink, obj.imgs, 30000).then(nextIframeDoc => fun.picPreload(fun.getImgSrcArr(obj.imgs, nextIframeDoc), obj.customTitle(nextIframeDoc), "next")),
        category: "comic"
    }, {
        name: "GODA漫畫",
        enable: 1,
        reg: () => {
            let hosts = ["news.cocolamanhua.com"];
            return hosts.includes(fun.lh) && /^\/[\w-]+\/$/i.test(fun.lp) && fun.ge("h2#title") && comicInfiniteScrollMode != 1;
        },
        xhrOptions: {
            cache: "no-cache"
        },
        init: async () => {
            await fun.waitEle(".touch-manipulation img");
            fun.remove("//div[ins[@class='adsbygoogle']]");
        },
        imgs: (doc = document) => fun.getImgSrcArr(".touch-manipulation img", doc),
        button: [4],
        insertImg: [".touch-manipulation", 2],
        autoDownload: [0],
        next: "#nextChapterLink",
        prev: "#preChapterLink",
        customTitle: (doc = document) => fun.gt("ol.inline-flex>li:nth-child(2) a", 1, doc) + " - " + fun.gt("ol.inline-flex>li:nth-child(3) a", 1, doc),
        preloadNext: (nextDoc, obj) => {
            const picPreloadFn = (m, c) => {
                let api = `https://cocolamanhua.com/chapter/getinfo?m=${m}&c=${c}`;
                fun.fetchDoc(api).then(apiDom => {
                    let srcs = fun.getImgSrcArr(".touch-manipulation img", apiDom);
                    let ntm = fun.gt(".text-default-700 .text-xs.line-clamp-1", 1, apiDom).trim();
                    let ntc = fun.gt(".text-default-500 .text-xs.line-clamp-1", 1, apiDom).trim();
                    let text = ntm + " - " + ntc;
                    fun.picPreload(srcs, text, "next");
                });
            };
            let next = fun.ge("a#nextChapter[href*='manga']");
            if (next) {
                let [, , mid, cid] = new URL(next.href).pathname.split("/");
                picPreloadFn(mid, cid);
            }
        },
        infiniteScroll: true,
        category: "comic"
    }, {
        name: "GODA漫畫 自動翻頁",
        enable: 1,
        reg: () => {
            let hosts = ["news.cocolamanhua.com"];
            return hosts.includes(fun.lh) && /^\/[\w-]+\/$/i.test(fun.lp) && fun.ge("h2#title") && comicInfiniteScrollMode == 1;
        },
        xhrOptions: {
            cache: "no-cache"
        },
        getImgs: (dom = document) => {
            let newDE = fun.ge("#imagelist", dom);
            let host = "https://cocolamanhua.com";
            let mid;
            let cid;
            if (newDE) {
                mid = newDE.dataset.mid;
                cid = newDE.dataset.cid;
            } else {
                [, , mid, cid] = new URL(nextLink).pathname.split("/");
            }
            let setdata = localStorage.getItem("setdata") ?? null;
            if (!!setdata) {
                let json = JSON.parse(document.cookie.match(/setdata[\s=]+([^;]+)/)[1]);
                host = json.host;
            }
            let api = `${host}/chapter/getinfo?m=${mid}&c=${cid}`;
            return fun.fetchDoc(api).then(apiDom => {
                let next = fun.ge("a#nextChapter[href*='manga']", apiDom);
                if (next) {
                    tempNextLink = next.href;
                } else {
                    tempNextLink = null;
                }
                let np = fun.ge(".flex.flex-row.space-x-2.px-2.py-4", apiDom);
                let cp = fun.ge(".flex.flex-row.space-x-2.px-2.py-4");
                if (np && cp) {
                    cp.outerHTML = np.outerHTML;
                }
                let nt = fun.gt(".text-default-500 .text-xs.line-clamp-1", 1, apiDom);
                let ct = fun.ge("#title");
                if (nt && ct) {
                    ct.innerText = nt;
                }
                let n_nav = fun.ge(".mx-auto.p-4", apiDom);
                let c_nav = fun.ge(".mx-auto.p-4");
                if (n_nav && c_nav) {
                    c_nav.outerHTML = n_nav.outerHTML;
                }
                customTitle = nt;
                let srcs = fun.getImgSrcArr(".touch-manipulation img", apiDom);
                return fun.createImgArray(srcs);
            });
        },
        init: async () => {
            await fun.waitEle(".touch-manipulation img");
            fun.remove("//div[ins[@class='adsbygoogle']]");
            fun.createImgBox(".touch-manipulation", 2);
            fun.remove(".touch-manipulation,.bottom-0");
            let imgs = await _this.getImgs();
            let tE = fun.ge("#FullPictureLoadMainImgBox");
            tE.append(...imgs);
            await fun.lazyload();
            let next = fun.ge("a#nextChapter[href*='manga']");
            if (next) {
                tempNextLink = next.href;
            } else {
                tempNextLink = null;
            }
            _this.autoPager.preloadNextPage();
        },
        autoPager: {
            ele: (dom) => _this.getImgs(dom),
            observer: "#FullPictureLoadMainImgBox>img",
            pos: ["#FullPictureLoadMainImgBox", 0],
            next: () => tempNextLink,
            title: () => customTitle,
            hide: "div:has(>div>.cardlist),.justify-center:has(>.border-t)",
            preloadNextPage: () => {
                if (!!tempNextLink) {
                    let host = "https://cocolamanhua.com";
                    let [, , mid, cid] = new URL(tempNextLink).pathname.split("/");
                    let api = `${host}/chapter/getinfo?m=${mid}&c=${cid}`;
                    fun.fetchDoc(api).then(dom => {
                        let srcs = fun.getImgSrcArr(".touch-manipulation img", dom);
                        let text = fun.gt(".text-default-500 .text-xs.line-clamp-1", 1, dom);
                        fun.picPreload(srcs, text, "next");
                    });
                }
            }
        },
        category: "comic autoPager"
    }, {
        name: "包子漫畫",
        enable: 1,
        reg: () => {
            let hosts = ["baozimh.one"];
            return hosts.includes(fun.lh) && /^\/[\w-]+\/$|^\/chapter\/\d+\.html$/i.test(fun.lp) && fun.ge("h2#title") && comicInfiniteScrollMode != 1;
        },
        xhrOptions: {
            cache: "no-cache"
        },
        init: async () => {
            await fun.waitEle(".touch-manipulation img");
            fun.remove("//div[ins[@class='adsbygoogle']]");
        },
        imgs: () => fun.getImgSrcArr(".touch-manipulation img"),
        button: [4],
        insertImg: [".touch-manipulation", 2],
        autoDownload: [0],
        next: "#nextChapterLink",
        prev: "#preChapterLink",
        preloadNext: () => {
            let setdata = JSON.parse(document.cookie.match(/setdata[\s=]+([^;]+)/)[1]);
            let host = setdata.host;
            let mid = setdata.ms;
            let cid = setdata.cs;
            let api = host + "/chapter/getinfo?m=" + mid + "&c=" + cid;
            fun.fetchDoc(api).then(dom => {
                let next = fun.ge("#c-imagelist", dom)?.dataset?.next;
                if (!!next) {
                    let nextApi = host + "/chapter/getinfo?m=" + mid + "&c=" + next;
                    fun.fetchDoc(nextApi).then(nextDom => {
                        let dataE = fun.ge("#c-imagelist", nextDom);
                        let srcs = fun.getImgSrcArr(".touch-manipulation img", nextDom);
                        let text = dataE.dataset.title + " - " + dataE.dataset.ctitle;
                        fun.picPreload(srcs, text, "next");
                    });
                }
            });
        },
        customTitle: () => fun.gt("ol.inline-flex>li:nth-child(2) a", 1) + " - " + fun.gt("ol.inline-flex>li:nth-child(3) a", 1),
        infiniteScroll: true,
        category: "comic"
    }, {
        name: "包子漫畫 自動翻頁",
        enable: 1,
        reg: () => {
            let hosts = ["baozimh.one"];
            return hosts.includes(fun.lh) && /^\/[\w-]+\/$|^\/chapter\/\d+\.html$/i.test(fun.lp) && fun.ge("h2#title") && comicInfiniteScrollMode == 1;
        },
        xhrOptions: {
            cache: "no-cache"
        },
        getImgs: (dom = null) => {
            let dataE = fun.ge("#c-imagelist", dom);
            let host, mid, cid;
            if (!!dataE) {
                host = dataE.dataset.home;
                mid = dataE.dataset.mid;
                cid = dataE.dataset.cid;
            } else {
                let setdata = JSON.parse(document.cookie.match(/setdata[\s=]+([^;]+)/)[1]);
                host = setdata.host;
                mid = setdata.ms;
                cid = setdata.cs;
            }
            if (!!dataE) {
                let next = dataE.dataset?.next;
                if (!!next) {
                    tempNextLink = `${host}/chapter/getinfo?m=${mid}&c=${next}`;
                } else {
                    tempNextLink = null;
                }
                let text;
                if (hasTouchEvents) {
                    text = dataE.dataset.ctitle;
                } else {
                    text = dataE.dataset.title + " - " + dataE.dataset.ctitle;
                }
                customTitle = text;
                let srcs = fun.getImgSrcArr(".touch-manipulation img", dom);
                return fun.createImgArray(srcs);
            } else {
                let api = `${host}/chapter/getinfo?m=${mid}&c=${cid}`;
                return fun.fetchDoc(api).then(apiDom => {
                    let dataE = fun.ge("#c-imagelist", apiDom);
                    let next = dataE.dataset?.next;
                    if (next) {
                        tempNextLink = `${host}/chapter/getinfo?m=${mid}&c=${next}`;
                    } else {
                        tempNextLink = null;
                    }
                    let text;
                    if (hasTouchEvents) {
                        text = dataE.dataset.ctitle;
                    } else {
                        text = dataE.dataset.title + " - " + dataE.dataset.ctitle;
                    }
                    customTitle = text;
                    let srcs = fun.getImgSrcArr(".touch-manipulation img", apiDom);
                    return fun.createImgArray(srcs);
                });
            }
        },
        init: async () => {
            await fun.waitEle(".touch-manipulation img");
            fun.remove("//div[ins[@class='adsbygoogle']]");
            fun.createImgBox(".touch-manipulation", 2);
            fun.remove(".touch-manipulation,.bottom-0");
            let imgs = await _this.getImgs();
            let tE = fun.ge("#FullPictureLoadMainImgBox");
            tE.append(...imgs);
            await fun.lazyload();
            _this.autoPager.preloadNextPage();
        },
        autoPager: {
            ele: (dom) => _this.getImgs(dom),
            observer: "#FullPictureLoadMainImgBox>img",
            pos: ["#FullPictureLoadMainImgBox", 0],
            next: () => tempNextLink,
            title: () => customTitle,
            history: 0,
            hide: "div:has(>#c-recommed),.justify-center:has(>.border-t)",
            preloadNextPage: () => {
                if (!!tempNextLink) {
                    fun.fetchDoc(tempNextLink).then(dom => {
                        let dataE = fun.ge("#c-imagelist", dom);
                        let srcs = fun.getImgSrcArr(".touch-manipulation img", dom);
                        let text = dataE.dataset.title + " - " + dataE.dataset.ctitle;
                        fun.picPreload(srcs, text, "next");
                    });
                }
            }
        },
        category: "comic autoPager"
    }, {
        name: "漫畫屋",
        host: ["mh5.tw"],
        enable: 0,
        reg: /mh5\.tw\/(series|seriesvip)-\w+-\d+-\d+/i,
        imgs: () => {
            let max;
            /seriesvip/.test(siteUrl) ? max = fun.gt("a.cur~a:last-child") - 2 : max = fun.gt("a.cur~a:last-child") - 1;
            return fun.getImgIframe(".ptview>img[alt]:not([style])", max, 13, ".setnmh-pagedos", 1000, 0);
        },
        insertImg: [".ptview", 1, 0],
        autoDownload: [0],
        next: "//a[text()='下一話']",
        prev: "//a[text()='上一話']",
        customTitle: () => {
            let ele = fun.ge("h2");
            return ele ? fun.gt("h1") + " - " + fun.gt("h2") : fun.gt(".setnmh-bookname>a:nth-child(5)") + " - " + fun.gt(".setnmh-bookname>a:nth-child(7)");
        },
        css: ".ptview>img{width:100%!important;height:auto!important;max-width:1000px!important;border:none!important;box-shadow:none!important;padding:0!important;margin:0 auto!important}",
        category: "comic"
    }, {
        name: "山立漫畫/TVBS漫畫",
        host: ["www.setnmh.com", "www.tvbsmh.com"],
        enable: 0,
        reg: /^https?:\/\/(www\.setnmh\.com|www\.tvbsmh\.com)\/(series|seriesvip)-\w+-\d+-\d+-.+$/i,
        imgs: () => {
            let max;
            /seriesvip/.test(siteUrl) ? max = fun.gt("a.cur~a:last-child") - 2 : max = fun.gt("a.cur~a:last-child") - 1;
            return fun.getImgIframe(".ptview>img[alt]:not([style])", max, 13, ".setnmh-pagedos,.pagedosw", 1000, 0);
        },
        insertImg: [".ptview", 1, 0],
        autoDownload: [0],
        next: "//a[text()='下一話']",
        prev: "//a[text()='上一話']",
        customTitle: () => document.title.split(" - ")[0].replace(/正在觀看|(\d+P)/ig, "").replace(">", " - "),
        css: ".ptview>img{width:100%!important;height:auto!important;max-width:1000px!important;border:none!important;box-shadow:none!important;padding:0!important;margin:0 auto!important}",
        category: "comic"
    }, {
        name: "ACG456",
        host: ["www.acg456.com"],
        enable: 0,
        reg: /^http:\/\/www\.acg456\.com\/HTML\/\w+\/\d+\//i,
        init: () => {
            fun.ge("body>table").width = "1400";
            fun.run("document.onkeydown=null;");
        },
        imgs: () => _unsafeWindow.picAy,
        button: [4],
        insertImg: ["body>table", 2],
        autoDownload: [0],
        next: () => {
            const {
                nextChap
            } = _unsafeWindow;
            return nextChap == "" ? null : location.origin + nextChap;
        },
        prev: "//a[text()='上一回']",
        customTitle: () => {
            let [, , comic_name, comic_chapter] = fun.gt(".Reduction_left", 1).split(" > ");
            return comic_name + " - " + comic_chapter.replace(/(\d+P)/i, "").replace(/(\d+P)/i, "");
        },
        preloadNext: async (nextDoc, obj) => {
            const callback = (doc, fun) => {
                const code = `
window.parent.postMessage({
    iframePicArr: picAy,
    title: document.title
}, "http://www.acg456.com/");
               `;
                fun.script(code, 0, 1, doc);
            };
            fun.iframeDoc(nextLink, "#curPic", 30000, callback);
        },
        category: "comic"
    }, {
        name: "ACG456M",
        host: ["m.acg456.com"],
        enable: 0,
        reg: /^http:\/\/m\.acg456\.com\/b\/\w+\/\w+\/\w+\//i,
        imgs: () => _unsafeWindow.picAy,
        button: [4],
        insertImg: ["#PicArea", 2],
        autoDownload: [0],
        next: "//a[contains(text(),'下一话')]",
        prev: "//a[contains(text(),'上一话')]",
        customTitle: ".menu_top_list>li:last-child",
        preloadNext: async (nextDoc, obj) => {
            const callback = (doc, fun) => {
                const code = `
window.parent.postMessage({
    iframePicArr: picAy,
    title: document.title
}, "http://m.acg456.com/");
               `;
                fun.script(code, 0, 1, doc);
            };
            fun.iframeDoc(nextLink, "#PicArea img", 3000, callback);
        },
        category: "comic"
    }, {
        name: "漫画160/非常爱漫新站",
        host: ["www.mh160.cc", "m.mh160.cc", "www.veryim.com"],
        enable: 1,
        reg: () => /\.mh160\.cc\/kanmanhua\/\w+\/\d+\.html$|^https?:\/\/www\.veryim\.com\/manhua\/\d+\/\d+\.html$/i.test(fun.url) && comicInfiniteScrollMode != 1,
        init: "document.onkeydown=null",
        imgs: () => {
            const {
                base64_decode,
                qTcms_S_m_murl_e,
                f_qTcms_Pic_curUrl_realpic
            } = _unsafeWindow;
            return base64_decode(qTcms_S_m_murl_e).split("$qingtiandy$").map(e => f_qTcms_Pic_curUrl_realpic(e));
        },
        button: [4],
        insertImg: ["//td[//img[@onclick]] | //div[@class='UnderPage']", 2],
        autoDownload: [0],
        next: "#k_Pic_nextArr",
        prev: "#k_Pic_backArr",
        customTitle: () => {
            const {
                qTcms_S_m_name,
                qTcms_S_m_playm
            } = _unsafeWindow;
            return qTcms_S_m_name + " - " + qTcms_S_m_playm;
        },
        preloadNext: (nextDoc, obj) => {
            let code = fun.gst("qTcms_S_m_murl_e", nextDoc);
            fun.script(code, 0, 1);
            fun.picPreload(obj.imgs(), obj.customTitle(), "next");
        },
        infiniteScroll: true,
        css: ".action-list li{width:50% !important}#action>ul>li:nth-child(n+2):nth-child(-n+3){display:none !important}",
        category: "comic"
    }, {
        name: "漫画160/非常爱漫新站 自動翻頁",
        enable: 1,
        reg: () => /\.mh160\.cc\/kanmanhua\/\w+\/\d+\.html$|^https?:\/\/www\.veryim\.com\/manhua\/\d+\/\d+\.html$/i.test(fun.url) && comicInfiniteScrollMode == 1,
        getImgs: () => {
            const {
                base64_decode,
                qTcms_S_m_murl_e,
                f_qTcms_Pic_curUrl_realpic
            } = _unsafeWindow;
            let srcs = base64_decode(qTcms_S_m_murl_e).split("$qingtiandy$").map(e => f_qTcms_Pic_curUrl_realpic(e));
            return fun.createImgArray(srcs);
        },
        init: async () => {
            let imgs = _this.getImgs();
            fun.createImgBox("//td[//img[@onclick]] | //div[@class='UnderPage']", 2);
            fun.remove("//td[//img[@onclick]] | //div[@class='UnderPage']");
            let tE = fun.ge("#FullPictureLoadMainImgBox");
            tE.append(...imgs);
            await fun.lazyload();
            _this.autoPager.preloadNextPage();
        },
        autoPager: {
            script: "//script[contains(text(),'qTcms_S_m_murl_e')]",
            ele: () => _this.getImgs(),
            pos: ["#FullPictureLoadMainImgBox", 0],
            observer: "#FullPictureLoadMainImgBox>img",
            next: (dom, r = 1) => {
                let n = fun.ge("#k_Pic_nextArr[href$='html']", dom);
                if (n) {
                    return n.href;
                } else {
                    if (r === 1) {
                        let n = fun.ge("#k_Pic_nextArr");
                        n.href = fun.lp.replace(/\d+\.html$/, "");
                        let text;
                        if (fun.lh.includes("mh160")) {
                            text = "返回目录";
                        } else {
                            text = "目录";
                        }
                        n.innerText = text;
                        if (fun.lh === "www.mh160.cc") {
                            n.remove();
                        }
                    }
                    return null;
                }
            },
            re: ".title,.main-btn,.breadcrumb,.BarTit,#action,.pager:not([id])",
            title: (dom, frame = _unsafeWindow) => {
                const {
                    qTcms_S_m_name,
                    qTcms_S_m_playm
                } = frame;
                if (hasTouchEvents) {
                    return qTcms_S_m_playm;
                } else {
                    return qTcms_S_m_name + " - " + qTcms_S_m_playm;
                }
            },
            hide: "#m_r_bottom~.imgBox,.globalPadding",
            preloadNextPage: (dom) => {
                let next = _this.autoPager.next(dom);
                if (!!next) {
                    fun.iframe(next, {
                        waitVar: "qTcms_S_m_murl_e",
                        cb: async (nextDom, frame) => {
                            let srcs = frame.base64_decode(frame.qTcms_S_m_murl_e).split("$qingtiandy$").map(e => frame.f_qTcms_Pic_curUrl_realpic(e));
                            let text = _this.autoPager.title(nextDom, frame);
                            fun.picPreload(srcs, text, "next");
                        }
                    });
                }
            }
        },
        css: ".action-list li{width:50% !important}#action>ul>li:nth-child(n+2):nth-child(-n+3),li:has(>#prev),li:has(>.curPage),li:has(>#k_next){display:none !important}@media only screen and (max-width:480px){.container,.content-body{padding:0px !important}}",
        category: "comic autoPager"
    }, {
        name: "笨狗漫画",
        host: ["www.bengou.co", "m.bengou.co"],
        enable: 0,
        reg: /(www|m)\.bengou\.co\/\w+\/\w+\/\d+\.html/i,
        init: "document.onkeydown=null;",
        imgs: () => {
            const {
                base64_decode,
                qTcms_S_m_murl_e,
                f_qTcms_Pic_curUrl_realpic
            } = _unsafeWindow;
            return base64_decode(qTcms_S_m_murl_e).split("$qingtiandy$").map(e => f_qTcms_Pic_curUrl_realpic(e));
        },
        insertImg: ["//td[img[@id='qTcms_pic']]", 2],
        autoDownload: [0],
        next: () => {
            const {
                qTcms_Pic_nextArr
            } = _unsafeWindow;
            return (!/^java/.test(qTcms_Pic_nextArr) && qTcms_Pic_nextArr !== "") ? location.origin + qTcms_Pic_nextArr : null;
        },
        prev: 1,
        customTitle: () => {
            const {
                qTcms_S_m_name,
                qTcms_S_m_playm
            } = _unsafeWindow;
            return qTcms_S_m_name + " - " + qTcms_S_m_playm;
        },
        preloadNext: (nextDoc, obj) => {
            let code = fun.gst("qTcms_S_m_murl_e", nextDoc);
            fun.script(code, 0, 1);
            fun.picPreload(obj.imgs(), obj.customTitle(), "next");
        },
        css: ".action-list li{width:50% !important}#mypic_k0,.action-list>ul>li:nth-child(n+2):nth-child(-n+3){display:none!important}",
        category: "comic"
    }, {
        name: "星辰漫画网",
        host: ["www.xcmh.com", "m.xcmh.com"],
        enable: 1,
        reg: /(www|m)\.xcmh\.com\/\w+\/\w+\/\d+\.html/i,
        init: "document.onkeydown=null;",
        imgs: () => {
            const {
                base64_decode,
                qTcms_S_m_murl_e,
                f_qTcms_Pic_curUrl_realpic
            } = _unsafeWindow;
            return base64_decode(qTcms_S_m_murl_e).split("$qingtiandy$").map(e => location.origin + f_qTcms_Pic_curUrl_realpic(e));
        },
        button: [4],
        insertImg: ["//td[img[@id='qTcms_pic']]", 2],
        autoDownload: [0],
        next: () => {
            const {
                qTcms_Pic_nextArr
            } = _unsafeWindow;
            return (!/^java/.test(qTcms_Pic_nextArr) && qTcms_Pic_nextArr !== "") ? location.origin + qTcms_Pic_nextArr : null;
        },
        prev: 1,
        customTitle: () => {
            const {
                qTcms_S_m_name,
                qTcms_S_m_playm
            } = _unsafeWindow;
            return qTcms_S_m_name + " - " + qTcms_S_m_playm;
        },
        preloadNext: (nextDoc, obj) => {
            let code = fun.gst("qTcms_S_m_murl_e", nextDoc);
            fun.script(code, 0, 1);
            fun.picPreload(obj.imgs(), obj.customTitle(), "next");
        },
        css: "#mypic_k0{display:none!important}",
        category: "comic"
    }, {
        name: "木马漫画",
        host: ["www.omyschool.com"],
        enable: 0,
        reg: /www\.omyschool\.com\/article_detail\/\d+\/\d+\/.+\/.+\//i,
        imgs: "#imgs amp-img",
        button: [4],
        insertImg: ["#imgs", 2],
        autoDownload: [0],
        next: ".nav_button.next",
        prev: ".nav_button.prev",
        customTitle: (doc = document) => fun.gt("//a/span[@property and not(i)]", 1, doc) + " - " + fun.gt("//li/span[@property and not(i)]", 1, doc),
        preloadNext: true,
        category: "comic"
    }, {
        name: "砂之船动漫家",
        host: ["www.szcdmj.com"],
        enable: 0,
        reg: /www\.szcdmj\.com\/szcchapter\/\d+/i,
        include: ".comiclist",
        imgs: async () => {
            await fun.getNP(".comicpage>div", "//a[@href and text()='下一页']", null, ".fanye");
            return fun.gae("img.lazy");
        },
        button: [4],
        insertImg: [".comiclist", 2],
        autoDownload: [0],
        next: "//a[text()='下一话']",
        prev: "//a[text()='上一话']",
        customTitle: "h1.title",
        category: "comic"
    }, {
        name: "砂之船动漫家M",
        host: ["www.szcdmj.com"],
        enable: 0,
        reg: /www\.szcdmj\.com\/szcchapter\/\d+/i,
        include: "#cp_img",
        imgs: async () => {
            await fun.getNP("#cp_img>img[data-original]", "//a[@href and text()='下一页']", null, ".view-bottom-bar");
            return fun.gae("#cp_img>img[data-original]");
        },
        insertImg: ["#cp_img", 2],
        autoDownload: [0],
        next: "//a[text()='下一话']",
        prev: "//a[text()='上一话']",
        customTitle: () => {
            const {
                bookInfo
            } = _unsafeWindow;
            return bookInfo.book_name + " - " + bookInfo.chapter_name;
        },
        category: "comic"
    }, {
        name: "艾米漫画/聚合漫画屋/酷看漫画",
        host: ["www.aimimh.com", "www.52hah.com", "www.kukanmanhua.com"],
        enable: 0,
        reg: /www\.aimimh\.com\/chapter\/[\d-]+|www\.52hah\.com\/chapter\/\d+|www\.kukanmanhua\.com\/chapter\/\d+/i,
        include: ".comiclist",
        imgs: ".comiclist img",
        button: [4],
        insertImg: [".comicpage", 2],
        autoDownload: [0],
        next: "//a[text()='下一章']",
        prev: "//a[text()='上一章']",
        customTitle: (doc = document) => fun.gt("h1.title", 1, doc),
        preloadNext: (nextDoc, obj) => fun.iframeDoc(nextLink, ".comiclist img:not([src*=loading])", 30000).then(nextIframeDoc => fun.picPreload(fun.getImgSrcArr(obj.imgs, nextIframeDoc), obj.customTitle(nextIframeDoc), "next")),
        category: "comic"
    }, {
        name: "艾米漫画M/聚合漫画屋M/酷看漫画M",
        host: ["www.aimimh.com", "www.52hah.com", "www.kukanmanhua.com"],
        enable: 0,
        reg: /www\.aimimh\.com\/chapter\/[\d-]+|www\.52hah\.com\/chapter\/\d+|www\.kukanmanhua\.com\/chapter\/\d+/i,
        imgs: "#cp_img>img[data-original]",
        button: [4],
        insertImg: ["#cp_img", 2],
        autoDownload: [0],
        next: "//a[text()='下一章']",
        prev: "//a[text()='上一章']",
        customTitle: () => {
            if (/www\.52hah\.com|www\.kukanmanhua\.com/.test(fun.lh)) {
                const {
                    bookInfo
                } = _unsafeWindow;
                return bookInfo.book_name.replace(/_\d+$/, "") + " - " + bookInfo.chapter_name;
            } else {
                return fun.title("在线阅读-艾米漫画");
            }
        },
        preloadNext: (nextDoc, obj) => fun.iframeDoc(nextLink, "#cp_img>img[data-original]:not([src*=loading])", 30000).then(nextIframeDoc => fun.picPreload(fun.getImgSrcArr(obj.imgs, nextIframeDoc), nextIframeDoc.title, "next")),
        category: "comic"
    }, {
        name: "云端漫画",
        host: ["www.bcloudmerge.com"],
        enable: 0,
        reg: /^https?:\/\/www\.bcloudmerge\.com\/bmergechapter\/\d+\/\d+\.html$/,
        init: () => fun.remove("//div[p[@class='open']] | //div[p[contains(text(),'小贴士')]] | //div[div[button[text()='无删韩漫']]]"),
        imgs: ".mh_list img,#content img",
        button: [4],
        insertImg: [".mh_list,#content", 2],
        autoDownload: [0],
        next: "//a[text()='下一章']",
        prev: "//a[text()='上一章']",
        customTitle: () => {
            const {
                read
            } = _unsafeWindow;
            return read.articlename + " - " + read.cname;
        },
        category: "comic"
    }, {
        name: "次元/夜神",
        host: ["cymh.info", "ysmh.info"],
        enable: 0,
        reg: () => !hasTouchEvents && /^https?:\/\/(cymh|ysmh)\.info\/\w+\/\d+\/\d+\.html$/i.test(fun.url),
        init: async () => fun.getNP("#cp_img img", "//a[text()='下一页']", null, ".fanye"),
        imgs: "#cp_img img",
        button: [4],
        insertImg: ["#cp_img", 2],
        autoDownload: [0],
        next: "//li[a[@class='active']]/following-sibling::li[1]/a",
        prev: "//li[a[@class='active']]/preceding-sibling::li[1]/a",
        customTitle: () => fun.gt("h1.title") + " - " + fun.gt("a.active"),
        category: "comic"
    }, {
        name: "次元M/夜神M",
        host: ["cymh.info", "ysmh.info"],
        enable: 0,
        reg: () => hasTouchEvents && /^https?:\/\/(cymh|ysmh)\.info\/\w+\/\d+\/\d+\.html$/i.test(fun.url),
        init: async () => fun.getNP("#cp_img>*", "//a[text()='下一页']", null, ".page"),
        imgs: "#cp_img img",
        button: [4],
        insertImg: ["#cp_img", 2],
        autoDownload: [0],
        next: "//a[text()='下一章']",
        prev: 1,
        customTitle: async () => {
            let url = fun.gu(".back>a");
            let comicName = await fun.fetchDoc(url).then(doc => fun.ge("#bookcase", doc).dataset.name);
            return comicName + " - " + fun.gt(".h1");
        },
        category: "comic"
    }, {
        name: "最次元/野蛮/考拉漫画/优乐漫画",
        host: ["zcymh.com", "yemancomic.com", "cn.colacomic.com", "www.beston-test.com"],
        enable: 0,
        reg: () => !hasTouchEvents && /^https?:\/\/(zcymh\.com|yemancomic\.com|cn\.colacomic\.com|www\.beston-test\.com)\/\w+\/\d+\/\d+\.html$/.test(fun.url),
        imgs: "#img-box img",
        button: [4],
        insertImg: ["#img-box", 2],
        autoDownload: [0],
        next: "#js_pageNextBtn>a",
        prev: "#js_pagePrevBtn>a",
        customTitle: () => {
            const {
                read
            } = _unsafeWindow;
            return read.articlename + " - " + read.chaptername;
        },
        category: "comic"
    }, {
        name: "最次元M/野蛮M/考拉漫画M/优乐漫画M",
        host: ["zcymh.com", "yemancomic.com", "cn.colacomic.com", "www.beston-test.com"],
        enable: 0,
        reg: () => hasTouchEvents && /^https?:\/\/(zcymh\.com|yemancomic\.com|cn\.colacomic\.com|www\.beston-test\.com)\/\w+\/\d+\/\d+\.html$/.test(fun.url),
        imgs: "#imgsec img",
        button: [4],
        insertImg: ["#imgsec", 2],
        autoDownload: [0],
        next: "a#next",
        prev: "a#prev",
        customTitle: () => {
            const {
                read
            } = _unsafeWindow;
            return read.articlename + " - " + read.chaptername;
        },
        category: "comic"
    }, {
        name: "爱看漫",
        host: ["ikmmh.com"],
        enable: 0,
        reg: () => !hasTouchEvents && /^https?:\/\/ikmmh\.com\/\w+\/\d+\/\d+\.html$/.test(fun.url),
        imgs: () => {
            fun.showMsg(displayLanguage.str_05, 0);
            return fun.xhrDoc(fun.url, {
                headers: {
                    "User-Agent": MobileUA
                },
            }).then(doc => fun.gae(".episode-detail img", doc));
        },
        button: [4],
        insertImg: ["#img-box", 2],
        autoDownload: [0],
        next: "#js_pageNextBtn>a",
        prev: "#js_pagePrevBtn>a",
        customTitle: () => {
            let code = fun.gst("read");
            let objText = code.match(/read[\s=]+([^;]+)/)[1];
            let json = fun.run(objText);
            return json.articlename + " - " + json.chaptername;
        },
        category: "comic"
    }, {
        name: "爱看漫M",
        host: ["ikmmh.com"],
        enable: 0,
        reg: () => hasTouchEvents && /^https?:\/\/ikmmh\.com\/\w+\/\d+\/\d+\.html$/.test(fun.url),
        imgs: ".episode-detail img",
        button: [4],
        insertImg: [".episode-detail", 2],
        autoDownload: [0],
        next: "a#next",
        prev: "a#prev",
        customTitle: () => {
            let code = fun.gst("read");
            let objText = code.match(/read[\s=]+([^;]+)/)[1];
            let json = fun.run(objText);
            return json.articlename + " - " + json.chaptername;
        },
        category: "comic"
    }, {
        name: "拷貝漫畫",
        host: ["www.copymanga.site", "copymanga.site", "www.copymanga.tv", "copymanga.tv", "www.mangacopy.com", "mangacopy.com"],
        enable: 1,
        reg: () => /(www\.)?(copymanga\.site|copymanga\.tv|mangacopy\.com)\/comic\/\w+\/chapter\/.+/.test(fun.url) && comicInfiniteScrollMode != 1,
        delay: 300,
        fetchJson: (url = siteUrl) => {
            //let host = fun.lh.replace("www.", "");
            //let api = siteUrl.replace(/.*?(?=\/comic\/)/, `https://api.${host}/api/v3`);
            let [, , name, , id] = new URL(url).pathname.split("/");
            let api = `/api/v3/comic/${name}/chapter2/${id}?platform=3`;
            return fetch(api).then(res => res.json());
        },
        init: async () => {
            fun.copymangaUI();
            fun.showMsg(displayLanguage.str_05, 0);
            let fetchJson = await _this.fetchJson();
            siteJson = fetchJson;
            debug("\n此頁JSON資料\n", fetchJson);
            let readHistoryData = localStorage.getItem("copymangaReadHistory");
            let [, , comic, , chapter] = fun.lp.split("/");
            let json;
            readHistoryData ? json = JSON.parse(readHistoryData) : json = {};
            json[comic] = chapter;
            localStorage.setItem("copymangaReadHistory", JSON.stringify(json));
        },
        //imgs: () => siteJson.results.chapter.contents.map(e => e.url.replace(".c800x.", ".c1500x.")),
        imgs: (json = siteJson) => {
            const srcs = [];
            const {
                words,
                contents
            } = siteJson.results.chapter;
            words.forEach((w, i) => (srcs[w] = contents[i].url.replace(".c800x.", ".c1500x.")));
            return srcs;
        },
        button: [4],
        insertImg: [".comicContent-list", 2],
        autoDownload: [0],
        next: "//a[text()='下一話'][starts-with(@href,'/comic/')]",
        prev: "//a[text()='上一話'][starts-with(@href,'/comic/')]",
        customTitle: (json = siteJson) => json.results.comic.name + " - " + json.results.chapter.name,
        preloadNext: (nextDoc, obj) => {
            obj.fetchJson(nextLink).then(json => {
                let srcs = obj.imgs(json);
                let title = obj.customTitle(json);
                fun.picPreload(srcs, title, "next");
            });
        },
        topButton: true,
        css: "#FullPictureLoadEnd{color:rgb(255, 255, 255)}.header+div[style],.comicContainerAds{display:none!important}",
        infiniteScroll: true,
        category: "comic"
    }, {
        name: "拷貝漫畫 自動翻頁",
        reg: () => /(www\.)?(copymanga\.site|copymanga\.tv|mangacopy\.com)\/comic\/\w+\/chapter\/.+/.test(fun.url) && comicInfiniteScrollMode == 1,
        delay: 300,
        getImgs: (url = siteUrl) => {
            let [, , comic, , chapter] = new URL(url).pathname.split("/");
            let api = `/api/v3/comic/${comic}/chapter2/${chapter}?platform=3`;
            return fetch(api).then(res => res.json()).then(json => {
                const srcArr = [];
                const {
                    words,
                    contents
                } = json.results.chapter;
                words.forEach((w, i) => (srcArr[w] = contents[i].url.replace(".c800x.", ".c1500x.")));
                customTitle = json.results.comic.name + " - " + json.results.chapter.name;
                let readHistoryData = localStorage.getItem("copymangaReadHistory");
                let obj;
                readHistoryData ? obj = JSON.parse(readHistoryData) : obj = {};
                obj[comic] = chapter;
                localStorage.setItem("copymangaReadHistory", JSON.stringify(obj));
                return srcArr;
            }).then(srcs => fun.createImgArray(srcs));
        },
        init: async () => {
            fun.copymangaUI();
            fun.showMsg("自動翻頁初始化中...", 0);
            await _this.getImgs().then(async imgs => {
                let tE = fun.ge(".comicContent-list");
                tE.innerHTML = "";
                tE.append(...imgs);
                fun.hideMsg();
                await fun.lazyload();
            });
            fun.addMutationObserver(() => {
                if (fun.ge("//li[img[@data-src]]")) {
                    fun.remove("//li[img[@data-src]]");
                }
            });
        },
        autoPager: {
            ele: () => _this.getImgs(nextLink),
            pos: [".comicContent-list", 0],
            observer: ".comicContent-list>img",
            next: "//a[text()='下一話'][starts-with(@href,'/comic/')]",
            re: ".header,.footer",
            title: () => customTitle
        },
        css: ".header+div[style],.comicContainerAds{display:none!important}",
        category: "comic autoPager"
    }, {
        name: "拷貝漫畫 目錄頁",
        reg: /(www\.)?(copymanga\.site|copymanga\.tv|mangacopy\.com)\/comic\/\w+$/,
        delay: 300,
        init: async () => {
            fun.clearAllTimer(3);
            if ("aboutBlank" in _unsafeWindow) _unsafeWindow.aboutBlank = null;
            await fun.waitEle(".tab-pane.show.active a");
            const updateLastChapter = () => {
                let [, , comic] = fun.lp.split("/");
                let readHistoryData = localStorage.getItem("copymangaReadHistory");
                if (!!readHistoryData) {
                    let json = JSON.parse(readHistoryData);
                    if (comic in json) {
                        let selector = `.tab-content a[href$="${json[comic]}"]`;
                        fun.gae(".lastchapter").forEach(a => a.classList.remove("lastchapter"));
                        fun.gae(selector).forEach(a => a.classList.add("lastchapter"));
                        setTimeout(() => {
                            let lastReadUrl = fun.lp + "/chapter/" + json[comic];
                            let lastText = fun.ge(".lastchapter").title;
                            let lastE = fun.ge("#lastRead");
                            if (!lastE && !fun.ge("//span[contains(text(),'最後閱讀')]")) {
                                let a = document.createElement("a");
                                a.id = "lastRead";
                                a.target = "_blank";
                                let tableRight = document.querySelector(".table-default-right");
                                tableRight.insertBefore(a, tableRight.firstElementChild);
                                const span = document.createElement("span");
                                span.innerText = "最後閱讀:";
                                tableRight.insertBefore(span, tableRight.firstElementChild);
                                a.href = lastReadUrl;
                                a.innerText = lastText;
                            } else if (!!lastE) {
                                let a = lastE;
                                a.href = lastReadUrl;
                                a.innerText = lastText;
                            }
                        }, 200);
                    }
                }
            };
            updateLastChapter();
            document.addEventListener("visibilitychange", updateLastChapter);
        },
        css: ".lastchapter{color:#fff !important;background:#1790E6}",
        category: "none"
    }, {
        name: "拷貝漫畫 清除不給開啟開發人員工具",
        reg: () => !hasTouchEvents && /^(www\.)?(copymanga\.site|copymanga\.tv|mangacopy\.com)$/.test(fun.lh) && !fun.ge("//title[text()='漫畫觀看']"),
        delay: 300,
        init: () => {
            fun.clearAllTimer(3);
            if ("aboutBlank" in _unsafeWindow) _unsafeWindow.aboutBlank = null;
            fun.gae("img[data-src]").forEach(img => (img.src = img.dataset.src));
        },
        category: "none"
    }, {
        name: "拷貝漫畫M",
        host: ["www.copymanga.site", "copymanga.site", "www.copymanga.tv", "copymanga.tv", "www.mangacopy.com", "mangacopy.com"],
        enable: 1,
        reg: () => /(www\.)?(copymanga\.site|copymanga\.tv|mangacopy\.com)\/h5\/comicContent\/\w+\/.+/.test(fun.url) && comicInfiniteScrollMode != 1,
        xhrJson: (url = siteUrl) => {
            //let [name, id] = url.split("/").slice(-2);
            //let host = fun.lh.replace("www.", "");
            //let api = `https://api.${host}/api/v3/comic/${name}/chapter/${id}`;
            let [name, id] = url.split("/").slice(-2);
            let api = `/api/v3/comic/${name}/chapter2/${id}?platform=3`;
            return fun.xhr(api, {
                responseType: "json",
                headers: {
                    "Referer": `https://${fun.lh}/comic/${name}/chapter/${id}`,
                    "User-Agent": PCUA
                }
            });
        },
        init: async () => {
            fun.clearAllTimer(3);
            if ("aboutBlank" in _unsafeWindow) _unsafeWindow.aboutBlank = null;
            siteJson = await _this.xhrJson();
            debug("\n此頁JSON資料\n", siteJson);
            const addHtml = (url, text) => {
                let str = `<div style="padding: 10px 0; text-align: center;"><a href="${url}"style="width: 100%;font-size: 26px;line-height: 50px;height: 50px;text-align: center;">${text}</a></div>`;
                fun.ge(".comicContentPopupImageList").insertAdjacentHTML("afterend", str);
            };
            let s = siteUrl.split("/").slice(-2);
            let url = `https://${fun.lh}/h5/details/comic/${s[0]}`;
            let hUrl = `https://${fun.lh}/h5/index`;
            addHtml(hUrl, "首頁");
            addHtml(url, "目錄");
            let nUrl = _this.next();
            if (nUrl) addHtml(nUrl, "點選進入下一話");
            fun.copymanga_M_UI(url, hUrl);
        },
        //imgs: () => siteJson.results.chapter.contents.map(e => e.url.replace("c800x.", "c1500x.")),
        imgs: (json = siteJson) => {
            const srcs = [];
            const {
                words,
                contents
            } = json.results.chapter;
            words.forEach((w, i) => (srcs[w] = contents[i].url));
            return srcs;
        },
        button: [4],
        insertImg: [".comicContentPopupImageList", 2],
        next: () => {
            let next = siteJson.results.chapter.next;
            return next ? siteUrl.replace(/[\w-]+$/, "") + next : null;
        },
        customTitle: () => siteJson.results.comic.name + " - " + siteJson.results.chapter.name,
        preloadNext: (nextDoc, obj) => {
            obj.xhrJson(nextLink).then(json => {
                let srcs = obj.imgs(json);
                let title = json.results.comic.name + " - " + json.results.chapter.name;
                fun.picPreload(srcs, title, "next");
            });
        },
        css: ".comicFixed,.comicControlBottom.hide{display:none!important}.comicControlBottom a:-webkit-any-link{color:white!important}.comicContentPopup .comicControlBottom .comicControlBottomBottom span{margin:0 1rem!important}",
        fancybox: {
            blacklist: 1
        },
        infiniteScroll: true,
        category: "comic"
    }, {
        name: "拷貝漫畫M 自動翻頁",
        enable: 1,
        reg: () => /(www\.)?(copymanga\.site|copymanga\.tv|mangacopy\.com)\/h5\/comicContent\/\w+\/.+/.test(fun.url) && comicInfiniteScrollMode == 1,
        getData: () => {
            let [name, id] = new URL(document.URL).pathname.split("/").slice(-2);
            let api = `/api/v3/comic/${name}/chapter2/${id}?platform=3`;
            return fun.xhr(api, {
                responseType: "json",
                headers: {
                    "Referer": `https://${fun.lh}/comic/${name}/chapter/${id}`,
                    "User-Agent": PCUA
                }
            }).then(json => {
                const srcs = [];
                const {
                    words,
                    contents
                } = json.results.chapter;
                words.forEach((w, i) => (srcs[w] = contents[i].url));
                globalImgArray = srcs;
                customTitle = json.results.chapter.name;
                let next = json.results.chapter?.next;
                console.log("\n拷貝漫畫M_JSON\n", json, globalImgArray, customTitle, next);
                if (!!next) {
                    tempNextLink = document.URL.replace(/[^\/]+$/, "") + next;
                } else {
                    tempNextLink = null;
                }
            });
        },
        init: async () => {
            fun.showMsg("自動翻頁初始化中...", 0);
            await _this.getData();
            let imgs = fun.createImgArray(globalImgArray);
            let tE = fun.ge(".comicContentPopupImageList");
            tE.innerHTML = "";
            tE.append(...imgs);
            await fun.lazyload();
            fun.clearAllTimer(3);
            if ("aboutBlank" in _unsafeWindow) _unsafeWindow.aboutBlank = null;
            fun.hideMsg();
            const addHtml = (url, text) => {
                let str = `<div style="padding: 0 0 12px; text-align: center;"><a href="${url}"style="width: 100%;font-size: 26px;line-height: 34px;height: 34px;text-align: center;">${text}</a></div>`;
                fun.ge(".comicContentPopupImageList").insertAdjacentHTML("afterend", str);
            };
            let s = siteUrl.split("/").slice(-2);
            let url = `https://${fun.lh}/h5/details/comic/${s[0]}`;
            let hUrl = `https://${fun.lh}/h5/index`;
            addHtml(hUrl, "首頁");
            addHtml(url, "目錄");
            fun.copymanga_M_UI(url, hUrl);
        },
        autoPager: {
            ele: () => fun.createImgArray(globalImgArray),
            pos: [".comicContentPopupImageList", 0],
            observer: ".comicContentPopupImageList>img",
            next: () => tempNextLink,
            wait: async () => await _this.getData(),
            title: () => customTitle
        },
        css: ".comicFixed,.comicControlBottom.hide{display:none!important}.comicControlBottom a:-webkit-any-link{color:white!important}.comicContentPopup .comicControlBottom .comicControlBottomBottom span{margin:0 1rem!important}",
        category: "comic autoPager"
    }, {
        name: "拷貝漫畫M 清除不給開啟開發人員工具",
        reg: /(www\.)?(copymanga\.site|copymanga\.tv|mangacopy\.com)\/h5/,
        init: async () => {
            fun.clearAllTimer(3);
            if ("aboutBlank" in _unsafeWindow) _unsafeWindow.aboutBlank = null;
        },
        category: "none"
    }, {
        name: "二次元動漫/看漫畫",
        host: ["www.2animx.com", "www.k886.net"],
        enable: 0,
        reg: /(www\.2animx\.com|www\.k886\.net)\/index-look-name-.+/,
        init: "$(document).unbind('click');",
        imgs: (url = siteUrl, dom = document, msg = 1, request = 0) => {
            let max = fun.ge("#total", dom).value;
            let links = fun.arr(max).map((_, i) => fun.getModeUrl(url, 20, (i + 1)));
            return fun.getImgA("#ComicPic", links, 100, null, msg, request);
        },
        button: [4],
        insertImg: ["//div[img[@id='ComicPic']]", 2],
        autoDownload: [0],
        next: ".n.zhangjie",
        prev: ".p.zhangjie",
        customTitle: dom => {
            let [, , comic_name, comic_chapter] = fun.gt(".b", 1, dom).split(" - ");
            return comic_name + " - " + comic_chapter.replace(/(\d+P)/i, "");
        },
        preloadNext: async (nextDoc, obj) => fun.picPreload(await obj.imgs(nextLink, nextDoc, 0, 1), obj.customTitle(nextDoc), "next"),
        css: ".c>*:not(.n.zhangjie):not(.p.zhangjie){display:none!important;}#ComicPic{display:block!important;margin: 0 auto !important;}",
        category: "comic"
    }, {
        name: "奴奴漫畫",
        host: ["www.2nunu.com"],
        enable: 0,
        reg: /^https?:\/\/www\.2nunu\.com\/look-.+\.html/,
        init: "$(document).unbind();document.onkeydown=null;",
        imgs: (url = siteUrl, dom = document, msg = 1, request = 0) => {
            let max = fun.ge("#total", dom).value;
            let links = fun.arr(max).map((_, i) => url.replace(/\d+\.html$/, "") + (i + 1) + ".html");
            return fun.getImgA("#cpimg", links, 100, null, msg, request);
        },
        button: [4],
        insertImg: ["#showimage", 2],
        autoDownload: [0],
        next: "//a[text()='下一章']",
        prev: "//a[text()='上一章']",
        customTitle: (dom = document) => dom.title.replace(/(\d+P).+/i, "").replace("第", " - 第"),
        preloadNext: async (nextDoc, obj) => fun.picPreload(await obj.imgs(nextLink, nextDoc, 0, 1), obj.customTitle(nextDoc), "next"),
        category: "comic"
    }, {
        name: "漫画DB",
        host: ["www.manhuadb.com"],
        enable: 1,
        reg: () => /www\.manhuadb\.com\/manhua\/\d+\/\w+\.html$/.test(fun.url) && comicInfiniteScrollMode != 1,
        imgs: () => {
            const {
                img_data_arr,
                img_host,
                img_pre
            } = _unsafeWindow;
            return img_data_arr.map(e => img_host + img_pre + e.img);
        },
        button: [4],
        insertImg: ["#all", 2],
        autoDownload: [0],
        next: () => {
            const {
                p_ccid,
                p_id,
                vg_r_data,
                p_d
            } = _unsafeWindow;
            return fetch("/book/goNumPage", {
                "headers": {
                    "content-type": "application/x-www-form-urlencoded; charset=UTF-8"
                },
                "body": `ccid=${p_ccid}&id=${p_id}&num=${Number(vg_r_data.data("num")) + 1}&d=${p_d}&type=next`,
                "method": "POST"
            }).then(res => res.json()).then(json => json.state == 0 ? null : location.origin + json.url);
        },
        prev: "//a[text()='上集']",
        customTitle: () => fun.title("-漫画DB"),
        preloadNext: async (nextDoc, obj) => {
            const callback = (doc, fun) => {
                const code = `
window.parent.postMessage({
    iframePicArr: img_data_arr.map(e => img_host + img_pre + e.img),
    title: document.title.replace("-漫画DB", "")
}, "https://www.manhuadb.com");
               `;
                fun.script(code, 0, 1, doc);
            };
            fun.iframeDoc(nextLink, ".show-pic", 30000, callback);
        },
        infiniteScroll: true,
        category: "comic"
    }, {
        name: "漫画DB 自動翻頁",
        reg: () => /www\.manhuadb\.com\/manhua\/\d+\/\w+\.html$/.test(fun.url) && comicInfiniteScrollMode == 1,
        getSrcs: (dom) => {
            let code = fun.gst("img_data", dom);
            let base64Text = code.slice(16, -2);
            //let decodeBase64 = atob(base64Text);
            let decodeBase64 = _unsafeWindow.jQuery.base64.decode(base64Text);
            let imgDataArr = JSON.parse(decodeBase64);
            let vgData = fun.ge(".vg-r-data", dom);
            let imgHost = vgData.dataset.host;
            let imgPre = vgData.dataset.img_pre;
            let srcs = imgDataArr.map(e => imgHost + imgPre + e.img);
            return srcs;
        },
        getImgs: (dom = document) => {
            let srcs = _this.getSrcs(dom);
            return fun.createImgArray(srcs);
        },
        init: async () => {
            let imgs = _this.getImgs();
            let tE = fun.ge("#all");
            tE.innerHTML = "";
            tE.append(...imgs);
            await fun.lazyload();
            _this.autoPager.preloadNextPage();
        },
        autoPager: {
            ele: (dom) => _this.getImgs(dom),
            pos: ["#all", 0],
            observer: "#all>img",
            next: (dom) => {
                let vgData = fun.ge(".vg-r-data", dom);
                let ccid = vgData.dataset.ccid;
                let id = vgData.dataset.id;
                let num = vgData.dataset.num;
                let d = vgData.dataset.d;
                return fetch("/book/goNumPage", {
                    "headers": {
                        "content-type": "application/x-www-form-urlencoded; charset=UTF-8"
                    },
                    "body": `ccid=${ccid}&id=${id}&num=${Number(num) + 1}&d=${d}&type=next`,
                    "method": "POST"
                }).then(res => res.json()).then(json => json.state == 0 ? null : json.url);
            },
            title: (dom) => {
                let m = fun.gt("h1.h2>a", 1, dom);
                let c = fun.gt("h2.h4", 1, dom).replace(/\[|\]/g, "");
                return hasTouchEvents ? c : m + " - " + c;
            },
            hide: ".comic-viewer-toc",
            preloadNextPage: async (dom) => {
                let next = await _this.autoPager.next(dom);
                if (!!next) {
                    fun.fetchDoc(next).then(nextDoc => {
                        let srcs = _this.getSrcs(nextDoc);
                        let text = _this.autoPager.title(nextDoc);
                        fun.picPreload(srcs, text, "next");
                    });
                }
            }
        },
        css: ".form-inline>.pre,.form-inline>.next,div:has(>#page-selector){display:none!important;}",
        category: "comic autoPager"
    }, {
        name: "快岸漫画",
        host: ["www.ikanbook.net"],
        enable: 0,
        reg: /www\.ikanbook\.net\/comic\/\d+\/\d+/,
        init: async () => {
            await fun.waitVar("x_tokens");
            fun.run("$(document).unbind('keydown');$(document).unbind('keyup');");
        },
        imgs: () => {
            const {
                is_refresh,
                x_tokens,
                Gm,
                comic_id,
                version_id,
                part_id,
                my_sha2,
                data
            } = _unsafeWindow;
            return is_refresh == 0 ? x_tokens.map(e => Gm.getImgUrl(comic_id + "/" + version_id + "/" + part_id + "/" + my_sha2(e))) : data.url.map(e => Gm.getImgUrl(e));
        },
        button: [4],
        insertImg: ["#all", 2],
        autoDownload: [0],
        next: "//a[text()='下一章' and not(starts-with(@href,'javascript'))]",
        prev: "//a[text()='上一章' and not(starts-with(@href,'javascript'))]",
        customTitle: () => fun.gt("h2.h2>a") + " - " + fun.gt("span.h4:nth-child(5)"),
        //threading: 4,
        css: "#FullPictureLoadEnd{color:rgb(255, 255, 255)}",
        category: "comic"
    }, {
        name: "樱花漫画",
        host: ["www.yinghuamh.net", "yinghuamh.net"],
        enable: 1,
        reg: /^https?:\/\/(www\.)?yinghuamh\.net\/comic\/\w+\/\d+\/\d+/i,
        init: async () => {
            await fun.waitVar("x_tokens");
            fun.run("$(document).off();");
            const toggleToolbar = e => {
                if (e.wheelDelta < 0 || e.detail > 0) {
                    fun.ge(".view-title").style.top = "-60px";
                } else {
                    fun.ge(".view-title").style.top = "0px";
                }
            };
            document.addEventListener("wheel", toggleToolbar);
            document.addEventListener("DOMMouseScroll", toggleToolbar);
            const keyToggleToolbar = event => {
                if (["PageDown", "Space", "ArrowDown"].includes(event.code) || ["PageDown", " ", "ArrowDown"].includes(event.key)) {
                    fun.ge(".view-title").style.top = "-60px";
                } else {
                    fun.ge(".view-title").style.top = "0px";
                }
            };
            document.addEventListener("keydown", keyToggleToolbar);
            if (hasTouchEvents) {
                let startY, moveY, Y;
                $("body").on("touchstart", (e) => {
                    startY = e.originalEvent.changedTouches[0].pageY;
                });
                $("body").on("touchmove", (e) => {
                    moveY = e.originalEvent.changedTouches[0].pageY;
                    Y = moveY - startY;
                    if (Y < 0) {
                        fun.ge(".view-title").style.top = "-60px";
                    } else if (Y > 0) {
                        fun.ge(".view-title").style.top = "0px";
                    }
                });
            }
        },
        imgs: () => {
            const {
                x_tokens,
                Gm
            } = _unsafeWindow;
            return x_tokens.map(e => Gm.getImgUrl(Gm.fitImgUrl(e)));
        },
        button: [4],
        insertImg: ["#all", 2],
        autoDownload: [0],
        next: "a.next_part:not([href^=java])",
        prev: ".paginationContent>a:first-child:not([href^=java])",
        customTitle: () => {
            const {
                comic_name,
                part_name
            } = _unsafeWindow;
            return comic_name + " - " + part_name;
        },
        preloadNext: async () => {
            let iframe = await fun.iframeVar(nextLink, 1000, "x_tokens");
            const {
                x_tokens,
                Gm,
                comic_name,
                part_name
            } = iframe;
            let srcs = x_tokens.map(e => Gm.getImgUrl(Gm.fitImgUrl(e)));
            let text = comic_name + part_name;
            fun.picPreload(srcs, text, "next");
        },
        threading: 4,
        css: "#FullPictureLoadEnd{color:rgb(255, 255, 255)}",
        category: "comic"
    }, {
        name: "哔哩哔哩漫画",
        host: ["manga.bilibili.com"],
        enable: 1,
        reg: /manga\.bilibili\.com\/mc\d+\/\d+\?from=manga_detail/,
        init: () => setTimeout(() => fun.ge(".load-next-btn").addEventListener("click", () => setTimeout(() => location.reload(), 500)), 1000),
        imgs: async () => {
            let ep_id = siteUrl.split("/").at(-1).match(/\d+/)[0];
            let headers = {
                "content-type": "application/json;charset=UTF-8"
            };
            let imgsRes = await fetch("/twirp/comic.v1.Comic/GetImageIndex?device=pc&platform=web", {
                "headers": headers,
                "body": JSON.stringify({
                    ep_id: `${ep_id}`
                }),
                "method": "POST"
            }).then(res => res.json()).then(json => json.data.images.map(e => e.path));
            return fetch("/twirp/comic.v1.Comic/ImageToken?device=pc&platform=web", {
                "headers": headers,
                "body": JSON.stringify({
                    urls: JSON.stringify(imgsRes)
                }),
                "method": "POST"
            }).then(res => res.json()).then(json => json.data.map(e => `${e.url}?token=${e.token}`));
        },
        insertImg: [".image-list", 2],
        next: ".load-next-btn",
        prev: 1,
        customTitle: async () => {
            await fun.delay(1500, 0);
            return fun.gt(".manga-title") + " - " + fun.gt(".episode");
        },
        css: "#FullPictureLoadEnd{color:rgb(255, 255, 255)}",
        category: "comic"
    }, {
        name: "看漫画",
        host: ["www.kanman.com"],
        enable: 0,
        reg: /www\.kanman\.com\/\d+\/[\w-]+\.html/,
        imgs: () => {
            let s = fun.lp.split("/");
            let comic_id = s[1];
            let chapter_newid = s[2].replace(".html", "");
            let api = `/api/getchapterinfov2?product_id=1&productname=kmh&platformname=pc&comic_id=${comic_id}&chapter_newid=${chapter_newid}&isWebp=1&quality=middle`;
            return fetch(api).then(res => res.json()).then(json => json.data.current_chapter.chapter_img_list);
        },
        customTitle: async () => {
            await fun.delay(1500, 0);
            return fun.gt("#crumbComicLink") + " - " + fun.gt(".chapter-title").trim();
        },
        category: "comic"
    }, {
        name: "zero搬运网",
        host: ["www.zerobyw24.com"],
        enable: 0,
        reg: /^https?:\/\/www\.zerobyw\w+\.com\/plugin\.php\?id=\w+&a=read&zjid=\d+$/i,
        include: "//script[contains(text(),'listimg')]",
        imgs: () => {
            let code = fun.gst("listimg");
            let arrText = code.match(/listimg[\s=]+([^;]+)/)[1];
            let dataArr = fun.run(arrText);
            return dataArr.map(e => e.file);
        },
        button: [4],
        insertImg: [".uk-alert.uk-alert-danger.uk-text-center,.uk-zjimg", 3],
        autoDownload: [0],
        next: "//a[contains(text(),'下一章')]",
        prev: "//a[contains(text(),'上一章')]",
        customTitle: () => fun.title(" - zero搬运网"),
        category: "comic"
    }, {
        name: "zero搬运网M",
        host: ["www.zerobyw24.com"],
        enable: 0,
        reg: [
            /^https?:\/\/www\.zerobyw\w+\.com\/plugin\.php\?id=\w+&c=index&a=read&zjid=\d+$/i,
            /^https?:\/\/www\.zerobyw\w+\.com\/plugin\.php\?id=\w+&a=read&zjid=\d+$/i
        ],
        include: ".areadiv",
        imgs: ".zjimg>img",
        button: [4],
        insertImg: [".areadiv", 3],
        autoDownload: [0],
        next: "//a[contains(text(),'下一章')]",
        prev: "//a[contains(text(),'上一章')]",
        customTitle: () => fun.title(/_ zero搬运网.+/),
        category: "comic"
    }, {
        name: "漫蛙", //方向鍵上一章下一章、清除擋廣告警告、向下滾動隱藏工具列、反反偵錯,,下載需先手動觸發全部載入圖片,函式使用到canvas需要繪製過程會有點卡。
        host: ["manwa.me", "manwaqq1.vip"],
        link: "https://fuw11.cc/maKapG",
        enable: 1,
        reg: /(^https?:\/\/manwa\.me|manwaqq1\.vip)\/chapter\/\d+(\?img_host=\d)?$/,
        init: async () => {
            _unsafeWindow.Function.prototype.constructor = () => {};
            //await fun.scrollEles(".img-content img", 200);
            fun.css(".ad-area{opacity:0!important;}#cp_img>.two-ad-area:nth-child(1)>.ad-area,#cp_img>.two-ad-area:nth-child(2){display:none!important}");
            fun.remove(".ad-area,body>div[id]:not([id^='pv-']):not([class^='pv-']):not(.pagetual_tipsWords):not(#comicRead):not(#fab):not(.FullPictureLoadMsg):not(.FullPictureLoadFixedBtn):not(#FullPictureLoadOptions):not(a):not(#FullPictureLoadFixedMenu):not(*[class^=fancybox])", 5000);
            const toggleToolbar = e => {
                if (e.wheelDelta < 0 || e.detail > 0) {
                    $(".view-fix-top-bar").attr("style", "top: -60px;");
                    $(".view-fix-bottom-bar").attr("style", "bottom: -60px;");
                    $(".detail-comment-fix-bottom").hide("fast");
                } else {
                    $(".view-fix-top-bar").attr("style", "top: 0px;");
                    $(".view-fix-bottom-bar").attr("style", "bottom: 0px;");
                    $(".detail-comment-fix-bottom").show("fast");
                }
            };
            document.addEventListener("wheel", toggleToolbar);
            document.addEventListener("DOMMouseScroll", toggleToolbar);
            const keyToggleToolbar = event => {
                if (["PageDown", "Space", "ArrowDown"].includes(event.code) || ["PageDown", " ", "ArrowDown"].includes(event.key)) {
                    $(".view-fix-top-bar").attr("style", "top: -60px;");
                    $(".view-fix-bottom-bar").attr("style", "bottom: -60px;");
                    $(".detail-comment-fix-bottom").hide("fast");
                } else {
                    $(".view-fix-top-bar").attr("style", "top: 0px;");
                    $(".view-fix-bottom-bar").attr("style", "bottom: 0px;");
                    $(".detail-comment-fix-bottom").show("fast");
                }
            };
            document.addEventListener("keydown", keyToggleToolbar);
            if (hasTouchEvents) {
                let startY, moveY, Y;
                $("body").on("touchstart", (e) => {
                    startY = e.originalEvent.changedTouches[0].pageY;
                });
                $("body").on("touchmove", (e) => {
                    moveY = e.originalEvent.changedTouches[0].pageY;
                    Y = moveY - startY;
                    if (Y < 0) {
                        $(".view-fix-top-bar").attr("style", "top: -60px;");
                        $(".view-fix-bottom-bar").attr("style", "bottom: -60px;");
                        $(".detail-comment-fix-bottom").hide("fast");
                    } else if (Y > 0) {
                        $(".view-fix-top-bar").attr("style", "top: 0px;");
                        $(".view-fix-bottom-bar").attr("style", "bottom: 0px;");
                        $(".detail-comment-fix-bottom").show("fast");
                    }
                });
            }
            await fun.waitEle(".content-img.lazy_img[src^=blob]");
            if (autoScrollAllElement === 1) _this.scrollEle();
        },
        imgs: () => fun.imgBlobArr(".content-img[src^=blob]"),
        scrollEle: () => fun.aotoScrollEles(".img-content .content-img", (img) => /^blob/.test(img.src)),
        next: ".view-fix-bottom-bar-item-menu-next",
        prev: ".view-fix-bottom-bar-item-menu-prev",
        customTitle: () => fun.title("在线阅读", 1),
        css: "body{padding-bottom:0px!important}",
        category: "comic"
    }, {
        name: "漫蛙選目錄展開全部章節",
        host: ["manwa.me"],
        enable: 1,
        icon: 0,
        key: 0,
        reg: /(^https?:\/\/manwa\.me|manwaqq1\.vip)\/book\/\d+$/,
        init: "Function.prototype.constructor=()=>{};titleSelect(this,'#chapter_indexes');charpterMore(this);",
        category: "comic"
    }, {
        name: "漫蛙自動載入更多",
        host: ["manwa.me"],
        enable: 1,
        icon: 0,
        key: 0,
        reg: /(^https?:\/\/manwa\.me|manwaqq1\.vip)\/update$/,
        init: "Function.prototype.constructor=()=>{};",
        observerClick: "#loadMore",
        category: "comic"
    }, {
        name: "開車漫画",
        host: ["18p.fun"],
        enable: 1,
        reg: /^https?:\/\/(www\.)?(18p|gohaveababy|imynest|healthway|beforeout)\.[a-z]{2,5}\/(ForInject\/|Article\/|content\/)/,
        imgs: async () => {
            await fun.waitEle("//script[contains(text(),'_curChap')]");
            if (fun.lh != "18p.fun") {

                location.replace("https://18p.fun/ForInject/Chapter/?id=" + _unsafeWindow.$_curChap.id);
                await fun.delay(3000, 0);
            }
            await fun.getNP("img[data-src].lazy:not(.demo-lazy)", "//a[@data-url and contains(text(),'下一頁')] | //a[@data-url and contains(text(),'下一章')]", null, "div[class^=picnext]");
            return fun.gae("img[data-src].lazy:not(.demo-lazy)");
        },
        insertImg: ["div[class^=pictures]", 3],
        fetch: 1,
        css: "#FullPictureLoadEnd{color:rgb(255, 255, 255)}",
        category: "comic"
    }, {
        name: "開車漫画",
        host: ["18p.fun"],
        enable: 0,
        icon: 0,
        key: 0,
        reg: /^https?:\/\/18p\.fun\//,
        include: ".loadmore>button",
        init: () => fun.addMutationObserver(() => fun.gae("img.lazy[src$=svg]").forEach(img => (img.src = img.dataset.src))),
        observerClick: ".loadmore>button",
        openInNewTab: "#itemlist li>a:not([target=_blank])",
        css: ".page{display:none!important}.loadmore{display:block!important}",
        category: "comic"
    }, {
        name: "风之动漫",
        host: ["www.fffdm.com"],
        enable: 1,
        reg: /(www\.fffdm\.com|manhua\.fffdm\.com)\/(manhua\/)?\d+\/[^/]+\/$/i,
        fetchJson: (url = siteUrl) => {
            let [mhId, mhcId] = new URL(url).pathname.split("/").slice(-3);
            let api = `/api/manhua/${mhId}/${mhcId}`;
            return fetch(api).then(res => res.json());
        },
        init: async () => {
            let json = await _this.fetchJson();
            debug("\n此頁JSON資料\n", json);
            siteJson = json;
        },
        imgs: async (json = siteJson, msg = null) => {
            let hostArr = ["https://p5.fffdm.live/", "https://p6.fffdm.live/", "https://p1.fffdm.live/"];
            let firstPic = json.cont[0];
            let testArr = hostArr.map(e => e + firstPic);
            let ok = false;
            let host;
            for (let i = 0; i < testArr.length; i++) {
                let obj = await fun.checkImgStatus(testArr[i], msg);
                console.log(`確認圖片[${i}]`, obj);
                if (obj.ok) {
                    ok = true;
                    host = hostArr[i];
                    break;
                }
            }
            return ok ? siteJson.cont.map(e => host + e) : [];
        },
        button: [4],
        insertImg: ["#mh", 2],
        insertImgAF: async () => {
            let url = await _this.next();
            if (!!url) {
                let text = `<div style="padding: 36px 0; text-align: center;"><a href="${url}"style="font-size: 26px;line-height: 50px;height: 50px;text-align: center;">點選進入下一話</a></div>`;
                fun.ge("#mh").insertAdjacentHTML("afterend", text);
                fun.ge("#mh+div").addEventListener("click", () => setTimeout(() => location.reload(), 200));
            }

        },
        next: () => {
            let comicListUrl = decodeURIComponent(siteUrl.replace(/[^\/]+\/$/i, ""));
            let chapter = decodeURIComponent(siteUrl.match(/[^\/]+\/$/)[0]);
            let nextXPath = `//div[@id='content']/li[a[@href='${chapter}']]/preceding-sibling::li[1]/a`;
            return fun.fetchDoc(comicListUrl).then(doc => {
                let next = fun.ge(nextXPath, doc, doc);
                return next ? comicListUrl + next.getAttribute("href") : null;
            });
        },
        prev: 1,
        customTitle: (doc = document) => fun.title("第1页", 1, doc),
        preloadNext: async (nextDoc, obj) => {
            let json = await obj.fetchJson(nextLink);
            fun.picPreload(await obj.imgs(json, 0), obj.customTitle(nextDoc), "next");
        },
        fancybox: {
            v: 3,
            insertLibrarys: 1
        },
        category: "comic"
    }, {
        name: "漫画皮",
        host: ["www.iimanhuapi.com", "m.iimanhuapi.com"],
        enable: 1,
        reg: /^https?:\/\/(www|m)\.iimanhuapi\.com\/chapter\/\d+\.html$/i,
        init: "document.onkeydown=null;$('body').unbind();",
        imgs: (doc = document) => fun.gae("option[jhc-data]", doc).map(e => e.getAttribute("jhc-data").replace("-mht.middle.webp", "")).map(e => e.replace(new URL(e).protocol, location.protocol)),
        button: [4],
        insertImg: [".mh_list,#content", 2],
        autoDownload: [0],
        next: "//a[text()='下一章'][contains(@href,'chapter')]",
        prev: "//a[text()='上一章'][contains(@href,'chapter')]",
        customTitle: (doc = document) => fun.attr("meta[name='keywords']", "content", doc).replace(",", " - "),
        preloadNext: true,
        css: "#prePage,#nextPage,select,.jump-list,.apjg,a[href*=taobao]{display:none!important;}",
        category: "comic"
    }, {
        name: "哈哈漫画",
        host: ["www.hahacomic.com"],
        enable: 1,
        reg: /^https?:\/\/www\.hahacomic\.com\/manhua\/\d+\/\d+\.html/,
        imgs: "img[data-original]",
        button: [4],
        insertImg: [".chapter-images", 2],
        autoDownload: [0],
        next: "//a[label[text()='下一章'] and not(starts-with(@href,'java'))]",
        prev: "//a[label[text()='上一章'] and not(starts-with(@href,'java'))]",
        preloadNext: async (nextDoc, obj) => fun.picPreload(fun.getImgSrcArr(obj.imgs, nextDoc), nextDoc.title, "next"),
        category: "comic"
    }, {
        name: "哈哈漫画 - 分類自動翻頁",
        host: ["www.hahacomic.com"],
        enable: 1,
        reg: /^https?:\/\/www\.hahacomic\.com\/manhua\/list\.html/,
        autoPager: {
            ele: ".mdui-col-lg-2",
            observer: ".mdui-col-lg-2",
            next: doc => fun.ge("span.current+a", doc) ? siteUrl.replace(/\?page=\d+/, "") + "?page=" + fun.ge("span.current+a", doc).getAttribute("href").match(/\d+/)[0] : null,
            re: ".pages",
            title: () => "Page " + nextLink.match(/\d+$/)[0]
        },
        openInNewTab: ".mdui-col-lg-2>a",
        category: "autoPager"
    }, {
        name: "爱看漫画",
        host: ["www.yyjj66.com", "m.yyjj66.com"],
        enable: 0,
        reg: /^https?:\/\/(www|m)\.yyjj66\.com\/comic\/[0-9_]+\.html/,
        imgs: ".chapter-content img,.hide-scrollbars img",
        button: [4],
        insertImg: [".chapter-content,.hide-scrollbars", 2],
        autoDownload: [0],
        next: "//span[starts-with(@class,'next-chapter')]/a[contains(@href,'html')] | //a[p[text()='下一话'] and contains(@href,'html')]",
        prev: "//span[starts-with(@class,'prev-chapter')]/a[contains(@href,'html')] | //a[p[text()='上一话'] and contains(@href,'html')]",
        customTitle: (doc = document) => fun.title("-在线", 1, doc),
        preloadNext: true,
        category: "comic"
    }, {
        name: "风车漫画",
        host: ["www.qyy158.com", "m.qyy158.com"],
        enable: 1,
        reg: /^https?:\/\/(www|m)\.qyy158\.com\/info\/\d+\/\d+\.html/,
        imgs: ".chapter-content img,.hide-scrollbars img",
        button: [4],
        insertImg: [".chapter-content,.hide-scrollbars", 2],
        autoDownload: [0],
        next: "//a[span[text()='下一话']] | //a[p[text()='下一话']]",
        prev: "//a[span[text()='上一话']] | //a[p[text()='上一话']]",
        customTitle: () => {
            if (fun.lh == "www.qyy158.com") {
                let s = fun.gt(".header-center").split(" > ");
                return s[1] + " - " + s[2];
            } else {
                let data = JSON.parse(localStorage[localStorage.read_book]);
                return data.articlename + " - " + data.chaptername_read;
            }
        },
        preloadNext: (nextDoc, obj) => fun.picPreload(fun.getImgSrcArr(obj.imgs, nextDoc), nextDoc.title, "next"),
        category: "comic"
    }, {
        name: "轻之国度",
        host: ["www.lightnovel.us"],
        enable: 1,
        reg: /^https?:\/\/www\.lightnovel\.us\/\w+\/detail\/\d+/,
        imgs: ".article-content img",
        button: [4],
        insertImg: [".article-content", 3],
        customTitle: ".article-title",
        category: "comic"
    }, {
        name: "微信公众号",
        host: ["mp.weixin.qq.com"],
        enable: 1,
        reg: /^https?:\/\/mp\.weixin\.qq\.com\/[^&]+&mid=\d+/,
        imgs: "img.js_insertlocalimg",
        category: "comic"
    }, {
        name: "虎扑社区",
        host: ["bbs.hupu.com"],
        enable: 1,
        reg: /^https?:\/\/bbs\.hupu\.com\/\d+\.html/,
        init: () => (siteJson = JSON.parse(fun.attr("#bbs-admin-main-post-container", "data-admininfo"))),
        imgs: () => {
            let data = JSON.parse(siteJson.format);
            if (data.imgList) {
                return data.imgList.map(e => e.remoteUrl);
            } else if (data.jsonV3) {
                return data.jsonV3.content.filter(item => item.type == "image").map(e => e.attrs.src);
            } else {
                return [];
            }
        },
        customTitle: () => siteJson.postTitle,
        category: "comic"
    }, {
        name: "漫畫類 自動展開目錄",
        enable: 1,
        icon: 0,
        key: 0,
        reg: /((mangabz|xmanhua|dm5|1kkk|manben|mkzhan|kumw\d|sumanku)\.com\/[\w-]+\/$)|(m\.dmzj\.com|m\.ymh1234\.com)\/(info|comic)\/\d+\.html$|(dgmanhua|acgud|acgwd|manhua456|mhxin|zuimh|imitui|xlsmh|pinmh|dashumanhua|kukuwumh|mh160|szcdmj|haoman6)\.(com|cc)\/(comic|manhua|manga|kanmanhua|szcbook)\/[\w-]+\/?$|www\.mhua5\.com\/[\w-]+\.html|m\.aiguoman\.com\/comic\/\w+|(www|m)\.77mh\.\w+\/colist_\d+\.html|www\.manhw\.com\/index\.php\/comic\/\w+$/,
        init: async () => {
            if (fun.lh == "m.acgud.com" || fun.lh == "m.acgwd.com") fun.css(".Introduct_Sub{background:url(https://m.idmzj.com/images/int_bg.png)!important;background-size:100% 100%!important}");
        },
        autoClick: "span.more,a.detail-list-form-more,a.detail-list-more,.deatil-list-more>a,.detail-more,.moreChapter,.show-more,a#zhankai,.gengduo_dt1>button,.morechapter>button,.gengduo_dt1>a,.chapterList+.more,li.add,a.extend,a.action-collapse:not(.on),.chapter__more .down,.listmore,.more.chapLiList-cont>a,.m-load-more-sm>a,.more>a,.allmulu,.show-more>a,.morechp,.nnmore>a",
        css: ".comic-info-box+a,.cartoon-introduction.cmg,.cartoon-introduction+a,.msloga,.comic_intro>a,.Introduct+a,[class^='ad']{display:none!important}",
        category: "comic"
    }, {
        name: "94i.in 自動簽到",
        host: ["94i.in"],
        reg: /^https?:\/\/94i\.in\//,
        autoClick: "#pper_a:not([style='display: none;'])",
        category: "none"
    }, {
        name: "Supjav 立即顯示影片縮圖",
        host: ["supjav.com"],
        delay: 300,
        reg: /^https?:\/\/supjav\.com\/(zh\/|ja\/)?\d+\.html/,
        init: async () => {
            let t = fun.ge("title");
            t.innerText = t.innerText.replace(/-\sSupjav.com.+/, "").trim();
            let ele = "#vserver.play-button";
            if (await fun.waitEle(ele)) fun.ge(ele).click();
        },
        category: "none"
    }, {
        name: "ouo.io 自動跳轉",
        host: ["ouo.io"],
        reg: /^https?:\/\/ouo\./,
        init: async () => {
            let ele = "#btn-main:not(.disabled)";
            if (await fun.waitEle(ele)) fun.ge(ele).click();
        },
        category: "none"
    }, {
        name: "cuty.io 自動跳轉",
        host: ["cuty.io"],
        reg: /^https?:\/\/cutt?y\.(io|app)\/\w+/i,
        init: async () => {
            let ele = "//button[@id='submit-button' and text()= 'Continue' or text()= 'I am not a robot' or text()= 'Go ->']";
            if (await fun.waitEle(ele)) fun.ge(ele).click();
        },
        category: "none"
    }, {
        name: "m.4khd.com 自動跳轉",
        host: ["m.4khd.com"],
        reg: /^https?:\/\/m\.4khd\.com\//,
        init: () => {
            if (isFn(_unsafeWindow.redirect)) {
                _unsafeWindow.redirect = null;
            }
            fun.css("#divExoLayerWrapper,.exo-ipp,.exo_wrapper,div:has(>.centered-contai),.center-container{display:none!important;}");
            location.href = fun.gu("//a[text()='GET LINK']|//a[span[text()='GET LINK']]");
        },
        category: "none"
    }, {
        name: "4kup.net 自動跳轉",
        host: ["4kup.net"],
        reg: /^https?:\/\/4kup\.net\/getlink\/$/,
        init: async () => {
            let selectorArr = ["#output:not([style*=none]) button", "#gotolink:not([disabled])"];
            for (let selector of selectorArr) {
                await fun.waitEle(selector);
                fun.ge(selector).click();
                await fun.delay(200);
            }
        },
        category: "none"
    }, {
        name: "Imgasd 自動跳轉",
        reg: /\/blog\/post\d?\?slid=\w+/i,
        init: async () => {
            let ele = "//span[text()='Click here to continue'] | //span[text()='Click here to continue ']";
            setInterval(async () => {
                if (await fun.waitEle(ele)) fun.ge(ele).click();
            }, 1000);
        },
        category: "none"
    }, {
        name: "terabox.fun 自動跳轉",
        host: ["terabox.fun"],
        reg: /^https?:\/\/terabox\.fun\/slmiddlepage\//,
        init: async () => {
            let ele = ".btn.active";
            setInterval(async () => {
                if (await fun.waitEle(ele)) fun.ge(ele).click();
            }, 1000);
        },
        category: "none"
    }, {
        name: "MediaFire 自動下載",
        host: ["www.mediafire.com"],
        reg: /^https?:\/\/www\.mediafire\.com\//,
        autoClick: ".download_link:not(.started) #downloadButton",
        category: "none"
    }, {
        name: "anonfiles 自動下載",
        host: ["anonfiles.com"],
        reg: /^https?:\/\/anonfiles\.com\//,
        autoClick: ["#download-url"],
        category: "none"
    }, {
        name: "letsupload 自動下載",
        host: ["letsupload.cc"],
        reg: /^https?:\/\/letsupload\.cc\//,
        autoClick: ["#download-url"],
        category: "none"
    }, {
        name: "stfly.me 半自動跳轉",
        host: ["stfly.me"],
        reg: () => fun.ge("img[src^='https://stfly.me/']") ? true : false,
        init: async () => {
            if (await fun.waitEle(".btn-captcha:not(.disable)")) setInterval(() => fun.ge(".btn-captcha:not(.disable)").click(), 3000);
        },
        category: "none"
    }, {
        name: "link1s 自動跳轉",
        host: ["link1s.com"],
        reg: () => fun.ge("a.site-logo[href='https://link1s.com/'],a.logo-image[href='https://link1s.com/']") ? true : false,
        init: async () => {
            if (await fun.waitEle("//button[@onclick='link1sgo()'] | //button[@id='link' and contains(@style,'none')] | //a[text()='Get Link']")) fun.ge("//button[@onclick='link1sgo()'] | //a[@id='link1s'] | //a[text()='Get Link']").click();
        },
        category: "none"
    }, {
        name: "Binto.click 自動跳轉",
        host: ["binto.click"],
        reg: () => /^https?:\/\/binto\.click\/\w+$/i.test(siteUrl) && fun.ge("#go-link"),
        init: async () => {
            if (await fun.waitEle("//a[text()='Get Link']")) location.href = fun.gu("//a[text()='Get Link']");
        },
        category: "none"
    }, {
        name: "網址清單新分頁開啟",
        host: ["github.com"],
        delay: 1000,
        reg: [
            /github\.com\/skofkyo\/AutoPager\/tree\/main\/CustomPictureDownload/,
            /github\.com\/skofkyo\/AutoPager\/blob\/main\/CustomPictureDownload\/README\.md$/
        ],
        openInNewTab: ".entry-content a[href]:not([target=_blank]):not([id])",
        category: "none"
    }, {
        name: "google search 新分頁開啟",
        reg: /^https?:\/\/(?:www\.)?google\..*\/search/,
        openInNewTab: "//div[@id='center_col']//a[@ping][not(@target)]",
        category: "none"
    }, {
        name: "CivitAi Auto Show NSFW",
        host: ["civitai.com"],
        reg: /^https?:\/\/civitai\.com\//,
        init: async () => {
            await fun.waitEle("img[src*='width='],video[src*='width=']");
            //自動顯示NSFW
            const unBlur = async () => {
                if (/\/posts\/|\/models\//.test(fun.lp)) {
                    try {
                        let ele = [...document.querySelectorAll(".mantine-1t4bhd4")][0];
                        let elePath = ele.querySelector("span>svg>path");
                        if (elePath) {
                            let d = elePath.getAttribute("d");
                            if (d == "M10 12a2 2 0 1 0 4 0a2 2 0 0 0 -4 0") ele.click();
                            await fun.delay(1000, 0);
                        }
                    } catch (e) {}
                }
                [...document.querySelectorAll("button.cursor-pointer")].forEach(ele => {
                    let elePath = ele.querySelector("span>svg>path");
                    if (elePath) {
                        let d = elePath.getAttribute("d");
                        if (d == "M10 12a2 2 0 1 0 4 0a2 2 0 0 0 -4 0") ele.click();
                    }
                });
            };
            fun.addMutationObserver(unBlur);
            //將預覽縮圖替換為原始圖片,延遲載入原始圖片URL,透過腳本管理器選單開啟。
            if (lazyLoadFullResolution == 1) {
                const lazyLoad = () => {
                    [...document.querySelectorAll("img[src*='width=']:not([src^='data'],.mantine-Avatar-image,.mantine-anvagt,.mantine-d881q8,.mantine-cdh9bk,.mantine-qh395j,.mantine-7aj0so[loading],.mantine-34i7e7,.mantine-lrbwmi,.mantine-14evxiu)")].forEach(item => {
                        //console.log(item);
                        if (!/\.mp4/.test(item.dataset.src ?? item.src)) {
                            let thumbnail = item.dataset.src ?? item.src;
                            item.dataset.thumb = thumbnail;
                            item.da