w-dwdata-hub 1.0.16 → 1.0.18

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,7 +1,7 @@
1
1
  /*!
2
- * w-dwdata-hub v1.0.16
2
+ * w-dwdata-hub v1.0.18
3
3
  * (c) 2018-2021 yuda-lyu(semisphere)
4
4
  * Released under the MIT License.
5
5
  */
6
- !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t(require("child_process"),require("util"),require("cheerio"),require("playwright"),require("rss-parser")):"function"==typeof define&&define.amd?define(["child_process","util","cheerio","playwright","rss-parser"],t):(e="undefined"!=typeof globalThis?globalThis:e||self)["w-dwdata-hub"]=t(e.child_process,e.util,e.cheerio,e.playwright,e["rss-parser"])}(this,function(e,t,r,n,a){"use strict";function s(e){var t=Object.create(null);return e&&Object.keys(e).forEach(function(r){if("default"!==r){var n=Object.getOwnPropertyDescriptor(e,r);Object.defineProperty(t,r,n.get?n:{enumerable:!0,get:function(){return e[r]}})}}),t.default=e,Object.freeze(t)}var i=s(r),o=Array.isArray,l="object"==typeof global&&global&&global.Object===Object&&global,u="object"==typeof self&&self&&self.Object===Object&&self,c=l||u||Function("return this")(),h=c.Symbol,f=Object.prototype,g=f.hasOwnProperty,d=f.toString,m=h?h.toStringTag:void 0;var p=Object.prototype.toString;var w=h?h.toStringTag:void 0;function y(e){return null==e?void 0===e?"[object Undefined]":"[object Null]":w&&w in Object(e)?function(e){var t=g.call(e,m),r=e[m];try{e[m]=void 0;var n=!0}catch(e){}var a=d.call(e);return n&&(t?e[m]=r:delete e[m]),a}(e):function(e){return p.call(e)}(e)}function $(e){return null!=e&&"object"==typeof e}function S(e){return"symbol"==typeof e||$(e)&&"[object Symbol]"==y(e)}var b=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,_=/^\w*$/;function v(e){var t=typeof e;return null!=e&&("object"==t||"function"==t)}var D,M=c["__core-js_shared__"],A=(D=/[^.]+$/.exec(M&&M.keys&&M.keys.IE_PROTO||""))?"Symbol(src)_1."+D:"";var x=Function.prototype.toString;var T=/^\[object .+?Constructor\]$/,E=Function.prototype,O=Object.prototype,k=E.toString,L=O.hasOwnProperty,C=RegExp("^"+k.call(L).replace(/[\\^$.*+?()[\]{}|]/g,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$");function j(e){if(!v(e)||(t=e,A&&A in t))return!1;var t,r=function(e){if(!v(e))return!1;var t=y(e);return"[object Function]"==t||"[object GeneratorFunction]"==t||"[object AsyncFunction]"==t||"[object Proxy]"==t}(e)?C:T;return r.test(function(e){if(null!=e){try{return x.call(e)}catch(e){}try{return e+""}catch(e){}}return""}(e))}function I(e,t){var r=function(e,t){return null==e?void 0:e[t]}(e,t);return j(r)?r:void 0}var R=I(Object,"create");var U=Object.prototype.hasOwnProperty;var P=Object.prototype.hasOwnProperty;function N(e){var t=-1,r=null==e?0:e.length;for(this.clear();++t<r;){var n=e[t];this.set(n[0],n[1])}}function Y(e,t){return e===t||e!=e&&t!=t}function F(e,t){for(var r=e.length;r--;)if(Y(e[r][0],t))return r;return-1}N.prototype.clear=function(){this.__data__=R?R(null):{},this.size=0},N.prototype.delete=function(e){var t=this.has(e)&&delete this.__data__[e];return this.size-=t?1:0,t},N.prototype.get=function(e){var t=this.__data__;if(R){var r=t[e];return"__lodash_hash_undefined__"===r?void 0:r}return U.call(t,e)?t[e]:void 0},N.prototype.has=function(e){var t=this.__data__;return R?void 0!==t[e]:P.call(t,e)},N.prototype.set=function(e,t){var r=this.__data__;return this.size+=this.has(e)?0:1,r[e]=R&&void 0===t?"__lodash_hash_undefined__":t,this};var H=Array.prototype.splice;function q(e){var t=-1,r=null==e?0:e.length;for(this.clear();++t<r;){var n=e[t];this.set(n[0],n[1])}}q.prototype.clear=function(){this.__data__=[],this.size=0},q.prototype.delete=function(e){var t=this.__data__,r=F(t,e);return!(r<0)&&(r==t.length-1?t.pop():H.call(t,r,1),--this.size,!0)},q.prototype.get=function(e){var t=this.__data__,r=F(t,e);return r<0?void 0:t[r][1]},q.prototype.has=function(e){return F(this.__data__,e)>-1},q.prototype.set=function(e,t){var r=this.__data__,n=F(r,e);return n<0?(++this.size,r.push([e,t])):r[n][1]=t,this};var z=I(c,"Map");function W(e,t){var r,n,a=e.__data__;return("string"==(n=typeof(r=t))||"number"==n||"symbol"==n||"boolean"==n?"__proto__"!==r:null===r)?a["string"==typeof t?"string":"hash"]:a.map}function B(e){var t=-1,r=null==e?0:e.length;for(this.clear();++t<r;){var n=e[t];this.set(n[0],n[1])}}B.prototype.clear=function(){this.size=0,this.__data__={hash:new N,map:new(z||q),string:new N}},B.prototype.delete=function(e){var t=W(this,e).delete(e);return this.size-=t?1:0,t},B.prototype.get=function(e){return W(this,e).get(e)},B.prototype.has=function(e){return W(this,e).has(e)},B.prototype.set=function(e,t){var r=W(this,e),n=r.size;return r.set(e,t),this.size+=r.size==n?0:1,this};function K(e,t){if("function"!=typeof e||null!=t&&"function"!=typeof t)throw new TypeError("Expected a function");var r=function(){var n=arguments,a=t?t.apply(this,n):n[0],s=r.cache;if(s.has(a))return s.get(a);var i=e.apply(this,n);return r.cache=s.set(a,i)||s,i};return r.cache=new(K.Cache||B),r}K.Cache=B;var G,X,Z,J=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,V=/\\(\\)?/g,Q=(G=function(e){var t=[];return 46===e.charCodeAt(0)&&t.push(""),e.replace(J,function(e,r,n,a){t.push(n?a.replace(V,"$1"):r||e)}),t},X=K(G,function(e){return 500===Z.size&&Z.clear(),e}),Z=X.cache,X),ee=Q;var te=h?h.prototype:void 0,re=te?te.toString:void 0;function ne(e){if("string"==typeof e)return e;if(o(e))return function(e,t){for(var r=-1,n=null==e?0:e.length,a=Array(n);++r<n;)a[r]=t(e[r],r,e);return a}(e,ne)+"";if(S(e))return re?re.call(e):"";var t=e+"";return"0"==t&&1/e==-1/0?"-0":t}function ae(e){return null==e?"":ne(e)}function se(e,t){return o(e)?e:function(e,t){if(o(e))return!1;var r=typeof e;return!("number"!=r&&"symbol"!=r&&"boolean"!=r&&null!=e&&!S(e))||_.test(e)||!b.test(e)||null!=t&&e in Object(t)}(e,t)?[e]:ee(ae(e))}function ie(e){if("string"==typeof e||S(e))return e;var t=e+"";return"0"==t&&1/e==-1/0?"-0":t}function oe(e,t,r){var n=null==e?void 0:function(e,t){for(var r=0,n=(t=se(t,e)).length;null!=e&&r<n;)e=e[ie(t[r++])];return r&&r==n?e:void 0}(e,t);return void 0===n?r:n}function le(e){return"[object String]"===Object.prototype.toString.call(e)}function ue(e){return!(!le(e)||""===e)}function ce(e){return"[object Array]"===Object.prototype.toString.call(e)}function he(e){return"[object Object]"===Object.prototype.toString.call(e)}function fe(e){return e!=e}function ge(e){return!!function(e){return"[object Undefined]"===Object.prototype.toString.call(e)}(e)||(!!function(e){return"[object Null]"===Object.prototype.toString.call(e)}(e)||(!!function(e){if(he(e)){for(let t in e)return!1;return!0}return!1}(e)||(!!function(e){return!(!le(e)||""!==e)}(e)||(!!function(e){return!!ce(e)&&0===e.length}(e)||!!fe(e)))))}function de(e){return!!ce(e)&&(0!==e.length&&(1!==e.length||!ge(e[0])))}function me(e){return!0===(t=e)||!1===t||$(t)&&"[object Boolean]"==y(t);var t}var pe=/\s/;var we=/^\s+/;function ye(e){return e?e.slice(0,function(e){for(var t=e.length;t--&&pe.test(e.charAt(t)););return t}(e)+1).replace(we,""):e}var $e=/^[-+]0x[0-9a-f]+$/i,Se=/^0b[01]+$/i,be=/^0o[0-7]+$/i,_e=parseInt;function ve(e){if("number"==typeof e)return e;if(S(e))return NaN;if(v(e)){var t="function"==typeof e.valueOf?e.valueOf():e;e=v(t)?t+"":t}if("string"!=typeof e)return 0===e?e:+e;e=ye(e);var r=Se.test(e);return r||be.test(e)?_e(e.slice(2),r?2:8):$e.test(e)?NaN:+e}var De=1/0;function Me(e){return e?(e=ve(e))===De||e===-1/0?17976931348623157e292*(e<0?-1:1):e==e?e:0:0===e?e:0}function Ae(e){var t=Me(e),r=t%1;return t==t?r?t-r:t:0}function xe(e){let t=!1;if(ue(e))t=!isNaN(Number(e));else if(function(e){return"[object Number]"===Object.prototype.toString.call(e)}(e)){if(fe(e))return!1;t=!0}return t}function Te(e){if(!xe(e))return 0;return Me(e)}function Ee(e,t={}){let r=oe(t,"useLimitSafe",null);return me(r)||(r=!1),!!xe(e)&&(e=Te(e),r?Number.isSafeInteger(e):"number"==typeof(n=e)&&n==Ae(n));var n}var Oe=c.isFinite,ke=Math.min;var Le=function(e){var t=Math[e];return function(e,r){if(e=ve(e),(r=null==r?0:ke(Ae(r),292))&&Oe(e)){var n=(ae(e)+"e").split("e");return+((n=(ae(t(n[0]+"e"+(+n[1]+r)))+"e").split("e"))[0]+"e"+(+n[1]-r))}return t(e)}}("round"),Ce=Le;function je(e,t={}){let r=oe(t,"useClampSafe",null);me(r)||(r=!1);let n=oe(t,"useLimitSafe",null);me(n)||(n=!1);let a=oe(t,"returnWithStateAndMsg",null);me(a)||(a=!1);let s=e=>a?{state:"success",msg:e}:e,i=e=>{if(a)return{state:"error",msg:e};throw new Error(e)};if(!xe(e))return s(0);let o=null;try{e=Te(e),o=Ce(e),r&&(o>Number.MAX_SAFE_INTEGER?o=Number.MAX_SAFE_INTEGER:o<Number.MIN_SAFE_INTEGER&&(o=Number.MIN_SAFE_INTEGER))}catch(e){return i(e.toString())}return n&&!Number.isSafeInteger(Number(o))?i(`v[${e}] is not a safe integer`):("0"===String(o)&&(o=0),s(o))}function Ie(e,t={}){if(!Ee(e,t))return!1;return je(e)>0}function Re(e,t={}){if(!Ee(e,t))return!1;return je(e)>=0}let Ue=2147483647;function Pe(e=10){xe(e)||(e=10),e=Math.min(e,Ue);let t=function(){let e,t,r=new Promise(function(){e=arguments[0],t=arguments[1]});return r.resolve=e,r.reject=t,r}();return setTimeout(function(){t.resolve()},e),t}let Ne=["ECONNRESET","ETIMEDOUT","ENOTFOUND","ECONNREFUSED","ECONNABORTED","EAI_AGAIN","EPIPE"];function Ye(e,t){let r=oe(e,"statusCode",null);if(Ie(r))return r>=500||429===r||t.includes(r);let n=oe(e,"cause.code",null)||oe(e,"code",null);if(ue(n)&&Ne.includes(n))return!0;let a=oe(e,"name","");if("AbortError"===a||"TimeoutError"===a)return!0;let s=String(oe(e,"cause.code","")||oe(e,"message",""));return!!/UND_ERR_(SOCKET|HEADERS_TIMEOUT|BODY_TIMEOUT|CONNECT_TIMEOUT)/.test(s)}async function Fe(e,t){let r=new AbortController,n=setTimeout(()=>{r.abort()},t.timeout);try{let n={method:t.method,headers:t.headers,signal:r.signal};null!==t.body&&(n.body=t.body);let a=await fetch(e,n);if(!a.ok){let t=new Error(`HTTP ${a.status} ${a.statusText}`.trim());throw t.statusCode=a.status,t.url=e,t}if("arrayBuffer"===t.responseType)return await a.arrayBuffer();if("text"===t.responseType){if(""!==t.encoding){let e=await a.arrayBuffer();return new TextDecoder(t.encoding).decode(e)}return await a.text()}let s=await a.text();try{return JSON.parse(s)}catch(e){throw new Error(`回傳非JSON格式(可能為維護頁面或網路中介): ${s.slice(0,100)}`)}}finally{clearTimeout(n)}}async function He(e,t={}){if(!ue(e))throw new Error(`url須為有效字串, 得到: ${e}`);let r=oe(t,"method");ue(r)||(r="GET");let n=oe(t,"headers");he(n)||(n={}),ue(oe(n,"User-Agent"))||(n={"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36",...n});let a=oe(t,"body",null);ue(a)||(a=null);let s=oe(t,"responseType");"text"!==s&&"arrayBuffer"!==s&&(s="json");let i=oe(t,"encoding");ue(i)||(i="");let o=oe(t,"timeout");o=Ie(o)?je(o):3e4;let l=oe(t,"maxRetries");l=Re(l)?je(l):10;let u=oe(t,"baseDelayMs");u=Ie(u)?je(u):5e3;let c=oe(t,"maxDelayMs");c=Ie(c)?je(c):3e4;let h=oe(t,"retryStatus");de(h)||(h=[]);let f=oe(t,"label");ue(f)||(f="fetchWithRetry");let g=oe(t,"useShowLog");me(g)||(g=!0);let d={method:r,headers:n,body:a,responseType:s,encoding:i,timeout:o},m=null;for(let t=1;t<=l+1;t++)try{return await Fe(e,d)}catch(e){m=e;let r=l+1-t;if(!Ye(e,h)||r<=0)throw e;let n=Math.min(u*t,c);g&&console.warn(`[${f}][Retry ${t}/${l}] ${e.message} — 等待 ${n/1e3}s 後重試...`),await Pe(n)}throw m}function qe(e,t,r,n){let a=oe(e,r);return Ie(a)?je(a):(a=oe(t,r),Ie(a)?je(a):n)}function ze(e={},t={}){let r=oe(e,"maxRetries");Re(r)||(r=oe(t,"maxRetries")),r=Re(r)?je(r):10;let n=oe(e,"useShowLog");me(n)||(n=oe(t,"useShowLog")),me(n)||(n=!0);let a={timeout:qe(e,t,"timeout",3e4),maxRetries:r,baseDelayMs:qe(e,t,"baseDelayMs",5e3),maxDelayMs:qe(e,t,"maxDelayMs",3e4),useShowLog:n};return ue(oe(t,"responseType"))&&(a.responseType=t.responseType),ue(oe(t,"encoding"))&&(a.encoding=t.encoding),he(oe(t,"headers"))&&(a.headers=t.headers),de(oe(t,"retryStatus"))&&(a.retryStatus=t.retryStatus),ue(oe(t,"label"))&&(a.label=t.label),a}"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self&&self;function We(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}var Be={exports:{}};!function(e){e.exports=function(){var e=1e3,t=6e4,r=36e5,n="millisecond",a="second",s="minute",i="hour",o="day",l="week",u="month",c="quarter",h="year",f="date",g="Invalid Date",d=/^(\d{4})[-/]?(\d{1,2})?[-/]?(\d{0,2})[Tt\s]*(\d{1,2})?:?(\d{1,2})?:?(\d{1,2})?[.:]?(\d+)?$/,m=/\[([^\]]+)]|YYYY|YY|M{1,4}|D{1,2}|d{1,4}|H{1,2}|h{1,2}|a|A|m{1,2}|s{1,2}|Z{1,2}|SSS/g,p={name:"en",weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),ordinal:function(e){var t=["th","st","nd","rd"],r=e%100;return"["+e+(t[(r-20)%10]||t[r]||t[0])+"]"}},w=function(e,t,r){var n=String(e);return!n||n.length>=t?e:""+Array(t+1-n.length).join(r)+e},y={s:w,z:function(e){var t=-e.utcOffset(),r=Math.abs(t),n=Math.floor(r/60),a=r%60;return(t<=0?"+":"-")+w(n,2,"0")+":"+w(a,2,"0")},m:function e(t,r){if(t.date()<r.date())return-e(r,t);var n=12*(r.year()-t.year())+(r.month()-t.month()),a=t.clone().add(n,u),s=r-a<0,i=t.clone().add(n+(s?-1:1),u);return+(-(n+(r-a)/(s?a-i:i-a))||0)},a:function(e){return e<0?Math.ceil(e)||0:Math.floor(e)},p:function(e){return{M:u,y:h,w:l,d:o,D:f,h:i,m:s,s:a,ms:n,Q:c}[e]||String(e||"").toLowerCase().replace(/s$/,"")},u:function(e){return void 0===e}},$="en",S={};S[$]=p;var b="$isDayjsObject",_=function(e){return e instanceof A||!(!e||!e[b])},v=function e(t,r,n){var a;if(!t)return $;if("string"==typeof t){var s=t.toLowerCase();S[s]&&(a=s),r&&(S[s]=r,a=s);var i=t.split("-");if(!a&&i.length>1)return e(i[0])}else{var o=t.name;S[o]=t,a=o}return!n&&a&&($=a),a||!n&&$},D=function(e,t){if(_(e))return e.clone();var r="object"==typeof t?t:{};return r.date=e,r.args=arguments,new A(r)},M=y;M.l=v,M.i=_,M.w=function(e,t){return D(e,{locale:t.$L,utc:t.$u,x:t.$x,$offset:t.$offset})};var A=function(){function p(e){this.$L=v(e.locale,null,!0),this.parse(e),this.$x=this.$x||e.x||{},this[b]=!0}var w=p.prototype;return w.parse=function(e){this.$d=function(e){var t=e.date,r=e.utc;if(null===t)return new Date(NaN);if(M.u(t))return new Date;if(t instanceof Date)return new Date(t);if("string"==typeof t&&!/Z$/i.test(t)){var n=t.match(d);if(n){var a=n[2]-1||0,s=(n[7]||"0").substring(0,3);return r?new Date(Date.UTC(n[1],a,n[3]||1,n[4]||0,n[5]||0,n[6]||0,s)):new Date(n[1],a,n[3]||1,n[4]||0,n[5]||0,n[6]||0,s)}}return new Date(t)}(e),this.init()},w.init=function(){var e=this.$d;this.$y=e.getFullYear(),this.$M=e.getMonth(),this.$D=e.getDate(),this.$W=e.getDay(),this.$H=e.getHours(),this.$m=e.getMinutes(),this.$s=e.getSeconds(),this.$ms=e.getMilliseconds()},w.$utils=function(){return M},w.isValid=function(){return!(this.$d.toString()===g)},w.isSame=function(e,t){var r=D(e);return this.startOf(t)<=r&&r<=this.endOf(t)},w.isAfter=function(e,t){return D(e)<this.startOf(t)},w.isBefore=function(e,t){return this.endOf(t)<D(e)},w.$g=function(e,t,r){return M.u(e)?this[t]:this.set(r,e)},w.unix=function(){return Math.floor(this.valueOf()/1e3)},w.valueOf=function(){return this.$d.getTime()},w.startOf=function(e,t){var r=this,n=!!M.u(t)||t,c=M.p(e),g=function(e,t){var a=M.w(r.$u?Date.UTC(r.$y,t,e):new Date(r.$y,t,e),r);return n?a:a.endOf(o)},d=function(e,t){return M.w(r.toDate()[e].apply(r.toDate("s"),(n?[0,0,0,0]:[23,59,59,999]).slice(t)),r)},m=this.$W,p=this.$M,w=this.$D,y="set"+(this.$u?"UTC":"");switch(c){case h:return n?g(1,0):g(31,11);case u:return n?g(1,p):g(0,p+1);case l:var $=this.$locale().weekStart||0,S=(m<$?m+7:m)-$;return g(n?w-S:w+(6-S),p);case o:case f:return d(y+"Hours",0);case i:return d(y+"Minutes",1);case s:return d(y+"Seconds",2);case a:return d(y+"Milliseconds",3);default:return this.clone()}},w.endOf=function(e){return this.startOf(e,!1)},w.$set=function(e,t){var r,l=M.p(e),c="set"+(this.$u?"UTC":""),g=(r={},r[o]=c+"Date",r[f]=c+"Date",r[u]=c+"Month",r[h]=c+"FullYear",r[i]=c+"Hours",r[s]=c+"Minutes",r[a]=c+"Seconds",r[n]=c+"Milliseconds",r)[l],d=l===o?this.$D+(t-this.$W):t;if(l===u||l===h){var m=this.clone().set(f,1);m.$d[g](d),m.init(),this.$d=m.set(f,Math.min(this.$D,m.daysInMonth())).$d}else g&&this.$d[g](d);return this.init(),this},w.set=function(e,t){return this.clone().$set(e,t)},w.get=function(e){return this[M.p(e)]()},w.add=function(n,c){var f,g=this;n=Number(n);var d=M.p(c),m=function(e){var t=D(g);return M.w(t.date(t.date()+Math.round(e*n)),g)};if(d===u)return this.set(u,this.$M+n);if(d===h)return this.set(h,this.$y+n);if(d===o)return m(1);if(d===l)return m(7);var p=(f={},f[s]=t,f[i]=r,f[a]=e,f)[d]||1,w=this.$d.getTime()+n*p;return M.w(w,this)},w.subtract=function(e,t){return this.add(-1*e,t)},w.format=function(e){var t=this,r=this.$locale();if(!this.isValid())return r.invalidDate||g;var n=e||"YYYY-MM-DDTHH:mm:ssZ",a=M.z(this),s=this.$H,i=this.$m,o=this.$M,l=r.weekdays,u=r.months,c=r.meridiem,h=function(e,r,a,s){return e&&(e[r]||e(t,n))||a[r].slice(0,s)},f=function(e){return M.s(s%12||12,e,"0")},d=c||function(e,t,r){var n=e<12?"AM":"PM";return r?n.toLowerCase():n};return n.replace(m,function(e,n){return n||function(e){switch(e){case"YY":return String(t.$y).slice(-2);case"YYYY":return M.s(t.$y,4,"0");case"M":return o+1;case"MM":return M.s(o+1,2,"0");case"MMM":return h(r.monthsShort,o,u,3);case"MMMM":return h(u,o);case"D":return t.$D;case"DD":return M.s(t.$D,2,"0");case"d":return String(t.$W);case"dd":return h(r.weekdaysMin,t.$W,l,2);case"ddd":return h(r.weekdaysShort,t.$W,l,3);case"dddd":return l[t.$W];case"H":return String(s);case"HH":return M.s(s,2,"0");case"h":return f(1);case"hh":return f(2);case"a":return d(s,i,!0);case"A":return d(s,i,!1);case"m":return String(i);case"mm":return M.s(i,2,"0");case"s":return String(t.$s);case"ss":return M.s(t.$s,2,"0");case"SSS":return M.s(t.$ms,3,"0");case"Z":return a}return null}(e)||a.replace(":","")})},w.utcOffset=function(){return 15*-Math.round(this.$d.getTimezoneOffset()/15)},w.diff=function(n,f,g){var d,m=this,p=M.p(f),w=D(n),y=(w.utcOffset()-this.utcOffset())*t,$=this-w,S=function(){return M.m(m,w)};switch(p){case h:d=S()/12;break;case u:d=S();break;case c:d=S()/3;break;case l:d=($-y)/6048e5;break;case o:d=($-y)/864e5;break;case i:d=$/r;break;case s:d=$/t;break;case a:d=$/e;break;default:d=$}return g?d:M.a(d)},w.daysInMonth=function(){return this.endOf(u).$D},w.$locale=function(){return S[this.$L]},w.locale=function(e,t){if(!e)return this.$L;var r=this.clone(),n=v(e,t,!0);return n&&(r.$L=n),r},w.clone=function(){return M.w(this.$d,this)},w.toDate=function(){return new Date(this.valueOf())},w.toJSON=function(){return this.isValid()?this.toISOString():null},w.toISOString=function(){return this.$d.toISOString()},w.toString=function(){return this.$d.toUTCString()},p}(),x=A.prototype;return D.prototype=x,[["$ms",n],["$s",a],["$m",s],["$H",i],["$W",o],["$M",u],["$y",h],["$D",f]].forEach(function(e){x[e[1]]=function(t){return this.$g(t,e[0],e[1])}}),D.extend=function(e,t){return e.$i||(e(t,A,D),e.$i=!0),D},D.locale=v,D.isDayjs=_,D.unix=function(e){return D(1e3*e)},D.en=S[$],D.Ls=S,D.p={},D}()}(Be);var Ke=We(Be.exports),Ge={exports:{}};!function(e){var t,r,n;e.exports=(t="minute",r=/[+-]\d\d(?::?\d\d)?/g,n=/([+-]|\d\d)/g,function(e,a,s){var i=a.prototype;s.utc=function(e){return new a({date:e,utc:!0,args:arguments})},i.utc=function(e){var r=s(this.toDate(),{locale:this.$L,utc:!0});return e?r.add(this.utcOffset(),t):r},i.local=function(){return s(this.toDate(),{locale:this.$L,utc:!1})};var o=i.parse;i.parse=function(e){e.utc&&(this.$u=!0),this.$utils().u(e.$offset)||(this.$offset=e.$offset),o.call(this,e)};var l=i.init;i.init=function(){if(this.$u){var e=this.$d;this.$y=e.getUTCFullYear(),this.$M=e.getUTCMonth(),this.$D=e.getUTCDate(),this.$W=e.getUTCDay(),this.$H=e.getUTCHours(),this.$m=e.getUTCMinutes(),this.$s=e.getUTCSeconds(),this.$ms=e.getUTCMilliseconds()}else l.call(this)};var u=i.utcOffset;i.utcOffset=function(e,a){var s=this.$utils().u;if(s(e))return this.$u?0:s(this.$offset)?u.call(this):this.$offset;if("string"==typeof e&&(e=function(e){void 0===e&&(e="");var t=e.match(r);if(!t)return null;var a=(""+t[0]).match(n)||["-",0,0],s=a[0],i=60*+a[1]+ +a[2];return 0===i?0:"+"===s?i:-i}(e),null===e))return this;var i=Math.abs(e)<=16?60*e:e;if(0===i)return this.utc(a);var o=this.clone();if(a)return o.$offset=i,o.$u=!1,o;var l=this.$u?this.toDate().getTimezoneOffset():-1*this.utcOffset();return(o=this.local().add(i+l,t)).$offset=i,o.$x.$localOffset=l,o};var c=i.format;i.format=function(e){var t=e||(this.$u?"YYYY-MM-DDTHH:mm:ss[Z]":"");return c.call(this,t)},i.valueOf=function(){var e=this.$utils().u(this.$offset)?0:this.$offset+(this.$x.$localOffset||this.$d.getTimezoneOffset());return this.$d.valueOf()-6e4*e},i.isUTC=function(){return!!this.$u},i.toISOString=function(){return this.toDate().toISOString()},i.toString=function(){return this.toDate().toUTCString()};var h=i.toDate;i.toDate=function(e){return"s"===e&&this.$offset?s(this.format("YYYY-MM-DD HH:mm:ss:SSS")).toDate():h.call(this)};var f=i.diff;i.diff=function(e,t,r){if(e&&this.$u===e.$u)return f.call(this,e,t,r);var n=this.local(),a=s(e).local();return f.call(n,a,t,r)}})}(Ge);var Xe=We(Ge.exports);Ke.extend(Xe);let Ze=/^[^T:]*$/;function Je(e){let t=null,r=!1;if("number"==typeof e){if(0===e)return"";t=Ke.unix(e)}else if(e instanceof Date)t=Ke(e);else{if(!ue(e))return"";t=Ke(e),r=Ze.test(e)}return t.isValid()?t.utcOffset(8,r).format("YYYY-MM-DD HH:mm:ss"):""}let Ve={timeout:3e4,maxRetries:5,baseDelayMs:3e3,maxDelayMs:15e3,label:"fetch-ai-news-aggregator"};let Qe={nbsp:" ",amp:"&",lt:"<",gt:">",quot:'"',apos:"'",hellip:"…",mdash:"—",ndash:"–",middot:"·",ldquo:'"',rdquo:'"',lsquo:"‘",rsquo:"’",laquo:"«",raquo:"»",copy:"©",reg:"®"};function et(e){return le(e)?e.replace(/&([a-zA-Z]+);/g,(e,t)=>void 0!==Qe[t]?Qe[t]:e).replace(/&#(\d+);/g,(e,t)=>String.fromCodePoint(Number(t))).replace(/&#x([\da-fA-F]+);/g,(e,t)=>String.fromCodePoint(parseInt(t,16))):""}function tt(e,t={}){if(!le(e))return"";let r=oe(t,"image");me(r)||(r=!1);let n=e;return n=n.replace(/<script[\s\S]*?<\/script>/gi,""),n=n.replace(/<style[\s\S]*?<\/style>/gi,""),n=n.replace(/<!--[\s\S]*?-->/g,""),r&&(n=n.replace(/<img[^>]*src="([^"]+)"[^>]*\/?>/gi,(e,t)=>`![](${t})`)),n=n.replace(/<h[1-6][^>]*>([\s\S]*?)<\/h[1-6]>/gi,"\n\n**$1**\n\n"),n=n.replace(/<\/?(?:strong|b)(?:\s[^>]*)?>/gi,"**"),n=n.replace(/<\/?(?:em|i)(?:\s[^>]*)?>/gi,"*"),n=n.replace(/<br\s*\/?>/gi,"\n"),n=n.replace(/<a\s+[^>]*href="([^"]+)"[^>]*>([\s\S]*?)<\/a>/gi,(e,t,r)=>{let n=r.replace(/<[^>]+>/g,"").trim();return n?`[${n}](${t})`:""}),n=n.replace(/<p(?:\s[^>]*)?>/gi,""),n=n.replace(/<\/p>/gi,"\n\n"),n=n.replace(/<\/?(?:div|span|section|article|font|u)(?:\s[^>]*)?>/gi,""),n=n.replace(/<[^>]+>/g,""),n=et(n),n=n.split("\n").map(e=>e.replace(/[ \t\u00A0]+/g," ").trimEnd()).join("\n"),n=n.replace(/\n{3,}/g,"\n\n").replace(/\*\*\s*\*\*/g,""),n.trim()}function rt(e,t){if(!le(e))return null;if(!ue(t))return null;let r=`<div class="${t}"`,n=e.indexOf(r);if(-1===n)return null;let a=e.indexOf(">",n);if(-1===a)return null;let s=a+1,i=s,o=1;for(;o>0&&i<e.length;){let t=e.indexOf("<div",i),r=e.indexOf("</div>",i);if(-1===r)return null;if(-1!==t&&t<r)o++,i=t+4;else{if(o--,0===o)return e.slice(s,r);i=r+6}}return null}function nt(e){return le(e)||(e=String(null==e?"":e)),e.replace(/[\\/:*?"<>|]/g,"_").slice(0,200)}let at="https://www.aisixiang.com",st="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0 Safari/537.36",it={responseType:"text",headers:{"User-Agent":st,"Accept-Language":"zh-CN,zh;q=0.9"},timeout:3e4,maxRetries:5,baseDelayMs:5e3,maxDelayMs:3e4,label:"fetch-aisixiang"};function ot(e={}){let t=oe(e,"baseUrl");ue(t)||(t=at),t=t.replace(/\/+$/,"");let r=ze(e,it),n=oe(e,"pageDelayMs");n=Re(n)?je(n):1e3;let a=oe(e,"maxPages");return a=Ie(a)?Math.min(je(a),50):50,{baseUrl:t,useShowLog:r.useShowLog,pageDelayMs:n,maxPages:a,optFetch:r}}function lt(e,t){let r=rt(e,"search_list");if(null===r)return[];let n,a=[],s=new Set,i=/href="\/data\/(\d+)\.html"[^>]*title="([^"]+)"/g;for(;null!==(n=i.exec(r));){if(s.has(n[1]))continue;s.add(n[1]);let e=n[2],r=e.indexOf(":");a.push({aid:n[1],url:`${t}/data/${n[1]}.html`,title:r>0?e.slice(r+1).trim():e.trim(),author:r>0?e.slice(0,r).trim():""})}return a}function ut(e,t){let r,n=e.match(/([\s\S]+?)<div class="list_page">/),a=n?n[1]:e,s=[],i=new Set,o=/<a\s+href="\/data\/(\d+)\.html"[^>]*>([^<]+)<\/a>/g;for(;null!==(r=o.exec(a));){if(i.has(r[1]))continue;i.add(r[1]);let e=r[2].trim(),n=e.indexOf(":");s.push({aid:r[1],url:`${t}/data/${r[1]}.html`,title:n>0?e.slice(n+1).trim():e,author:n>0?e.slice(0,n).trim():""})}return s}function ct(e){let t=e.match(/<div class="list_page">([\s\S]+?)<\/div>/);if(!t)return 1;let r=[...t[1].matchAll(/page=(\d+)/g)].map(e=>Number(e[1]));return r.length?Math.max(...r):1}async function ht(e,t,r){let n=[],a=new Set,s=1,i=0;for(let o=1;o<=r.maxPages;o++){let l=e(o);r.useShowLog&&process.stderr.write(`[info] fetching page ${o}${s>1?`/${s}`:""} ...\n`);let u=await He(l,r.optFetch);i++,1===o&&(s=ct(u));let c=t(u,r.baseUrl).filter(e=>!a.has(e.aid));if(0===c.length){r.useShowLog&&process.stderr.write(`[info] page ${o} 無新項目,停止翻頁\n`);break}for(let e of c)a.add(e.aid);if(n.push(...c),o>=s)break;await Pe(r.pageDelayMs)}return{items:n,total_pages:s,pages_fetched:i}}async function ft(e={}){let t=ot(e),r=[...(await He(`${t.baseUrl}/thinktank/`,t.optFetch)).matchAll(/href="\/thinktank\/([^"]+?)\.html"[^>]*>([^<]+)</g)],n=new Map;for(let[,e,t]of r){let r=e.toLowerCase();if(n.has(r))continue;let a=t.split(/[,、]/)[0].trim();!a||a.length>30||n.set(r,{slug:e,name:a})}return[...n.values()]}function gt(e,t){return Array.isArray(e)&&e.find(e=>e.name===t)||null}async function dt(e={}){let t=ot(e),r=await He(`${t.baseUrl}/zhuanti/`,t.optFetch),n=[{name:"学科",start:r.indexOf("<h3>学科关键词</h3>")},{name:"事件",start:r.indexOf("<h3>事件关键词</h3>")},{name:"人物",start:r.indexOf("<h3>人物关键词</h3>")}].filter(e=>e.start>=0).sort((e,t)=>e.start-t.start);n.push({name:null,start:r.length});let a=new Set,s=[];for(let e=0;e<n.length-1;e++){let t,i=r.slice(n[e].start,n[e+1].start),o=/href="\/zhuanti\/(\d+)\.html"[^>]*>([^<]+)</g;for(;null!==(t=o.exec(i));){if(a.has(t[1]))continue;a.add(t[1]);let r=t[2].trim().replace(/^\[|\]$/g,"").trim();!r||r.length>50||s.push({id:t[1],name:r,category:n[e].name})}}return s}function mt(e,t){return Array.isArray(e)&&e.find(e=>e.name===t)||null}let pt={BASE_URL:at,USER_AGENT:st,MAX_PAGES:50,safeFilename:nt,fetchAuthorsList:ft,lookupAuthor:gt,fetchTopicsList:dt,lookupTopic:mt,fetchAuthorArticles:async function(e={}){let t=ot(e),r=oe(e,"name");ue(r)||(r="");let n=oe(e,"slug");if(ue(n)||(n=""),!r&&!n)throw new Error("需要 name 或 slug");let a=null,s=r,i=n;if(i)a={slug:i,url:`${t.baseUrl}/thinktank/${i}.html`};else{t.useShowLog&&process.stderr.write("[info] fetching authors list from /thinktank/ ...\n");let n=await ft(e),o=gt(n,r);if(!o)return{status:"success",site:"aisixiang",mode:"author",query:r,fetched_at:(new Date).toISOString(),authors_count:n.length,count:0,items:[],message:`"${r}" 不在愛思想專欄作者清單中(共 ${n.length} 位)。尚無此作者文章(此為查詢成功的真實結果、0 筆,非抓取失敗)。提醒:本函數不轉簡繁,呼叫端負責用站方登錄字形(通常是簡體)。`};i=o.slug,s=s||o.name,a={slug:i,url:`${t.baseUrl}/thinktank/${i}.html`,name:o.name}}let o=function(e,t){let r=["论文","时评","随笔","著作","演讲","读书","访谈","未分类"],n=[];for(let t of r){let r,a=new RegExp(`<h3>${t}<\\/h3>`,"g");for(;null!==(r=a.exec(e));)n.push({cat:t,pos:r.index})}n.sort((e,t)=>e.pos-t.pos),n.push({cat:null,pos:e.length});let a=[];for(let r=0;r<n.length-1;r++){let s,{cat:i,pos:o}=n[r],l=e.slice(o,n[r+1].pos),u=/<a\s+href="\/data\/(\d+)\.html"[^>]*>([\s\S]*?)<\/a>/g;for(;null!==(s=u.exec(l));){let e=s[2].replace(/<[^>]+>/g,"").trim();e&&a.push({aid:s[1],url:`${t}/data/${s[1]}.html`,title:e,category:i})}}return a}(await He(a.url,t.optFetch),t.baseUrl),l={status:"success",site:"aisixiang",mode:"author",query:s||i,resolved:a,fetched_at:(new Date).toISOString(),count:o.length,items:o};return 0===o.length&&(l.message=`已命中愛思想作者欄頁(${a.url})但該欄頁目前 0 篇文章。此為查詢成功的真實結果(非抓取失敗);若 slug 為手動指定,請確認 slug 是否正確。`),l},fetchKeywordArticles:async function(e,t={}){if(!ue(e))throw new Error("需要 keyword");let r=ot(t),n=t=>`${r.baseUrl}/data/search?searchfield=keywords&keywords=${encodeURIComponent(e)}&page=${t}`,{items:a,total_pages:s,pages_fetched:i}=await ht(n,lt,r);return 0===a.length?{status:"success",site:"aisixiang",mode:"keyword",query:e,resolved:{search_url:n(1)},fetched_at:(new Date).toISOString(),count:0,items:[],message:`關鍵字 "${e}" 在愛思想無相關文章。提醒:站方搜尋只認簡體,呼叫端負責簡體化;若已是簡體仍 0 筆,該主題可能無 tag 索引。`}:{status:"success",site:"aisixiang",mode:"keyword",query:e,resolved:{search_url:n(1),total_pages:s,pages_fetched:i},fetched_at:(new Date).toISOString(),count:a.length,items:a}},fetchTitleArticles:async function(e,t={}){if(!ue(e))throw new Error("需要 keyword");let r=ot(t),n=t=>`${r.baseUrl}/data/search?searchfield=title&keywords=${encodeURIComponent(e)}&page=${t}`,{items:a,total_pages:s,pages_fetched:i}=await ht(n,lt,r);return 0===a.length?{status:"success",site:"aisixiang",mode:"title",query:e,resolved:{search_url:n(1)},fetched_at:(new Date).toISOString(),count:0,items:[],message:`標題關鍵字 "${e}" 在愛思想無相關文章。提醒:站方搜尋只認簡體,呼叫端負責簡體化。`}:{status:"success",site:"aisixiang",mode:"title",query:e,resolved:{search_url:n(1),total_pages:s,pages_fetched:i},fetched_at:(new Date).toISOString(),count:a.length,items:a}},fetchTopicArticles:async function(e={}){let t=ot(e),r=oe(e,"keyword");ue(r)||(r="");let n=oe(e,"id");if(ue(n)||(n=""),!r&&!n)throw new Error("需要 keyword 或 id");let a=n,s=r,i=null;if(a)i={id:a,url:`${t.baseUrl}/zhuanti/${a}.html`};else{t.useShowLog&&process.stderr.write("[info] fetching topics list from /zhuanti/ ...\n");let n=await dt(e),o=mt(n,r);if(!o)return{status:"success",site:"aisixiang",mode:"topic",query:r,fetched_at:(new Date).toISOString(),topics_count:n.length,count:0,items:[],message:`"${r}" 不在愛思想策展主題清單中(共 ${n.length} 個主題)。建議改用 fetchKeywordArticles('${r}') 查 keyword tag 結果。本函數不自動轉向,請呼叫端決定是否重試。`};a=o.id,s=o.name,i={id:a,name:o.name,category:o.category,url:`${t.baseUrl}/zhuanti/${a}.html`}}let{items:o,total_pages:l,pages_fetched:u}=await ht(e=>`${t.baseUrl}/zhuanti/${a}.html?page=${e}`,ut,t),c={status:"success",site:"aisixiang",mode:"topic",query:s||a,resolved:{...i,total_pages:l,pages_fetched:u},fetched_at:(new Date).toISOString(),count:o.length,items:o};return 0===o.length&&(c.message=`已命中愛思想策展主題(${i.url})但該主題頁目前 0 篇文章。此為查詢成功的真實結果(非抓取失敗);若需更多結果可改用 fetchKeywordArticles 查 keyword tag。`),c},fetchArticle:async function(e={}){let t=ot(e),r=oe(e,"aid");ue(r)||(r="");let n=oe(e,"url");ue(n)||(n="");let a=r?`${t.baseUrl}/data/${r}.html`:n;if(!a)throw new Error("需要 aid 或 url");let s=await He(a,t.optFetch),i=function(e){let t=e.match(/<title>([\s\S]*?)<\/title>/i);return t?et(t[1].trim()):null}(s),o=rt(s,"article-content");if(!i||!o)throw new Error(`解析失敗:title=${!!i}, content=${!!o}`);let l=tt(o),u=i.replace(/[_\-\s]*(?:_)?(?:爱思想|愛思想)\s*$/u,"").trim(),c=`---\ntitle: "${u}"\nsource: "${a}"\nauthor:\npublished:\ncreated: ${(new Date).toISOString().slice(0,10)}\ndescription:\n---\n${l}\n`;return{status:"success",site:"aisixiang",mode:"fetch",url:a,title:u,chars:l.length,markdown:c}}},wt={timeout:3e4,maxRetries:10,baseDelayMs:5e3,maxDelayMs:3e4,retryStatus:[403],label:"fetch-cnyes"};function yt(e,t,r){return ue(e)?function(e){if(!ue(e))return!1;try{let t=new URL(e);return"http:"===t.protocol||"https:"===t.protocol}catch{return!1}}(e)?null:{status:"error",url:e,message:"invalid url (must be http/https)",reason:"invalid-url",method:t,fetchedAt:r,attempts:0}:{status:"error",url:String(e),message:"url is required (string)",reason:"invalid-url",method:t,fetchedAt:r,attempts:0}}function $t(e){return Ie(e)?Math.min(3e3*e,15e3):3e3}function St(e,t,r,n,a){let s=e?.[t];return n(s)?a?a(s):s:r}let bt={useLimitSafe:!0};function _t(e){return je(e)<=2147483647}function vt(e,t,r){return St(e,t,r,ue,null)}function Dt(e){let t=function(e){return{userAgent:vt(e,"userAgent",""),referer:vt(e,"referer",""),acceptLanguage:vt(e,"acceptLanguage","")}}(e);return{userAgent:t.userAgent||"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36",referer:t.referer||"https://www.google.com/",acceptLanguage:t.acceptLanguage||"en-US,en;q=0.9,zh-TW;q=0.8"}}let Mt="curl";function At(e){return e>=500||429===e}let xt=t.promisify(e.execFile);async function Tt(e,t={}){let r=(new Date).toISOString(),n=yt(e,Mt,r);if(n)return n;let a=function(e,t,r){return St(e,t,r,e=>Ie(e,bt)&&_t(e),je)}(t,"timeoutMs",15e3),s=function(e,t,r){return St(e,t,r,e=>Re(e,bt)&&_t(e),je)}(t,"maxRetries",5),{userAgent:i,referer:o,acceptLanguage:l}=Dt(t),u=0,c=await async function(e,t){let r=t.maxRetries,n=t.tag,a=!1!==t.useShowLog,s=null;for(let t=1;t<=r+1;t++){if(s=await e(t),s.ok)return{...s,attempts:t};if(!1===s.retryable||t>r)return{...s,attempts:t};let i=$t(t);if(a){let e=s.logDetail||"error: "+(s.message||"unknown");process.stderr.write(`[${n}] ${e},等 ${i}ms 後重試 (${t}/${r})\n`)}await Pe(i)}return{...s,attempts:r+1}}(async()=>{try{let{stdout:t}=await xt("curl",["-s","-L","--compressed","--max-time",String(Math.ceil(a/1e3)),"--write-out","\n%{http_code}\n%{url_effective}","-H","User-Agent: "+i,"-H","Accept: text/html,application/xhtml+xml","-H","Accept-Language: "+l,"-H","Referer: "+o,e],{encoding:"utf8",timeout:a+5e3,maxBuffer:10485760,windowsHide:!0}),r=t.trimEnd().split("\n"),n=r.pop(),s=parseInt(r.pop(),10)||0,c=r.join("\n");u=s;let h=function(e){return!e||e<400?null:{reason:"http-error",message:"HTTP "+e,httpCode:e,retryable:At(e)}}(s);if(h){let t={ok:!1,retryable:h.retryable,reason:h.reason,message:h.message,httpCode:s};return h.retryable&&(t.logDetail=h.message+" "+e),t}return!c||c.length<100?{ok:!1,retryable:!1,reason:"empty-response",message:`response too short (${c?c.length:0} chars)`,httpCode:s}:{ok:!0,html:c,httpCode:s,finalUrl:n}}catch(e){let t=e.message||String(e);return{ok:!1,reason:"curl-error",message:t,httpCode:u||void 0,logDetail:"curl error: "+t}}},{maxRetries:s,tag:"fetchWebByCurl"});return c.ok?{status:"success",url:e,html:c.html,htmlLength:c.html.length,contentKind:"raw",httpCode:c.httpCode,finalUrl:c.finalUrl,method:Mt,fetchedAt:r,attempts:c.attempts}:{status:"error",url:e,message:c.message,reason:c.reason,httpCode:c.httpCode,method:Mt,fetchedAt:r,attempts:c.attempts}}let Et="https://www.guancha.cn",Ot="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36",kt=[{slug:"CaiJing",name:"财经"},{slug:"economy",name:"财经-大頻道"},{slug:"JunShi",name:"军事"},{slug:"military-affairs",name:"军事-大頻道"},{slug:"ZhengZhi",name:"政治"},{slug:"WenHua",name:"文化"},{slug:"chanjing",name:"产经"},{slug:"qiche",name:"观出行"},{slug:"gongye-keji",name:"科技"},{slug:"ChengShi",name:"城事"},{slug:"GuanJinRong",name:"观金融"},{slug:"XinShiDai",name:"新时代"},{slug:"ChaoJiGongCheng",name:"超级工程"},{slug:"NengYuanZhanLue",name:"能源战略"},{slug:"RenGongZhiNeng",name:"人工智能"},{slug:"XinZhiGuanChaSuoNews",name:"心智观察所"},{slug:"YiLangJuShi",name:"伊朗局势"},{slug:"MeiGuoMeng",name:"美国一梦"},{slug:"MeiGuoJingJi",name:"美国经济"},{slug:"ELuoSiZhiSheng",name:"俄罗斯之声"},{slug:"lianganyuanzhuopai",name:"两岸圆桌派"},{slug:"ZheJiuShiZhongGuo",name:"这就是中国"},{slug:"YiZhouJunQingGuanCha",name:"一周军事观察"},{slug:"feizhoushangkou",name:"非洲之窗"},{slug:"toutiao",name:"观察者头条"},{slug:"gushi",name:"股市"},{slug:"guanwangwenyu",name:"新潮观鱼"},{slug:"jingtiriben",name:"冲破战后秩序 日本想干什么"},{slug:"DaoGuoDianAVI",name:"日本"}];function Lt(e={}){let t=oe(e,"baseUrl");ue(t)||(t=Et),t=t.replace(/\/+$/,"");let r=oe(e,"maxRetries");r=Re(r)?je(r):5;let n=oe(e,"timeout");n=Ie(n)?je(n):null;let a=oe(e,"useShowLog");me(a)||(a=!0);let s={userAgent:Ot,referer:t,maxRetries:r};null!==n&&(s.timeoutMs=n);let i=oe(e,"pageDelayMs");i=Re(i)?je(i):1e3;let o=oe(e,"maxPages");return o=Ie(o)?Math.min(je(o),50):50,{baseUrl:t,useShowLog:a,pageDelayMs:i,maxPages:o,optFetch:s}}async function Ct(e,t){let r=await Tt(e,t.optFetch);if("success"!==r.status){let t=new Error(r.message||"fetch failed");throw t.reason=r.reason,t.url=e,t.httpCode=r.httpCode,t}return r.html}function jt(e){let t=e.match(/<dt>[A-Z]<\/dt>/g);return!!t&&t.length>=5}function It(e,t){let r,n=e.replace(/\n/g," "),a=[],s=new Set,i=/<a[^>]+href="\/([A-Za-z][a-zA-Z0-9_-]+)\/(\d{4}_\d{2}_\d{2}_\d+)\.shtml"(?:[^>]*title="([^"]+)")?[^>]*>([^<]*)<\/a>/g;for(;null!==(r=i.exec(n));){let e=r[1],n=r[2],i=r[3]&&et(r[3]).trim(),o=r[4]&&et(r[4]).replace(/<[^>]+>/g,"").trim(),l=i||o||"",u=`${e}/${n}`;!s.has(u)&&l&&(s.add(u),a.push({url:`${t}/${e}/${n}.shtml`,title:l,slug:e}))}return a}async function Rt(e,t){let r=[],n=new Set,a=0;for(let s=1;s<=t.maxPages;s++){let i=`${t.baseUrl}/${e}/list_${s}.shtml`;t.useShowLog&&process.stderr.write(`[info] fetching ${e} list_${s} ...\n`);let o=null;try{o=await Ct(i,t)}catch(e){if(1===s)throw e;t.useShowLog&&process.stderr.write(`[info] page ${s} fetch error (assumed end of list): ${e.message}\n`);break}if(jt(o)){if(1===s){let t=new Error(`slug "${e}" 不存在:請求 list 頁被觀察者網 302 導向首頁。`);throw t.reason="redirected-to-homepage",t}t.useShowLog&&process.stderr.write(`[info] page ${s} 被導向首頁,視為到底,停止翻頁\n`);break}a++;let l=It(o,t.baseUrl).filter(e=>!n.has(e.url));if(0===l.length){t.useShowLog&&process.stderr.write(`[info] page ${s} 無新項目,停止翻頁\n`);break}for(let e of l)n.add(e.url);r.push(...l),s<t.maxPages&&await Pe(t.pageDelayMs)}return{items:r,pages_fetched:a}}async function Ut(e={}){let t=Lt(e);return function(e){let t=e.replace(/\n/g," "),r=[],n=new Set,a=[...t.matchAll(/<dt>([A-Z])<\/dt>\s*<dd[^>]*>([\s\S]*?)<\/dd>/g)];for(let[,e,t]of a){let a,s=/<a[^>]+href="(?:\.\.\/|\/)?([A-Za-z][a-zA-Z0-9_-]+)\/list_1\.shtml"[^>]*>([^<]+)<\/a>/g;for(;null!==(a=s.exec(t));){let t=a[1],s=et(a[2]).trim();s&&!n.has(t)&&(n.add(t),r.push({slug:t,name:s,letter:e}))}}return r}(await Ct(`${t.baseUrl}/`,t))}function Pt(e,t){return Array.isArray(e)&&t&&e.find(e=>e.name===t)||null}function Nt(e){return e&&kt.find(t=>t.name===e)||null}let Yt={timeout:3e4,maxRetries:5,baseDelayMs:3e3,maxDelayMs:15e3,label:"fetch-hacker-news"};let Ft={responseType:"text",timeout:3e4,maxRetries:10,baseDelayMs:5e3,maxDelayMs:3e4,retryStatus:[403],label:"fetch-moneydj"},Ht=/^(\d{2}\/\d{2}\s+\d{2}:\d{2}|\d{2}:\d{2}|昨\s*\d{2}:\d{2})$/;let qt=5e3,zt=3e4,Wt=[{name:"上市",marketKind:"sii"},{name:"上櫃",marketKind:"otc"},{name:"興櫃",marketKind:"rotc"},{name:"公開發行",marketKind:"pub"}];async function Bt(e,t,r){let n=null;for(let a=1;a<=r.maxRetries+1;a++){if(n=await e.evaluate(async e=>{try{let t=await fetch(e.url,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(e.payload)});if(t.status>=500||403===t.status||429===t.status)return{error:`HTTP ${t.status}`,retryable:!0};let r=await t.text();try{let e=JSON.parse(r),t=e&&e.code;return 200!==t&&406!==t?{error:`MOPS code ${t}: ${e&&e.message||""}`,json:e,raw:r.substring(0,500),retryable:!1}:{json:e,raw:r.substring(0,500)}}catch(e){return{error:"Parse Error",raw:r,retryable:!1}}}catch(e){return{error:e.toString(),retryable:!0}}},t),!n.error)return n;let s=!1!==n.retryable,i=r.maxRetries+1-a;if(!s||i<=0)return n;let o=Math.min(r.baseDelayMs*a,r.maxDelayMs);r.useShowLog&&console.warn(`[${t.name}][Retry ${a}/${r.maxRetries}] ${n.error} — 等待 ${o/1e3}s 後重試...`),await Pe(o)}return n}let Kt={responseType:"text",timeout:3e4,maxRetries:5,baseDelayMs:3e3,maxDelayMs:15e3,retryStatus:[404],label:"fetch-rss"};async function Gt(e,t){let r=await Tt(e,{timeoutMs:t.timeout,maxRetries:t.maxRetries});if("success"!==r.status){let t=new Error(r.message||"curl fetch failed");throw t.statusCode=r.httpCode,t.reason=r.reason,t.url=e,t}return r.html}let Xt={responseType:"text",timeout:3e4,maxRetries:10,baseDelayMs:5e3,maxDelayMs:3e4,retryStatus:[403],label:"fetch-statementdog"},Zt=".statementdog-news-list-item";function Jt(e){if(!ue(e))return!1;if(!/^\d{8}$/.test(e))return!1;let t=je(e.slice(0,4)),r=je(e.slice(4,6)),n=je(e.slice(6,8)),a=new Date(t,r-1,n);return a.getFullYear()===t&&a.getMonth()===r-1&&a.getDate()===n}let Vt={responseType:"text",encoding:"big5",timeout:15e3,maxRetries:10,baseDelayMs:5e3,maxDelayMs:3e4,label:"fetch-taifex"},Qt={"外資及陸資":"foreign","外資":"foreign","投信":"trust","自營商":"dealers"};function er(e){let t=[],r="",n=!1;for(let a=0;a<e.length;a++){let s=e[a];n?'"'===s?'"'===e[a+1]?(r+='"',a++):n=!1:r+=s:","===s?(t.push(r.trim()),r=""):'"'===s&&0===r.length?n=!0:r+=s}return t.push(r.trim()),t}function tr(e){let t=e.trim().split("\n").map(e=>e.trim()).filter(e=>e.length>0);if(t.length<2)return[];let r=er(t[0]),n=[];for(let e=1;e<t.length;e++){let a=er(t[e]),s={};for(let e=0;e<r.length;e++)s[r[e]]=a[e]||"";n.push(s)}return n}function rr(e){if(!e||"-"===e||""===e)return null;let t=Number(e.replace(/,/g,""));return isNaN(t)?null:t}function nr(e){if(!ue(e))return"";return`${parseInt(e.substring(0,4),10)-1911}/${e.substring(4,6)}/${e.substring(6,8)}`}let ar={timeout:15e3,maxRetries:10,baseDelayMs:5e3,maxDelayMs:3e4,label:"fetch-tpex-3insti"},sr=["代號","名稱","外陸資買進股數(不含外資自營商)","外陸資賣出股數(不含外資自營商)","外陸資買賣超股數(不含外資自營商)","外資自營商買進股數","外資自營商賣出股數","外資自營商買賣超股數","外資及陸資買進股數","外資及陸資賣出股數","外資及陸資買賣超股數","投信買進股數","投信賣出股數","投信買賣超股數","自營商買進股數(自行買賣)","自營商賣出股數(自行買賣)","自營商買賣超股數(自行買賣)","自營商買進股數(避險)","自營商賣出股數(避險)","自營商買賣超股數(避險)","自營商買進股數","自營商賣出股數","自營商買賣超股數","三大法人買賣超股數合計"];function ir(e){return"string"!=typeof e?e:parseInt(e.replace(/,/g,""),10)||0}let or={timeout:15e3,maxRetries:10,baseDelayMs:5e3,maxDelayMs:3e4,label:"fetch-tpex-margin"};let lr={timeout:15e3,maxRetries:10,baseDelayMs:5e3,maxDelayMs:3e4,label:"fetch-tpex-stock"};let ur={responseType:"text",timeout:3e4,maxRetries:10,baseDelayMs:5e3,maxDelayMs:3e4,label:"fetch-tw-data-holiday"};let cr={timeout:15e3,maxRetries:10,baseDelayMs:5e3,maxDelayMs:3e4,label:"fetch-twse-margin"};let hr={timeout:1e4,maxRetries:10,baseDelayMs:5e3,maxDelayMs:3e4,label:"fetch-twse-stock"};let fr={timeout:15e3,maxRetries:10,baseDelayMs:5e3,maxDelayMs:3e4,label:"fetch-twse-t86"};let gr={fetchRSS:async function(e,t={}){if(!ue(e)||!/^https?:\/\//i.test(e))throw new Error("rssUrl 須為有效的 http/https RSS 網址");let r=oe(t,"method");"curl"!==r&&"auto"!==r&&(r="fetch");let n=oe(t,"withContent");me(n)||(n=!1);let s=await async function(e,t,r){if("curl"===t)return await Gt(e,r);if("auto"===t)try{return await Gt(e,r)}catch(t){return await He(e,r)}return await He(e,r)}(e,r,ze(t,Kt)),i=new a,o=await i.parseString(s),l=String(oe(o,"title","")||"").trim(),u=oe(o,"items");return de(u)||(u=[]),u.map(e=>{let t={url:String(oe(e,"link","")||"").trim(),time:Je(oe(e,"isoDate","")||oe(e,"pubDate","")),title:String(oe(e,"title","")||"").trim(),description:String(oe(e,"contentSnippet","")||oe(e,"summary","")||"").trim(),from:String(oe(e,"creator","")||l).trim()};return n&&(t.content=function(e){if(!le(e))return"";let t=e;return t=t.replace(/<script[\s\S]*?<\/script>/gi,""),t=t.replace(/<style[\s\S]*?<\/style>/gi,""),t=t.replace(/<\/(?:p|div|li|h[1-6])>/gi,"\n"),t=t.replace(/<br\s*\/?>/gi,"\n"),t=t.replace(/<[^>]+>/g,""),t=et(t),t=t.replace(/\u00A0/g," "),t=t.split("\n").map(e=>e.replace(/[ \t]+/g," ").trim()).join("\n"),t=t.replace(/\n{3,}/g,"\n\n"),t.trim()}(oe(e,"content:encoded","")||oe(e,"content","")||oe(e,"summary","")||oe(e,"description",""))),t})},fetchHackerNews:async function(e=30,t={}){e=Ie(e)?je(e):30;let r=oe(t,"apiBase");ue(r)||(r="https://hacker-news.firebaseio.com/v0"),r=r.replace(/\/+$/,"");let n=ze(t,Yt),a=await He(`${r}/newstories.json`,n);de(a)||(a=[]);let s=a.slice(0,e),i=[];for(let e=0;e<s.length;e+=10){let t=s.slice(e,e+10),a=await Promise.allSettled(t.map(e=>He(`${r}/item/${e}.json`,n)));for(let e of a)"fulfilled"===e.status&&i.push(e.value)}return i.filter(e=>e&&"story"===e.type).map(e=>({url:String(oe(e,"url","")||`https://news.ycombinator.com/item?id=${oe(e,"id","")}`).trim(),time:Je(oe(e,"time",0)),title:String(oe(e,"title","")||"").trim(),description:"",from:"Hacker News"}))},fetchAiNewsAggregator:async function(e={}){let t=oe(e,"url");ue(t)||(t="https://raw.githubusercontent.com/SuYxh/ai-news-aggregator/refs/heads/main/data/latest-24h.json");let r=oe(await He(t,ze(e,Ve)),"items");return de(r)||(r=[]),r.map(e=>({url:String(oe(e,"url","")||"").trim(),time:Je(oe(e,"published_at","")),title:String(oe(e,"title","")||"").trim(),description:"",from:String(oe(e,"source","")||"").trim()}))},fetchCnyes:async function(e={}){let t=oe(e,"url");ue(t)||(t="https://api.cnyes.com/media/api/v1/newslist/category/tw_stock");let r=oe(e,"targetTotal");r=Ie(r)?je(r):100;let n=oe(e,"pageLimit");n=Ie(n)?je(n):30;let a=oe(e,"daysBack");a=Ie(a)?je(a):10;let s=oe(e,"pageDelayMs");s=Re(s)?je(s):500;let i=ze(e,wt),o=i.useShowLog,l=Math.floor(Date.now()/1e3),u=l-86400*a;o&&console.log("Starting to fetch Anue (tw_stock) news...");let c=[],h=1;for(;c.length<r;){let e=new URLSearchParams({page:String(h),limit:String(n),isCategoryHeadline:"1",startAt:String(u),endAt:String(l)}),r=oe(await He(`${t}?${e.toString()}`,i),"items.data");if(!de(r)){o&&console.log("No more items found.");break}c=c.concat(r),o&&console.log(`Page ${h}: Fetched ${r.length} items. Total so far: ${c.length}`),h++,await Pe(s)}let f=c.slice(0,r);return o&&console.log(`Total items collected: ${f.length}`),f.map(e=>{let t=Je(oe(e,"publishAt",0));return""===t&&o&&console.warn(`[fetch-cnyes] 時間格式化失敗(newsId=${oe(e,"newsId","")}, publishAt=${oe(e,"publishAt","")}) — 該筆time退回空字串`),{time:t,title:oe(e,"title",""),link:`https://news.cnyes.com/news/id/${oe(e,"newsId","")}`}})},fetchMoneydj:async function(e={}){let t=oe(e,"baseUrl");ue(t)||(t="https://www.moneydj.com/kmdj/news/newsreallist.aspx?a=mb06&index1=");let r=oe(e,"totalPages");r=Ie(r)?je(r):50;let n=oe(e,"onPageDone");(function(e){let t=Object.prototype.toString.call(e);return"[object Function]"===t||"[object AsyncFunction]"===t})(n)||(n=()=>{});let a=ze(e,Ft),s=a.useShowLog,o=oe(e,"pageDelayMs");o=Ie(o)||0===o?je(o):null;let l=new URL(t).origin,u=async e=>{let r=await He(`${t}${e}`,{...a,label:`${Ft.label} Page ${e}`}),n=i.load(r),s=[];return n("tr").each((e,t)=>{let r=n(t),a=r.find("td").eq(0).text().trim(),i=r.find("td").eq(1).find("a");if(a&&Ht.test(a)&&i.length>0){let e=i.attr("title")||i.text().trim(),t=i.attr("href");if(t){let r=t.startsWith("http")?t:l+t;s.push({time:a,title:e,link:r})}}}),s},c=[];for(let e=1;e<=r;e++){let t=null;try{t=await u(e)}catch(t){s&&console.warn(`[Page ${e}] 抓取失敗,已跳過:${t.message}`);continue}c=c.concat(t),n(e,t.length,r),e<r&&await Pe(null===o?Math.floor(2e3*Math.random())+1e3:o)}if(0===c.length)throw new Error("抓取到 0 筆新聞,可能是頁面結構改變或 selector 失效,請確認 MoneyDJ 頁面是否正常。");return c},fetchStatementdog:async function(e={}){let t=oe(e,"url");ue(t)||(t="https://statementdog.com/news/latest");let r=ze(e,Xt),n=r.useShowLog;n&&console.log(`Fetching ${t}...`);let a=await He(t,r),s=new URL(t).origin,o=i.load(a),l=o(Zt).length>0,u=l?Zt:'article, .news-item, [class*="news"][class*="item"]',c=l?".statementdog-news-list-item-title":'h2, h3, [class*="title"]',h=l?".statementdog-news-list-item-link":"a[href]",f=l?".statementdog-news-list-item-date":'time, [class*="date"], [class*="time"]';!l&&n&&console.warn("主要 CSS selector 未匹配,嘗試 fallback selector...");let g=[];if(o(u).each((e,t)=>{let r=o(t).find(c),n=l?o(t).find(h):o(t).find(h).first(),a=o(t).find(f),i=r.text().trim(),u=n.attr("href"),d=a.text().trim();i&&u&&(u.startsWith("http")||(u=`${s}${u.startsWith("/")?"":"/"}${u}`),g.push({time:d,title:i,link:u}))}),n&&console.log(`Extracted News Items: ${g.length}`),0===g.length)throw new Error("抓取到 0 筆新聞,可能是頁面結構改變或 selector 失效,請確認財報狗頁面是否正常。");return g},fetchMops:async function(e={}){let t=oe(e,"pageUrl");ue(t)||(t="https://mops.twse.com.tw/mops/#/web/t146sb10");let r=oe(e,"apiUrl");ue(r)||(r="https://mops.twse.com.tw/mops/api/t146sb10");let a=oe(e,"maxRetries");a=Re(a)?je(a):10;let s=oe(e,"useShowLog");me(s)||(s=!0);let i={maxRetries:a,baseDelayMs:qt,maxDelayMs:zt,useShowLog:s},o=Wt.map(e=>{return{name:e.name,marketKind:e.marketKind,url:r,payload:(t=e.marketKind,{scopeType:"2",companyId:"",dateType:"2",firstDate:"",lastDate:"",marketKind:t,announcementBasis:"0",dateRangeType:"1",announcementType:"1",sort:"1",encodeURIComponent:1,step:1,firstin:1,off:1})};var t});s&&console.log("啟動瀏覽器...");let l=null;for(let e=1;e<=a+1;e++)try{l=await n.chromium.launch({headless:!0,executablePath:process.env.CHROME_PATH||void 0,channel:"chrome",args:["--no-sandbox","--disable-setuid-sandbox"],timeout:36e4});break}catch(t){if(a+1-e<=0)throw new Error(`瀏覽器啟動失敗(已重試 ${a} 次): ${t.message}`);let r=Math.min(qt*e,zt);s&&console.warn(`[browser.launch][Retry ${e}/${a}] ${t.message} — 等待 ${r/1e3}s 後重試...`),await Pe(r)}try{let e=await l.newPage();s&&console.log("前往 MOPS 重大訊息頁面 (t146sb10)...");for(let r=1;r<=a+1;r++)try{await e.goto(t,{waitUntil:"networkidle",timeout:6e4});break}catch(e){if(a+1-r<=0)throw e;let t=Math.min(qt*r,zt);s&&console.warn(`[page.goto][Retry ${r}/${a}] ${e.message} — 等待 ${t/1e3}s 後重試...`),await Pe(t)}await e.waitForTimeout(2e3);let r=[];for(let t of o){s&&console.log(`正在抓取 [${t.name}] 資料...`);let n=await Bt(e,t,i);r.push({market:t.name,marketKind:t.marketKind,data:n.json||n,...n.error&&{error:n.error},timestamp:(new Date).toISOString()}),await e.waitForTimeout(1e3)}if(s){let e=r.map(e=>{let t=oe(e,"data.result",oe(e,"data")),r=Array.isArray(t)?t.length:0;return`${e.market}: 取得 ${r} 筆資料`});console.log("抓取完成。摘要:",e)}let n=r.some(e=>e.error);return{results:r,hasError:n}}finally{await l.close()}},fetchTwseStock:async function(e,t,r={}){if(!Jt(e))throw new Error(`dateStr 須為合法之 YYYYMMDD 字串,得到: ${e}`);let n=oe(r,"baseUrl");ue(n)||(n="https://www.twse.com.tw"),n=n.replace(/\/+$/,"");let a=ze(r,hr),s=a.useShowLog,i=ue(t)&&"all"!==t.toLowerCase(),o=i?t:"ALLBUT0999",l="";l=i?`${n}/exchangeReport/STOCK_DAY?response=json&date=${e}&stockNo=${o}`:`${n}/exchangeReport/MI_INDEX?response=json&date=${e}&type=ALLBUT0999`,s&&(console.log(`Fetching TWSE data: ${e}, Stock: ${o}`),console.log(`URL: ${l}`));let u=await He(l,a);if("OK"!==oe(u,"stat"))throw new Error(`TWSE API returned: ${oe(u,"stat")}`);if(i&&Array.isArray(u.data)){let r=nr(e),n=u.data.filter(e=>e[0]===r);if(u.data=n,0===n.length)throw new Error(`TWSE 個股 ${t} 於 ${e} 無交易資料(可能為假日或停盤)`)}return u},fetchTpexStock:async function(e,t,r={}){if(!Jt(e))throw new Error(`dateStr 須為合法之 YYYYMMDD 字串,得到: ${e}`);let n=oe(r,"baseUrl");ue(n)||(n="https://www.tpex.org.tw"),n=n.replace(/\/+$/,"");let a=ze(r,lr),s=a.useShowLog,i=de(t)?t:[],o=nr(e),l=`${n}/web/stock/aftertrading/daily_close_quotes/stk_quote_result.php?l=zh-tw&d=${o}&s=0,asc,0&o=json`;s&&(console.log(`Fetching TPEX data: ${e} (${o})`),console.log(`Target: ${i.length>0?i.join(", "):"All Market"}`),console.log(`URL: ${l}`));let u=await He(l,a),c=Array.isArray(u.tables)?u.tables:[],h=c.find(e=>oe(e,"title","").includes("行情")&&oe(e,"data.length",0)>0)||c.find(e=>oe(e,"data.length",0)>0),f=oe(h,"data");if(!de(f))throw new Error("TPEX API returned no data. Possibly a holiday or data not yet available.");if(!Array.isArray(f[0])||f[0].length<8)throw new Error(`TPEX 行情資料欄數不符預期(首列 ${Array.isArray(f[0])?f[0].length:"N/A"} 欄,應 >= 8),可能 API 格式變更`);let g=f;if(i.length>0&&(g=g.filter(e=>i.includes(e[0])),0===g.length))throw new Error(`指定個股 ${i.join(",")} 在 ${e} 之上櫃資料中查無資料(可能為上市股、代碼有誤、或當日無交易)`);return{source:"tpex",date:e,count:g.length,data:g}},fetchTwseMargin:async function(e,t,r={}){if(!ue(e)||!/^\d{8}$/.test(e))throw new Error(`日期參數無效:格式須為 YYYYMMDD (收到 "${e}")`);if(!Jt(e))throw new Error(`日期參數無效:不合法的日期 (${e})`);let n=oe(r,"baseUrl");ue(n)||(n="https://www.twse.com.tw"),n=n.replace(/\/+$/,"");let a=ze(r,cr),s=a.useShowLog,i=de(t)?t.filter(Boolean):[],o=`${n}/rwd/zh/marginTrading/MI_MARGN?date=${e}&selectType=ALL&response=json`;s&&(console.log(`Fetching TWSE margin data: ${e}`),console.log(`Target: ${i.length>0?i.join(", "):"All Market"}`),console.log(`URL: ${o}`));let l=await He(o,a);if("OK"!==oe(l,"stat"))throw new Error(`TWSE MI_MARGN API returned: ${oe(l,"stat")}`);let u=Array.isArray(l.tables)?l.tables:[],c=u.find(e=>oe(e,"data.length",0)>0&&oe(e,"title","").includes("融資融券彙總"));if(c||(c=u.find(e=>oe(e,"data.length",0)>0&&Array.isArray(e.fields)&&e.fields.some(e=>String(e).includes("融資"))&&e.fields.some(e=>String(e).includes("融券")))),!c||!de(oe(c,"data")))throw new Error("TWSE MI_MARGN: 找不到融資融券彙總資料表");if(!Array.isArray(c.fields)||c.fields.length<16)throw new Error(`TWSE 融資融券資料欄數不符預期(fields ${oe(c,"fields.length","N/A")} 欄,應 >= 16),可能 API 格式變更`);let h=c.data;if(i.length>0&&(h=h.filter(e=>i.includes(String(e[0]||"").trim())),0===h.length))throw new Error(`指定個股 ${i.join(",")} 不在上市融資融券資料中(可能為上櫃股或代碼有誤)`);let f=h.map(e=>{let t=ir(e[2]),r=ir(e[3]),n=ir(e[6]),a=ir(e[5]),s=ir(e[8]),i=ir(e[9]),o=ir(e[12]),l=ir(e[11]);return{code:String(e[0]||"").trim(),name:String(e[1]||"").trim(),marginBuy:t,marginSell:r,marginCashRepay:ir(e[4]),marginPrevBalance:a,marginBalance:n,marginChange:n-a,marginLimit:ir(e[7]),shortSell:i,shortBuy:s,shortCashRepay:ir(e[10]),shortPrevBalance:l,shortBalance:o,shortChange:o-l,shortLimit:ir(e[13]),offset:ir(e[14]),note:String(e[15]||"").trim()}});return s&&console.log(`Fetched ${f.length} records.`),{source:"twse_margin",date:e,count:f.length,data:f}},fetchTpexMargin:async function(e,t,r={}){if(!ue(e)||!/^\d{8}$/.test(e))throw new Error(`日期參數無效:格式須為 YYYYMMDD (收到 "${e}")`);if(!Jt(e))throw new Error(`日期參數無效:不合法的日期 (${e})`);let n=oe(r,"baseUrl");ue(n)||(n="https://www.tpex.org.tw"),n=n.replace(/\/+$/,"");let a=ze(r,or),s=a.useShowLog,i=de(t)?t.filter(Boolean):[],o=nr(e),l=`${n}/web/stock/margin_trading/margin_balance/margin_bal_result.php?l=zh-tw&d=${o}&o=json`;s&&(console.log(`Fetching TPEX margin data: ${e} (${o})`),console.log(`Target: ${i.length>0?i.join(", "):"All Market"}`),console.log(`URL: ${l}`));let u=await He(l,a),c=Array.isArray(u.tables)?u.tables:[],h=c.find(e=>oe(e,"data.length",0)>0&&Array.isArray(e.fields)&&e.fields.some(e=>String(e).includes("資餘額"))&&e.fields.some(e=>String(e).includes("券餘額")))||c.find(e=>oe(e,"data.length",0)>0);if(!h||!de(oe(h,"data")))throw new Error("TPEX margin API returned no data. Possibly a holiday or data not yet available.");let f=Array.isArray(h.fields)?h.fields:[];if(!String(f[6]||"").includes("資餘額")||!String(f[14]||"").includes("券餘額"))throw new Error(`TPEX 融資融券資料欄位佈局與預期不符(index6 應含「資餘額」實為「${f[6]??""}」、index14 應含「券餘額」實為「${f[14]??""}」);可能 API 格式變更,停止解析以免產生錯誤資料`);let g=h.data;if(i.length>0&&(g=g.filter(e=>i.includes(String(e[0]||"").trim())),0===g.length))throw new Error(`指定個股 ${i.join(",")} 不在上櫃融資融券資料中(可能為上市股或代碼有誤)`);let d=g.map(e=>{let t=ir(e[2]),r=ir(e[3]),n=ir(e[4]),a=ir(e[6]),s=ir(e[10]),i=ir(e[11]),o=ir(e[12]),l=ir(e[14]);return{code:String(e[0]||"").trim(),name:String(e[1]||"").trim(),marginBuy:r,marginSell:n,marginCashRepay:ir(e[5]),marginPrevBalance:t,marginBalance:a,marginChange:a-t,marginLimit:ir(e[9]),shortSell:i,shortBuy:o,shortCashRepay:ir(e[13]),shortPrevBalance:s,shortBalance:l,shortChange:l-s,shortLimit:ir(e[17]),offset:ir(e[18]),note:String(e[19]||"").trim()}});return s&&console.log(`Fetched ${d.length} records.`),{source:"tpex_margin",date:e,count:d.length,data:d}},fetchTwseT86:async function(e,t,r={}){if(!ue(e)||!/^\d{8}$/.test(e))throw new Error(`dateStr must be YYYYMMDD, got: ${e}`);if(!Jt(e))throw new Error(`dateStr 不是合法日期: ${e}`);let n=oe(r,"baseUrl");ue(n)||(n="https://www.twse.com.tw"),n=n.replace(/\/+$/,"");let a=ze(r,fr),s=a.useShowLog,i=de(t)?t:[],o=`${n}/rwd/zh/fund/T86?response=json&date=${e}&selectType=ALL`;s&&(console.log(`Fetching from: ${o}`),console.log(`Target: ${0===i.length?"All Market":i.join(", ")}`));let l=await He(o,a);if("OK"!==oe(l,"stat"))throw new Error(`TWSE T86 API returned: ${oe(l,"stat")}`);let u=oe(l,"fields"),c=oe(l,"data");if(!Array.isArray(c))throw new Error("TWSE T86: data not found in response.");if(!Array.isArray(u))throw new Error("TWSE T86: fields not found in response.");let h=c.map(e=>{let t={};return u.forEach((r,n)=>{let a=e[n];"string"==typeof a&&(a=a.trim()),t[r]=a}),t});if(i.length>0){let e=u.find(e=>String(e).includes("證券代號"));if(!e)throw new Error("無法篩選個股:API 回應中找不到證券代號欄位");h=h.filter(t=>i.includes(t[e]))}return s&&console.log(`Fetched ${h.length} records.`),{source:"twse",date:e,data:h}},fetchTpex3insti:async function(e,t,r={}){if(!ue(e)||!/^\d{8}$/.test(e))throw new Error(`dateStr must be YYYYMMDD, got: ${e}`);if(!Jt(e))throw new Error(`dateStr 不是合法日期: ${e}`);let n=oe(r,"baseUrl");ue(n)||(n="https://www.tpex.org.tw"),n=n.replace(/\/+$/,"");let a=ze(r,ar),s=a.useShowLog,i=de(t)?t:[],o=`${n}/web/stock/3insti/daily_trade/3itrade_hedge_result.php?l=zh-tw&t=D&d=${nr(e)}&o=json`;s&&(console.log(`Fetching from: ${o}`),console.log(`Target: ${0===i.length?"All Market":i.join(", ")}`));let l=await He(o,a);if(!de(oe(l,"tables")))throw new Error("TPEX 3insti: tables not found in response. Possibly a holiday or no data.");let u=l.tables,c=u.find(e=>Array.isArray(e.fields)&&e.fields.some(e=>String(e).includes("代號"))&&e.fields.some(e=>String(e).includes("名稱")))||u[0],h=oe(c,"fields"),f=oe(c,"data");if(!Array.isArray(h)||!Array.isArray(f))throw new Error("TPEX 3insti: data/fields not found in table.");!function(e){if(e.length!==sr.length)throw new Error(`TPEX 3insti: 欄數異常,預期 ${sr.length} 得 ${e.length}(疑似 API 改版,請重新校準 TPEX_FIELD_MAP)`);if(!String(e[0]).includes("代號")||!String(e[1]).includes("名稱"))throw new Error(`TPEX 3insti: 前兩欄非「代號/名稱」(得「${e[0]}」「${e[1]}」,疑似 API 改版)`);if(!String(e[e.length-1]).includes("合計"))throw new Error(`TPEX 3insti: 末欄非「合計」(得「${e[e.length-1]}」,疑似 API 改版)`);let t=["買進股數","賣出股數","買賣超股數"];for(let r=2;r<e.length-1;r++){let n=t[(r-2)%3];if(String(e[r])!==n)throw new Error(`TPEX 3insti: 第 ${r} 欄預期「${n}」得「${e[r]}」(疑似 API 改版,欄序已變)`)}}(h);let g=f.map(e=>{let t={};return sr.forEach((r,n)=>{let a=e[n];"string"==typeof a&&(a=a.trim()),t[r]=a}),t}).filter(e=>0===i.length||i.includes(e["代號"]));return s&&console.log(`Fetched ${g.length} records.`),{source:"tpex",date:e,data:g}},fetchTaifex:async function(e,t={}){if(!ue(e)||!/^\d{8}$/.test(e))throw new Error(`dateStr 須為 YYYYMMDD 字串,得到: ${e}`);if(!Jt(e))throw new Error(`dateStr 非合法日期: ${e}`);let r=oe(t,"baseUrl");ue(r)||(r="https://www.taifex.com.tw"),r=r.replace(/\/+$/,"");let n=ze(t,Vt),a=n.useShowLog,s={baseUrl:r,useShowLog:a,optFetch:n},i=oe(t,"interRequestDelayMs");i=Re(i)?je(i):1e3;let o=`${e.substring(0,4)}/${e.substring(4,6)}/${e.substring(6,8)}`;a&&console.log(`Fetching TAIFEX data for ${e} (${o})`);let l=[],u=null,c=null,h=null;try{u=await async function(e,t){let r=`${t.baseUrl}/cht/3/futDataDown?down_type=1&queryStartDate=${e}&queryEndDate=${e}&commodity_id=TX`;t.useShowLog&&console.log(`Fetching futures data: ${r}`);let n=tr(await He(r,{...t.optFetch,label:`${Vt.label} Futures`}));if(0===n.length)throw new Error("台指期行情:無資料(可能非交易日)");let a=n.filter(e=>"TX"===e["契約"]&&!e["到期月份(週別)"].includes("/"));if(0===a.length)throw new Error("台指期行情:找不到 TX 合約資料");a.sort((e,t)=>e["到期月份(週別)"].trim().localeCompare(t["到期月份(週別)"].trim()));let s=a[0]["到期月份(週別)"].trim(),i=a.filter(e=>e["到期月份(週別)"].trim()===s),o=i.find(e=>"一般"===e["交易時段"]),l=i.find(e=>"盤後"===e["交易時段"]),u={contractMonth:s,open:null,high:null,low:null,close:null,settlement:null,volume:null,afterHoursClose:null,afterHoursSettlement:null,afterHoursVolume:null};return o&&(u.open=rr(o["開盤價"]),u.high=rr(o["最高價"]),u.low=rr(o["最低價"]),u.close=rr(o["收盤價"]),u.settlement=rr(o["結算價"]),u.volume=rr(o["成交量"])),l&&(u.afterHoursClose=rr(l["收盤價"]),u.afterHoursSettlement=rr(l["結算價"]),u.afterHoursVolume=rr(l["成交量"])),t.useShowLog&&(console.log(` 台指期近月 (${s}): 開${u.open} 高${u.high} 低${u.low} 收${u.close} 結算${u.settlement} 量${u.volume}`),null!==u.afterHoursClose&&console.log(` 盤後: 收${u.afterHoursClose} 結算${u.afterHoursSettlement} 量${u.afterHoursVolume}`)),u}(o,s)}catch(e){let t=`台指期行情: ${oe(e,"message",e)}`;a&&console.error(t),l.push(t)}await Pe(i);try{c=await async function(e,t){let r=`${t.baseUrl}/cht/3/futContractsDateDown?queryStartDate=${e}&queryEndDate=${e}&commodityId=TXF`;t.useShowLog&&console.log(`Fetching institutional data: ${r}`);let n=tr(await He(r,{...t.optFetch,label:`${Vt.label} Institutional`}));if(0===n.length)throw new Error("三大法人期貨未平倉:無資料(可能非交易日)");let a={};for(let e of n){let r=e["身份別"],n=Qt[r];n&&(a[n]={longContracts:rr(e["多方未平倉口數"]),longAmount:rr(e["多方未平倉契約金額(千元)"]),shortContracts:rr(e["空方未平倉口數"]),shortAmount:rr(e["空方未平倉契約金額(千元)"]),netContracts:rr(e["多空未平倉口數淨額"]),netAmount:rr(e["多空未平倉契約金額淨額(千元)"]),tradingLong:rr(e["多方交易口數"]),tradingShort:rr(e["空方交易口數"]),tradingNet:rr(e["多空交易口數淨額"])},t.useShowLog&&console.log(` ${r}: 未平倉淨額 ${a[n].netContracts} 口`))}if(0===Object.keys(a).length)throw new Error("三大法人期貨未平倉:無法解析身份別(可能官方變更欄位用語)");return a}(o,s)}catch(e){let t=`三大法人: ${oe(e,"message",e)}`;a&&console.error(t),l.push(t)}await Pe(i);try{h=await async function(e,t){let r=`${t.baseUrl}/cht/3/pcRatioDown?queryStartDate=${e}&queryEndDate=${e}`;t.useShowLog&&console.log(`Fetching P/C ratio: ${r}`);let n=tr(await He(r,{...t.optFetch,label:`${Vt.label} PCRatio`}));if(0===n.length)throw new Error("Put/Call Ratio:無資料(可能非交易日)");let a=n[0],s={putVolume:rr(a["賣權成交量"]),callVolume:rr(a["買權成交量"]),ratio:rr(a["買賣權成交量比率%"]),putOpenInterest:rr(a["賣權未平倉量"]),callOpenInterest:rr(a["買權未平倉量"]),openInterestRatio:rr(a["買賣權未平倉量比率%"])};return t.useShowLog&&console.log(` Put ${s.putVolume} / Call ${s.callVolume} = ${s.ratio}%`),s}(o,s)}catch(e){let t=`Put/Call Ratio: ${oe(e,"message",e)}`;a&&console.error(t),l.push(t)}if(!(u||c||h)){let e=new Error(`所有資料抓取失敗: ${l.join("; ")}`);throw e.errors=l,e}return{date:e,futures:u?{tx:u}:null,institutional:c||null,pcRatio:h||null,errors:l}},fetchTwDataHoliday:async function(e,t={}){let r=oe(t,"url");ue(r)||(r="https://openapi.twse.com.tw/v1/holidaySchedule/holidaySchedule");let n=ze(t,ur),a=await He(r,n),s=null;try{s=JSON.parse(a)}catch(e){throw new Error("API 回傳非 JSON 格式(可能為維護頁面或網路中介),請稍後再試")}if(!de(s))throw new Error("API 回傳空陣列或格式異常");let i=s.filter(e=>!function(e){let t=String(oe(e,"Name","")),r=String(oe(e,"Description",""));return/交易日/.test(t)||/市場無交易/.test(t)||/開始交易/.test(r)||/最後交易/.test(r)}(e)).map(e=>{return{date:(t=oe(e,"Date",""),`${parseInt(t.substring(0,t.length-4),10)+1911}${t.substring(t.length-4)}`),rocDate:oe(e,"Date",""),name:oe(e,"Name",""),weekday:oe(e,"Weekday",""),description:String(oe(e,"Description","")||"").replace(/<br\s*\/?>/gi,"").trim()};var t}),o=new Set,l=i.filter(e=>!o.has(e.date)&&(o.add(e.date),!0));l.sort((e,t)=>e.date.localeCompare(t.date));let u={dataYear:l.length>0?l[0].date.substring(0,4):null,totalHolidays:l.length,holidays:l};if(ue(e)&&/^\d{8}$/.test(e)){u.checkDate=e;let t=l.find(t=>t.date===e);u.isHoliday=!!t,u.holidayName=t?t.name:null}return u},fetchAisixiang:pt,fetchGuancha:{BASE_URL:Et,USER_AGENT:Ot,MAX_PAGES:50,KNOWN_TOPICS:kt,safeFilename:nt,fetchAuthorsList:Ut,lookupAuthor:Pt,lookupTopic:Nt,fetchAuthorArticles:async function(e={}){let t=Lt(e),r=oe(e,"name");ue(r)||(r="");let n=oe(e,"slug");if(ue(n)||(n=""),!r&&!n)throw new Error("需要 name 或 slug");let a=n,s=r;if(!a){t.useShowLog&&process.stderr.write("[info] fetching authors index from / ...\n");let n=await Ut(e),i=Pt(n,r);if(!i)return{status:"success",site:"guancha",mode:"author",query:r,fetched_at:(new Date).toISOString(),authors_count:n.length,count:0,items:[],message:`"${r}" 不在觀察者網作者索引中(共 ${n.length} 位)。尚無此作者文章。提醒:本函數不轉繁簡,呼叫端負責用站方登錄字形(簡體)。`};a=i.slug,s=i.name}let i=`${t.baseUrl}/${a}`,o=null;try{o=await Rt(a,t)}catch(e){return{status:"error",site:"guancha",mode:"author",query:s||a,resolved:{slug:a,url:i,name:s},fetched_at:(new Date).toISOString(),reason:e.reason,error:e.message}}return{status:"success",site:"guancha",mode:"author",query:s||a,resolved:{slug:a,url:i,name:s,pages_fetched:o.pages_fetched},fetched_at:(new Date).toISOString(),count:o.items.length,items:o.items}},fetchKeywordArticles:async function(e,t={}){if(!ue(e))throw new Error("需要 keyword");return{status:"error",site:"guancha",mode:"keyword",query:e,fetched_at:(new Date).toISOString(),error:"unsupported-by-curl",message:"觀察者網搜尋 API(s.guancha.cn/main/search-v2)由 sojson.v4 混淆並走 MD5 簽名,本函數(純 curl 路徑)無法支援。如已知作者拼音 slug,請改用 fetchAuthorArticles({ slug });如已知主題 slug,請改用 fetchTopicArticles({ slug })。"}},fetchTitleArticles:async function(e,t={}){if(!ue(e))throw new Error("需要 keyword");return{status:"error",site:"guancha",mode:"title",query:e,fetched_at:(new Date).toISOString(),error:"unsupported-by-curl",message:"觀察者網無分「標題」與「全文」搜尋(兩者同源),搜尋 API 由 sojson.v4 混淆並走 MD5 簽名,本函數(純 curl 路徑)無法支援。如已知作者拼音 slug,請改用 fetchAuthorArticles({ slug })。"}},fetchTopicArticles:async function(e={}){let t=Lt(e),r=oe(e,"name");ue(r)||(r="");let n=oe(e,"slug");if(ue(n)||(n=""),!r&&!n)throw new Error("需要 name 或 slug");let a=n,s=r;if(!a){let e=Nt(r);if(!e)return{status:"error",site:"guancha",mode:"topic",query:r,fetched_at:(new Date).toISOString(),topics_count:kt.length,error:"topic-not-in-table",message:`主題 "${r}" 不在已知主題對照表中(共 ${kt.length} 個)。觀察者網無公開主題清單頁,本函數採手工對照。建議直接傳 slug(拼音 slug)。本函數不自動轉向,請呼叫端決定是否重試。`};a=e.slug,s=e.name}let i=`${t.baseUrl}/${a}`,o=null;try{o=await Rt(a,t)}catch(e){return{status:"error",site:"guancha",mode:"topic",query:s||a,resolved:{slug:a,url:i,name:s},fetched_at:(new Date).toISOString(),reason:e.reason,error:e.message}}return{status:"success",site:"guancha",mode:"topic",query:s||a,resolved:{slug:a,url:i,name:s,pages_fetched:o.pages_fetched},fetched_at:(new Date).toISOString(),count:o.items.length,items:o.items}},fetchArticle:async function(e={}){let t=Lt(e),r=oe(e,"url");if(!ue(r))throw new Error("需要 url");let n=null;try{n=await Ct(r,t)}catch(e){return{status:"error",site:"guancha",mode:"fetch",url:r,fetched_at:(new Date).toISOString(),error:e.message||"fetch failed"}}let a=function(e){let t=e.match(/<title>([\s\S]*?)<\/title>/i);return t?et(t[1].trim()):null}(n)||"",s=rt(n,"content all-txt");if("观察者网"===a||"觀察者網"===a||!s)return{status:"error",site:"guancha",mode:"fetch",url:r,fetched_at:(new Date).toISOString(),error:"article-not-found",message:`無此文章(title="${a}",可能已下架或 URL 不正確)。`};let i=a.replace(/[_\-\s||]*(?:观察者网|觀察者網)\s*$/u,"").trim(),o=function(e){let t=e.match(/【([^】]{4,120})】/);return t?t[1].replace(/<[^>]+>/g,"").trim():null}(s)||"",l=function(e){let t=e.match(/<span[^>]*>(20\d{2}-\d{2}-\d{2}\s+\d{2}:\d{2}:\d{2})<\/span>/);return t?t[1]:null}(n)||"",u=(new Date).toISOString().slice(0,10),c=tt(s,{image:!0}),h=e=>String(e).replace(/"/g,'\\"'),f=`---\ntitle: "${h(i)}"\nsource: "${r}"\nauthor: "${h(o)}"\npublished: "${l}"\ncreated: ${u}\ndescription:\n---\n${c}\n`;return{status:"success",site:"guancha",mode:"fetch",url:r,title:i,author:o,published:l,chars:c.length,markdown:f}}}};return gr});
6
+ !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t(require("child_process"),require("util"),require("cheerio"),require("playwright"),require("rss-parser")):"function"==typeof define&&define.amd?define(["child_process","util","cheerio","playwright","rss-parser"],t):(e="undefined"!=typeof globalThis?globalThis:e||self)["w-dwdata-hub"]=t(e.child_process,e.util,e.cheerio,e.playwright,e["rss-parser"])}(this,function(e,t,r,n,a){"use strict";function s(e){var t=Object.create(null);return e&&Object.keys(e).forEach(function(r){if("default"!==r){var n=Object.getOwnPropertyDescriptor(e,r);Object.defineProperty(t,r,n.get?n:{enumerable:!0,get:function(){return e[r]}})}}),t.default=e,Object.freeze(t)}var i=s(r),o=Array.isArray,l="object"==typeof global&&global&&global.Object===Object&&global,u="object"==typeof self&&self&&self.Object===Object&&self,c=l||u||Function("return this")(),h=c.Symbol,f=Object.prototype,g=f.hasOwnProperty,d=f.toString,m=h?h.toStringTag:void 0;var p=Object.prototype.toString;var w=h?h.toStringTag:void 0;function y(e){return null==e?void 0===e?"[object Undefined]":"[object Null]":w&&w in Object(e)?function(e){var t=g.call(e,m),r=e[m];try{e[m]=void 0;var n=!0}catch(e){}var a=d.call(e);return n&&(t?e[m]=r:delete e[m]),a}(e):function(e){return p.call(e)}(e)}function $(e){return null!=e&&"object"==typeof e}function S(e){return"symbol"==typeof e||$(e)&&"[object Symbol]"==y(e)}var b=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,_=/^\w*$/;function v(e){var t=typeof e;return null!=e&&("object"==t||"function"==t)}function D(e){if(!v(e))return!1;var t=y(e);return"[object Function]"==t||"[object GeneratorFunction]"==t||"[object AsyncFunction]"==t||"[object Proxy]"==t}var M,A=c["__core-js_shared__"],x=(M=/[^.]+$/.exec(A&&A.keys&&A.keys.IE_PROTO||""))?"Symbol(src)_1."+M:"";var T=Function.prototype.toString;var E=/^\[object .+?Constructor\]$/,O=Function.prototype,k=Object.prototype,L=O.toString,C=k.hasOwnProperty,I=RegExp("^"+L.call(C).replace(/[\\^$.*+?()[\]{}|]/g,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$");function j(e){return!(!v(e)||(t=e,x&&x in t))&&(D(e)?I:E).test(function(e){if(null!=e){try{return T.call(e)}catch(e){}try{return e+""}catch(e){}}return""}(e));var t}function R(e,t){var r=function(e,t){return null==e?void 0:e[t]}(e,t);return j(r)?r:void 0}var U=R(Object,"create");var P=Object.prototype.hasOwnProperty;var N=Object.prototype.hasOwnProperty;function Y(e){var t=-1,r=null==e?0:e.length;for(this.clear();++t<r;){var n=e[t];this.set(n[0],n[1])}}function F(e,t){return e===t||e!=e&&t!=t}function H(e,t){for(var r=e.length;r--;)if(F(e[r][0],t))return r;return-1}Y.prototype.clear=function(){this.__data__=U?U(null):{},this.size=0},Y.prototype.delete=function(e){var t=this.has(e)&&delete this.__data__[e];return this.size-=t?1:0,t},Y.prototype.get=function(e){var t=this.__data__;if(U){var r=t[e];return"__lodash_hash_undefined__"===r?void 0:r}return P.call(t,e)?t[e]:void 0},Y.prototype.has=function(e){var t=this.__data__;return U?void 0!==t[e]:N.call(t,e)},Y.prototype.set=function(e,t){var r=this.__data__;return this.size+=this.has(e)?0:1,r[e]=U&&void 0===t?"__lodash_hash_undefined__":t,this};var q=Array.prototype.splice;function z(e){var t=-1,r=null==e?0:e.length;for(this.clear();++t<r;){var n=e[t];this.set(n[0],n[1])}}z.prototype.clear=function(){this.__data__=[],this.size=0},z.prototype.delete=function(e){var t=this.__data__,r=H(t,e);return!(r<0)&&(r==t.length-1?t.pop():q.call(t,r,1),--this.size,!0)},z.prototype.get=function(e){var t=this.__data__,r=H(t,e);return r<0?void 0:t[r][1]},z.prototype.has=function(e){return H(this.__data__,e)>-1},z.prototype.set=function(e,t){var r=this.__data__,n=H(r,e);return n<0?(++this.size,r.push([e,t])):r[n][1]=t,this};var W=R(c,"Map");function B(e,t){var r,n,a=e.__data__;return("string"==(n=typeof(r=t))||"number"==n||"symbol"==n||"boolean"==n?"__proto__"!==r:null===r)?a["string"==typeof t?"string":"hash"]:a.map}function K(e){var t=-1,r=null==e?0:e.length;for(this.clear();++t<r;){var n=e[t];this.set(n[0],n[1])}}K.prototype.clear=function(){this.size=0,this.__data__={hash:new Y,map:new(W||z),string:new Y}},K.prototype.delete=function(e){var t=B(this,e).delete(e);return this.size-=t?1:0,t},K.prototype.get=function(e){return B(this,e).get(e)},K.prototype.has=function(e){return B(this,e).has(e)},K.prototype.set=function(e,t){var r=B(this,e),n=r.size;return r.set(e,t),this.size+=r.size==n?0:1,this};function G(e,t){if("function"!=typeof e||null!=t&&"function"!=typeof t)throw new TypeError("Expected a function");var r=function(){var n=arguments,a=t?t.apply(this,n):n[0],s=r.cache;if(s.has(a))return s.get(a);var i=e.apply(this,n);return r.cache=s.set(a,i)||s,i};return r.cache=new(G.Cache||K),r}G.Cache=K;var X,Z,J,V=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,Q=/\\(\\)?/g,ee=(X=function(e){var t=[];return 46===e.charCodeAt(0)&&t.push(""),e.replace(V,function(e,r,n,a){t.push(n?a.replace(Q,"$1"):r||e)}),t},Z=G(X,function(e){return 500===J.size&&J.clear(),e}),J=Z.cache,Z),te=ee;var re=h?h.prototype:void 0,ne=re?re.toString:void 0;function ae(e){if("string"==typeof e)return e;if(o(e))return function(e,t){for(var r=-1,n=null==e?0:e.length,a=Array(n);++r<n;)a[r]=t(e[r],r,e);return a}(e,ae)+"";if(S(e))return ne?ne.call(e):"";var t=e+"";return"0"==t&&1/e==-1/0?"-0":t}function se(e){return null==e?"":ae(e)}function ie(e,t){return o(e)?e:function(e,t){if(o(e))return!1;var r=typeof e;return!("number"!=r&&"symbol"!=r&&"boolean"!=r&&null!=e&&!S(e))||_.test(e)||!b.test(e)||null!=t&&e in Object(t)}(e,t)?[e]:te(se(e))}function oe(e){if("string"==typeof e||S(e))return e;var t=e+"";return"0"==t&&1/e==-1/0?"-0":t}function le(e,t,r){var n=null==e?void 0:function(e,t){for(var r=0,n=(t=ie(t,e)).length;null!=e&&r<n;)e=e[oe(t[r++])];return r&&r==n?e:void 0}(e,t);return void 0===n?r:n}function ue(e){return"[object String]"===Object.prototype.toString.call(e)}function ce(e){return!(!ue(e)||""===e)}function he(e){return"[object Array]"===Object.prototype.toString.call(e)}function fe(e){return"[object Object]"===Object.prototype.toString.call(e)}function ge(e){return e!=e}function de(e){return!!function(e){return"[object Undefined]"===Object.prototype.toString.call(e)}(e)||(!!function(e){return"[object Null]"===Object.prototype.toString.call(e)}(e)||(!!function(e){if(fe(e)){for(let t in e)return!1;return!0}return!1}(e)||(!!function(e){return!(!ue(e)||""!==e)}(e)||(!!function(e){return!!he(e)&&0===e.length}(e)||!!ge(e)))))}function me(e){return!!he(e)&&(0!==e.length&&(1!==e.length||!de(e[0])))}function pe(e){return!0===(t=e)||!1===t||$(t)&&"[object Boolean]"==y(t);var t}var we=/\s/;var ye=/^\s+/;function $e(e){return e?e.slice(0,function(e){for(var t=e.length;t--&&we.test(e.charAt(t)););return t}(e)+1).replace(ye,""):e}var Se=/^[-+]0x[0-9a-f]+$/i,be=/^0b[01]+$/i,_e=/^0o[0-7]+$/i,ve=parseInt;function De(e){if("number"==typeof e)return e;if(S(e))return NaN;if(v(e)){var t="function"==typeof e.valueOf?e.valueOf():e;e=v(t)?t+"":t}if("string"!=typeof e)return 0===e?e:+e;e=$e(e);var r=be.test(e);return r||_e.test(e)?ve(e.slice(2),r?2:8):Se.test(e)?NaN:+e}var Me=1/0;function Ae(e){return e?(e=De(e))===Me||e===-1/0?17976931348623157e292*(e<0?-1:1):e==e?e:0:0===e?e:0}function xe(e){var t=Ae(e),r=t%1;return t==t?r?t-r:t:0}function Te(e){let t=!1;if(ce(e))t=!isNaN(Number(e));else if(function(e){return"[object Number]"===Object.prototype.toString.call(e)}(e)){if(ge(e))return!1;t=!0}return t}function Ee(e){if(!Te(e))return 0;return Ae(e)}function Oe(e,t={}){let r=le(t,"useLimitSafe",null);return pe(r)||(r=!1),!!Te(e)&&(e=Ee(e),r?Number.isSafeInteger(e):"number"==typeof(n=e)&&n==xe(n));var n}var ke=c.isFinite,Le=Math.min;var Ce=function(e){var t=Math[e];return function(e,r){if(e=De(e),(r=null==r?0:Le(xe(r),292))&&ke(e)){var n=(se(e)+"e").split("e");return+((n=(se(t(n[0]+"e"+(+n[1]+r)))+"e").split("e"))[0]+"e"+(+n[1]-r))}return t(e)}}("round"),Ie=Ce;function je(e,t={}){let r=le(t,"useClampSafe",null);pe(r)||(r=!1);let n=le(t,"useLimitSafe",null);pe(n)||(n=!1);let a=le(t,"returnWithStateAndMsg",null);pe(a)||(a=!1);let s=e=>a?{state:"success",msg:e}:e,i=e=>{if(a)return{state:"error",msg:e};throw new Error(e)};if(!Te(e))return s(0);let o=null;try{e=Ee(e),o=Ie(e),r&&(o>Number.MAX_SAFE_INTEGER?o=Number.MAX_SAFE_INTEGER:o<Number.MIN_SAFE_INTEGER&&(o=Number.MIN_SAFE_INTEGER))}catch(e){return i(e.toString())}return n&&!Number.isSafeInteger(Number(o))?i(`v[${e}] is not a safe integer`):("0"===String(o)&&(o=0),s(o))}function Re(e,t={}){if(!Oe(e,t))return!1;return je(e)>0}function Ue(e,t={}){if(!Oe(e,t))return!1;return je(e)>=0}let Pe=2147483647;function Ne(e=10){Te(e)||(e=10),e=Math.min(e,Pe);let t=function(){let e,t,r=new Promise(function(){e=arguments[0],t=arguments[1]});return r.resolve=e,r.reject=t,r}();return setTimeout(function(){t.resolve()},e),t}let Ye=["ECONNRESET","ETIMEDOUT","ENOTFOUND","ECONNREFUSED","ECONNABORTED","EAI_AGAIN","EPIPE"];function Fe(e,t){let r=le(e,"statusCode",null);if(Re(r))return r>=500||429===r||t.includes(r);let n=le(e,"cause.code",null)||le(e,"code",null);if(ce(n)&&Ye.includes(n))return!0;let a=le(e,"name","");if("AbortError"===a||"TimeoutError"===a)return!0;let s=String(le(e,"cause.code","")||le(e,"message",""));return!!/UND_ERR_(SOCKET|HEADERS_TIMEOUT|BODY_TIMEOUT|CONNECT_TIMEOUT)/.test(s)}async function He(e,t){let r=new AbortController,n=setTimeout(()=>{r.abort()},t.timeout);try{let n={method:t.method,headers:t.headers,signal:r.signal};null!==t.body&&(n.body=t.body);let a=await fetch(e,n);if(!a.ok){let t=new Error(`HTTP ${a.status} ${a.statusText}`.trim());throw t.statusCode=a.status,t.url=e,t}if("arrayBuffer"===t.responseType)return await a.arrayBuffer();if("text"===t.responseType){if(""!==t.encoding){let e=await a.arrayBuffer();return new TextDecoder(t.encoding).decode(e)}return await a.text()}let s=await a.text();try{return JSON.parse(s)}catch(e){throw new Error(`回傳非JSON格式(可能為維護頁面或網路中介): ${s.slice(0,100)}`)}}finally{clearTimeout(n)}}async function qe(e,t={}){if(!ce(e))throw new Error(`url須為有效字串, 得到: ${e}`);let r=le(t,"method");ce(r)||(r="GET");let n=le(t,"headers");fe(n)||(n={}),ce(le(n,"User-Agent"))||(n={"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36",...n});let a=le(t,"body",null);ce(a)||(a=null);let s=le(t,"responseType");"text"!==s&&"arrayBuffer"!==s&&(s="json");let i=le(t,"encoding");ce(i)||(i="");let o=le(t,"timeout");o=Re(o)?je(o):3e4;let l=le(t,"maxRetries");l=Ue(l)?je(l):10;let u=le(t,"baseDelayMs");u=Re(u)?je(u):5e3;let c=le(t,"maxDelayMs");c=Re(c)?je(c):3e4;let h=le(t,"retryStatus");me(h)||(h=[]);let f=le(t,"label");ce(f)||(f="fetchWithRetry");let g=le(t,"useShowLog");pe(g)||(g=!0);let d={method:r,headers:n,body:a,responseType:s,encoding:i,timeout:o},m=null;for(let t=1;t<=l+1;t++)try{return await He(e,d)}catch(e){m=e;let r=l+1-t;if(!Fe(e,h)||r<=0)throw e;let n=Math.min(u*t,c);g&&console.warn(`[${f}][Retry ${t}/${l}] ${e.message} — 等待 ${n/1e3}s 後重試...`),await Ne(n)}throw m}function ze(e,t,r,n){let a=le(e,r);return Re(a)?je(a):(a=le(t,r),Re(a)?je(a):n)}function We(e={},t={}){let r=le(e,"maxRetries");Ue(r)||(r=le(t,"maxRetries")),r=Ue(r)?je(r):10;let n=le(e,"useShowLog");pe(n)||(n=le(t,"useShowLog")),pe(n)||(n=!0);let a={timeout:ze(e,t,"timeout",3e4),maxRetries:r,baseDelayMs:ze(e,t,"baseDelayMs",5e3),maxDelayMs:ze(e,t,"maxDelayMs",3e4),useShowLog:n};return ce(le(t,"responseType"))&&(a.responseType=t.responseType),ce(le(t,"encoding"))&&(a.encoding=t.encoding),fe(le(t,"headers"))&&(a.headers=t.headers),me(le(t,"retryStatus"))&&(a.retryStatus=t.retryStatus),ce(le(t,"label"))&&(a.label=t.label),a}"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self&&self;function Be(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}var Ke={exports:{}};!function(e){e.exports=function(){var e=1e3,t=6e4,r=36e5,n="millisecond",a="second",s="minute",i="hour",o="day",l="week",u="month",c="quarter",h="year",f="date",g="Invalid Date",d=/^(\d{4})[-/]?(\d{1,2})?[-/]?(\d{0,2})[Tt\s]*(\d{1,2})?:?(\d{1,2})?:?(\d{1,2})?[.:]?(\d+)?$/,m=/\[([^\]]+)]|YYYY|YY|M{1,4}|D{1,2}|d{1,4}|H{1,2}|h{1,2}|a|A|m{1,2}|s{1,2}|Z{1,2}|SSS/g,p={name:"en",weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),ordinal:function(e){var t=["th","st","nd","rd"],r=e%100;return"["+e+(t[(r-20)%10]||t[r]||t[0])+"]"}},w=function(e,t,r){var n=String(e);return!n||n.length>=t?e:""+Array(t+1-n.length).join(r)+e},y={s:w,z:function(e){var t=-e.utcOffset(),r=Math.abs(t),n=Math.floor(r/60),a=r%60;return(t<=0?"+":"-")+w(n,2,"0")+":"+w(a,2,"0")},m:function e(t,r){if(t.date()<r.date())return-e(r,t);var n=12*(r.year()-t.year())+(r.month()-t.month()),a=t.clone().add(n,u),s=r-a<0,i=t.clone().add(n+(s?-1:1),u);return+(-(n+(r-a)/(s?a-i:i-a))||0)},a:function(e){return e<0?Math.ceil(e)||0:Math.floor(e)},p:function(e){return{M:u,y:h,w:l,d:o,D:f,h:i,m:s,s:a,ms:n,Q:c}[e]||String(e||"").toLowerCase().replace(/s$/,"")},u:function(e){return void 0===e}},$="en",S={};S[$]=p;var b="$isDayjsObject",_=function(e){return e instanceof A||!(!e||!e[b])},v=function e(t,r,n){var a;if(!t)return $;if("string"==typeof t){var s=t.toLowerCase();S[s]&&(a=s),r&&(S[s]=r,a=s);var i=t.split("-");if(!a&&i.length>1)return e(i[0])}else{var o=t.name;S[o]=t,a=o}return!n&&a&&($=a),a||!n&&$},D=function(e,t){if(_(e))return e.clone();var r="object"==typeof t?t:{};return r.date=e,r.args=arguments,new A(r)},M=y;M.l=v,M.i=_,M.w=function(e,t){return D(e,{locale:t.$L,utc:t.$u,x:t.$x,$offset:t.$offset})};var A=function(){function p(e){this.$L=v(e.locale,null,!0),this.parse(e),this.$x=this.$x||e.x||{},this[b]=!0}var w=p.prototype;return w.parse=function(e){this.$d=function(e){var t=e.date,r=e.utc;if(null===t)return new Date(NaN);if(M.u(t))return new Date;if(t instanceof Date)return new Date(t);if("string"==typeof t&&!/Z$/i.test(t)){var n=t.match(d);if(n){var a=n[2]-1||0,s=(n[7]||"0").substring(0,3);return r?new Date(Date.UTC(n[1],a,n[3]||1,n[4]||0,n[5]||0,n[6]||0,s)):new Date(n[1],a,n[3]||1,n[4]||0,n[5]||0,n[6]||0,s)}}return new Date(t)}(e),this.init()},w.init=function(){var e=this.$d;this.$y=e.getFullYear(),this.$M=e.getMonth(),this.$D=e.getDate(),this.$W=e.getDay(),this.$H=e.getHours(),this.$m=e.getMinutes(),this.$s=e.getSeconds(),this.$ms=e.getMilliseconds()},w.$utils=function(){return M},w.isValid=function(){return!(this.$d.toString()===g)},w.isSame=function(e,t){var r=D(e);return this.startOf(t)<=r&&r<=this.endOf(t)},w.isAfter=function(e,t){return D(e)<this.startOf(t)},w.isBefore=function(e,t){return this.endOf(t)<D(e)},w.$g=function(e,t,r){return M.u(e)?this[t]:this.set(r,e)},w.unix=function(){return Math.floor(this.valueOf()/1e3)},w.valueOf=function(){return this.$d.getTime()},w.startOf=function(e,t){var r=this,n=!!M.u(t)||t,c=M.p(e),g=function(e,t){var a=M.w(r.$u?Date.UTC(r.$y,t,e):new Date(r.$y,t,e),r);return n?a:a.endOf(o)},d=function(e,t){return M.w(r.toDate()[e].apply(r.toDate("s"),(n?[0,0,0,0]:[23,59,59,999]).slice(t)),r)},m=this.$W,p=this.$M,w=this.$D,y="set"+(this.$u?"UTC":"");switch(c){case h:return n?g(1,0):g(31,11);case u:return n?g(1,p):g(0,p+1);case l:var $=this.$locale().weekStart||0,S=(m<$?m+7:m)-$;return g(n?w-S:w+(6-S),p);case o:case f:return d(y+"Hours",0);case i:return d(y+"Minutes",1);case s:return d(y+"Seconds",2);case a:return d(y+"Milliseconds",3);default:return this.clone()}},w.endOf=function(e){return this.startOf(e,!1)},w.$set=function(e,t){var r,l=M.p(e),c="set"+(this.$u?"UTC":""),g=(r={},r[o]=c+"Date",r[f]=c+"Date",r[u]=c+"Month",r[h]=c+"FullYear",r[i]=c+"Hours",r[s]=c+"Minutes",r[a]=c+"Seconds",r[n]=c+"Milliseconds",r)[l],d=l===o?this.$D+(t-this.$W):t;if(l===u||l===h){var m=this.clone().set(f,1);m.$d[g](d),m.init(),this.$d=m.set(f,Math.min(this.$D,m.daysInMonth())).$d}else g&&this.$d[g](d);return this.init(),this},w.set=function(e,t){return this.clone().$set(e,t)},w.get=function(e){return this[M.p(e)]()},w.add=function(n,c){var f,g=this;n=Number(n);var d=M.p(c),m=function(e){var t=D(g);return M.w(t.date(t.date()+Math.round(e*n)),g)};if(d===u)return this.set(u,this.$M+n);if(d===h)return this.set(h,this.$y+n);if(d===o)return m(1);if(d===l)return m(7);var p=(f={},f[s]=t,f[i]=r,f[a]=e,f)[d]||1,w=this.$d.getTime()+n*p;return M.w(w,this)},w.subtract=function(e,t){return this.add(-1*e,t)},w.format=function(e){var t=this,r=this.$locale();if(!this.isValid())return r.invalidDate||g;var n=e||"YYYY-MM-DDTHH:mm:ssZ",a=M.z(this),s=this.$H,i=this.$m,o=this.$M,l=r.weekdays,u=r.months,c=r.meridiem,h=function(e,r,a,s){return e&&(e[r]||e(t,n))||a[r].slice(0,s)},f=function(e){return M.s(s%12||12,e,"0")},d=c||function(e,t,r){var n=e<12?"AM":"PM";return r?n.toLowerCase():n};return n.replace(m,function(e,n){return n||function(e){switch(e){case"YY":return String(t.$y).slice(-2);case"YYYY":return M.s(t.$y,4,"0");case"M":return o+1;case"MM":return M.s(o+1,2,"0");case"MMM":return h(r.monthsShort,o,u,3);case"MMMM":return h(u,o);case"D":return t.$D;case"DD":return M.s(t.$D,2,"0");case"d":return String(t.$W);case"dd":return h(r.weekdaysMin,t.$W,l,2);case"ddd":return h(r.weekdaysShort,t.$W,l,3);case"dddd":return l[t.$W];case"H":return String(s);case"HH":return M.s(s,2,"0");case"h":return f(1);case"hh":return f(2);case"a":return d(s,i,!0);case"A":return d(s,i,!1);case"m":return String(i);case"mm":return M.s(i,2,"0");case"s":return String(t.$s);case"ss":return M.s(t.$s,2,"0");case"SSS":return M.s(t.$ms,3,"0");case"Z":return a}return null}(e)||a.replace(":","")})},w.utcOffset=function(){return 15*-Math.round(this.$d.getTimezoneOffset()/15)},w.diff=function(n,f,g){var d,m=this,p=M.p(f),w=D(n),y=(w.utcOffset()-this.utcOffset())*t,$=this-w,S=function(){return M.m(m,w)};switch(p){case h:d=S()/12;break;case u:d=S();break;case c:d=S()/3;break;case l:d=($-y)/6048e5;break;case o:d=($-y)/864e5;break;case i:d=$/r;break;case s:d=$/t;break;case a:d=$/e;break;default:d=$}return g?d:M.a(d)},w.daysInMonth=function(){return this.endOf(u).$D},w.$locale=function(){return S[this.$L]},w.locale=function(e,t){if(!e)return this.$L;var r=this.clone(),n=v(e,t,!0);return n&&(r.$L=n),r},w.clone=function(){return M.w(this.$d,this)},w.toDate=function(){return new Date(this.valueOf())},w.toJSON=function(){return this.isValid()?this.toISOString():null},w.toISOString=function(){return this.$d.toISOString()},w.toString=function(){return this.$d.toUTCString()},p}(),x=A.prototype;return D.prototype=x,[["$ms",n],["$s",a],["$m",s],["$H",i],["$W",o],["$M",u],["$y",h],["$D",f]].forEach(function(e){x[e[1]]=function(t){return this.$g(t,e[0],e[1])}}),D.extend=function(e,t){return e.$i||(e(t,A,D),e.$i=!0),D},D.locale=v,D.isDayjs=_,D.unix=function(e){return D(1e3*e)},D.en=S[$],D.Ls=S,D.p={},D}()}(Ke);var Ge=Be(Ke.exports),Xe={exports:{}};!function(e){var t,r,n;e.exports=(t="minute",r=/[+-]\d\d(?::?\d\d)?/g,n=/([+-]|\d\d)/g,function(e,a,s){var i=a.prototype;s.utc=function(e){return new a({date:e,utc:!0,args:arguments})},i.utc=function(e){var r=s(this.toDate(),{locale:this.$L,utc:!0});return e?r.add(this.utcOffset(),t):r},i.local=function(){return s(this.toDate(),{locale:this.$L,utc:!1})};var o=i.parse;i.parse=function(e){e.utc&&(this.$u=!0),this.$utils().u(e.$offset)||(this.$offset=e.$offset),o.call(this,e)};var l=i.init;i.init=function(){if(this.$u){var e=this.$d;this.$y=e.getUTCFullYear(),this.$M=e.getUTCMonth(),this.$D=e.getUTCDate(),this.$W=e.getUTCDay(),this.$H=e.getUTCHours(),this.$m=e.getUTCMinutes(),this.$s=e.getUTCSeconds(),this.$ms=e.getUTCMilliseconds()}else l.call(this)};var u=i.utcOffset;i.utcOffset=function(e,a){var s=this.$utils().u;if(s(e))return this.$u?0:s(this.$offset)?u.call(this):this.$offset;if("string"==typeof e&&(e=function(e){void 0===e&&(e="");var t=e.match(r);if(!t)return null;var a=(""+t[0]).match(n)||["-",0,0],s=a[0],i=60*+a[1]+ +a[2];return 0===i?0:"+"===s?i:-i}(e),null===e))return this;var i=Math.abs(e)<=16?60*e:e;if(0===i)return this.utc(a);var o=this.clone();if(a)return o.$offset=i,o.$u=!1,o;var l=this.$u?this.toDate().getTimezoneOffset():-1*this.utcOffset();return(o=this.local().add(i+l,t)).$offset=i,o.$x.$localOffset=l,o};var c=i.format;i.format=function(e){var t=e||(this.$u?"YYYY-MM-DDTHH:mm:ss[Z]":"");return c.call(this,t)},i.valueOf=function(){var e=this.$utils().u(this.$offset)?0:this.$offset+(this.$x.$localOffset||this.$d.getTimezoneOffset());return this.$d.valueOf()-6e4*e},i.isUTC=function(){return!!this.$u},i.toISOString=function(){return this.toDate().toISOString()},i.toString=function(){return this.toDate().toUTCString()};var h=i.toDate;i.toDate=function(e){return"s"===e&&this.$offset?s(this.format("YYYY-MM-DD HH:mm:ss:SSS")).toDate():h.call(this)};var f=i.diff;i.diff=function(e,t,r){if(e&&this.$u===e.$u)return f.call(this,e,t,r);var n=this.local(),a=s(e).local();return f.call(n,a,t,r)}})}(Xe);var Ze=Be(Xe.exports);Ge.extend(Ze);let Je=/^[^T:]*$/;function Ve(e){let t=null,r=!1;if("number"==typeof e){if(0===e)return"";t=Ge.unix(e)}else if(e instanceof Date)t=Ge(e);else{if(!ce(e))return"";t=Ge(e),r=Je.test(e)}return t.isValid()?t.utcOffset(8,r).format("YYYY-MM-DD HH:mm:ss"):""}let Qe={timeout:3e4,maxRetries:5,baseDelayMs:3e3,maxDelayMs:15e3,label:"fetch-ai-news-aggregator"};let et={nbsp:" ",amp:"&",lt:"<",gt:">",quot:'"',apos:"'",hellip:"…",mdash:"—",ndash:"–",middot:"·",ldquo:'"',rdquo:'"',lsquo:"‘",rsquo:"’",laquo:"«",raquo:"»",copy:"©",reg:"®"};function tt(e){return ue(e)?e.replace(/&([a-zA-Z]+);/g,(e,t)=>void 0!==et[t]?et[t]:e).replace(/&#(\d+);/g,(e,t)=>String.fromCodePoint(Number(t))).replace(/&#x([\da-fA-F]+);/g,(e,t)=>String.fromCodePoint(parseInt(t,16))):""}function rt(e,t={}){if(!ue(e))return"";let r=le(t,"image");pe(r)||(r=!1);let n=e;return n=n.replace(/<script[\s\S]*?<\/script>/gi,""),n=n.replace(/<style[\s\S]*?<\/style>/gi,""),n=n.replace(/<!--[\s\S]*?-->/g,""),r&&(n=n.replace(/<img[^>]*src="([^"]+)"[^>]*\/?>/gi,(e,t)=>`![](${t})`)),n=n.replace(/<h[1-6][^>]*>([\s\S]*?)<\/h[1-6]>/gi,"\n\n**$1**\n\n"),n=n.replace(/<\/?(?:strong|b)(?:\s[^>]*)?>/gi,"**"),n=n.replace(/<\/?(?:em|i)(?:\s[^>]*)?>/gi,"*"),n=n.replace(/<br\s*\/?>/gi,"\n"),n=n.replace(/<a\s+[^>]*href="([^"]+)"[^>]*>([\s\S]*?)<\/a>/gi,(e,t,r)=>{let n=r.replace(/<[^>]+>/g,"").trim();return n?`[${n}](${t})`:""}),n=n.replace(/<p(?:\s[^>]*)?>/gi,""),n=n.replace(/<\/p>/gi,"\n\n"),n=n.replace(/<\/?(?:div|span|section|article|font|u)(?:\s[^>]*)?>/gi,""),n=n.replace(/<[^>]+>/g,""),n=tt(n),n=n.split("\n").map(e=>e.replace(/[ \t\u00A0]+/g," ").trimEnd()).join("\n"),n=n.replace(/\n{3,}/g,"\n\n").replace(/\*\*\s*\*\*/g,""),n.trim()}function nt(e,t){if(!ue(e))return null;if(!ce(t))return null;let r=`<div class="${t}"`,n=e.indexOf(r);if(-1===n)return null;let a=e.indexOf(">",n);if(-1===a)return null;let s=a+1,i=s,o=1;for(;o>0&&i<e.length;){let t=e.indexOf("<div",i),r=e.indexOf("</div>",i);if(-1===r)return null;if(-1!==t&&t<r)o++,i=t+4;else{if(o--,0===o)return e.slice(s,r);i=r+6}}return null}function at(e){return ue(e)||(e=String(null==e?"":e)),e.replace(/[\\/:*?"<>|]/g,"_").slice(0,200)}let st="https://www.aisixiang.com",it="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0 Safari/537.36",ot={responseType:"text",headers:{"User-Agent":it,"Accept-Language":"zh-CN,zh;q=0.9"},timeout:3e4,maxRetries:5,baseDelayMs:5e3,maxDelayMs:3e4,label:"fetch-aisixiang"};function lt(e={}){let t=le(e,"baseUrl");ce(t)||(t=st),t=t.replace(/\/+$/,"");let r=We(e,ot),n=le(e,"pageDelayMs");n=Ue(n)?je(n):1e3;let a=le(e,"maxPages");return a=Re(a)?Math.min(je(a),50):50,{baseUrl:t,useShowLog:r.useShowLog,pageDelayMs:n,maxPages:a,optFetch:r}}function ut(e,t){let r=nt(e,"search_list");if(null===r)return[];let n,a=[],s=new Set,i=/href="\/data\/(\d+)\.html"[^>]*title="([^"]+)"/g;for(;null!==(n=i.exec(r));){if(s.has(n[1]))continue;s.add(n[1]);let e=n[2],r=e.indexOf(":");a.push({aid:n[1],url:`${t}/data/${n[1]}.html`,title:r>0?e.slice(r+1).trim():e.trim(),author:r>0?e.slice(0,r).trim():""})}return a}function ct(e,t){let r,n=e.match(/([\s\S]+?)<div class="list_page">/),a=n?n[1]:e,s=[],i=new Set,o=/<a\s+href="\/data\/(\d+)\.html"[^>]*>([^<]+)<\/a>/g;for(;null!==(r=o.exec(a));){if(i.has(r[1]))continue;i.add(r[1]);let e=r[2].trim(),n=e.indexOf(":");s.push({aid:r[1],url:`${t}/data/${r[1]}.html`,title:n>0?e.slice(n+1).trim():e,author:n>0?e.slice(0,n).trim():""})}return s}function ht(e){let t=e.match(/<div class="list_page">([\s\S]+?)<\/div>/);if(!t)return 1;let r=[...t[1].matchAll(/page=(\d+)/g)].map(e=>Number(e[1]));return r.length?Math.max(...r):1}async function ft(e,t,r){let n=[],a=new Set,s=1,i=0;for(let o=1;o<=r.maxPages;o++){let l=e(o);r.useShowLog&&process.stderr.write(`[info] fetching page ${o}${s>1?`/${s}`:""} ...\n`);let u=await qe(l,r.optFetch);i++,1===o&&(s=ht(u));let c=t(u,r.baseUrl).filter(e=>!a.has(e.aid));if(0===c.length){r.useShowLog&&process.stderr.write(`[info] page ${o} 無新項目,停止翻頁\n`);break}for(let e of c)a.add(e.aid);if(n.push(...c),o>=s)break;await Ne(r.pageDelayMs)}return{items:n,total_pages:s,pages_fetched:i}}async function gt(e={}){let t=lt(e),r=[...(await qe(`${t.baseUrl}/thinktank/`,t.optFetch)).matchAll(/href="\/thinktank\/([^"]+?)\.html"[^>]*>([^<]+)</g)],n=new Map;for(let[,e,t]of r){let r=e.toLowerCase();if(n.has(r))continue;let a=t.split(/[,、]/)[0].trim();!a||a.length>30||n.set(r,{slug:e,name:a})}return[...n.values()]}function dt(e,t){return Array.isArray(e)&&e.find(e=>e.name===t)||null}async function mt(e={}){let t=lt(e),r=await qe(`${t.baseUrl}/zhuanti/`,t.optFetch),n=[{name:"学科",start:r.indexOf("<h3>学科关键词</h3>")},{name:"事件",start:r.indexOf("<h3>事件关键词</h3>")},{name:"人物",start:r.indexOf("<h3>人物关键词</h3>")}].filter(e=>e.start>=0).sort((e,t)=>e.start-t.start);n.push({name:null,start:r.length});let a=new Set,s=[];for(let e=0;e<n.length-1;e++){let t,i=r.slice(n[e].start,n[e+1].start),o=/href="\/zhuanti\/(\d+)\.html"[^>]*>([^<]+)</g;for(;null!==(t=o.exec(i));){if(a.has(t[1]))continue;a.add(t[1]);let r=t[2].trim().replace(/^\[|\]$/g,"").trim();!r||r.length>50||s.push({id:t[1],name:r,category:n[e].name})}}return s}function pt(e,t){return Array.isArray(e)&&e.find(e=>e.name===t)||null}let wt={BASE_URL:st,USER_AGENT:it,MAX_PAGES:50,safeFilename:at,fetchAuthorsList:gt,lookupAuthor:dt,fetchTopicsList:mt,lookupTopic:pt,fetchAuthorArticles:async function(e={}){let t=lt(e),r=le(e,"name");ce(r)||(r="");let n=le(e,"slug");if(ce(n)||(n=""),!r&&!n)throw new Error("需要 name 或 slug");let a=null,s=r,i=n;if(i)a={slug:i,url:`${t.baseUrl}/thinktank/${i}.html`};else{t.useShowLog&&process.stderr.write("[info] fetching authors list from /thinktank/ ...\n");let n=await gt(e),o=dt(n,r);if(!o)return{status:"success",site:"aisixiang",mode:"author",query:r,fetched_at:(new Date).toISOString(),authors_count:n.length,count:0,items:[],message:`"${r}" 不在愛思想專欄作者清單中(共 ${n.length} 位)。尚無此作者文章(此為查詢成功的真實結果、0 筆,非抓取失敗)。提醒:本函數不轉簡繁,呼叫端負責用站方登錄字形(通常是簡體)。`};i=o.slug,s=s||o.name,a={slug:i,url:`${t.baseUrl}/thinktank/${i}.html`,name:o.name}}let o=function(e,t){let r=["论文","时评","随笔","著作","演讲","读书","访谈","未分类"],n=[];for(let t of r){let r,a=new RegExp(`<h3>${t}<\\/h3>`,"g");for(;null!==(r=a.exec(e));)n.push({cat:t,pos:r.index})}n.sort((e,t)=>e.pos-t.pos),n.push({cat:null,pos:e.length});let a=[];for(let r=0;r<n.length-1;r++){let s,{cat:i,pos:o}=n[r],l=e.slice(o,n[r+1].pos),u=/<a\s+href="\/data\/(\d+)\.html"[^>]*>([\s\S]*?)<\/a>/g;for(;null!==(s=u.exec(l));){let e=s[2].replace(/<[^>]+>/g,"").trim();e&&a.push({aid:s[1],url:`${t}/data/${s[1]}.html`,title:e,category:i})}}return a}(await qe(a.url,t.optFetch),t.baseUrl),l={status:"success",site:"aisixiang",mode:"author",query:s||i,resolved:a,fetched_at:(new Date).toISOString(),count:o.length,items:o};return 0===o.length&&(l.message=`已命中愛思想作者欄頁(${a.url})但該欄頁目前 0 篇文章。此為查詢成功的真實結果(非抓取失敗);若 slug 為手動指定,請確認 slug 是否正確。`),l},fetchKeywordArticles:async function(e,t={}){if(!ce(e))throw new Error("需要 keyword");let r=lt(t),n=t=>`${r.baseUrl}/data/search?searchfield=keywords&keywords=${encodeURIComponent(e)}&page=${t}`,{items:a,total_pages:s,pages_fetched:i}=await ft(n,ut,r);return 0===a.length?{status:"success",site:"aisixiang",mode:"keyword",query:e,resolved:{search_url:n(1)},fetched_at:(new Date).toISOString(),count:0,items:[],message:`關鍵字 "${e}" 在愛思想無相關文章。提醒:站方搜尋只認簡體,呼叫端負責簡體化;若已是簡體仍 0 筆,該主題可能無 tag 索引。`}:{status:"success",site:"aisixiang",mode:"keyword",query:e,resolved:{search_url:n(1),total_pages:s,pages_fetched:i},fetched_at:(new Date).toISOString(),count:a.length,items:a}},fetchTitleArticles:async function(e,t={}){if(!ce(e))throw new Error("需要 keyword");let r=lt(t),n=t=>`${r.baseUrl}/data/search?searchfield=title&keywords=${encodeURIComponent(e)}&page=${t}`,{items:a,total_pages:s,pages_fetched:i}=await ft(n,ut,r);return 0===a.length?{status:"success",site:"aisixiang",mode:"title",query:e,resolved:{search_url:n(1)},fetched_at:(new Date).toISOString(),count:0,items:[],message:`標題關鍵字 "${e}" 在愛思想無相關文章。提醒:站方搜尋只認簡體,呼叫端負責簡體化。`}:{status:"success",site:"aisixiang",mode:"title",query:e,resolved:{search_url:n(1),total_pages:s,pages_fetched:i},fetched_at:(new Date).toISOString(),count:a.length,items:a}},fetchTopicArticles:async function(e={}){let t=lt(e),r=le(e,"keyword");ce(r)||(r="");let n=le(e,"id");if(ce(n)||(n=""),!r&&!n)throw new Error("需要 keyword 或 id");let a=n,s=r,i=null;if(a)i={id:a,url:`${t.baseUrl}/zhuanti/${a}.html`};else{t.useShowLog&&process.stderr.write("[info] fetching topics list from /zhuanti/ ...\n");let n=await mt(e),o=pt(n,r);if(!o)return{status:"success",site:"aisixiang",mode:"topic",query:r,fetched_at:(new Date).toISOString(),topics_count:n.length,count:0,items:[],message:`"${r}" 不在愛思想策展主題清單中(共 ${n.length} 個主題)。建議改用 fetchKeywordArticles('${r}') 查 keyword tag 結果。本函數不自動轉向,請呼叫端決定是否重試。`};a=o.id,s=o.name,i={id:a,name:o.name,category:o.category,url:`${t.baseUrl}/zhuanti/${a}.html`}}let{items:o,total_pages:l,pages_fetched:u}=await ft(e=>`${t.baseUrl}/zhuanti/${a}.html?page=${e}`,ct,t),c={status:"success",site:"aisixiang",mode:"topic",query:s||a,resolved:{...i,total_pages:l,pages_fetched:u},fetched_at:(new Date).toISOString(),count:o.length,items:o};return 0===o.length&&(c.message=`已命中愛思想策展主題(${i.url})但該主題頁目前 0 篇文章。此為查詢成功的真實結果(非抓取失敗);若需更多結果可改用 fetchKeywordArticles 查 keyword tag。`),c},fetchArticle:async function(e={}){let t=lt(e),r=le(e,"aid");ce(r)||(r="");let n=le(e,"url");ce(n)||(n="");let a=r?`${t.baseUrl}/data/${r}.html`:n;if(!a)throw new Error("需要 aid 或 url");let s=await qe(a,t.optFetch),i=function(e){let t=e.match(/<title>([\s\S]*?)<\/title>/i);return t?tt(t[1].trim()):null}(s),o=nt(s,"article-content");if(!i||!o)throw new Error(`解析失敗:title=${!!i}, content=${!!o}`);let l=rt(o),u=i.replace(/[_\-\s]*(?:_)?(?:爱思想|愛思想)\s*$/u,"").trim(),c=`---\ntitle: "${u}"\nsource: "${a}"\nauthor:\npublished:\ncreated: ${(new Date).toISOString().slice(0,10)}\ndescription:\n---\n${l}\n`;return{status:"success",site:"aisixiang",mode:"fetch",url:a,title:u,chars:l.length,markdown:c}}},yt={timeout:3e4,maxRetries:10,baseDelayMs:5e3,maxDelayMs:3e4,retryStatus:[403],label:"fetch-cnyes"};function $t(e,t,r){return ce(e)?function(e){if(!ce(e))return!1;try{let t=new URL(e);return"http:"===t.protocol||"https:"===t.protocol}catch{return!1}}(e)?null:{status:"error",url:e,message:"invalid url (must be http/https)",reason:"invalid-url",method:t,fetchedAt:r,attempts:0}:{status:"error",url:String(e),message:"url is required (string)",reason:"invalid-url",method:t,fetchedAt:r,attempts:0}}function St(e){return Re(e)?Math.min(3e3*e,15e3):3e3}function bt(e,t,r,n,a){let s=e?.[t];return n(s)?a?a(s):s:r}let _t={useLimitSafe:!0};function vt(e){return je(e)<=2147483647}function Dt(e,t,r){return bt(e,t,r,ce,null)}function Mt(e){let t=function(e){return{userAgent:Dt(e,"userAgent",""),referer:Dt(e,"referer",""),acceptLanguage:Dt(e,"acceptLanguage","")}}(e);return{userAgent:t.userAgent||"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36",referer:t.referer||"https://www.google.com/",acceptLanguage:t.acceptLanguage||"en-US,en;q=0.9,zh-TW;q=0.8"}}let At="curl";function xt(e){return e>=500||429===e}let Tt=t.promisify(e.execFile);async function Et(e,t={}){let r=(new Date).toISOString(),n=$t(e,At,r);if(n)return n;let a=function(e,t,r){return bt(e,t,r,e=>Re(e,_t)&&vt(e),je)}(t,"timeoutMs",15e3),s=function(e,t,r){return bt(e,t,r,e=>Ue(e,_t)&&vt(e),je)}(t,"maxRetries",5),{userAgent:i,referer:o,acceptLanguage:l}=Mt(t),u=0,c=await async function(e,t){let r=t.maxRetries,n=t.tag,a=!1!==t.useShowLog,s=null;for(let t=1;t<=r+1;t++){if(s=await e(t),s.ok)return{...s,attempts:t};if(!1===s.retryable||t>r)return{...s,attempts:t};let i=St(t);if(a){let e=s.logDetail||"error: "+(s.message||"unknown");process.stderr.write(`[${n}] ${e},等 ${i}ms 後重試 (${t}/${r})\n`)}await Ne(i)}return{...s,attempts:r+1}}(async()=>{try{let{stdout:t}=await Tt("curl",["-s","-L","--compressed","--max-time",String(Math.ceil(a/1e3)),"--write-out","\n%{http_code}\n%{url_effective}","-H","User-Agent: "+i,"-H","Accept: text/html,application/xhtml+xml","-H","Accept-Language: "+l,"-H","Referer: "+o,e],{encoding:"utf8",timeout:a+5e3,maxBuffer:10485760,windowsHide:!0}),r=t.trimEnd().split("\n"),n=r.pop(),s=parseInt(r.pop(),10)||0,c=r.join("\n");u=s;let h=function(e){return!e||e<400?null:{reason:"http-error",message:"HTTP "+e,httpCode:e,retryable:xt(e)}}(s);if(h){let t={ok:!1,retryable:h.retryable,reason:h.reason,message:h.message,httpCode:s};return h.retryable&&(t.logDetail=h.message+" "+e),t}return!c||c.length<100?{ok:!1,retryable:!1,reason:"empty-response",message:`response too short (${c?c.length:0} chars)`,httpCode:s}:{ok:!0,html:c,httpCode:s,finalUrl:n}}catch(e){let t=e.message||String(e);return{ok:!1,reason:"curl-error",message:t,httpCode:u||void 0,logDetail:"curl error: "+t}}},{maxRetries:s,tag:"fetchWebByCurl"});return c.ok?{status:"success",url:e,html:c.html,htmlLength:c.html.length,contentKind:"raw",httpCode:c.httpCode,finalUrl:c.finalUrl,method:At,fetchedAt:r,attempts:c.attempts}:{status:"error",url:e,message:c.message,reason:c.reason,httpCode:c.httpCode,method:At,fetchedAt:r,attempts:c.attempts}}let Ot="https://www.guancha.cn",kt="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36",Lt=[{slug:"CaiJing",name:"财经"},{slug:"economy",name:"财经-大頻道"},{slug:"JunShi",name:"军事"},{slug:"military-affairs",name:"军事-大頻道"},{slug:"ZhengZhi",name:"政治"},{slug:"WenHua",name:"文化"},{slug:"chanjing",name:"产经"},{slug:"qiche",name:"观出行"},{slug:"gongye-keji",name:"科技"},{slug:"ChengShi",name:"城事"},{slug:"GuanJinRong",name:"观金融"},{slug:"XinShiDai",name:"新时代"},{slug:"ChaoJiGongCheng",name:"超级工程"},{slug:"NengYuanZhanLue",name:"能源战略"},{slug:"RenGongZhiNeng",name:"人工智能"},{slug:"XinZhiGuanChaSuoNews",name:"心智观察所"},{slug:"YiLangJuShi",name:"伊朗局势"},{slug:"MeiGuoMeng",name:"美国一梦"},{slug:"MeiGuoJingJi",name:"美国经济"},{slug:"ELuoSiZhiSheng",name:"俄罗斯之声"},{slug:"lianganyuanzhuopai",name:"两岸圆桌派"},{slug:"ZheJiuShiZhongGuo",name:"这就是中国"},{slug:"YiZhouJunQingGuanCha",name:"一周军事观察"},{slug:"feizhoushangkou",name:"非洲之窗"},{slug:"toutiao",name:"观察者头条"},{slug:"gushi",name:"股市"},{slug:"guanwangwenyu",name:"新潮观鱼"},{slug:"jingtiriben",name:"冲破战后秩序 日本想干什么"},{slug:"DaoGuoDianAVI",name:"日本"}];function Ct(e={}){let t=le(e,"baseUrl");ce(t)||(t=Ot),t=t.replace(/\/+$/,"");let r=le(e,"maxRetries");r=Ue(r)?je(r):5;let n=le(e,"timeout");n=Re(n)?je(n):null;let a=le(e,"useShowLog");pe(a)||(a=!0);let s={userAgent:kt,referer:t,maxRetries:r};null!==n&&(s.timeoutMs=n);let i=le(e,"pageDelayMs");i=Ue(i)?je(i):1e3;let o=le(e,"maxPages");return o=Re(o)?Math.min(je(o),50):50,{baseUrl:t,useShowLog:a,pageDelayMs:i,maxPages:o,optFetch:s}}async function It(e,t){let r=await Et(e,t.optFetch);if("success"!==r.status){let t=new Error(r.message||"fetch failed");throw t.reason=r.reason,t.url=e,t.httpCode=r.httpCode,t}return r.html}function jt(e){let t=e.match(/<dt>[A-Z]<\/dt>/g);return!!t&&t.length>=5}function Rt(e,t){let r,n=e.replace(/\n/g," "),a=[],s=new Set,i=/<a[^>]+href="\/([A-Za-z][a-zA-Z0-9_-]+)\/(\d{4}_\d{2}_\d{2}_\d+)\.shtml"(?:[^>]*title="([^"]+)")?[^>]*>([^<]*)<\/a>/g;for(;null!==(r=i.exec(n));){let e=r[1],n=r[2],i=r[3]&&tt(r[3]).trim(),o=r[4]&&tt(r[4]).replace(/<[^>]+>/g,"").trim(),l=i||o||"",u=`${e}/${n}`;!s.has(u)&&l&&(s.add(u),a.push({url:`${t}/${e}/${n}.shtml`,title:l,slug:e}))}return a}async function Ut(e,t){let r=[],n=new Set,a=0;for(let s=1;s<=t.maxPages;s++){let i=`${t.baseUrl}/${e}/list_${s}.shtml`;t.useShowLog&&process.stderr.write(`[info] fetching ${e} list_${s} ...\n`);let o=null;try{o=await It(i,t)}catch(e){if(1===s)throw e;t.useShowLog&&process.stderr.write(`[info] page ${s} fetch error (assumed end of list): ${e.message}\n`);break}if(jt(o)){if(1===s){let t=new Error(`slug "${e}" 不存在:請求 list 頁被觀察者網 302 導向首頁。`);throw t.reason="redirected-to-homepage",t}t.useShowLog&&process.stderr.write(`[info] page ${s} 被導向首頁,視為到底,停止翻頁\n`);break}a++;let l=Rt(o,t.baseUrl).filter(e=>!n.has(e.url));if(0===l.length){t.useShowLog&&process.stderr.write(`[info] page ${s} 無新項目,停止翻頁\n`);break}for(let e of l)n.add(e.url);r.push(...l),s<t.maxPages&&await Ne(t.pageDelayMs)}return{items:r,pages_fetched:a}}async function Pt(e={}){let t=Ct(e);return function(e){let t=e.replace(/\n/g," "),r=[],n=new Set,a=[...t.matchAll(/<dt>([A-Z])<\/dt>\s*<dd[^>]*>([\s\S]*?)<\/dd>/g)];for(let[,e,t]of a){let a,s=/<a[^>]+href="(?:\.\.\/|\/)?([A-Za-z][a-zA-Z0-9_-]+)\/list_1\.shtml"[^>]*>([^<]+)<\/a>/g;for(;null!==(a=s.exec(t));){let t=a[1],s=tt(a[2]).trim();s&&!n.has(t)&&(n.add(t),r.push({slug:t,name:s,letter:e}))}}return r}(await It(`${t.baseUrl}/`,t))}function Nt(e,t){return Array.isArray(e)&&t&&e.find(e=>e.name===t)||null}function Yt(e){return e&&Lt.find(t=>t.name===e)||null}let Ft={timeout:3e4,maxRetries:5,baseDelayMs:3e3,maxDelayMs:15e3,label:"fetch-hacker-news"};let Ht={responseType:"text",timeout:3e4,maxRetries:10,baseDelayMs:5e3,maxDelayMs:3e4,retryStatus:[403],label:"fetch-moneydj"},qt=/^(\d{2}\/\d{2}\s+\d{2}:\d{2}|\d{2}:\d{2}|昨\s*\d{2}:\d{2})$/;let zt=5e3,Wt=3e4,Bt=[{name:"上市",marketKind:"sii"},{name:"上櫃",marketKind:"otc"},{name:"興櫃",marketKind:"rotc"},{name:"公開發行",marketKind:"pub"}];async function Kt(e,t,r){let n=null;for(let a=1;a<=r.maxRetries+1;a++){if(n=await e.evaluate(async e=>{try{let t=await fetch(e.url,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(e.payload)});if(t.status>=500||403===t.status||429===t.status)return{error:`HTTP ${t.status}`,retryable:!0};let r=await t.text();try{let e=JSON.parse(r),t=e&&e.code;return 200!==t&&406!==t?{error:`MOPS code ${t}: ${e&&e.message||""}`,json:e,raw:r.substring(0,500),retryable:!1}:{json:e,raw:r.substring(0,500)}}catch(e){return{error:"Parse Error",raw:r,retryable:!1}}}catch(e){return{error:e.toString(),retryable:!0}}},t),!n.error)return n;let s=!1!==n.retryable,i=r.maxRetries+1-a;if(!s||i<=0)return n;let o=Math.min(r.baseDelayMs*a,r.maxDelayMs);r.useShowLog&&console.warn(`[${t.name}][Retry ${a}/${r.maxRetries}] ${n.error} — 等待 ${o/1e3}s 後重試...`),await Ne(o)}return n}let Gt={responseType:"text",timeout:3e4,maxRetries:5,baseDelayMs:3e3,maxDelayMs:15e3,retryStatus:[404],label:"fetch-rss"};async function Xt(e,t){let r=await Et(e,{timeoutMs:t.timeout,maxRetries:t.maxRetries});if("success"!==r.status){let t=new Error(r.message||"curl fetch failed");throw t.statusCode=r.httpCode,t.reason=r.reason,t.url=e,t}return r.html}let Zt={responseType:"text",timeout:3e4,maxRetries:10,baseDelayMs:5e3,maxDelayMs:3e4,retryStatus:[403],label:"fetch-statementdog"},Jt=".statementdog-news-list-item";function Vt(e){if(!ce(e))return!1;if(!/^\d{8}$/.test(e))return!1;let t=je(e.slice(0,4)),r=je(e.slice(4,6)),n=je(e.slice(6,8)),a=new Date(t,r-1,n);return a.getFullYear()===t&&a.getMonth()===r-1&&a.getDate()===n}let Qt={responseType:"text",encoding:"big5",timeout:15e3,maxRetries:10,baseDelayMs:5e3,maxDelayMs:3e4,label:"fetch-taifex"},er={"外資及陸資":"foreign","外資":"foreign","投信":"trust","自營商":"dealers"};function tr(e){let t=[],r="",n=!1;for(let a=0;a<e.length;a++){let s=e[a];n?'"'===s?'"'===e[a+1]?(r+='"',a++):n=!1:r+=s:","===s?(t.push(r.trim()),r=""):'"'===s&&0===r.length?n=!0:r+=s}return t.push(r.trim()),t}function rr(e){let t=e.trim().split("\n").map(e=>e.trim()).filter(e=>e.length>0);if(t.length<2)return[];let r=tr(t[0]),n=[];for(let e=1;e<t.length;e++){let a=tr(t[e]),s={};for(let e=0;e<r.length;e++)s[r[e]]=a[e]||"";n.push(s)}return n}function nr(e){if(!e||"-"===e||""===e)return null;let t=Number(e.replace(/,/g,""));return isNaN(t)?null:t}function ar(e){if(!ce(e))return"";return`${parseInt(e.substring(0,4),10)-1911}/${e.substring(4,6)}/${e.substring(6,8)}`}let sr={timeout:15e3,maxRetries:10,baseDelayMs:5e3,maxDelayMs:3e4,label:"fetch-tpex-3insti"},ir=["代號","名稱","外陸資買進股數(不含外資自營商)","外陸資賣出股數(不含外資自營商)","外陸資買賣超股數(不含外資自營商)","外資自營商買進股數","外資自營商賣出股數","外資自營商買賣超股數","外資及陸資買進股數","外資及陸資賣出股數","外資及陸資買賣超股數","投信買進股數","投信賣出股數","投信買賣超股數","自營商買進股數(自行買賣)","自營商賣出股數(自行買賣)","自營商買賣超股數(自行買賣)","自營商買進股數(避險)","自營商賣出股數(避險)","自營商買賣超股數(避險)","自營商買進股數","自營商賣出股數","自營商買賣超股數","三大法人買賣超股數合計"];function or(e){return"string"!=typeof e?e:parseInt(e.replace(/,/g,""),10)||0}let lr={timeout:15e3,maxRetries:10,baseDelayMs:5e3,maxDelayMs:3e4,label:"fetch-tpex-margin"};let ur={timeout:15e3,maxRetries:10,baseDelayMs:5e3,maxDelayMs:3e4,label:"fetch-tpex-stock"};let cr={responseType:"text",timeout:3e4,maxRetries:10,baseDelayMs:5e3,maxDelayMs:3e4,label:"fetch-tw-data-holiday"};let hr={timeout:15e3,maxRetries:10,baseDelayMs:5e3,maxDelayMs:3e4,label:"fetch-twse-margin"};let fr={timeout:1e4,maxRetries:10,baseDelayMs:5e3,maxDelayMs:3e4,label:"fetch-twse-stock"};let gr={timeout:15e3,maxRetries:10,baseDelayMs:5e3,maxDelayMs:3e4,label:"fetch-twse-t86"};let dr={fetchRSS:async function(e,t={}){if(!ce(e)||!/^https?:\/\//i.test(e))throw new Error("rssUrl 須為有效的 http/https RSS 網址");let r=le(t,"method");"curl"!==r&&"auto"!==r&&(r="fetch");let n=le(t,"withContent");pe(n)||(n=!1);let s=await async function(e,t,r){if("curl"===t)return await Xt(e,r);if("auto"===t)try{return await Xt(e,r)}catch(t){return await qe(e,r)}return await qe(e,r)}(e,r,We(t,Gt)),i=new a,o=await i.parseString(s),l=String(le(o,"title","")||"").trim(),u=le(o,"items");return me(u)||(u=[]),u.map(e=>{let t={url:String(le(e,"link","")||"").trim(),time:Ve(le(e,"isoDate","")||le(e,"pubDate","")),title:String(le(e,"title","")||"").trim(),description:String(le(e,"contentSnippet","")||le(e,"summary","")||"").trim(),from:String(le(e,"creator","")||l).trim()};return n&&(t.content=function(e){if(!ue(e))return"";let t=e;return t=t.replace(/<script[\s\S]*?<\/script>/gi,""),t=t.replace(/<style[\s\S]*?<\/style>/gi,""),t=t.replace(/<\/(?:p|div|li|h[1-6])>/gi,"\n"),t=t.replace(/<br\s*\/?>/gi,"\n"),t=t.replace(/<[^>]+>/g,""),t=tt(t),t=t.replace(/\u00A0/g," "),t=t.split("\n").map(e=>e.replace(/[ \t]+/g," ").trim()).join("\n"),t=t.replace(/\n{3,}/g,"\n\n"),t.trim()}(le(e,"content:encoded","")||le(e,"content","")||le(e,"summary","")||le(e,"description",""))),t})},fetchHackerNews:async function(e=30,t={}){e=Re(e)?je(e):30;let r=le(t,"apiBase");ce(r)||(r="https://hacker-news.firebaseio.com/v0"),r=r.replace(/\/+$/,"");let n=We(t,Ft),a=await qe(`${r}/newstories.json`,n);me(a)||(a=[]);let s=a.slice(0,e),i=[];for(let e=0;e<s.length;e+=10){let t=s.slice(e,e+10),a=await Promise.allSettled(t.map(e=>qe(`${r}/item/${e}.json`,n)));for(let e of a)"fulfilled"===e.status&&i.push(e.value)}return i.filter(e=>e&&"story"===e.type).map(e=>({url:String(le(e,"url","")||`https://news.ycombinator.com/item?id=${le(e,"id","")}`).trim(),time:Ve(le(e,"time",0)),title:String(le(e,"title","")||"").trim(),description:"",from:"Hacker News"}))},fetchAiNewsAggregator:async function(e={}){let t=le(e,"url");ce(t)||(t="https://raw.githubusercontent.com/SuYxh/ai-news-aggregator/refs/heads/main/data/latest-24h.json");let r=le(await qe(t,We(e,Qe)),"items");return me(r)||(r=[]),r.map(e=>({url:String(le(e,"url","")||"").trim(),time:Ve(le(e,"published_at","")),title:String(le(e,"title","")||"").trim(),description:"",from:String(le(e,"source","")||"").trim()}))},fetchCnyes:async function(e={}){let t=le(e,"url");ce(t)||(t="https://api.cnyes.com/media/api/v1/newslist/category/tw_stock");let r=le(e,"targetTotal");r=Re(r)?je(r):100;let n=le(e,"pageLimit");n=Re(n)?je(n):30;let a=le(e,"daysBack");a=Re(a)?je(a):10;let s=le(e,"pageDelayMs");s=Ue(s)?je(s):500;let i=We(e,yt),o=i.useShowLog,l=Math.floor(Date.now()/1e3),u=l-86400*a;o&&console.log("Starting to fetch Anue (tw_stock) news...");let c=[],h=1;for(;c.length<r;){let e=new URLSearchParams({page:String(h),limit:String(n),isCategoryHeadline:"1",startAt:String(u),endAt:String(l)}),r=le(await qe(`${t}?${e.toString()}`,i),"items.data");if(!me(r)){o&&console.log("No more items found.");break}c=c.concat(r),o&&console.log(`Page ${h}: Fetched ${r.length} items. Total so far: ${c.length}`),h++,await Ne(s)}let f=c.slice(0,r);return o&&console.log(`Total items collected: ${f.length}`),f.map(e=>{let t=Ve(le(e,"publishAt",0));return""===t&&o&&console.warn(`[fetch-cnyes] 時間格式化失敗(newsId=${le(e,"newsId","")}, publishAt=${le(e,"publishAt","")}) — 該筆time退回空字串`),{time:t,title:le(e,"title",""),link:`https://news.cnyes.com/news/id/${le(e,"newsId","")}`}})},fetchMoneydj:async function(e={}){let t=le(e,"baseUrl");ce(t)||(t="https://www.moneydj.com/kmdj/news/newsreallist.aspx?a=mb06&index1=");let r=le(e,"totalPages");r=Re(r)?je(r):50;let n=le(e,"onPageDone");D(n)||(n=()=>{});let a=We(e,Ht),s=a.useShowLog,o=le(e,"pageDelayMs");o=Re(o)||0===o?je(o):null;let l=new URL(t).origin,u=async e=>{let r=await qe(`${t}${e}`,{...a,label:`${Ht.label} Page ${e}`}),n=i.load(r),s=[];return n("tr").each((e,t)=>{let r=n(t),a=r.find("td").eq(0).text().trim(),i=r.find("td").eq(1).find("a");if(a&&qt.test(a)&&i.length>0){let e=i.attr("title")||i.text().trim(),t=i.attr("href");if(t){let r=t.startsWith("http")?t:l+t;s.push({time:a,title:e,link:r})}}}),s},c=[];for(let e=1;e<=r;e++){let t=null;try{t=await u(e)}catch(t){s&&console.warn(`[Page ${e}] 抓取失敗,已跳過:${t.message}`);continue}c=c.concat(t),n(e,t.length,r),e<r&&await Ne(null===o?Math.floor(2e3*Math.random())+1e3:o)}if(0===c.length)throw new Error("抓取到 0 筆新聞,可能是頁面結構改變或 selector 失效,請確認 MoneyDJ 頁面是否正常。");return c},fetchStatementdog:async function(e={}){let t=le(e,"url");ce(t)||(t="https://statementdog.com/news/latest");let r=We(e,Zt),n=r.useShowLog;n&&console.log(`Fetching ${t}...`);let a=await qe(t,r),s=new URL(t).origin,o=i.load(a),l=o(Jt).length>0,u=l?Jt:'article, .news-item, [class*="news"][class*="item"]',c=l?".statementdog-news-list-item-title":'h2, h3, [class*="title"]',h=l?".statementdog-news-list-item-link":"a[href]",f=l?".statementdog-news-list-item-date":'time, [class*="date"], [class*="time"]';!l&&n&&console.warn("主要 CSS selector 未匹配,嘗試 fallback selector...");let g=[];if(o(u).each((e,t)=>{let r=o(t).find(c),n=l?o(t).find(h):o(t).find(h).first(),a=o(t).find(f),i=r.text().trim(),u=n.attr("href"),d=a.text().trim();i&&u&&(u.startsWith("http")||(u=`${s}${u.startsWith("/")?"":"/"}${u}`),g.push({time:d,title:i,link:u}))}),n&&console.log(`Extracted News Items: ${g.length}`),0===g.length)throw new Error("抓取到 0 筆新聞,可能是頁面結構改變或 selector 失效,請確認財報狗頁面是否正常。");return g},fetchMops:async function(e={}){let t=le(e,"pageUrl");ce(t)||(t="https://mops.twse.com.tw/mops/#/web/t146sb10");let r=le(e,"apiUrl");ce(r)||(r="https://mops.twse.com.tw/mops/api/t146sb10");let a=le(e,"maxRetries");a=Ue(a)?je(a):10;let s=le(e,"useShowLog");pe(s)||(s=!0);let i={maxRetries:a,baseDelayMs:zt,maxDelayMs:Wt,useShowLog:s},o=Bt.map(e=>{return{name:e.name,marketKind:e.marketKind,url:r,payload:(t=e.marketKind,{scopeType:"2",companyId:"",dateType:"2",firstDate:"",lastDate:"",marketKind:t,announcementBasis:"0",dateRangeType:"1",announcementType:"1",sort:"1",encodeURIComponent:1,step:1,firstin:1,off:1})};var t});s&&console.log("啟動瀏覽器...");let l=null;for(let e=1;e<=a+1;e++)try{l=await n.chromium.launch({headless:!0,executablePath:process.env.CHROME_PATH||void 0,channel:"chrome",args:["--no-sandbox","--disable-setuid-sandbox"],timeout:36e4});break}catch(t){if(a+1-e<=0)throw new Error(`瀏覽器啟動失敗(已重試 ${a} 次): ${t.message}`);let r=Math.min(zt*e,Wt);s&&console.warn(`[browser.launch][Retry ${e}/${a}] ${t.message} — 等待 ${r/1e3}s 後重試...`),await Ne(r)}try{let e=await l.newPage();s&&console.log("前往 MOPS 重大訊息頁面 (t146sb10)...");for(let r=1;r<=a+1;r++)try{await e.goto(t,{waitUntil:"networkidle",timeout:6e4});break}catch(e){if(a+1-r<=0)throw e;let t=Math.min(zt*r,Wt);s&&console.warn(`[page.goto][Retry ${r}/${a}] ${e.message} — 等待 ${t/1e3}s 後重試...`),await Ne(t)}await e.waitForTimeout(2e3);let r=[];for(let t of o){s&&console.log(`正在抓取 [${t.name}] 資料...`);let n=await Kt(e,t,i);r.push({market:t.name,marketKind:t.marketKind,data:n.json||n,...n.error&&{error:n.error},timestamp:(new Date).toISOString()}),await e.waitForTimeout(1e3)}if(s){let e=r.map(e=>{let t=le(e,"data.result",le(e,"data")),r=Array.isArray(t)?t.length:0;return`${e.market}: 取得 ${r} 筆資料`});console.log("抓取完成。摘要:",e)}let n=r.some(e=>e.error);return{results:r,hasError:n}}finally{await l.close()}},fetchTwseStock:async function(e,t,r={}){if(!Vt(e))throw new Error(`dateStr 須為合法之 YYYYMMDD 字串,得到: ${e}`);let n=le(r,"baseUrl");ce(n)||(n="https://www.twse.com.tw"),n=n.replace(/\/+$/,"");let a=We(r,fr),s=a.useShowLog,i=ce(t)&&"all"!==t.toLowerCase(),o=i?t:"ALLBUT0999",l="";l=i?`${n}/exchangeReport/STOCK_DAY?response=json&date=${e}&stockNo=${o}`:`${n}/exchangeReport/MI_INDEX?response=json&date=${e}&type=ALLBUT0999`,s&&(console.log(`Fetching TWSE data: ${e}, Stock: ${o}`),console.log(`URL: ${l}`));let u=await qe(l,a);if("OK"!==le(u,"stat"))throw new Error(`TWSE API returned: ${le(u,"stat")}`);if(i&&Array.isArray(u.data)){let r=ar(e),n=u.data.filter(e=>e[0]===r);if(u.data=n,0===n.length)throw new Error(`TWSE 個股 ${t} 於 ${e} 無交易資料(可能為假日或停盤)`)}return u},fetchTpexStock:async function(e,t,r={}){if(!Vt(e))throw new Error(`dateStr 須為合法之 YYYYMMDD 字串,得到: ${e}`);let n=le(r,"baseUrl");ce(n)||(n="https://www.tpex.org.tw"),n=n.replace(/\/+$/,"");let a=We(r,ur),s=a.useShowLog,i=me(t)?t:[],o=ar(e),l=`${n}/web/stock/aftertrading/daily_close_quotes/stk_quote_result.php?l=zh-tw&d=${o}&s=0,asc,0&o=json`;s&&(console.log(`Fetching TPEX data: ${e} (${o})`),console.log(`Target: ${i.length>0?i.join(", "):"All Market"}`),console.log(`URL: ${l}`));let u=await qe(l,a),c=Array.isArray(u.tables)?u.tables:[],h=c.find(e=>le(e,"title","").includes("行情")&&le(e,"data.length",0)>0)||c.find(e=>le(e,"data.length",0)>0),f=le(h,"data");if(!me(f))throw new Error("TPEX API returned no data. Possibly a holiday or data not yet available.");if(!Array.isArray(f[0])||f[0].length<8)throw new Error(`TPEX 行情資料欄數不符預期(首列 ${Array.isArray(f[0])?f[0].length:"N/A"} 欄,應 >= 8),可能 API 格式變更`);let g=f;if(i.length>0&&(g=g.filter(e=>i.includes(e[0])),0===g.length))throw new Error(`指定個股 ${i.join(",")} 在 ${e} 之上櫃資料中查無資料(可能為上市股、代碼有誤、或當日無交易)`);return{source:"tpex",date:e,count:g.length,data:g}},fetchTwseMargin:async function(e,t,r={}){if(!ce(e)||!/^\d{8}$/.test(e))throw new Error(`日期參數無效:格式須為 YYYYMMDD (收到 "${e}")`);if(!Vt(e))throw new Error(`日期參數無效:不合法的日期 (${e})`);let n=le(r,"baseUrl");ce(n)||(n="https://www.twse.com.tw"),n=n.replace(/\/+$/,"");let a=We(r,hr),s=a.useShowLog,i=me(t)?t.filter(Boolean):[],o=`${n}/rwd/zh/marginTrading/MI_MARGN?date=${e}&selectType=ALL&response=json`;s&&(console.log(`Fetching TWSE margin data: ${e}`),console.log(`Target: ${i.length>0?i.join(", "):"All Market"}`),console.log(`URL: ${o}`));let l=await qe(o,a);if("OK"!==le(l,"stat"))throw new Error(`TWSE MI_MARGN API returned: ${le(l,"stat")}`);let u=Array.isArray(l.tables)?l.tables:[],c=u.find(e=>le(e,"data.length",0)>0&&le(e,"title","").includes("融資融券彙總"));if(c||(c=u.find(e=>le(e,"data.length",0)>0&&Array.isArray(e.fields)&&e.fields.some(e=>String(e).includes("融資"))&&e.fields.some(e=>String(e).includes("融券")))),!c||!me(le(c,"data")))throw new Error("TWSE MI_MARGN: 找不到融資融券彙總資料表");if(!Array.isArray(c.fields)||c.fields.length<16)throw new Error(`TWSE 融資融券資料欄數不符預期(fields ${le(c,"fields.length","N/A")} 欄,應 >= 16),可能 API 格式變更`);let h=c.data;if(i.length>0&&(h=h.filter(e=>i.includes(String(e[0]||"").trim())),0===h.length))throw new Error(`指定個股 ${i.join(",")} 不在上市融資融券資料中(可能為上櫃股或代碼有誤)`);let f=h.map(e=>{let t=or(e[2]),r=or(e[3]),n=or(e[6]),a=or(e[5]),s=or(e[8]),i=or(e[9]),o=or(e[12]),l=or(e[11]);return{code:String(e[0]||"").trim(),name:String(e[1]||"").trim(),marginBuy:t,marginSell:r,marginCashRepay:or(e[4]),marginPrevBalance:a,marginBalance:n,marginChange:n-a,marginLimit:or(e[7]),shortSell:i,shortBuy:s,shortCashRepay:or(e[10]),shortPrevBalance:l,shortBalance:o,shortChange:o-l,shortLimit:or(e[13]),offset:or(e[14]),note:String(e[15]||"").trim()}});return s&&console.log(`Fetched ${f.length} records.`),{source:"twse_margin",date:e,count:f.length,data:f}},fetchTpexMargin:async function(e,t,r={}){if(!ce(e)||!/^\d{8}$/.test(e))throw new Error(`日期參數無效:格式須為 YYYYMMDD (收到 "${e}")`);if(!Vt(e))throw new Error(`日期參數無效:不合法的日期 (${e})`);let n=le(r,"baseUrl");ce(n)||(n="https://www.tpex.org.tw"),n=n.replace(/\/+$/,"");let a=We(r,lr),s=a.useShowLog,i=me(t)?t.filter(Boolean):[],o=ar(e),l=`${n}/web/stock/margin_trading/margin_balance/margin_bal_result.php?l=zh-tw&d=${o}&o=json`;s&&(console.log(`Fetching TPEX margin data: ${e} (${o})`),console.log(`Target: ${i.length>0?i.join(", "):"All Market"}`),console.log(`URL: ${l}`));let u=await qe(l,a),c=Array.isArray(u.tables)?u.tables:[],h=c.find(e=>le(e,"data.length",0)>0&&Array.isArray(e.fields)&&e.fields.some(e=>String(e).includes("資餘額"))&&e.fields.some(e=>String(e).includes("券餘額")))||c.find(e=>le(e,"data.length",0)>0);if(!h||!me(le(h,"data")))throw new Error("TPEX margin API returned no data. Possibly a holiday or data not yet available.");let f=Array.isArray(h.fields)?h.fields:[];if(!String(f[6]||"").includes("資餘額")||!String(f[14]||"").includes("券餘額"))throw new Error(`TPEX 融資融券資料欄位佈局與預期不符(index6 應含「資餘額」實為「${f[6]??""}」、index14 應含「券餘額」實為「${f[14]??""}」);可能 API 格式變更,停止解析以免產生錯誤資料`);let g=h.data;if(i.length>0&&(g=g.filter(e=>i.includes(String(e[0]||"").trim())),0===g.length))throw new Error(`指定個股 ${i.join(",")} 不在上櫃融資融券資料中(可能為上市股或代碼有誤)`);let d=g.map(e=>{let t=or(e[2]),r=or(e[3]),n=or(e[4]),a=or(e[6]),s=or(e[10]),i=or(e[11]),o=or(e[12]),l=or(e[14]);return{code:String(e[0]||"").trim(),name:String(e[1]||"").trim(),marginBuy:r,marginSell:n,marginCashRepay:or(e[5]),marginPrevBalance:t,marginBalance:a,marginChange:a-t,marginLimit:or(e[9]),shortSell:i,shortBuy:o,shortCashRepay:or(e[13]),shortPrevBalance:s,shortBalance:l,shortChange:l-s,shortLimit:or(e[17]),offset:or(e[18]),note:String(e[19]||"").trim()}});return s&&console.log(`Fetched ${d.length} records.`),{source:"tpex_margin",date:e,count:d.length,data:d}},fetchTwseT86:async function(e,t,r={}){if(!ce(e)||!/^\d{8}$/.test(e))throw new Error(`dateStr must be YYYYMMDD, got: ${e}`);if(!Vt(e))throw new Error(`dateStr 不是合法日期: ${e}`);let n=le(r,"baseUrl");ce(n)||(n="https://www.twse.com.tw"),n=n.replace(/\/+$/,"");let a=We(r,gr),s=a.useShowLog,i=me(t)?t:[],o=`${n}/rwd/zh/fund/T86?response=json&date=${e}&selectType=ALL`;s&&(console.log(`Fetching from: ${o}`),console.log(`Target: ${0===i.length?"All Market":i.join(", ")}`));let l=await qe(o,a);if("OK"!==le(l,"stat"))throw new Error(`TWSE T86 API returned: ${le(l,"stat")}`);let u=le(l,"fields"),c=le(l,"data");if(!Array.isArray(c))throw new Error("TWSE T86: data not found in response.");if(!Array.isArray(u))throw new Error("TWSE T86: fields not found in response.");let h=c.map(e=>{let t={};return u.forEach((r,n)=>{let a=e[n];"string"==typeof a&&(a=a.trim()),t[r]=a}),t});if(i.length>0){let e=u.find(e=>String(e).includes("證券代號"));if(!e)throw new Error("無法篩選個股:API 回應中找不到證券代號欄位");h=h.filter(t=>i.includes(t[e]))}return s&&console.log(`Fetched ${h.length} records.`),{source:"twse",date:e,data:h}},fetchTpex3insti:async function(e,t,r={}){if(!ce(e)||!/^\d{8}$/.test(e))throw new Error(`dateStr must be YYYYMMDD, got: ${e}`);if(!Vt(e))throw new Error(`dateStr 不是合法日期: ${e}`);let n=le(r,"baseUrl");ce(n)||(n="https://www.tpex.org.tw"),n=n.replace(/\/+$/,"");let a=We(r,sr),s=a.useShowLog,i=me(t)?t:[],o=`${n}/web/stock/3insti/daily_trade/3itrade_hedge_result.php?l=zh-tw&t=D&d=${ar(e)}&o=json`;s&&(console.log(`Fetching from: ${o}`),console.log(`Target: ${0===i.length?"All Market":i.join(", ")}`));let l=await qe(o,a);if(!me(le(l,"tables")))throw new Error("TPEX 3insti: tables not found in response. Possibly a holiday or no data.");let u=l.tables,c=u.find(e=>Array.isArray(e.fields)&&e.fields.some(e=>String(e).includes("代號"))&&e.fields.some(e=>String(e).includes("名稱")))||u[0],h=le(c,"fields"),f=le(c,"data");if(!Array.isArray(h)||!Array.isArray(f))throw new Error("TPEX 3insti: data/fields not found in table.");!function(e){if(e.length!==ir.length)throw new Error(`TPEX 3insti: 欄數異常,預期 ${ir.length} 得 ${e.length}(疑似 API 改版,請重新校準 TPEX_FIELD_MAP)`);if(!String(e[0]).includes("代號")||!String(e[1]).includes("名稱"))throw new Error(`TPEX 3insti: 前兩欄非「代號/名稱」(得「${e[0]}」「${e[1]}」,疑似 API 改版)`);if(!String(e[e.length-1]).includes("合計"))throw new Error(`TPEX 3insti: 末欄非「合計」(得「${e[e.length-1]}」,疑似 API 改版)`);let t=["買進股數","賣出股數","買賣超股數"];for(let r=2;r<e.length-1;r++){let n=t[(r-2)%3];if(String(e[r])!==n)throw new Error(`TPEX 3insti: 第 ${r} 欄預期「${n}」得「${e[r]}」(疑似 API 改版,欄序已變)`)}}(h);let g=f.map(e=>{let t={};return ir.forEach((r,n)=>{let a=e[n];"string"==typeof a&&(a=a.trim()),t[r]=a}),t}).filter(e=>0===i.length||i.includes(e["代號"]));return s&&console.log(`Fetched ${g.length} records.`),{source:"tpex",date:e,data:g}},fetchTaifex:async function(e,t={}){if(!ce(e)||!/^\d{8}$/.test(e))throw new Error(`dateStr 須為 YYYYMMDD 字串,得到: ${e}`);if(!Vt(e))throw new Error(`dateStr 非合法日期: ${e}`);let r=le(t,"baseUrl");ce(r)||(r="https://www.taifex.com.tw"),r=r.replace(/\/+$/,"");let n=We(t,Qt),a=n.useShowLog,s={baseUrl:r,useShowLog:a,optFetch:n},i=le(t,"interRequestDelayMs");i=Ue(i)?je(i):1e3;let o=`${e.substring(0,4)}/${e.substring(4,6)}/${e.substring(6,8)}`;a&&console.log(`Fetching TAIFEX data for ${e} (${o})`);let l=[],u=null,c=null,h=null;try{u=await async function(e,t){let r=`${t.baseUrl}/cht/3/futDataDown?down_type=1&queryStartDate=${e}&queryEndDate=${e}&commodity_id=TX`;t.useShowLog&&console.log(`Fetching futures data: ${r}`);let n=rr(await qe(r,{...t.optFetch,label:`${Qt.label} Futures`}));if(0===n.length)throw new Error("台指期行情:無資料(可能非交易日)");let a=n.filter(e=>"TX"===e["契約"]&&!e["到期月份(週別)"].includes("/"));if(0===a.length)throw new Error("台指期行情:找不到 TX 合約資料");a.sort((e,t)=>e["到期月份(週別)"].trim().localeCompare(t["到期月份(週別)"].trim()));let s=a[0]["到期月份(週別)"].trim(),i=a.filter(e=>e["到期月份(週別)"].trim()===s),o=i.find(e=>"一般"===e["交易時段"]),l=i.find(e=>"盤後"===e["交易時段"]),u={contractMonth:s,open:null,high:null,low:null,close:null,settlement:null,volume:null,afterHoursClose:null,afterHoursSettlement:null,afterHoursVolume:null};return o&&(u.open=nr(o["開盤價"]),u.high=nr(o["最高價"]),u.low=nr(o["最低價"]),u.close=nr(o["收盤價"]),u.settlement=nr(o["結算價"]),u.volume=nr(o["成交量"])),l&&(u.afterHoursClose=nr(l["收盤價"]),u.afterHoursSettlement=nr(l["結算價"]),u.afterHoursVolume=nr(l["成交量"])),t.useShowLog&&(console.log(` 台指期近月 (${s}): 開${u.open} 高${u.high} 低${u.low} 收${u.close} 結算${u.settlement} 量${u.volume}`),null!==u.afterHoursClose&&console.log(` 盤後: 收${u.afterHoursClose} 結算${u.afterHoursSettlement} 量${u.afterHoursVolume}`)),u}(o,s)}catch(e){let t=`台指期行情: ${le(e,"message",e)}`;a&&console.error(t),l.push(t)}await Ne(i);try{c=await async function(e,t){let r=`${t.baseUrl}/cht/3/futContractsDateDown?queryStartDate=${e}&queryEndDate=${e}&commodityId=TXF`;t.useShowLog&&console.log(`Fetching institutional data: ${r}`);let n=rr(await qe(r,{...t.optFetch,label:`${Qt.label} Institutional`}));if(0===n.length)throw new Error("三大法人期貨未平倉:無資料(可能非交易日)");let a={};for(let e of n){let r=e["身份別"],n=er[r];n&&(a[n]={longContracts:nr(e["多方未平倉口數"]),longAmount:nr(e["多方未平倉契約金額(千元)"]),shortContracts:nr(e["空方未平倉口數"]),shortAmount:nr(e["空方未平倉契約金額(千元)"]),netContracts:nr(e["多空未平倉口數淨額"]),netAmount:nr(e["多空未平倉契約金額淨額(千元)"]),tradingLong:nr(e["多方交易口數"]),tradingShort:nr(e["空方交易口數"]),tradingNet:nr(e["多空交易口數淨額"])},t.useShowLog&&console.log(` ${r}: 未平倉淨額 ${a[n].netContracts} 口`))}if(0===Object.keys(a).length)throw new Error("三大法人期貨未平倉:無法解析身份別(可能官方變更欄位用語)");return a}(o,s)}catch(e){let t=`三大法人: ${le(e,"message",e)}`;a&&console.error(t),l.push(t)}await Ne(i);try{h=await async function(e,t){let r=`${t.baseUrl}/cht/3/pcRatioDown?queryStartDate=${e}&queryEndDate=${e}`;t.useShowLog&&console.log(`Fetching P/C ratio: ${r}`);let n=rr(await qe(r,{...t.optFetch,label:`${Qt.label} PCRatio`}));if(0===n.length)throw new Error("Put/Call Ratio:無資料(可能非交易日)");let a=n[0],s={putVolume:nr(a["賣權成交量"]),callVolume:nr(a["買權成交量"]),ratio:nr(a["買賣權成交量比率%"]),putOpenInterest:nr(a["賣權未平倉量"]),callOpenInterest:nr(a["買權未平倉量"]),openInterestRatio:nr(a["買賣權未平倉量比率%"])};return t.useShowLog&&console.log(` Put ${s.putVolume} / Call ${s.callVolume} = ${s.ratio}%`),s}(o,s)}catch(e){let t=`Put/Call Ratio: ${le(e,"message",e)}`;a&&console.error(t),l.push(t)}if(!(u||c||h)){let e=new Error(`所有資料抓取失敗: ${l.join("; ")}`);throw e.errors=l,e}return{date:e,futures:u?{tx:u}:null,institutional:c||null,pcRatio:h||null,errors:l}},fetchTwDataHoliday:async function(e,t={}){let r=le(t,"url");ce(r)||(r="https://openapi.twse.com.tw/v1/holidaySchedule/holidaySchedule");let n=We(t,cr),a=await qe(r,n),s=null;try{s=JSON.parse(a)}catch(e){throw new Error("API 回傳非 JSON 格式(可能為維護頁面或網路中介),請稍後再試")}if(!me(s))throw new Error("API 回傳空陣列或格式異常");let i=s.filter(e=>!function(e){let t=String(le(e,"Name","")),r=String(le(e,"Description",""));return/交易日/.test(t)||/市場無交易/.test(t)||/開始交易/.test(r)||/最後交易/.test(r)}(e)).map(e=>{return{date:(t=le(e,"Date",""),`${parseInt(t.substring(0,t.length-4),10)+1911}${t.substring(t.length-4)}`),rocDate:le(e,"Date",""),name:le(e,"Name",""),weekday:le(e,"Weekday",""),description:String(le(e,"Description","")||"").replace(/<br\s*\/?>/gi,"").trim()};var t}),o=new Set,l=i.filter(e=>!o.has(e.date)&&(o.add(e.date),!0));l.sort((e,t)=>e.date.localeCompare(t.date));let u={dataYear:l.length>0?l[0].date.substring(0,4):null,totalHolidays:l.length,holidays:l};if(ce(e)&&/^\d{8}$/.test(e)){u.checkDate=e;let t=l.find(t=>t.date===e);u.isHoliday=!!t,u.holidayName=t?t.name:null}return u},fetchAisixiang:wt,fetchGuancha:{BASE_URL:Ot,USER_AGENT:kt,MAX_PAGES:50,KNOWN_TOPICS:Lt,safeFilename:at,fetchAuthorsList:Pt,lookupAuthor:Nt,lookupTopic:Yt,fetchAuthorArticles:async function(e={}){let t=Ct(e),r=le(e,"name");ce(r)||(r="");let n=le(e,"slug");if(ce(n)||(n=""),!r&&!n)throw new Error("需要 name 或 slug");let a=n,s=r;if(!a){t.useShowLog&&process.stderr.write("[info] fetching authors index from / ...\n");let n=await Pt(e),i=Nt(n,r);if(!i)return{status:"success",site:"guancha",mode:"author",query:r,fetched_at:(new Date).toISOString(),authors_count:n.length,count:0,items:[],message:`"${r}" 不在觀察者網作者索引中(共 ${n.length} 位)。尚無此作者文章。提醒:本函數不轉繁簡,呼叫端負責用站方登錄字形(簡體)。`};a=i.slug,s=i.name}let i=`${t.baseUrl}/${a}`,o=null;try{o=await Ut(a,t)}catch(e){return{status:"error",site:"guancha",mode:"author",query:s||a,resolved:{slug:a,url:i,name:s},fetched_at:(new Date).toISOString(),reason:e.reason,error:e.message}}return{status:"success",site:"guancha",mode:"author",query:s||a,resolved:{slug:a,url:i,name:s,pages_fetched:o.pages_fetched},fetched_at:(new Date).toISOString(),count:o.items.length,items:o.items}},fetchKeywordArticles:async function(e,t={}){if(!ce(e))throw new Error("需要 keyword");return{status:"error",site:"guancha",mode:"keyword",query:e,fetched_at:(new Date).toISOString(),error:"unsupported-by-curl",message:"觀察者網搜尋 API(s.guancha.cn/main/search-v2)由 sojson.v4 混淆並走 MD5 簽名,本函數(純 curl 路徑)無法支援。如已知作者拼音 slug,請改用 fetchAuthorArticles({ slug });如已知主題 slug,請改用 fetchTopicArticles({ slug })。"}},fetchTitleArticles:async function(e,t={}){if(!ce(e))throw new Error("需要 keyword");return{status:"error",site:"guancha",mode:"title",query:e,fetched_at:(new Date).toISOString(),error:"unsupported-by-curl",message:"觀察者網無分「標題」與「全文」搜尋(兩者同源),搜尋 API 由 sojson.v4 混淆並走 MD5 簽名,本函數(純 curl 路徑)無法支援。如已知作者拼音 slug,請改用 fetchAuthorArticles({ slug })。"}},fetchTopicArticles:async function(e={}){let t=Ct(e),r=le(e,"name");ce(r)||(r="");let n=le(e,"slug");if(ce(n)||(n=""),!r&&!n)throw new Error("需要 name 或 slug");let a=n,s=r;if(!a){let e=Yt(r);if(!e)return{status:"error",site:"guancha",mode:"topic",query:r,fetched_at:(new Date).toISOString(),topics_count:Lt.length,error:"topic-not-in-table",message:`主題 "${r}" 不在已知主題對照表中(共 ${Lt.length} 個)。觀察者網無公開主題清單頁,本函數採手工對照。建議直接傳 slug(拼音 slug)。本函數不自動轉向,請呼叫端決定是否重試。`};a=e.slug,s=e.name}let i=`${t.baseUrl}/${a}`,o=null;try{o=await Ut(a,t)}catch(e){return{status:"error",site:"guancha",mode:"topic",query:s||a,resolved:{slug:a,url:i,name:s},fetched_at:(new Date).toISOString(),reason:e.reason,error:e.message}}return{status:"success",site:"guancha",mode:"topic",query:s||a,resolved:{slug:a,url:i,name:s,pages_fetched:o.pages_fetched},fetched_at:(new Date).toISOString(),count:o.items.length,items:o.items}},fetchArticle:async function(e={}){let t=Ct(e),r=le(e,"url");if(!ce(r))throw new Error("需要 url");let n=null;try{n=await It(r,t)}catch(e){return{status:"error",site:"guancha",mode:"fetch",url:r,fetched_at:(new Date).toISOString(),error:e.message||"fetch failed"}}let a=function(e){let t=e.match(/<title>([\s\S]*?)<\/title>/i);return t?tt(t[1].trim()):null}(n)||"",s=nt(n,"content all-txt");if("观察者网"===a||"觀察者網"===a||!s)return{status:"error",site:"guancha",mode:"fetch",url:r,fetched_at:(new Date).toISOString(),error:"article-not-found",message:`無此文章(title="${a}",可能已下架或 URL 不正確)。`};let i=a.replace(/[_\-\s||]*(?:观察者网|觀察者網)\s*$/u,"").trim(),o=function(e){let t=e.match(/【([^】]{4,120})】/);return t?t[1].replace(/<[^>]+>/g,"").trim():null}(s)||"",l=function(e){let t=e.match(/<span[^>]*>(20\d{2}-\d{2}-\d{2}\s+\d{2}:\d{2}:\d{2})<\/span>/);return t?t[1]:null}(n)||"",u=(new Date).toISOString().slice(0,10),c=rt(s,{image:!0}),h=e=>String(e).replace(/"/g,'\\"'),f=`---\ntitle: "${h(i)}"\nsource: "${r}"\nauthor: "${h(o)}"\npublished: "${l}"\ncreated: ${u}\ndescription:\n---\n${c}\n`;return{status:"success",site:"guancha",mode:"fetch",url:r,title:i,author:o,published:l,chars:c.length,markdown:f}}}};return dr});
7
7
  //# sourceMappingURL=w-dwdata-hub.umd.js.map