tds-map-methods 0.0.0-stage → 0.1.1
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.
- package/README.md +30 -2
- package/index.cjs +280 -0
- package/index.js +8445 -0
- package/package.json +30 -4
- package/types/components/map/methods/arrowLayer.d.ts +25 -0
- package/types/components/map/methods/common.d.ts +1 -0
- package/types/components/map/methods/config.d.ts +32 -0
- package/types/components/map/methods/createIsoline.d.ts +76 -0
- package/types/components/map/methods/createMic.d.ts +28 -0
- package/types/components/map/methods/fcstLayer.d.ts +81 -0
- package/types/components/map/methods/fcstLayer2.d.ts +30 -0
- package/types/components/map/methods/girdLayer.d.ts +62 -0
- package/types/components/map/methods/index.d.ts +21 -0
- package/types/components/map/methods/isolineLayer.d.ts +18 -0
- package/types/components/map/methods/layer.d.ts +41 -0
- package/types/components/map/methods/layerRequest.d.ts +7 -0
- package/types/components/map/methods/micLayer.d.ts +28 -0
- package/types/components/map/methods/request.d.ts +21 -0
- package/types/components/map/methods/tdsRequest.d.ts +49 -0
- package/types/components/map/methods/typhoonLayer.d.ts +57 -0
- package/types/components/map/methods/typhoonRequest.d.ts +49 -0
- package/types/components/map/methods/utils.d.ts +97 -0
- package/types/components/map/methods/webgpuRaster.d.ts +13 -0
- package/types/components/map/methods/windLayer.d.ts +23 -0
- package/types/components/map/methods/windShaft.d.ts +43 -0
- package/types/components/map/methods/wmsLayer.d.ts +36 -0
- package/types/typings/layer.d.ts +226 -0
package/index.cjs
ADDED
|
@@ -0,0 +1,280 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const Ze=require("dayjs"),Ke=require("lodash-es"),zr=require("dayjs/plugin/utc.js"),tr=require("@turf/turf"),Mn=require("ol"),On=require("ol/View.js"),nt=require("ol/proj.js"),qr=require("ol/layer/Tile.js"),Vr=require("ol/source.js"),kt=require("ol/source/ImageCanvas.js"),Ct=require("ol/layer/Image.js"),It=require("d3-contour"),Gr=require("ol/format/GeoJSON.js"),ot=require("ol/layer/Vector.js"),yt=require("ol/source/Vector.js"),j=require("ol/style.js"),Jt=require("ol/Feature.js"),Zt=require("ol/geom.js");function Xn(n){const e=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(n){for(const t in n)if(t!=="default"){const r=Object.getOwnPropertyDescriptor(n,t);Object.defineProperty(e,t,r.get?r:{enumerable:!0,get:()=>n[t]})}}return e.default=n,Object.freeze(e)}const Q=Xn(tr);function Hn(){}const kr={serviceBaseUrl:"",serviceAuthorization:"",ncssBaseUrl:"/ncss/grid",requestTimeout:6e4,imageSize:2048,typhoonServiceBaseUrl:"",typhoonDataPath:"data/script/mdp_typhoon/output",typhoonAuthorization:""};let me={...kr};function Kt(n){return String(n??"").trim().replace(/\/+$/,"")}function wr(n,e){const t=Number(n);return Number.isFinite(t)&&t>0?Math.round(t):e}function Qr(n){me={...me,...n,serviceBaseUrl:n.serviceBaseUrl===void 0?me.serviceBaseUrl:Kt(n.serviceBaseUrl),serviceAuthorization:n.serviceAuthorization===void 0?me.serviceAuthorization:String(n.serviceAuthorization),ncssBaseUrl:n.ncssBaseUrl===void 0?me.ncssBaseUrl:Kt(n.ncssBaseUrl),requestTimeout:wr(n.requestTimeout,me.requestTimeout),imageSize:wr(n.imageSize,me.imageSize),typhoonServiceBaseUrl:n.typhoonServiceBaseUrl===void 0?me.typhoonServiceBaseUrl:Kt(n.typhoonServiceBaseUrl),typhoonDataPath:n.typhoonDataPath===void 0?me.typhoonDataPath:String(n.typhoonDataPath).replace(/^\/+|\/+$/g,""),typhoonAuthorization:n.typhoonAuthorization===void 0?me.typhoonAuthorization:String(n.typhoonAuthorization)}}function Ae(){return{...me}}function In(){me={...kr}}function Rn(n){return String(n??"").trim().replace(/\/+$/,"")}function zn(n){return/^(?:[a-z]+:)?\/\//i.test(n)||/^(?:data|blob):/i.test(n)}function jr(n,e){const t=String(n||"").trim();if(!t||zn(t))return t;const r=Ae(),i=Rn(e===void 0?r.serviceBaseUrl:e);return i?t===i||t.startsWith(i+"/")?t:i+"/"+t.replace(/^\/+/,""):t.startsWith("/")?t:"/"+t}function qn(n,e){const t=new AbortController,r=()=>t.abort(n?.reason);n?.aborted?r():n?.addEventListener("abort",r,{once:!0});const i=e>0?setTimeout(()=>t.abort(new Error("Request timeout")),e):void 0;return{signal:t.signal,cleanup(){i&&clearTimeout(i),n?.removeEventListener("abort",r)}}}async function Vn(n){try{return(await n.text()).slice(0,240)}catch{return""}}async function Qt(n,e={}){const t=Ae(),r=Number(e.timeout??t.requestTimeout),i=qn(e.signal,Number.isFinite(r)?r:6e4),o=new Headers(e.headers),u=e.authorization??t.serviceAuthorization;u&&!o.has("Authorization")&&o.set("Authorization",u);try{const s=await fetch(jr(n,e.baseUrl),{credentials:e.credentials??"include",signal:i.signal,headers:o});if(!s.ok){const l=await Vn(s);throw new Error("TDS request failed: "+s.status+" "+s.statusText+(l?"; "+l:""))}return s}finally{i.cleanup()}}function Gn(n,e){if(!e)return n;const t=new URLSearchParams;Object.entries(e).forEach(([i,o])=>{o!=null&&t.set(i,String(o))});const r=t.toString();return r?n+(n.includes("?")?"&":"?")+r:n}async function jt(n,e,t,r={}){const i=await Qt(Gn(n,e),{...r,authorization:t??r.authorization});switch(r.responseType??"json"){case"response":return i;case"text":return await i.text();case"blob":return await i.blob();case"arrayBuffer":case"arraybuffer":return await i.arrayBuffer();default:return await i.json()}}async function fr(n,e,t){const r=await Qt(n,{...t,authorization:e??t?.authorization}),i=(r.headers.get("content-type")||"").toLowerCase(),o=await r.text(),u=o.trimStart().toLowerCase();if(i.includes("text/html")||u.startsWith("<!doctype html")||u.startsWith("<html"))throw new Error("TDS XML response is HTML. Check serviceBaseUrl/ncssBaseUrl: "+r.url+"; "+o.slice(0,240));return o}function Wr(n,e,t){return fr(n,e,t)}function kn(n,e,t,r){return jt(n,e,t,{...r,responseType:"text"})}function Qn(n,e,t){return jt(n,void 0,e,{...t,responseType:"arrayBuffer"})}function jn(n){return new Promise((e,t)=>{const r=new FileReader;r.onload=()=>typeof r.result=="string"?e(r.result):t(new Error("Blob to base64 failed")),r.onerror=()=>t(r.error??new Error("Read blob failed")),r.readAsDataURL(n)})}async function Ur(n,e,t,r){const u=await jt(n,typeof e=="string"?void 0:e,typeof e=="string"?e:t,{...r,responseType:"blob"});return jn(u)}function Wn(n,e){return Ur(n,e)}function Un(n){return n&&n.__esModule&&Object.prototype.hasOwnProperty.call(n,"default")?n.default:n}var Rt={exports:{}},At={},Pe={},Qe={},Cr;function Wt(){if(Cr)return Qe;Cr=1;function n(o,u,s){if(s===void 0&&(s=Array.prototype),o&&typeof s.find=="function")return s.find.call(o,u);for(var l=0;l<o.length;l++)if(Object.prototype.hasOwnProperty.call(o,l)){var d=o[l];if(u.call(void 0,d,l,o))return d}}function e(o,u){return u===void 0&&(u=Object),u&&typeof u.freeze=="function"?u.freeze(o):o}function t(o,u){if(o===null||typeof o!="object")throw new TypeError("target is not an object");for(var s in u)Object.prototype.hasOwnProperty.call(u,s)&&(o[s]=u[s]);return o}var r=e({HTML:"text/html",isHTML:function(o){return o===r.HTML},XML_APPLICATION:"application/xml",XML_TEXT:"text/xml",XML_XHTML_APPLICATION:"application/xhtml+xml",XML_SVG_IMAGE:"image/svg+xml"}),i=e({HTML:"http://www.w3.org/1999/xhtml",isHTML:function(o){return o===i.HTML},SVG:"http://www.w3.org/2000/svg",XML:"http://www.w3.org/XML/1998/namespace",XMLNS:"http://www.w3.org/2000/xmlns/"});return Qe.assign=t,Qe.find=n,Qe.freeze=e,Qe.MIME_TYPE=r,Qe.NAMESPACE=i,Qe}var Br;function Yr(){if(Br)return Pe;Br=1;var n=Wt(),e=n.find,t=n.NAMESPACE;function r(c){return c!==""}function i(c){return c?c.split(/[\t\n\f\r ]+/).filter(r):[]}function o(c,f){return c.hasOwnProperty(f)||(c[f]=!0),c}function u(c){if(!c)return[];var f=i(c);return Object.keys(f.reduce(o,{}))}function s(c){return function(f){return c&&c.indexOf(f)!==-1}}function l(c,f){for(var m in c)Object.prototype.hasOwnProperty.call(c,m)&&(f[m]=c[m])}function d(c,f){var m=c.prototype;if(!(m instanceof f)){let x=function(){};x.prototype=f.prototype,x=new x,l(m,x),c.prototype=m=x}m.constructor!=c&&(typeof c!="function"&&console.error("unknown Class:"+c),m.constructor=c)}var h={},a=h.ELEMENT_NODE=1,D=h.ATTRIBUTE_NODE=2,p=h.TEXT_NODE=3,A=h.CDATA_SECTION_NODE=4,w=h.ENTITY_REFERENCE_NODE=5,v=h.ENTITY_NODE=6,B=h.PROCESSING_INSTRUCTION_NODE=7,N=h.COMMENT_NODE=8,E=h.DOCUMENT_NODE=9,L=h.DOCUMENT_TYPE_NODE=10,X=h.DOCUMENT_FRAGMENT_NODE=11,R=h.NOTATION_NODE=12,S={},z={};S.INDEX_SIZE_ERR=(z[1]="Index size error",1),S.DOMSTRING_SIZE_ERR=(z[2]="DOMString size error",2);var C=S.HIERARCHY_REQUEST_ERR=(z[3]="Hierarchy request error",3);S.WRONG_DOCUMENT_ERR=(z[4]="Wrong document",4),S.INVALID_CHARACTER_ERR=(z[5]="Invalid character",5),S.NO_DATA_ALLOWED_ERR=(z[6]="No data allowed",6),S.NO_MODIFICATION_ALLOWED_ERR=(z[7]="No modification allowed",7);var P=S.NOT_FOUND_ERR=(z[8]="Not found",8);S.NOT_SUPPORTED_ERR=(z[9]="Not supported",9);var F=S.INUSE_ATTRIBUTE_ERR=(z[10]="Attribute in use",10);S.INVALID_STATE_ERR=(z[11]="Invalid state",11),S.SYNTAX_ERR=(z[12]="Syntax error",12),S.INVALID_MODIFICATION_ERR=(z[13]="Invalid modification",13),S.NAMESPACE_ERR=(z[14]="Invalid namespace",14),S.INVALID_ACCESS_ERR=(z[15]="Invalid access",15);function M(c,f){if(f instanceof Error)var m=f;else m=this,Error.call(this,z[c]),this.message=z[c],Error.captureStackTrace&&Error.captureStackTrace(this,M);return m.code=c,f&&(this.message=this.message+": "+f),m}M.prototype=Error.prototype,l(S,M);function I(){}I.prototype={length:0,item:function(c){return c>=0&&c<this.length?this[c]:null},toString:function(c,f){for(var m=[],x=0;x<this.length;x++)Me(this[x],m,c,f);return m.join("")},filter:function(c){return Array.prototype.filter.call(this,c)},indexOf:function(c){return Array.prototype.indexOf.call(this,c)}};function g(c,f){this._node=c,this._refresh=f,y(this)}function y(c){var f=c._node._inc||c._node.ownerDocument._inc;if(c._inc!==f){var m=c._refresh(c._node);if(Dr(c,"length",m.length),!c.$$length||m.length<c.$$length)for(var x=m.length;x in c;x++)Object.prototype.hasOwnProperty.call(c,x)&&delete c[x];l(m,c),c._inc=f}}g.prototype.item=function(c){return y(this),this[c]||null},d(g,I);function b(){}function T(c,f){for(var m=c.length;m--;)if(c[m]===f)return m}function O(c,f,m,x){if(x?f[T(f,x)]=m:f[f.length++]=m,c){m.ownerElement=c;var q=c.ownerDocument;q&&(x&&_(q,c,x),U(q,c,m))}}function H(c,f,m){var x=T(f,m);if(x>=0){for(var q=f.length-1;x<q;)f[x]=f[++x];if(f.length=q,c){var k=c.ownerDocument;k&&(_(k,c,m),m.ownerElement=null)}}else throw new M(P,new Error(c.tagName+"@"+m))}b.prototype={length:0,item:I.prototype.item,getNamedItem:function(c){for(var f=this.length;f--;){var m=this[f];if(m.nodeName==c)return m}},setNamedItem:function(c){var f=c.ownerElement;if(f&&f!=this._ownerElement)throw new M(F);var m=this.getNamedItem(c.nodeName);return O(this._ownerElement,this,c,m),m},setNamedItemNS:function(c){var f=c.ownerElement,m;if(f&&f!=this._ownerElement)throw new M(F);return m=this.getNamedItemNS(c.namespaceURI,c.localName),O(this._ownerElement,this,c,m),m},removeNamedItem:function(c){var f=this.getNamedItem(c);return H(this._ownerElement,this,f),f},removeNamedItemNS:function(c,f){var m=this.getNamedItemNS(c,f);return H(this._ownerElement,this,m),m},getNamedItemNS:function(c,f){for(var m=this.length;m--;){var x=this[m];if(x.localName==f&&x.namespaceURI==c)return x}return null}};function G(){}G.prototype={hasFeature:function(c,f){return!0},createDocument:function(c,f,m){var x=new W;if(x.implementation=this,x.childNodes=new I,x.doctype=m||null,m&&x.appendChild(m),f){var q=x.createElementNS(c,f);x.appendChild(q)}return x},createDocumentType:function(c,f,m){var x=new Re;return x.name=c,x.nodeName=c,x.publicId=f||"",x.systemId=m||"",x}};function V(){}V.prototype={firstChild:null,lastChild:null,previousSibling:null,nextSibling:null,attributes:null,parentNode:null,childNodes:null,ownerDocument:null,nodeValue:null,namespaceURI:null,prefix:null,localName:null,insertBefore:function(c,f){return fe(this,c,f)},replaceChild:function(c,f){fe(this,c,f,ve),f&&this.removeChild(f)},removeChild:function(c){return Y(this,c)},appendChild:function(c){return this.insertBefore(c,null)},hasChildNodes:function(){return this.firstChild!=null},cloneNode:function(c){return tt(this.ownerDocument||this,this,c)},normalize:function(){for(var c=this.firstChild;c;){var f=c.nextSibling;f&&f.nodeType==p&&c.nodeType==p?(this.removeChild(f),c.appendData(f.data)):(c.normalize(),c=f)}},isSupported:function(c,f){return this.ownerDocument.implementation.hasFeature(c,f)},hasAttributes:function(){return this.attributes.length>0},lookupPrefix:function(c){for(var f=this;f;){var m=f._nsMap;if(m){for(var x in m)if(Object.prototype.hasOwnProperty.call(m,x)&&m[x]===c)return x}f=f.nodeType==D?f.ownerDocument:f.parentNode}return null},lookupNamespaceURI:function(c){for(var f=this;f;){var m=f._nsMap;if(m&&Object.prototype.hasOwnProperty.call(m,c))return m[c];f=f.nodeType==D?f.ownerDocument:f.parentNode}return null},isDefaultNamespace:function(c){var f=this.lookupPrefix(c);return f==null}};function Z(c){return c=="<"&&"<"||c==">"&&">"||c=="&"&&"&"||c=='"'&&"""||"&#"+c.charCodeAt()+";"}l(h,V),l(h,V.prototype);function J(c,f){if(f(c))return!0;if(c=c.firstChild)do if(J(c,f))return!0;while(c=c.nextSibling)}function W(){this.ownerDocument=this}function U(c,f,m){c&&c._inc++;var x=m.namespaceURI;x===t.XMLNS&&(f._nsMap[m.prefix?m.localName:""]=m.value)}function _(c,f,m,x){c&&c._inc++;var q=m.namespaceURI;q===t.XMLNS&&delete f._nsMap[m.prefix?m.localName:""]}function K(c,f,m){if(c&&c._inc){c._inc++;var x=f.childNodes;if(m)x[x.length++]=m;else{for(var q=f.firstChild,k=0;q;)x[k++]=q,q=q.nextSibling;x.length=k,delete x[x.length]}}}function Y(c,f){var m=f.previousSibling,x=f.nextSibling;return m?m.nextSibling=x:c.firstChild=x,x?x.previousSibling=m:c.lastChild=m,f.parentNode=null,f.previousSibling=null,f.nextSibling=null,K(c.ownerDocument,c),f}function re(c){return c&&(c.nodeType===V.DOCUMENT_NODE||c.nodeType===V.DOCUMENT_FRAGMENT_NODE||c.nodeType===V.ELEMENT_NODE)}function ae(c){return c&&(ee(c)||ce(c)||$(c)||c.nodeType===V.DOCUMENT_FRAGMENT_NODE||c.nodeType===V.COMMENT_NODE||c.nodeType===V.PROCESSING_INSTRUCTION_NODE)}function $(c){return c&&c.nodeType===V.DOCUMENT_TYPE_NODE}function ee(c){return c&&c.nodeType===V.ELEMENT_NODE}function ce(c){return c&&c.nodeType===V.TEXT_NODE}function oe(c,f){var m=c.childNodes||[];if(e(m,ee)||$(f))return!1;var x=e(m,$);return!(f&&x&&m.indexOf(x)>m.indexOf(f))}function ge(c,f){var m=c.childNodes||[];function x(k){return ee(k)&&k!==f}if(e(m,x))return!1;var q=e(m,$);return!(f&&q&&m.indexOf(q)>m.indexOf(f))}function se(c,f,m){if(!re(c))throw new M(C,"Unexpected parent node type "+c.nodeType);if(m&&m.parentNode!==c)throw new M(P,"child not in parent");if(!ae(f)||$(f)&&c.nodeType!==V.DOCUMENT_NODE)throw new M(C,"Unexpected node type "+f.nodeType+" for parent node type "+c.nodeType)}function pe(c,f,m){var x=c.childNodes||[],q=f.childNodes||[];if(f.nodeType===V.DOCUMENT_FRAGMENT_NODE){var k=q.filter(ee);if(k.length>1||e(q,ce))throw new M(C,"More than one element or text in fragment");if(k.length===1&&!oe(c,m))throw new M(C,"Element in fragment can not be inserted before doctype")}if(ee(f)&&!oe(c,m))throw new M(C,"Only one element can be added and only after doctype");if($(f)){if(e(x,$))throw new M(C,"Only one doctype is allowed");var ne=e(x,ee);if(m&&x.indexOf(ne)<x.indexOf(m))throw new M(C,"Doctype can only be inserted before an element");if(!m&&ne)throw new M(C,"Doctype can not be appended since element is present")}}function ve(c,f,m){var x=c.childNodes||[],q=f.childNodes||[];if(f.nodeType===V.DOCUMENT_FRAGMENT_NODE){var k=q.filter(ee);if(k.length>1||e(q,ce))throw new M(C,"More than one element or text in fragment");if(k.length===1&&!ge(c,m))throw new M(C,"Element in fragment can not be inserted before doctype")}if(ee(f)&&!ge(c,m))throw new M(C,"Only one element can be added and only after doctype");if($(f)){if(e(x,function(ye){return $(ye)&&ye!==m}))throw new M(C,"Only one doctype is allowed");var ne=e(x,ee);if(m&&x.indexOf(ne)<x.indexOf(m))throw new M(C,"Doctype can only be inserted before an element")}}function fe(c,f,m,x){se(c,f,m),c.nodeType===V.DOCUMENT_NODE&&(x||pe)(c,f,m);var q=f.parentNode;if(q&&q.removeChild(f),f.nodeType===X){var k=f.firstChild;if(k==null)return f;var ne=f.lastChild}else k=ne=f;var he=m?m.previousSibling:c.lastChild;k.previousSibling=he,ne.nextSibling=m,he?he.nextSibling=k:c.firstChild=k,m==null?c.lastChild=ne:m.previousSibling=ne;do{k.parentNode=c;var ye=c.ownerDocument||c;De(k,ye)}while(k!==ne&&(k=k.nextSibling));return K(c.ownerDocument||c,c),f.nodeType==X&&(f.firstChild=f.lastChild=null),f}function De(c,f){if(c.ownerDocument!==f){if(c.ownerDocument=f,c.nodeType===a&&c.attributes)for(var m=0;m<c.attributes.length;m++){var x=c.attributes.item(m);x&&(x.ownerDocument=f)}for(var q=c.firstChild;q;)De(q,f),q=q.nextSibling}}function te(c,f){f.parentNode&&f.parentNode.removeChild(f),f.parentNode=c,f.previousSibling=c.lastChild,f.nextSibling=null,f.previousSibling?f.previousSibling.nextSibling=f:c.firstChild=f,c.lastChild=f,K(c.ownerDocument,c,f);var m=c.ownerDocument||c;return De(f,m),f}W.prototype={nodeName:"#document",nodeType:E,doctype:null,documentElement:null,_inc:1,insertBefore:function(c,f){if(c.nodeType==X){for(var m=c.firstChild;m;){var x=m.nextSibling;this.insertBefore(m,f),m=x}return c}return fe(this,c,f),De(c,this),this.documentElement===null&&c.nodeType===a&&(this.documentElement=c),c},removeChild:function(c){return this.documentElement==c&&(this.documentElement=null),Y(this,c)},replaceChild:function(c,f){fe(this,c,f,ve),De(c,this),f&&this.removeChild(f),ee(c)&&(this.documentElement=c)},importNode:function(c,f){return gt(this,c,f)},getElementById:function(c){var f=null;return J(this.documentElement,function(m){if(m.nodeType==a&&m.getAttribute("id")==c)return f=m,!0}),f},getElementsByClassName:function(c){var f=u(c);return new g(this,function(m){var x=[];return f.length>0&&J(m.documentElement,function(q){if(q!==m&&q.nodeType===a){var k=q.getAttribute("class");if(k){var ne=c===k;if(!ne){var he=u(k);ne=f.every(s(he))}ne&&x.push(q)}}}),x})},createElement:function(c){var f=new ie;f.ownerDocument=this,f.nodeName=c,f.tagName=c,f.localName=c,f.childNodes=new I;var m=f.attributes=new b;return m._ownerElement=f,f},createDocumentFragment:function(){var c=new $e;return c.ownerDocument=this,c.childNodes=new I,c},createTextNode:function(c){var f=new Le;return f.ownerDocument=this,f.appendData(c),f},createComment:function(c){var f=new at;return f.ownerDocument=this,f.appendData(c),f},createCDATASection:function(c){var f=new ct;return f.ownerDocument=this,f.appendData(c),f},createProcessingInstruction:function(c,f){var m=new Se;return m.ownerDocument=this,m.tagName=m.nodeName=m.target=c,m.nodeValue=m.data=f,m},createAttribute:function(c){var f=new xe;return f.ownerDocument=this,f.name=c,f.nodeName=c,f.localName=c,f.specified=!0,f},createEntityReference:function(c){var f=new Fe;return f.ownerDocument=this,f.nodeName=c,f},createElementNS:function(c,f){var m=new ie,x=f.split(":"),q=m.attributes=new b;return m.childNodes=new I,m.ownerDocument=this,m.nodeName=f,m.tagName=f,m.namespaceURI=c,x.length==2?(m.prefix=x[0],m.localName=x[1]):m.localName=f,q._ownerElement=m,m},createAttributeNS:function(c,f){var m=new xe,x=f.split(":");return m.ownerDocument=this,m.nodeName=f,m.name=f,m.namespaceURI=c,m.specified=!0,x.length==2?(m.prefix=x[0],m.localName=x[1]):m.localName=f,m}},d(W,V);function ie(){this._nsMap={}}ie.prototype={nodeType:a,hasAttribute:function(c){return this.getAttributeNode(c)!=null},getAttribute:function(c){var f=this.getAttributeNode(c);return f&&f.value||""},getAttributeNode:function(c){return this.attributes.getNamedItem(c)},setAttribute:function(c,f){var m=this.ownerDocument.createAttribute(c);m.value=m.nodeValue=""+f,this.setAttributeNode(m)},removeAttribute:function(c){var f=this.getAttributeNode(c);f&&this.removeAttributeNode(f)},appendChild:function(c){return c.nodeType===X?this.insertBefore(c,null):te(this,c)},setAttributeNode:function(c){return this.attributes.setNamedItem(c)},setAttributeNodeNS:function(c){return this.attributes.setNamedItemNS(c)},removeAttributeNode:function(c){return this.attributes.removeNamedItem(c.nodeName)},removeAttributeNS:function(c,f){var m=this.getAttributeNodeNS(c,f);m&&this.removeAttributeNode(m)},hasAttributeNS:function(c,f){return this.getAttributeNodeNS(c,f)!=null},getAttributeNS:function(c,f){var m=this.getAttributeNodeNS(c,f);return m&&m.value||""},setAttributeNS:function(c,f,m){var x=this.ownerDocument.createAttributeNS(c,f);x.value=x.nodeValue=""+m,this.setAttributeNode(x)},getAttributeNodeNS:function(c,f){return this.attributes.getNamedItemNS(c,f)},getElementsByTagName:function(c){return new g(this,function(f){var m=[];return J(f,function(x){x!==f&&x.nodeType==a&&(c==="*"||x.tagName==c)&&m.push(x)}),m})},getElementsByTagNameNS:function(c,f){return new g(this,function(m){var x=[];return J(m,function(q){q!==m&&q.nodeType===a&&(c==="*"||q.namespaceURI===c)&&(f==="*"||q.localName==f)&&x.push(q)}),x})}},W.prototype.getElementsByTagName=ie.prototype.getElementsByTagName,W.prototype.getElementsByTagNameNS=ie.prototype.getElementsByTagNameNS,d(ie,V);function xe(){}xe.prototype.nodeType=D,d(xe,V);function Ce(){}Ce.prototype={data:"",substringData:function(c,f){return this.data.substring(c,c+f)},appendData:function(c){c=this.data+c,this.nodeValue=this.data=c,this.length=c.length},insertData:function(c,f){this.replaceData(c,0,f)},appendChild:function(c){throw new Error(z[C])},deleteData:function(c,f){this.replaceData(c,f,"")},replaceData:function(c,f,m){var x=this.data.substring(0,c),q=this.data.substring(c+f);m=x+m+q,this.nodeValue=this.data=m,this.length=m.length}},d(Ce,V);function Le(){}Le.prototype={nodeName:"#text",nodeType:p,splitText:function(c){var f=this.data,m=f.substring(c);f=f.substring(0,c),this.data=this.nodeValue=f,this.length=f.length;var x=this.ownerDocument.createTextNode(m);return this.parentNode&&this.parentNode.insertBefore(x,this.nextSibling),x}},d(Le,Ce);function at(){}at.prototype={nodeName:"#comment",nodeType:N},d(at,Ce);function ct(){}ct.prototype={nodeName:"#cdata-section",nodeType:A},d(ct,Ce);function Re(){}Re.prototype.nodeType=L,d(Re,V);function lt(){}lt.prototype.nodeType=R,d(lt,V);function ze(){}ze.prototype.nodeType=v,d(ze,V);function Fe(){}Fe.prototype.nodeType=w,d(Fe,V);function $e(){}$e.prototype.nodeName="#document-fragment",$e.prototype.nodeType=X,d($e,V);function Se(){}Se.prototype.nodeType=B,d(Se,V);function et(){}et.prototype.serializeToString=function(c,f,m){return ft.call(c,f,m)},V.prototype.toString=ft;function ft(c,f){var m=[],x=this.nodeType==9&&this.documentElement||this,q=x.prefix,k=x.namespaceURI;if(k&&q==null){var q=x.lookupPrefix(k);if(q==null)var ne=[{namespace:k,prefix:null}]}return Me(this,m,c,f,ne),m.join("")}function ht(c,f,m){var x=c.prefix||"",q=c.namespaceURI;if(!q||x==="xml"&&q===t.XML||q===t.XMLNS)return!1;for(var k=m.length;k--;){var ne=m[k];if(ne.prefix===x)return ne.namespace!==q}return!0}function dt(c,f,m){c.push(" ",f,'="',m.replace(/[<>&"\t\n\r]/g,Z),'"')}function Me(c,f,m,x,q){if(q||(q=[]),x)if(c=x(c),c){if(typeof c=="string"){f.push(c);return}}else return;switch(c.nodeType){case a:var k=c.attributes,ne=k.length,le=c.firstChild,he=c.tagName;m=t.isHTML(c.namespaceURI)||m;var ye=he;if(!m&&!c.prefix&&c.namespaceURI){for(var Oe,Ne=0;Ne<k.length;Ne++)if(k.item(Ne).name==="xmlns"){Oe=k.item(Ne).value;break}if(!Oe)for(var qe=q.length-1;qe>=0;qe--){var Ve=q[qe];if(Ve.prefix===""&&Ve.namespace===c.namespaceURI){Oe=Ve.namespace;break}}if(Oe!==c.namespaceURI)for(var qe=q.length-1;qe>=0;qe--){var Ve=q[qe];if(Ve.namespace===c.namespaceURI){Ve.prefix&&(ye=Ve.prefix+":"+he);break}}}f.push("<",ye);for(var Ge=0;Ge<ne;Ge++){var Be=k.item(Ge);Be.prefix=="xmlns"?q.push({prefix:Be.localName,namespace:Be.value}):Be.nodeName=="xmlns"&&q.push({prefix:"",namespace:Be.value})}for(var Ge=0;Ge<ne;Ge++){var Be=k.item(Ge);if(ht(Be,m,q)){var ke=Be.prefix||"",mt=Be.namespaceURI;dt(f,ke?"xmlns:"+ke:"xmlns",mt),q.push({prefix:ke,namespace:mt})}Me(Be,f,m,x,q)}if(he===ye&&ht(c,m,q)){var ke=c.prefix||"",mt=c.namespaceURI;dt(f,ke?"xmlns:"+ke:"xmlns",mt),q.push({prefix:ke,namespace:mt})}if(le||m&&!/^(?:meta|link|img|br|hr|input)$/i.test(he)){if(f.push(">"),m&&/^script$/i.test(he))for(;le;)le.data?f.push(le.data):Me(le,f,m,x,q.slice()),le=le.nextSibling;else for(;le;)Me(le,f,m,x,q.slice()),le=le.nextSibling;f.push("</",ye,">")}else f.push("/>");return;case E:case X:for(var le=c.firstChild;le;)Me(le,f,m,x,q.slice()),le=le.nextSibling;return;case D:return dt(f,c.name,c.value);case p:return f.push(c.data.replace(/[<&>]/g,Z));case A:return f.push("<![CDATA[",c.data,"]]>");case N:return f.push("<!--",c.data,"-->");case L:var yr=c.publicId,rt=c.systemId;if(f.push("<!DOCTYPE ",c.name),yr)f.push(" PUBLIC ",yr),rt&&rt!="."&&f.push(" ",rt),f.push(">");else if(rt&&rt!=".")f.push(" SYSTEM ",rt,">");else{var br=c.internalSubset;br&&f.push(" [",br,"]"),f.push(">")}return;case B:return f.push("<?",c.target," ",c.data,"?>");case w:return f.push("&",c.nodeName,";");default:f.push("??",c.nodeName)}}function gt(c,f,m){var x;switch(f.nodeType){case a:x=f.cloneNode(!1),x.ownerDocument=c;case X:break;case D:m=!0;break}if(x||(x=f.cloneNode(!1)),x.ownerDocument=c,x.parentNode=null,m)for(var q=f.firstChild;q;)x.appendChild(gt(c,q,m)),q=q.nextSibling;return x}function tt(c,f,m){var x=new f.constructor;for(var q in f)if(Object.prototype.hasOwnProperty.call(f,q)){var k=f[q];typeof k!="object"&&k!=x[q]&&(x[q]=k)}switch(f.childNodes&&(x.childNodes=new I),x.ownerDocument=c,x.nodeType){case a:var ne=f.attributes,he=x.attributes=new b,ye=ne.length;he._ownerElement=x;for(var Oe=0;Oe<ye;Oe++)x.setAttributeNode(tt(c,ne.item(Oe),!0));break;case D:m=!0}if(m)for(var Ne=f.firstChild;Ne;)x.appendChild(tt(c,Ne,m)),Ne=Ne.nextSibling;return x}function Dr(c,f,m){c[f]=m}try{if(Object.defineProperty){let c=function(f){switch(f.nodeType){case a:case X:var m=[];for(f=f.firstChild;f;)f.nodeType!==7&&f.nodeType!==8&&m.push(c(f)),f=f.nextSibling;return m.join("");default:return f.nodeValue}};Object.defineProperty(g.prototype,"length",{get:function(){return y(this),this.$$length}}),Object.defineProperty(V.prototype,"textContent",{get:function(){return c(this)},set:function(f){switch(this.nodeType){case a:case X:for(;this.firstChild;)this.removeChild(this.firstChild);(f||String(f))&&this.appendChild(this.ownerDocument.createTextNode(f));break;default:this.data=f,this.value=f,this.nodeValue=f}}}),Dr=function(f,m,x){f["$$"+m]=x}}}catch{}return Pe.DocumentType=Re,Pe.DOMException=M,Pe.DOMImplementation=G,Pe.Element=ie,Pe.Node=V,Pe.NodeList=I,Pe.XMLSerializer=et,Pe}var pt={},_t={},Er;function Yn(){return Er||(Er=1,(function(n){var e=Wt().freeze;n.XML_ENTITIES=e({amp:"&",apos:"'",gt:">",lt:"<",quot:'"'}),n.HTML_ENTITIES=e({Aacute:"Á",aacute:"á",Abreve:"Ă",abreve:"ă",ac:"∾",acd:"∿",acE:"∾̳",Acirc:"Â",acirc:"â",acute:"´",Acy:"А",acy:"а",AElig:"Æ",aelig:"æ",af:"",Afr:"𝔄",afr:"𝔞",Agrave:"À",agrave:"à",alefsym:"ℵ",aleph:"ℵ",Alpha:"Α",alpha:"α",Amacr:"Ā",amacr:"ā",amalg:"⨿",AMP:"&",amp:"&",And:"⩓",and:"∧",andand:"⩕",andd:"⩜",andslope:"⩘",andv:"⩚",ang:"∠",ange:"⦤",angle:"∠",angmsd:"∡",angmsdaa:"⦨",angmsdab:"⦩",angmsdac:"⦪",angmsdad:"⦫",angmsdae:"⦬",angmsdaf:"⦭",angmsdag:"⦮",angmsdah:"⦯",angrt:"∟",angrtvb:"⊾",angrtvbd:"⦝",angsph:"∢",angst:"Å",angzarr:"⍼",Aogon:"Ą",aogon:"ą",Aopf:"𝔸",aopf:"𝕒",ap:"≈",apacir:"⩯",apE:"⩰",ape:"≊",apid:"≋",apos:"'",ApplyFunction:"",approx:"≈",approxeq:"≊",Aring:"Å",aring:"å",Ascr:"𝒜",ascr:"𝒶",Assign:"≔",ast:"*",asymp:"≈",asympeq:"≍",Atilde:"Ã",atilde:"ã",Auml:"Ä",auml:"ä",awconint:"∳",awint:"⨑",backcong:"≌",backepsilon:"϶",backprime:"‵",backsim:"∽",backsimeq:"⋍",Backslash:"∖",Barv:"⫧",barvee:"⊽",Barwed:"⌆",barwed:"⌅",barwedge:"⌅",bbrk:"⎵",bbrktbrk:"⎶",bcong:"≌",Bcy:"Б",bcy:"б",bdquo:"„",becaus:"∵",Because:"∵",because:"∵",bemptyv:"⦰",bepsi:"϶",bernou:"ℬ",Bernoullis:"ℬ",Beta:"Β",beta:"β",beth:"ℶ",between:"≬",Bfr:"𝔅",bfr:"𝔟",bigcap:"⋂",bigcirc:"◯",bigcup:"⋃",bigodot:"⨀",bigoplus:"⨁",bigotimes:"⨂",bigsqcup:"⨆",bigstar:"★",bigtriangledown:"▽",bigtriangleup:"△",biguplus:"⨄",bigvee:"⋁",bigwedge:"⋀",bkarow:"⤍",blacklozenge:"⧫",blacksquare:"▪",blacktriangle:"▴",blacktriangledown:"▾",blacktriangleleft:"◂",blacktriangleright:"▸",blank:"␣",blk12:"▒",blk14:"░",blk34:"▓",block:"█",bne:"=⃥",bnequiv:"≡⃥",bNot:"⫭",bnot:"⌐",Bopf:"𝔹",bopf:"𝕓",bot:"⊥",bottom:"⊥",bowtie:"⋈",boxbox:"⧉",boxDL:"╗",boxDl:"╖",boxdL:"╕",boxdl:"┐",boxDR:"╔",boxDr:"╓",boxdR:"╒",boxdr:"┌",boxH:"═",boxh:"─",boxHD:"╦",boxHd:"╤",boxhD:"╥",boxhd:"┬",boxHU:"╩",boxHu:"╧",boxhU:"╨",boxhu:"┴",boxminus:"⊟",boxplus:"⊞",boxtimes:"⊠",boxUL:"╝",boxUl:"╜",boxuL:"╛",boxul:"┘",boxUR:"╚",boxUr:"╙",boxuR:"╘",boxur:"└",boxV:"║",boxv:"│",boxVH:"╬",boxVh:"╫",boxvH:"╪",boxvh:"┼",boxVL:"╣",boxVl:"╢",boxvL:"╡",boxvl:"┤",boxVR:"╠",boxVr:"╟",boxvR:"╞",boxvr:"├",bprime:"‵",Breve:"˘",breve:"˘",brvbar:"¦",Bscr:"ℬ",bscr:"𝒷",bsemi:"⁏",bsim:"∽",bsime:"⋍",bsol:"\\",bsolb:"⧅",bsolhsub:"⟈",bull:"•",bullet:"•",bump:"≎",bumpE:"⪮",bumpe:"≏",Bumpeq:"≎",bumpeq:"≏",Cacute:"Ć",cacute:"ć",Cap:"⋒",cap:"∩",capand:"⩄",capbrcup:"⩉",capcap:"⩋",capcup:"⩇",capdot:"⩀",CapitalDifferentialD:"ⅅ",caps:"∩︀",caret:"⁁",caron:"ˇ",Cayleys:"ℭ",ccaps:"⩍",Ccaron:"Č",ccaron:"č",Ccedil:"Ç",ccedil:"ç",Ccirc:"Ĉ",ccirc:"ĉ",Cconint:"∰",ccups:"⩌",ccupssm:"⩐",Cdot:"Ċ",cdot:"ċ",cedil:"¸",Cedilla:"¸",cemptyv:"⦲",cent:"¢",CenterDot:"·",centerdot:"·",Cfr:"ℭ",cfr:"𝔠",CHcy:"Ч",chcy:"ч",check:"✓",checkmark:"✓",Chi:"Χ",chi:"χ",cir:"○",circ:"ˆ",circeq:"≗",circlearrowleft:"↺",circlearrowright:"↻",circledast:"⊛",circledcirc:"⊚",circleddash:"⊝",CircleDot:"⊙",circledR:"®",circledS:"Ⓢ",CircleMinus:"⊖",CirclePlus:"⊕",CircleTimes:"⊗",cirE:"⧃",cire:"≗",cirfnint:"⨐",cirmid:"⫯",cirscir:"⧂",ClockwiseContourIntegral:"∲",CloseCurlyDoubleQuote:"”",CloseCurlyQuote:"’",clubs:"♣",clubsuit:"♣",Colon:"∷",colon:":",Colone:"⩴",colone:"≔",coloneq:"≔",comma:",",commat:"@",comp:"∁",compfn:"∘",complement:"∁",complexes:"ℂ",cong:"≅",congdot:"⩭",Congruent:"≡",Conint:"∯",conint:"∮",ContourIntegral:"∮",Copf:"ℂ",copf:"𝕔",coprod:"∐",Coproduct:"∐",COPY:"©",copy:"©",copysr:"℗",CounterClockwiseContourIntegral:"∳",crarr:"↵",Cross:"⨯",cross:"✗",Cscr:"𝒞",cscr:"𝒸",csub:"⫏",csube:"⫑",csup:"⫐",csupe:"⫒",ctdot:"⋯",cudarrl:"⤸",cudarrr:"⤵",cuepr:"⋞",cuesc:"⋟",cularr:"↶",cularrp:"⤽",Cup:"⋓",cup:"∪",cupbrcap:"⩈",CupCap:"≍",cupcap:"⩆",cupcup:"⩊",cupdot:"⊍",cupor:"⩅",cups:"∪︀",curarr:"↷",curarrm:"⤼",curlyeqprec:"⋞",curlyeqsucc:"⋟",curlyvee:"⋎",curlywedge:"⋏",curren:"¤",curvearrowleft:"↶",curvearrowright:"↷",cuvee:"⋎",cuwed:"⋏",cwconint:"∲",cwint:"∱",cylcty:"⌭",Dagger:"‡",dagger:"†",daleth:"ℸ",Darr:"↡",dArr:"⇓",darr:"↓",dash:"‐",Dashv:"⫤",dashv:"⊣",dbkarow:"⤏",dblac:"˝",Dcaron:"Ď",dcaron:"ď",Dcy:"Д",dcy:"д",DD:"ⅅ",dd:"ⅆ",ddagger:"‡",ddarr:"⇊",DDotrahd:"⤑",ddotseq:"⩷",deg:"°",Del:"∇",Delta:"Δ",delta:"δ",demptyv:"⦱",dfisht:"⥿",Dfr:"𝔇",dfr:"𝔡",dHar:"⥥",dharl:"⇃",dharr:"⇂",DiacriticalAcute:"´",DiacriticalDot:"˙",DiacriticalDoubleAcute:"˝",DiacriticalGrave:"`",DiacriticalTilde:"˜",diam:"⋄",Diamond:"⋄",diamond:"⋄",diamondsuit:"♦",diams:"♦",die:"¨",DifferentialD:"ⅆ",digamma:"ϝ",disin:"⋲",div:"÷",divide:"÷",divideontimes:"⋇",divonx:"⋇",DJcy:"Ђ",djcy:"ђ",dlcorn:"⌞",dlcrop:"⌍",dollar:"$",Dopf:"𝔻",dopf:"𝕕",Dot:"¨",dot:"˙",DotDot:"⃜",doteq:"≐",doteqdot:"≑",DotEqual:"≐",dotminus:"∸",dotplus:"∔",dotsquare:"⊡",doublebarwedge:"⌆",DoubleContourIntegral:"∯",DoubleDot:"¨",DoubleDownArrow:"⇓",DoubleLeftArrow:"⇐",DoubleLeftRightArrow:"⇔",DoubleLeftTee:"⫤",DoubleLongLeftArrow:"⟸",DoubleLongLeftRightArrow:"⟺",DoubleLongRightArrow:"⟹",DoubleRightArrow:"⇒",DoubleRightTee:"⊨",DoubleUpArrow:"⇑",DoubleUpDownArrow:"⇕",DoubleVerticalBar:"∥",DownArrow:"↓",Downarrow:"⇓",downarrow:"↓",DownArrowBar:"⤓",DownArrowUpArrow:"⇵",DownBreve:"̑",downdownarrows:"⇊",downharpoonleft:"⇃",downharpoonright:"⇂",DownLeftRightVector:"⥐",DownLeftTeeVector:"⥞",DownLeftVector:"↽",DownLeftVectorBar:"⥖",DownRightTeeVector:"⥟",DownRightVector:"⇁",DownRightVectorBar:"⥗",DownTee:"⊤",DownTeeArrow:"↧",drbkarow:"⤐",drcorn:"⌟",drcrop:"⌌",Dscr:"𝒟",dscr:"𝒹",DScy:"Ѕ",dscy:"ѕ",dsol:"⧶",Dstrok:"Đ",dstrok:"đ",dtdot:"⋱",dtri:"▿",dtrif:"▾",duarr:"⇵",duhar:"⥯",dwangle:"⦦",DZcy:"Џ",dzcy:"џ",dzigrarr:"⟿",Eacute:"É",eacute:"é",easter:"⩮",Ecaron:"Ě",ecaron:"ě",ecir:"≖",Ecirc:"Ê",ecirc:"ê",ecolon:"≕",Ecy:"Э",ecy:"э",eDDot:"⩷",Edot:"Ė",eDot:"≑",edot:"ė",ee:"ⅇ",efDot:"≒",Efr:"𝔈",efr:"𝔢",eg:"⪚",Egrave:"È",egrave:"è",egs:"⪖",egsdot:"⪘",el:"⪙",Element:"∈",elinters:"⏧",ell:"ℓ",els:"⪕",elsdot:"⪗",Emacr:"Ē",emacr:"ē",empty:"∅",emptyset:"∅",EmptySmallSquare:"◻",emptyv:"∅",EmptyVerySmallSquare:"▫",emsp:" ",emsp13:" ",emsp14:" ",ENG:"Ŋ",eng:"ŋ",ensp:" ",Eogon:"Ę",eogon:"ę",Eopf:"𝔼",eopf:"𝕖",epar:"⋕",eparsl:"⧣",eplus:"⩱",epsi:"ε",Epsilon:"Ε",epsilon:"ε",epsiv:"ϵ",eqcirc:"≖",eqcolon:"≕",eqsim:"≂",eqslantgtr:"⪖",eqslantless:"⪕",Equal:"⩵",equals:"=",EqualTilde:"≂",equest:"≟",Equilibrium:"⇌",equiv:"≡",equivDD:"⩸",eqvparsl:"⧥",erarr:"⥱",erDot:"≓",Escr:"ℰ",escr:"ℯ",esdot:"≐",Esim:"⩳",esim:"≂",Eta:"Η",eta:"η",ETH:"Ð",eth:"ð",Euml:"Ë",euml:"ë",euro:"€",excl:"!",exist:"∃",Exists:"∃",expectation:"ℰ",ExponentialE:"ⅇ",exponentiale:"ⅇ",fallingdotseq:"≒",Fcy:"Ф",fcy:"ф",female:"♀",ffilig:"ffi",fflig:"ff",ffllig:"ffl",Ffr:"𝔉",ffr:"𝔣",filig:"fi",FilledSmallSquare:"◼",FilledVerySmallSquare:"▪",fjlig:"fj",flat:"♭",fllig:"fl",fltns:"▱",fnof:"ƒ",Fopf:"𝔽",fopf:"𝕗",ForAll:"∀",forall:"∀",fork:"⋔",forkv:"⫙",Fouriertrf:"ℱ",fpartint:"⨍",frac12:"½",frac13:"⅓",frac14:"¼",frac15:"⅕",frac16:"⅙",frac18:"⅛",frac23:"⅔",frac25:"⅖",frac34:"¾",frac35:"⅗",frac38:"⅜",frac45:"⅘",frac56:"⅚",frac58:"⅝",frac78:"⅞",frasl:"⁄",frown:"⌢",Fscr:"ℱ",fscr:"𝒻",gacute:"ǵ",Gamma:"Γ",gamma:"γ",Gammad:"Ϝ",gammad:"ϝ",gap:"⪆",Gbreve:"Ğ",gbreve:"ğ",Gcedil:"Ģ",Gcirc:"Ĝ",gcirc:"ĝ",Gcy:"Г",gcy:"г",Gdot:"Ġ",gdot:"ġ",gE:"≧",ge:"≥",gEl:"⪌",gel:"⋛",geq:"≥",geqq:"≧",geqslant:"⩾",ges:"⩾",gescc:"⪩",gesdot:"⪀",gesdoto:"⪂",gesdotol:"⪄",gesl:"⋛︀",gesles:"⪔",Gfr:"𝔊",gfr:"𝔤",Gg:"⋙",gg:"≫",ggg:"⋙",gimel:"ℷ",GJcy:"Ѓ",gjcy:"ѓ",gl:"≷",gla:"⪥",glE:"⪒",glj:"⪤",gnap:"⪊",gnapprox:"⪊",gnE:"≩",gne:"⪈",gneq:"⪈",gneqq:"≩",gnsim:"⋧",Gopf:"𝔾",gopf:"𝕘",grave:"`",GreaterEqual:"≥",GreaterEqualLess:"⋛",GreaterFullEqual:"≧",GreaterGreater:"⪢",GreaterLess:"≷",GreaterSlantEqual:"⩾",GreaterTilde:"≳",Gscr:"𝒢",gscr:"ℊ",gsim:"≳",gsime:"⪎",gsiml:"⪐",Gt:"≫",GT:">",gt:">",gtcc:"⪧",gtcir:"⩺",gtdot:"⋗",gtlPar:"⦕",gtquest:"⩼",gtrapprox:"⪆",gtrarr:"⥸",gtrdot:"⋗",gtreqless:"⋛",gtreqqless:"⪌",gtrless:"≷",gtrsim:"≳",gvertneqq:"≩︀",gvnE:"≩︀",Hacek:"ˇ",hairsp:" ",half:"½",hamilt:"ℋ",HARDcy:"Ъ",hardcy:"ъ",hArr:"⇔",harr:"↔",harrcir:"⥈",harrw:"↭",Hat:"^",hbar:"ℏ",Hcirc:"Ĥ",hcirc:"ĥ",hearts:"♥",heartsuit:"♥",hellip:"…",hercon:"⊹",Hfr:"ℌ",hfr:"𝔥",HilbertSpace:"ℋ",hksearow:"⤥",hkswarow:"⤦",hoarr:"⇿",homtht:"∻",hookleftarrow:"↩",hookrightarrow:"↪",Hopf:"ℍ",hopf:"𝕙",horbar:"―",HorizontalLine:"─",Hscr:"ℋ",hscr:"𝒽",hslash:"ℏ",Hstrok:"Ħ",hstrok:"ħ",HumpDownHump:"≎",HumpEqual:"≏",hybull:"⁃",hyphen:"‐",Iacute:"Í",iacute:"í",ic:"",Icirc:"Î",icirc:"î",Icy:"И",icy:"и",Idot:"İ",IEcy:"Е",iecy:"е",iexcl:"¡",iff:"⇔",Ifr:"ℑ",ifr:"𝔦",Igrave:"Ì",igrave:"ì",ii:"ⅈ",iiiint:"⨌",iiint:"∭",iinfin:"⧜",iiota:"℩",IJlig:"IJ",ijlig:"ij",Im:"ℑ",Imacr:"Ī",imacr:"ī",image:"ℑ",ImaginaryI:"ⅈ",imagline:"ℐ",imagpart:"ℑ",imath:"ı",imof:"⊷",imped:"Ƶ",Implies:"⇒",in:"∈",incare:"℅",infin:"∞",infintie:"⧝",inodot:"ı",Int:"∬",int:"∫",intcal:"⊺",integers:"ℤ",Integral:"∫",intercal:"⊺",Intersection:"⋂",intlarhk:"⨗",intprod:"⨼",InvisibleComma:"",InvisibleTimes:"",IOcy:"Ё",iocy:"ё",Iogon:"Į",iogon:"į",Iopf:"𝕀",iopf:"𝕚",Iota:"Ι",iota:"ι",iprod:"⨼",iquest:"¿",Iscr:"ℐ",iscr:"𝒾",isin:"∈",isindot:"⋵",isinE:"⋹",isins:"⋴",isinsv:"⋳",isinv:"∈",it:"",Itilde:"Ĩ",itilde:"ĩ",Iukcy:"І",iukcy:"і",Iuml:"Ï",iuml:"ï",Jcirc:"Ĵ",jcirc:"ĵ",Jcy:"Й",jcy:"й",Jfr:"𝔍",jfr:"𝔧",jmath:"ȷ",Jopf:"𝕁",jopf:"𝕛",Jscr:"𝒥",jscr:"𝒿",Jsercy:"Ј",jsercy:"ј",Jukcy:"Є",jukcy:"є",Kappa:"Κ",kappa:"κ",kappav:"ϰ",Kcedil:"Ķ",kcedil:"ķ",Kcy:"К",kcy:"к",Kfr:"𝔎",kfr:"𝔨",kgreen:"ĸ",KHcy:"Х",khcy:"х",KJcy:"Ќ",kjcy:"ќ",Kopf:"𝕂",kopf:"𝕜",Kscr:"𝒦",kscr:"𝓀",lAarr:"⇚",Lacute:"Ĺ",lacute:"ĺ",laemptyv:"⦴",lagran:"ℒ",Lambda:"Λ",lambda:"λ",Lang:"⟪",lang:"⟨",langd:"⦑",langle:"⟨",lap:"⪅",Laplacetrf:"ℒ",laquo:"«",Larr:"↞",lArr:"⇐",larr:"←",larrb:"⇤",larrbfs:"⤟",larrfs:"⤝",larrhk:"↩",larrlp:"↫",larrpl:"⤹",larrsim:"⥳",larrtl:"↢",lat:"⪫",lAtail:"⤛",latail:"⤙",late:"⪭",lates:"⪭︀",lBarr:"⤎",lbarr:"⤌",lbbrk:"❲",lbrace:"{",lbrack:"[",lbrke:"⦋",lbrksld:"⦏",lbrkslu:"⦍",Lcaron:"Ľ",lcaron:"ľ",Lcedil:"Ļ",lcedil:"ļ",lceil:"⌈",lcub:"{",Lcy:"Л",lcy:"л",ldca:"⤶",ldquo:"“",ldquor:"„",ldrdhar:"⥧",ldrushar:"⥋",ldsh:"↲",lE:"≦",le:"≤",LeftAngleBracket:"⟨",LeftArrow:"←",Leftarrow:"⇐",leftarrow:"←",LeftArrowBar:"⇤",LeftArrowRightArrow:"⇆",leftarrowtail:"↢",LeftCeiling:"⌈",LeftDoubleBracket:"⟦",LeftDownTeeVector:"⥡",LeftDownVector:"⇃",LeftDownVectorBar:"⥙",LeftFloor:"⌊",leftharpoondown:"↽",leftharpoonup:"↼",leftleftarrows:"⇇",LeftRightArrow:"↔",Leftrightarrow:"⇔",leftrightarrow:"↔",leftrightarrows:"⇆",leftrightharpoons:"⇋",leftrightsquigarrow:"↭",LeftRightVector:"⥎",LeftTee:"⊣",LeftTeeArrow:"↤",LeftTeeVector:"⥚",leftthreetimes:"⋋",LeftTriangle:"⊲",LeftTriangleBar:"⧏",LeftTriangleEqual:"⊴",LeftUpDownVector:"⥑",LeftUpTeeVector:"⥠",LeftUpVector:"↿",LeftUpVectorBar:"⥘",LeftVector:"↼",LeftVectorBar:"⥒",lEg:"⪋",leg:"⋚",leq:"≤",leqq:"≦",leqslant:"⩽",les:"⩽",lescc:"⪨",lesdot:"⩿",lesdoto:"⪁",lesdotor:"⪃",lesg:"⋚︀",lesges:"⪓",lessapprox:"⪅",lessdot:"⋖",lesseqgtr:"⋚",lesseqqgtr:"⪋",LessEqualGreater:"⋚",LessFullEqual:"≦",LessGreater:"≶",lessgtr:"≶",LessLess:"⪡",lesssim:"≲",LessSlantEqual:"⩽",LessTilde:"≲",lfisht:"⥼",lfloor:"⌊",Lfr:"𝔏",lfr:"𝔩",lg:"≶",lgE:"⪑",lHar:"⥢",lhard:"↽",lharu:"↼",lharul:"⥪",lhblk:"▄",LJcy:"Љ",ljcy:"љ",Ll:"⋘",ll:"≪",llarr:"⇇",llcorner:"⌞",Lleftarrow:"⇚",llhard:"⥫",lltri:"◺",Lmidot:"Ŀ",lmidot:"ŀ",lmoust:"⎰",lmoustache:"⎰",lnap:"⪉",lnapprox:"⪉",lnE:"≨",lne:"⪇",lneq:"⪇",lneqq:"≨",lnsim:"⋦",loang:"⟬",loarr:"⇽",lobrk:"⟦",LongLeftArrow:"⟵",Longleftarrow:"⟸",longleftarrow:"⟵",LongLeftRightArrow:"⟷",Longleftrightarrow:"⟺",longleftrightarrow:"⟷",longmapsto:"⟼",LongRightArrow:"⟶",Longrightarrow:"⟹",longrightarrow:"⟶",looparrowleft:"↫",looparrowright:"↬",lopar:"⦅",Lopf:"𝕃",lopf:"𝕝",loplus:"⨭",lotimes:"⨴",lowast:"∗",lowbar:"_",LowerLeftArrow:"↙",LowerRightArrow:"↘",loz:"◊",lozenge:"◊",lozf:"⧫",lpar:"(",lparlt:"⦓",lrarr:"⇆",lrcorner:"⌟",lrhar:"⇋",lrhard:"⥭",lrm:"",lrtri:"⊿",lsaquo:"‹",Lscr:"ℒ",lscr:"𝓁",Lsh:"↰",lsh:"↰",lsim:"≲",lsime:"⪍",lsimg:"⪏",lsqb:"[",lsquo:"‘",lsquor:"‚",Lstrok:"Ł",lstrok:"ł",Lt:"≪",LT:"<",lt:"<",ltcc:"⪦",ltcir:"⩹",ltdot:"⋖",lthree:"⋋",ltimes:"⋉",ltlarr:"⥶",ltquest:"⩻",ltri:"◃",ltrie:"⊴",ltrif:"◂",ltrPar:"⦖",lurdshar:"⥊",luruhar:"⥦",lvertneqq:"≨︀",lvnE:"≨︀",macr:"¯",male:"♂",malt:"✠",maltese:"✠",Map:"⤅",map:"↦",mapsto:"↦",mapstodown:"↧",mapstoleft:"↤",mapstoup:"↥",marker:"▮",mcomma:"⨩",Mcy:"М",mcy:"м",mdash:"—",mDDot:"∺",measuredangle:"∡",MediumSpace:" ",Mellintrf:"ℳ",Mfr:"𝔐",mfr:"𝔪",mho:"℧",micro:"µ",mid:"∣",midast:"*",midcir:"⫰",middot:"·",minus:"−",minusb:"⊟",minusd:"∸",minusdu:"⨪",MinusPlus:"∓",mlcp:"⫛",mldr:"…",mnplus:"∓",models:"⊧",Mopf:"𝕄",mopf:"𝕞",mp:"∓",Mscr:"ℳ",mscr:"𝓂",mstpos:"∾",Mu:"Μ",mu:"μ",multimap:"⊸",mumap:"⊸",nabla:"∇",Nacute:"Ń",nacute:"ń",nang:"∠⃒",nap:"≉",napE:"⩰̸",napid:"≋̸",napos:"ʼn",napprox:"≉",natur:"♮",natural:"♮",naturals:"ℕ",nbsp:" ",nbump:"≎̸",nbumpe:"≏̸",ncap:"⩃",Ncaron:"Ň",ncaron:"ň",Ncedil:"Ņ",ncedil:"ņ",ncong:"≇",ncongdot:"⩭̸",ncup:"⩂",Ncy:"Н",ncy:"н",ndash:"–",ne:"≠",nearhk:"⤤",neArr:"⇗",nearr:"↗",nearrow:"↗",nedot:"≐̸",NegativeMediumSpace:"",NegativeThickSpace:"",NegativeThinSpace:"",NegativeVeryThinSpace:"",nequiv:"≢",nesear:"⤨",nesim:"≂̸",NestedGreaterGreater:"≫",NestedLessLess:"≪",NewLine:`
|
|
2
|
+
`,nexist:"∄",nexists:"∄",Nfr:"𝔑",nfr:"𝔫",ngE:"≧̸",nge:"≱",ngeq:"≱",ngeqq:"≧̸",ngeqslant:"⩾̸",nges:"⩾̸",nGg:"⋙̸",ngsim:"≵",nGt:"≫⃒",ngt:"≯",ngtr:"≯",nGtv:"≫̸",nhArr:"⇎",nharr:"↮",nhpar:"⫲",ni:"∋",nis:"⋼",nisd:"⋺",niv:"∋",NJcy:"Њ",njcy:"њ",nlArr:"⇍",nlarr:"↚",nldr:"‥",nlE:"≦̸",nle:"≰",nLeftarrow:"⇍",nleftarrow:"↚",nLeftrightarrow:"⇎",nleftrightarrow:"↮",nleq:"≰",nleqq:"≦̸",nleqslant:"⩽̸",nles:"⩽̸",nless:"≮",nLl:"⋘̸",nlsim:"≴",nLt:"≪⃒",nlt:"≮",nltri:"⋪",nltrie:"⋬",nLtv:"≪̸",nmid:"∤",NoBreak:"",NonBreakingSpace:" ",Nopf:"ℕ",nopf:"𝕟",Not:"⫬",not:"¬",NotCongruent:"≢",NotCupCap:"≭",NotDoubleVerticalBar:"∦",NotElement:"∉",NotEqual:"≠",NotEqualTilde:"≂̸",NotExists:"∄",NotGreater:"≯",NotGreaterEqual:"≱",NotGreaterFullEqual:"≧̸",NotGreaterGreater:"≫̸",NotGreaterLess:"≹",NotGreaterSlantEqual:"⩾̸",NotGreaterTilde:"≵",NotHumpDownHump:"≎̸",NotHumpEqual:"≏̸",notin:"∉",notindot:"⋵̸",notinE:"⋹̸",notinva:"∉",notinvb:"⋷",notinvc:"⋶",NotLeftTriangle:"⋪",NotLeftTriangleBar:"⧏̸",NotLeftTriangleEqual:"⋬",NotLess:"≮",NotLessEqual:"≰",NotLessGreater:"≸",NotLessLess:"≪̸",NotLessSlantEqual:"⩽̸",NotLessTilde:"≴",NotNestedGreaterGreater:"⪢̸",NotNestedLessLess:"⪡̸",notni:"∌",notniva:"∌",notnivb:"⋾",notnivc:"⋽",NotPrecedes:"⊀",NotPrecedesEqual:"⪯̸",NotPrecedesSlantEqual:"⋠",NotReverseElement:"∌",NotRightTriangle:"⋫",NotRightTriangleBar:"⧐̸",NotRightTriangleEqual:"⋭",NotSquareSubset:"⊏̸",NotSquareSubsetEqual:"⋢",NotSquareSuperset:"⊐̸",NotSquareSupersetEqual:"⋣",NotSubset:"⊂⃒",NotSubsetEqual:"⊈",NotSucceeds:"⊁",NotSucceedsEqual:"⪰̸",NotSucceedsSlantEqual:"⋡",NotSucceedsTilde:"≿̸",NotSuperset:"⊃⃒",NotSupersetEqual:"⊉",NotTilde:"≁",NotTildeEqual:"≄",NotTildeFullEqual:"≇",NotTildeTilde:"≉",NotVerticalBar:"∤",npar:"∦",nparallel:"∦",nparsl:"⫽⃥",npart:"∂̸",npolint:"⨔",npr:"⊀",nprcue:"⋠",npre:"⪯̸",nprec:"⊀",npreceq:"⪯̸",nrArr:"⇏",nrarr:"↛",nrarrc:"⤳̸",nrarrw:"↝̸",nRightarrow:"⇏",nrightarrow:"↛",nrtri:"⋫",nrtrie:"⋭",nsc:"⊁",nsccue:"⋡",nsce:"⪰̸",Nscr:"𝒩",nscr:"𝓃",nshortmid:"∤",nshortparallel:"∦",nsim:"≁",nsime:"≄",nsimeq:"≄",nsmid:"∤",nspar:"∦",nsqsube:"⋢",nsqsupe:"⋣",nsub:"⊄",nsubE:"⫅̸",nsube:"⊈",nsubset:"⊂⃒",nsubseteq:"⊈",nsubseteqq:"⫅̸",nsucc:"⊁",nsucceq:"⪰̸",nsup:"⊅",nsupE:"⫆̸",nsupe:"⊉",nsupset:"⊃⃒",nsupseteq:"⊉",nsupseteqq:"⫆̸",ntgl:"≹",Ntilde:"Ñ",ntilde:"ñ",ntlg:"≸",ntriangleleft:"⋪",ntrianglelefteq:"⋬",ntriangleright:"⋫",ntrianglerighteq:"⋭",Nu:"Ν",nu:"ν",num:"#",numero:"№",numsp:" ",nvap:"≍⃒",nVDash:"⊯",nVdash:"⊮",nvDash:"⊭",nvdash:"⊬",nvge:"≥⃒",nvgt:">⃒",nvHarr:"⤄",nvinfin:"⧞",nvlArr:"⤂",nvle:"≤⃒",nvlt:"<⃒",nvltrie:"⊴⃒",nvrArr:"⤃",nvrtrie:"⊵⃒",nvsim:"∼⃒",nwarhk:"⤣",nwArr:"⇖",nwarr:"↖",nwarrow:"↖",nwnear:"⤧",Oacute:"Ó",oacute:"ó",oast:"⊛",ocir:"⊚",Ocirc:"Ô",ocirc:"ô",Ocy:"О",ocy:"о",odash:"⊝",Odblac:"Ő",odblac:"ő",odiv:"⨸",odot:"⊙",odsold:"⦼",OElig:"Œ",oelig:"œ",ofcir:"⦿",Ofr:"𝔒",ofr:"𝔬",ogon:"˛",Ograve:"Ò",ograve:"ò",ogt:"⧁",ohbar:"⦵",ohm:"Ω",oint:"∮",olarr:"↺",olcir:"⦾",olcross:"⦻",oline:"‾",olt:"⧀",Omacr:"Ō",omacr:"ō",Omega:"Ω",omega:"ω",Omicron:"Ο",omicron:"ο",omid:"⦶",ominus:"⊖",Oopf:"𝕆",oopf:"𝕠",opar:"⦷",OpenCurlyDoubleQuote:"“",OpenCurlyQuote:"‘",operp:"⦹",oplus:"⊕",Or:"⩔",or:"∨",orarr:"↻",ord:"⩝",order:"ℴ",orderof:"ℴ",ordf:"ª",ordm:"º",origof:"⊶",oror:"⩖",orslope:"⩗",orv:"⩛",oS:"Ⓢ",Oscr:"𝒪",oscr:"ℴ",Oslash:"Ø",oslash:"ø",osol:"⊘",Otilde:"Õ",otilde:"õ",Otimes:"⨷",otimes:"⊗",otimesas:"⨶",Ouml:"Ö",ouml:"ö",ovbar:"⌽",OverBar:"‾",OverBrace:"⏞",OverBracket:"⎴",OverParenthesis:"⏜",par:"∥",para:"¶",parallel:"∥",parsim:"⫳",parsl:"⫽",part:"∂",PartialD:"∂",Pcy:"П",pcy:"п",percnt:"%",period:".",permil:"‰",perp:"⊥",pertenk:"‱",Pfr:"𝔓",pfr:"𝔭",Phi:"Φ",phi:"φ",phiv:"ϕ",phmmat:"ℳ",phone:"☎",Pi:"Π",pi:"π",pitchfork:"⋔",piv:"ϖ",planck:"ℏ",planckh:"ℎ",plankv:"ℏ",plus:"+",plusacir:"⨣",plusb:"⊞",pluscir:"⨢",plusdo:"∔",plusdu:"⨥",pluse:"⩲",PlusMinus:"±",plusmn:"±",plussim:"⨦",plustwo:"⨧",pm:"±",Poincareplane:"ℌ",pointint:"⨕",Popf:"ℙ",popf:"𝕡",pound:"£",Pr:"⪻",pr:"≺",prap:"⪷",prcue:"≼",prE:"⪳",pre:"⪯",prec:"≺",precapprox:"⪷",preccurlyeq:"≼",Precedes:"≺",PrecedesEqual:"⪯",PrecedesSlantEqual:"≼",PrecedesTilde:"≾",preceq:"⪯",precnapprox:"⪹",precneqq:"⪵",precnsim:"⋨",precsim:"≾",Prime:"″",prime:"′",primes:"ℙ",prnap:"⪹",prnE:"⪵",prnsim:"⋨",prod:"∏",Product:"∏",profalar:"⌮",profline:"⌒",profsurf:"⌓",prop:"∝",Proportion:"∷",Proportional:"∝",propto:"∝",prsim:"≾",prurel:"⊰",Pscr:"𝒫",pscr:"𝓅",Psi:"Ψ",psi:"ψ",puncsp:" ",Qfr:"𝔔",qfr:"𝔮",qint:"⨌",Qopf:"ℚ",qopf:"𝕢",qprime:"⁗",Qscr:"𝒬",qscr:"𝓆",quaternions:"ℍ",quatint:"⨖",quest:"?",questeq:"≟",QUOT:'"',quot:'"',rAarr:"⇛",race:"∽̱",Racute:"Ŕ",racute:"ŕ",radic:"√",raemptyv:"⦳",Rang:"⟫",rang:"⟩",rangd:"⦒",range:"⦥",rangle:"⟩",raquo:"»",Rarr:"↠",rArr:"⇒",rarr:"→",rarrap:"⥵",rarrb:"⇥",rarrbfs:"⤠",rarrc:"⤳",rarrfs:"⤞",rarrhk:"↪",rarrlp:"↬",rarrpl:"⥅",rarrsim:"⥴",Rarrtl:"⤖",rarrtl:"↣",rarrw:"↝",rAtail:"⤜",ratail:"⤚",ratio:"∶",rationals:"ℚ",RBarr:"⤐",rBarr:"⤏",rbarr:"⤍",rbbrk:"❳",rbrace:"}",rbrack:"]",rbrke:"⦌",rbrksld:"⦎",rbrkslu:"⦐",Rcaron:"Ř",rcaron:"ř",Rcedil:"Ŗ",rcedil:"ŗ",rceil:"⌉",rcub:"}",Rcy:"Р",rcy:"р",rdca:"⤷",rdldhar:"⥩",rdquo:"”",rdquor:"”",rdsh:"↳",Re:"ℜ",real:"ℜ",realine:"ℛ",realpart:"ℜ",reals:"ℝ",rect:"▭",REG:"®",reg:"®",ReverseElement:"∋",ReverseEquilibrium:"⇋",ReverseUpEquilibrium:"⥯",rfisht:"⥽",rfloor:"⌋",Rfr:"ℜ",rfr:"𝔯",rHar:"⥤",rhard:"⇁",rharu:"⇀",rharul:"⥬",Rho:"Ρ",rho:"ρ",rhov:"ϱ",RightAngleBracket:"⟩",RightArrow:"→",Rightarrow:"⇒",rightarrow:"→",RightArrowBar:"⇥",RightArrowLeftArrow:"⇄",rightarrowtail:"↣",RightCeiling:"⌉",RightDoubleBracket:"⟧",RightDownTeeVector:"⥝",RightDownVector:"⇂",RightDownVectorBar:"⥕",RightFloor:"⌋",rightharpoondown:"⇁",rightharpoonup:"⇀",rightleftarrows:"⇄",rightleftharpoons:"⇌",rightrightarrows:"⇉",rightsquigarrow:"↝",RightTee:"⊢",RightTeeArrow:"↦",RightTeeVector:"⥛",rightthreetimes:"⋌",RightTriangle:"⊳",RightTriangleBar:"⧐",RightTriangleEqual:"⊵",RightUpDownVector:"⥏",RightUpTeeVector:"⥜",RightUpVector:"↾",RightUpVectorBar:"⥔",RightVector:"⇀",RightVectorBar:"⥓",ring:"˚",risingdotseq:"≓",rlarr:"⇄",rlhar:"⇌",rlm:"",rmoust:"⎱",rmoustache:"⎱",rnmid:"⫮",roang:"⟭",roarr:"⇾",robrk:"⟧",ropar:"⦆",Ropf:"ℝ",ropf:"𝕣",roplus:"⨮",rotimes:"⨵",RoundImplies:"⥰",rpar:")",rpargt:"⦔",rppolint:"⨒",rrarr:"⇉",Rrightarrow:"⇛",rsaquo:"›",Rscr:"ℛ",rscr:"𝓇",Rsh:"↱",rsh:"↱",rsqb:"]",rsquo:"’",rsquor:"’",rthree:"⋌",rtimes:"⋊",rtri:"▹",rtrie:"⊵",rtrif:"▸",rtriltri:"⧎",RuleDelayed:"⧴",ruluhar:"⥨",rx:"℞",Sacute:"Ś",sacute:"ś",sbquo:"‚",Sc:"⪼",sc:"≻",scap:"⪸",Scaron:"Š",scaron:"š",sccue:"≽",scE:"⪴",sce:"⪰",Scedil:"Ş",scedil:"ş",Scirc:"Ŝ",scirc:"ŝ",scnap:"⪺",scnE:"⪶",scnsim:"⋩",scpolint:"⨓",scsim:"≿",Scy:"С",scy:"с",sdot:"⋅",sdotb:"⊡",sdote:"⩦",searhk:"⤥",seArr:"⇘",searr:"↘",searrow:"↘",sect:"§",semi:";",seswar:"⤩",setminus:"∖",setmn:"∖",sext:"✶",Sfr:"𝔖",sfr:"𝔰",sfrown:"⌢",sharp:"♯",SHCHcy:"Щ",shchcy:"щ",SHcy:"Ш",shcy:"ш",ShortDownArrow:"↓",ShortLeftArrow:"←",shortmid:"∣",shortparallel:"∥",ShortRightArrow:"→",ShortUpArrow:"↑",shy:"",Sigma:"Σ",sigma:"σ",sigmaf:"ς",sigmav:"ς",sim:"∼",simdot:"⩪",sime:"≃",simeq:"≃",simg:"⪞",simgE:"⪠",siml:"⪝",simlE:"⪟",simne:"≆",simplus:"⨤",simrarr:"⥲",slarr:"←",SmallCircle:"∘",smallsetminus:"∖",smashp:"⨳",smeparsl:"⧤",smid:"∣",smile:"⌣",smt:"⪪",smte:"⪬",smtes:"⪬︀",SOFTcy:"Ь",softcy:"ь",sol:"/",solb:"⧄",solbar:"⌿",Sopf:"𝕊",sopf:"𝕤",spades:"♠",spadesuit:"♠",spar:"∥",sqcap:"⊓",sqcaps:"⊓︀",sqcup:"⊔",sqcups:"⊔︀",Sqrt:"√",sqsub:"⊏",sqsube:"⊑",sqsubset:"⊏",sqsubseteq:"⊑",sqsup:"⊐",sqsupe:"⊒",sqsupset:"⊐",sqsupseteq:"⊒",squ:"□",Square:"□",square:"□",SquareIntersection:"⊓",SquareSubset:"⊏",SquareSubsetEqual:"⊑",SquareSuperset:"⊐",SquareSupersetEqual:"⊒",SquareUnion:"⊔",squarf:"▪",squf:"▪",srarr:"→",Sscr:"𝒮",sscr:"𝓈",ssetmn:"∖",ssmile:"⌣",sstarf:"⋆",Star:"⋆",star:"☆",starf:"★",straightepsilon:"ϵ",straightphi:"ϕ",strns:"¯",Sub:"⋐",sub:"⊂",subdot:"⪽",subE:"⫅",sube:"⊆",subedot:"⫃",submult:"⫁",subnE:"⫋",subne:"⊊",subplus:"⪿",subrarr:"⥹",Subset:"⋐",subset:"⊂",subseteq:"⊆",subseteqq:"⫅",SubsetEqual:"⊆",subsetneq:"⊊",subsetneqq:"⫋",subsim:"⫇",subsub:"⫕",subsup:"⫓",succ:"≻",succapprox:"⪸",succcurlyeq:"≽",Succeeds:"≻",SucceedsEqual:"⪰",SucceedsSlantEqual:"≽",SucceedsTilde:"≿",succeq:"⪰",succnapprox:"⪺",succneqq:"⪶",succnsim:"⋩",succsim:"≿",SuchThat:"∋",Sum:"∑",sum:"∑",sung:"♪",Sup:"⋑",sup:"⊃",sup1:"¹",sup2:"²",sup3:"³",supdot:"⪾",supdsub:"⫘",supE:"⫆",supe:"⊇",supedot:"⫄",Superset:"⊃",SupersetEqual:"⊇",suphsol:"⟉",suphsub:"⫗",suplarr:"⥻",supmult:"⫂",supnE:"⫌",supne:"⊋",supplus:"⫀",Supset:"⋑",supset:"⊃",supseteq:"⊇",supseteqq:"⫆",supsetneq:"⊋",supsetneqq:"⫌",supsim:"⫈",supsub:"⫔",supsup:"⫖",swarhk:"⤦",swArr:"⇙",swarr:"↙",swarrow:"↙",swnwar:"⤪",szlig:"ß",Tab:" ",target:"⌖",Tau:"Τ",tau:"τ",tbrk:"⎴",Tcaron:"Ť",tcaron:"ť",Tcedil:"Ţ",tcedil:"ţ",Tcy:"Т",tcy:"т",tdot:"⃛",telrec:"⌕",Tfr:"𝔗",tfr:"𝔱",there4:"∴",Therefore:"∴",therefore:"∴",Theta:"Θ",theta:"θ",thetasym:"ϑ",thetav:"ϑ",thickapprox:"≈",thicksim:"∼",ThickSpace:" ",thinsp:" ",ThinSpace:" ",thkap:"≈",thksim:"∼",THORN:"Þ",thorn:"þ",Tilde:"∼",tilde:"˜",TildeEqual:"≃",TildeFullEqual:"≅",TildeTilde:"≈",times:"×",timesb:"⊠",timesbar:"⨱",timesd:"⨰",tint:"∭",toea:"⤨",top:"⊤",topbot:"⌶",topcir:"⫱",Topf:"𝕋",topf:"𝕥",topfork:"⫚",tosa:"⤩",tprime:"‴",TRADE:"™",trade:"™",triangle:"▵",triangledown:"▿",triangleleft:"◃",trianglelefteq:"⊴",triangleq:"≜",triangleright:"▹",trianglerighteq:"⊵",tridot:"◬",trie:"≜",triminus:"⨺",TripleDot:"⃛",triplus:"⨹",trisb:"⧍",tritime:"⨻",trpezium:"⏢",Tscr:"𝒯",tscr:"𝓉",TScy:"Ц",tscy:"ц",TSHcy:"Ћ",tshcy:"ћ",Tstrok:"Ŧ",tstrok:"ŧ",twixt:"≬",twoheadleftarrow:"↞",twoheadrightarrow:"↠",Uacute:"Ú",uacute:"ú",Uarr:"↟",uArr:"⇑",uarr:"↑",Uarrocir:"⥉",Ubrcy:"Ў",ubrcy:"ў",Ubreve:"Ŭ",ubreve:"ŭ",Ucirc:"Û",ucirc:"û",Ucy:"У",ucy:"у",udarr:"⇅",Udblac:"Ű",udblac:"ű",udhar:"⥮",ufisht:"⥾",Ufr:"𝔘",ufr:"𝔲",Ugrave:"Ù",ugrave:"ù",uHar:"⥣",uharl:"↿",uharr:"↾",uhblk:"▀",ulcorn:"⌜",ulcorner:"⌜",ulcrop:"⌏",ultri:"◸",Umacr:"Ū",umacr:"ū",uml:"¨",UnderBar:"_",UnderBrace:"⏟",UnderBracket:"⎵",UnderParenthesis:"⏝",Union:"⋃",UnionPlus:"⊎",Uogon:"Ų",uogon:"ų",Uopf:"𝕌",uopf:"𝕦",UpArrow:"↑",Uparrow:"⇑",uparrow:"↑",UpArrowBar:"⤒",UpArrowDownArrow:"⇅",UpDownArrow:"↕",Updownarrow:"⇕",updownarrow:"↕",UpEquilibrium:"⥮",upharpoonleft:"↿",upharpoonright:"↾",uplus:"⊎",UpperLeftArrow:"↖",UpperRightArrow:"↗",Upsi:"ϒ",upsi:"υ",upsih:"ϒ",Upsilon:"Υ",upsilon:"υ",UpTee:"⊥",UpTeeArrow:"↥",upuparrows:"⇈",urcorn:"⌝",urcorner:"⌝",urcrop:"⌎",Uring:"Ů",uring:"ů",urtri:"◹",Uscr:"𝒰",uscr:"𝓊",utdot:"⋰",Utilde:"Ũ",utilde:"ũ",utri:"▵",utrif:"▴",uuarr:"⇈",Uuml:"Ü",uuml:"ü",uwangle:"⦧",vangrt:"⦜",varepsilon:"ϵ",varkappa:"ϰ",varnothing:"∅",varphi:"ϕ",varpi:"ϖ",varpropto:"∝",vArr:"⇕",varr:"↕",varrho:"ϱ",varsigma:"ς",varsubsetneq:"⊊︀",varsubsetneqq:"⫋︀",varsupsetneq:"⊋︀",varsupsetneqq:"⫌︀",vartheta:"ϑ",vartriangleleft:"⊲",vartriangleright:"⊳",Vbar:"⫫",vBar:"⫨",vBarv:"⫩",Vcy:"В",vcy:"в",VDash:"⊫",Vdash:"⊩",vDash:"⊨",vdash:"⊢",Vdashl:"⫦",Vee:"⋁",vee:"∨",veebar:"⊻",veeeq:"≚",vellip:"⋮",Verbar:"‖",verbar:"|",Vert:"‖",vert:"|",VerticalBar:"∣",VerticalLine:"|",VerticalSeparator:"❘",VerticalTilde:"≀",VeryThinSpace:" ",Vfr:"𝔙",vfr:"𝔳",vltri:"⊲",vnsub:"⊂⃒",vnsup:"⊃⃒",Vopf:"𝕍",vopf:"𝕧",vprop:"∝",vrtri:"⊳",Vscr:"𝒱",vscr:"𝓋",vsubnE:"⫋︀",vsubne:"⊊︀",vsupnE:"⫌︀",vsupne:"⊋︀",Vvdash:"⊪",vzigzag:"⦚",Wcirc:"Ŵ",wcirc:"ŵ",wedbar:"⩟",Wedge:"⋀",wedge:"∧",wedgeq:"≙",weierp:"℘",Wfr:"𝔚",wfr:"𝔴",Wopf:"𝕎",wopf:"𝕨",wp:"℘",wr:"≀",wreath:"≀",Wscr:"𝒲",wscr:"𝓌",xcap:"⋂",xcirc:"◯",xcup:"⋃",xdtri:"▽",Xfr:"𝔛",xfr:"𝔵",xhArr:"⟺",xharr:"⟷",Xi:"Ξ",xi:"ξ",xlArr:"⟸",xlarr:"⟵",xmap:"⟼",xnis:"⋻",xodot:"⨀",Xopf:"𝕏",xopf:"𝕩",xoplus:"⨁",xotime:"⨂",xrArr:"⟹",xrarr:"⟶",Xscr:"𝒳",xscr:"𝓍",xsqcup:"⨆",xuplus:"⨄",xutri:"△",xvee:"⋁",xwedge:"⋀",Yacute:"Ý",yacute:"ý",YAcy:"Я",yacy:"я",Ycirc:"Ŷ",ycirc:"ŷ",Ycy:"Ы",ycy:"ы",yen:"¥",Yfr:"𝔜",yfr:"𝔶",YIcy:"Ї",yicy:"ї",Yopf:"𝕐",yopf:"𝕪",Yscr:"𝒴",yscr:"𝓎",YUcy:"Ю",yucy:"ю",Yuml:"Ÿ",yuml:"ÿ",Zacute:"Ź",zacute:"ź",Zcaron:"Ž",zcaron:"ž",Zcy:"З",zcy:"з",Zdot:"Ż",zdot:"ż",zeetrf:"ℨ",ZeroWidthSpace:"",Zeta:"Ζ",zeta:"ζ",Zfr:"ℨ",zfr:"𝔷",ZHcy:"Ж",zhcy:"ж",zigrarr:"⇝",Zopf:"ℤ",zopf:"𝕫",Zscr:"𝒵",zscr:"𝓏",zwj:"",zwnj:""}),n.entityMap=n.HTML_ENTITIES})(_t)),_t}var Nt={},xr;function Jn(){if(xr)return Nt;xr=1;var n=Wt().NAMESPACE,e=/[A-Z_a-z\xC0-\xD6\xD8-\xF6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD]/,t=new RegExp("[\\-\\.0-9"+e.source.slice(1,-1)+"\\u00B7\\u0300-\\u036F\\u203F-\\u2040]"),r=new RegExp("^"+e.source+t.source+"*(?::"+e.source+t.source+"*)?$"),i=0,o=1,u=2,s=3,l=4,d=5,h=6,a=7;function D(C,P){this.message=C,this.locator=P,Error.captureStackTrace&&Error.captureStackTrace(this,D)}D.prototype=new Error,D.prototype.name=D.name;function p(){}p.prototype={parse:function(C,P,F){var M=this.domBuilder;M.startDocument(),L(P,P={}),A(C,P,F,M,this.errorHandler),M.endDocument()}};function A(C,P,F,M,I){function g(te){if(te>65535){te-=65536;var ie=55296+(te>>10),xe=56320+(te&1023);return String.fromCharCode(ie,xe)}else return String.fromCharCode(te)}function y(te){var ie=te.slice(1,-1);return Object.hasOwnProperty.call(F,ie)?F[ie]:ie.charAt(0)==="#"?g(parseInt(ie.substr(1).replace("x","0x"))):(I.error("entity not found:"+te),te)}function b(te){if(te>W){var ie=C.substring(W,te).replace(/&#?\w+;/g,y);V&&T(W),M.characters(ie,0,te-W),W=te}}function T(te,ie){for(;te>=H&&(ie=G.exec(C));)O=ie.index,H=O+ie[0].length,V.lineNumber++;V.columnNumber=te-O+1}for(var O=0,H=0,G=/.*(?:\r\n?|\n)|.*$/g,V=M.locator,Z=[{currentNSMap:P}],J={},W=0;;){try{var U=C.indexOf("<",W);if(U<0){if(!C.substr(W).match(/^\s*$/)){var _=M.doc,K=_.createTextNode(C.substr(W));_.appendChild(K),M.currentElement=K}return}switch(U>W&&b(U),C.charAt(U+1)){case"/":var se=C.indexOf(">",U+3),Y=C.substring(U+2,se).replace(/[ \t\n\r]+$/g,""),re=Z.pop();se<0?(Y=C.substring(U+2).replace(/[\s<].*/,""),I.error("end tag name: "+Y+" is not complete:"+re.tagName),se=U+1+Y.length):Y.match(/\s</)&&(Y=Y.replace(/[\s<].*/,""),I.error("end tag name: "+Y+" maybe not complete"),se=U+1+Y.length);var ae=re.localNSMap,$=re.tagName==Y,ee=$||re.tagName&&re.tagName.toLowerCase()==Y.toLowerCase();if(ee){if(M.endElement(re.uri,re.localName,Y),ae)for(var ce in ae)Object.prototype.hasOwnProperty.call(ae,ce)&&M.endPrefixMapping(ce);$||I.fatalError("end tag name: "+Y+" is not match the current start tagName:"+re.tagName)}else Z.push(re);se++;break;case"?":V&&T(U),se=R(C,U,M);break;case"!":V&&T(U),se=X(C,U,M,I);break;default:V&&T(U);var oe=new S,ge=Z[Z.length-1].currentNSMap,se=v(C,U,oe,ge,y,I),pe=oe.length;if(!oe.closed&&E(C,se,oe.tagName,J)&&(oe.closed=!0,F.nbsp||I.warning("unclosed xml attribute")),V&&pe){for(var ve=w(V,{}),fe=0;fe<pe;fe++){var De=oe[fe];T(De.offset),De.locator=w(V,{})}M.locator=ve,B(oe,M,ge)&&Z.push(oe),M.locator=V}else B(oe,M,ge)&&Z.push(oe);n.isHTML(oe.uri)&&!oe.closed?se=N(C,se,oe.tagName,y,M):se++}}catch(te){if(te instanceof D)throw te;I.error("element parse error: "+te),se=-1}se>W?W=se:b(Math.max(U,W)+1)}}function w(C,P){return P.lineNumber=C.lineNumber,P.columnNumber=C.columnNumber,P}function v(C,P,F,M,I,g){function y(V,Z,J){F.attributeNames.hasOwnProperty(V)&&g.fatalError("Attribute "+V+" redefined"),F.addValue(V,Z.replace(/[\t\n\r]/g," ").replace(/&#?\w+;/g,I),J)}for(var b,T,O=++P,H=i;;){var G=C.charAt(O);switch(G){case"=":if(H===o)b=C.slice(P,O),H=s;else if(H===u)H=s;else throw new Error("attribute equal must after attrName");break;case"'":case'"':if(H===s||H===o)if(H===o&&(g.warning('attribute value must after "="'),b=C.slice(P,O)),P=O+1,O=C.indexOf(G,P),O>0)T=C.slice(P,O),y(b,T,P-1),H=d;else throw new Error("attribute value no end '"+G+"' match");else if(H==l)T=C.slice(P,O),y(b,T,P),g.warning('attribute "'+b+'" missed start quot('+G+")!!"),P=O+1,H=d;else throw new Error('attribute value must after "="');break;case"/":switch(H){case i:F.setTagName(C.slice(P,O));case d:case h:case a:H=a,F.closed=!0;case l:case o:break;case u:F.closed=!0;break;default:throw new Error("attribute invalid close char('/')")}break;case"":return g.error("unexpected end of input"),H==i&&F.setTagName(C.slice(P,O)),O;case">":switch(H){case i:F.setTagName(C.slice(P,O));case d:case h:case a:break;case l:case o:T=C.slice(P,O),T.slice(-1)==="/"&&(F.closed=!0,T=T.slice(0,-1));case u:H===u&&(T=b),H==l?(g.warning('attribute "'+T+'" missed quot(")!'),y(b,T,P)):((!n.isHTML(M[""])||!T.match(/^(?:disabled|checked|selected)$/i))&&g.warning('attribute "'+T+'" missed value!! "'+T+'" instead!!'),y(T,T,P));break;case s:throw new Error("attribute value missed!!")}return O;case"":G=" ";default:if(G<=" ")switch(H){case i:F.setTagName(C.slice(P,O)),H=h;break;case o:b=C.slice(P,O),H=u;break;case l:var T=C.slice(P,O);g.warning('attribute "'+T+'" missed quot(")!!'),y(b,T,P);case d:H=h;break}else switch(H){case u:F.tagName,(!n.isHTML(M[""])||!b.match(/^(?:disabled|checked|selected)$/i))&&g.warning('attribute "'+b+'" missed value!! "'+b+'" instead2!!'),y(b,b,P),P=O,H=o;break;case d:g.warning('attribute space is required"'+b+'"!!');case h:H=o,P=O;break;case s:H=l,P=O;break;case a:throw new Error("elements closed character '/' and '>' must be connected to")}}O++}}function B(C,P,F){for(var M=C.tagName,I=null,G=C.length;G--;){var g=C[G],y=g.qName,b=g.value,V=y.indexOf(":");if(V>0)var T=g.prefix=y.slice(0,V),O=y.slice(V+1),H=T==="xmlns"&&O;else O=y,T=null,H=y==="xmlns"&&"";g.localName=O,H!==!1&&(I==null&&(I={},L(F,F={})),F[H]=I[H]=b,g.uri=n.XMLNS,P.startPrefixMapping(H,b))}for(var G=C.length;G--;){g=C[G];var T=g.prefix;T&&(T==="xml"&&(g.uri=n.XML),T!=="xmlns"&&(g.uri=F[T||""]))}var V=M.indexOf(":");V>0?(T=C.prefix=M.slice(0,V),O=C.localName=M.slice(V+1)):(T=null,O=C.localName=M);var Z=C.uri=F[T||""];if(P.startElement(Z,O,M,C),C.closed){if(P.endElement(Z,O,M),I)for(T in I)Object.prototype.hasOwnProperty.call(I,T)&&P.endPrefixMapping(T)}else return C.currentNSMap=F,C.localNSMap=I,!0}function N(C,P,F,M,I){if(/^(?:script|textarea)$/i.test(F)){var g=C.indexOf("</"+F+">",P),y=C.substring(P+1,g);if(/[&<]/.test(y))return/^script$/i.test(F)?(I.characters(y,0,y.length),g):(y=y.replace(/&#?\w+;/g,M),I.characters(y,0,y.length),g)}return P+1}function E(C,P,F,M){var I=M[F];return I==null&&(I=C.lastIndexOf("</"+F+">"),I<P&&(I=C.lastIndexOf("</"+F)),M[F]=I),I<P}function L(C,P){for(var F in C)Object.prototype.hasOwnProperty.call(C,F)&&(P[F]=C[F])}function X(C,P,F,M){var I=C.charAt(P+2);switch(I){case"-":if(C.charAt(P+3)==="-"){var g=C.indexOf("-->",P+4);return g>P?(F.comment(C,P+4,g-P-4),g+3):(M.error("Unclosed comment"),-1)}else return-1;default:if(C.substr(P+3,6)=="CDATA["){var g=C.indexOf("]]>",P+9);return F.startCDATA(),F.characters(C,P+9,g-P-9),F.endCDATA(),g+3}var y=z(C,P),b=y.length;if(b>1&&/!doctype/i.test(y[0][0])){var T=y[1][0],O=!1,H=!1;b>3&&(/^public$/i.test(y[2][0])?(O=y[3][0],H=b>4&&y[4][0]):/^system$/i.test(y[2][0])&&(H=y[3][0]));var G=y[b-1];return F.startDTD(T,O,H),F.endDTD(),G.index+G[0].length}}return-1}function R(C,P,F){var M=C.indexOf("?>",P);if(M){var I=C.substring(P,M).match(/^<\?(\S*)\s*([\s\S]*?)\s*$/);return I?(I[0].length,F.processingInstruction(I[1],I[2]),M+2):-1}return-1}function S(){this.attributeNames={}}S.prototype={setTagName:function(C){if(!r.test(C))throw new Error("invalid tagName:"+C);this.tagName=C},addValue:function(C,P,F){if(!r.test(C))throw new Error("invalid attribute:"+C);this.attributeNames[C]=this.length,this[this.length++]={qName:C,value:P,offset:F}},length:0,getLocalName:function(C){return this[C].localName},getLocator:function(C){return this[C].locator},getQName:function(C){return this[C].qName},getURI:function(C){return this[C].uri},getValue:function(C){return this[C].value}};function z(C,P){var F,M=[],I=/'[^']+'|"[^"]+"|[^\s<>\/=]+=?|(\/?\s*>|<)/g;for(I.lastIndex=P,I.exec(C);F=I.exec(C);)if(M.push(F),F[1])return M}return Nt.XMLReader=p,Nt.ParseError=D,Nt}var Nr;function Zn(){if(Nr)return pt;Nr=1;var n=Wt(),e=Yr(),t=Yn(),r=Jn(),i=e.DOMImplementation,o=n.NAMESPACE,u=r.ParseError,s=r.XMLReader;function l(v){return v.replace(/\r[\n\u0085]/g,`
|
|
3
|
+
`).replace(/[\r\u0085\u2028]/g,`
|
|
4
|
+
`)}function d(v){this.options=v||{locator:{}}}d.prototype.parseFromString=function(v,B){var N=this.options,E=new s,L=N.domBuilder||new a,X=N.errorHandler,R=N.locator,S=N.xmlns||{},z=/\/x?html?$/.test(B),C=z?t.HTML_ENTITIES:t.XML_ENTITIES;R&&L.setDocumentLocator(R),E.errorHandler=h(X,L,R),E.domBuilder=N.domBuilder||L,z&&(S[""]=o.HTML),S.xml=S.xml||o.XML;var P=N.normalizeLineEndings||l;return v&&typeof v=="string"?E.parse(P(v),S,C):E.errorHandler.error("invalid doc source"),L.doc};function h(v,B,N){if(!v){if(B instanceof a)return B;v=B}var E={},L=v instanceof Function;N=N||{};function X(R){var S=v[R];!S&&L&&(S=v.length==2?function(z){v(R,z)}:v),E[R]=S&&function(z){S("[xmldom "+R+"] "+z+p(N))}||function(){}}return X("warning"),X("error"),X("fatalError"),E}function a(){this.cdata=!1}function D(v,B){B.lineNumber=v.lineNumber,B.columnNumber=v.columnNumber}a.prototype={startDocument:function(){this.doc=new i().createDocument(null,null,null),this.locator&&(this.doc.documentURI=this.locator.systemId)},startElement:function(v,B,N,E){var L=this.doc,X=L.createElementNS(v,N||B),R=E.length;w(this,X),this.currentElement=X,this.locator&&D(this.locator,X);for(var S=0;S<R;S++){var v=E.getURI(S),z=E.getValue(S),N=E.getQName(S),C=L.createAttributeNS(v,N);this.locator&&D(E.getLocator(S),C),C.value=C.nodeValue=z,X.setAttributeNode(C)}},endElement:function(v,B,N){var E=this.currentElement;E.tagName,this.currentElement=E.parentNode},startPrefixMapping:function(v,B){},endPrefixMapping:function(v){},processingInstruction:function(v,B){var N=this.doc.createProcessingInstruction(v,B);this.locator&&D(this.locator,N),w(this,N)},ignorableWhitespace:function(v,B,N){},characters:function(v,B,N){if(v=A.apply(this,arguments),v){if(this.cdata)var E=this.doc.createCDATASection(v);else var E=this.doc.createTextNode(v);this.currentElement?this.currentElement.appendChild(E):/^\s*$/.test(v)&&this.doc.appendChild(E),this.locator&&D(this.locator,E)}},skippedEntity:function(v){},endDocument:function(){this.doc.normalize()},setDocumentLocator:function(v){(this.locator=v)&&(v.lineNumber=0)},comment:function(v,B,N){v=A.apply(this,arguments);var E=this.doc.createComment(v);this.locator&&D(this.locator,E),w(this,E)},startCDATA:function(){this.cdata=!0},endCDATA:function(){this.cdata=!1},startDTD:function(v,B,N){var E=this.doc.implementation;if(E&&E.createDocumentType){var L=E.createDocumentType(v,B,N);this.locator&&D(this.locator,L),w(this,L),this.doc.doctype=L}},warning:function(v){console.warn("[xmldom warning] "+v,p(this.locator))},error:function(v){console.error("[xmldom error] "+v,p(this.locator))},fatalError:function(v){throw new u(v,this.locator)}};function p(v){if(v)return`
|
|
5
|
+
@`+(v.systemId||"")+"#[line:"+v.lineNumber+",col:"+v.columnNumber+"]"}function A(v,B,N){return typeof v=="string"?v.substr(B,N):v.length>=B+N||B?new java.lang.String(v,B,N)+"":v}"endDTD,startEntity,endEntity,attributeDecl,elementDecl,externalEntityDecl,internalEntityDecl,resolveEntity,getExternalSubset,notationDecl,unparsedEntityDecl".replace(/\w+/g,function(v){a.prototype[v]=function(){return null}});function w(v,B){v.currentElement?v.currentElement.appendChild(B):v.doc.appendChild(B)}return pt.__DOMHandler=a,pt.normalizeLineEndings=l,pt.DOMParser=d,pt}var Pr;function Kn(){if(Pr)return At;Pr=1;var n=Yr();return At.DOMImplementation=n.DOMImplementation,At.XMLSerializer=n.XMLSerializer,At.DOMParser=Zn().DOMParser,At}var _n=Rt.exports,Tr;function $n(){return Tr||(Tr=1,(function(n){(function(e,t){n.exports?n.exports=t(Kn().DOMParser):e.X2JS=t()})(_n,function(e){return function(r){var i="3.4.4";r=r||{};function o(){r.arrayAccessForm=r.arrayAccessForm||"none",r.emptyNodeForm=r.emptyNodeForm||"text",r.jsAttributeFilter=r.jsAttributeFilter,r.jsAttributeConverter=r.jsAttributeConverter,r.attributeConverters=r.attributeConverters||[],r.datetimeAccessFormPaths=r.datetimeAccessFormPaths||[],r.arrayAccessFormPaths=r.arrayAccessFormPaths||[],r.xmldomOptions=r.xmldomOptions||{},r.enableToStringFunc===void 0&&(r.enableToStringFunc=!0),r.skipEmptyTextNodesForObj===void 0&&(r.skipEmptyTextNodesForObj=!0),r.stripWhitespaces===void 0&&(r.stripWhitespaces=!0),r.useDoubleQuotes===void 0&&(r.useDoubleQuotes=!0),r.ignoreRoot===void 0&&(r.ignoreRoot=!1),r.escapeMode===void 0&&(r.escapeMode=!0),r.attributePrefix===void 0&&(r.attributePrefix="_"),r.selfClosingElements===void 0&&(r.selfClosingElements=!0),r.keepCData===void 0&&(r.keepCData=!1),r.keepText===void 0&&(r.keepText=!1),r.jsDateUTC===void 0&&(r.jsDateUTC=!1)}function u(){function g(y){var b=String(y);return b.length===1&&(b="0"+b),b}typeof String.prototype.trim!="function"&&(String.prototype.trim=function(){return this.replace(/^\s+|^\n+|(\s|\n)+$/g,"")}),typeof Date.prototype.toISOString!="function"&&(Date.prototype.toISOString=function(){var b=1e3;return this.getUTCFullYear()+"-"+g(this.getUTCMonth()+1)+"-"+g(this.getUTCDate())+"T"+g(this.getUTCHours())+":"+g(this.getUTCMinutes())+":"+g(this.getUTCSeconds())+"."+String((this.getUTCMilliseconds()/b).toFixed(3)).slice(2,5)+"Z"})}o(),u();var s={ELEMENT_NODE:1,TEXT_NODE:3,CDATA_SECTION_NODE:4,COMMENT_NODE:8,DOCUMENT_NODE:9};function l(g){var y=g.localName;return y==null&&(y=g.baseName),(y==null||y==="")&&(y=g.nodeName),y}function d(g){return g.prefix}function h(g){return typeof g=="string"?g.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'"):g}function a(g){return g.replace(/</g,"<").replace(/>/g,">").replace(/"/g,'"').replace(/'/g,"'").replace(/&/g,"&")}function D(g,y,b){if(r.arrayAccessForm==="property"&&(g[y]instanceof Array?g[y+"_asArray"]=g[y]:g[y+"_asArray"]=[g[y]]),!(g[y]instanceof Array)&&r.arrayAccessFormPaths.length>0){for(var T=!1,O=0;O<r.arrayAccessFormPaths.length;O++){var H=r.arrayAccessFormPaths[O];if(typeof H=="string"){if(H===b){T=!0;break}}else if(H instanceof RegExp){if(H.test(b)){T=!0;break}}else if(typeof H=="function"&&H(y,b)){T=!0;break}}T&&(g[y]=[g[y]])}}function p(g){var y=60,b=g.split(/[-T:+Z]/g),T=new Date(b[0],b[1]-1,b[2]),O=b[5].split(".");if(T.setHours(b[3],b[4],O[0]),O.length>1&&T.setMilliseconds(O[1]),b[6]&&b[7]){var H=b[6]*y+Number(b[7]),G=/\d\d-\d\d:\d\d$/.test(g)?"-":"+";H=0+(G==="-"?-1*H:H),T.setMinutes(T.getMinutes()-H-T.getTimezoneOffset())}else g.indexOf("Z",g.length-1)!==-1&&(T=new Date(Date.UTC(T.getFullYear(),T.getMonth(),T.getDate(),T.getHours(),T.getMinutes(),T.getSeconds(),T.getMilliseconds())));return T}function A(g,y,b){if(r.datetimeAccessFormPaths.length>0)for(var T=b.split(".#")[0],O=0;O<r.datetimeAccessFormPaths.length;O++){var H=r.datetimeAccessFormPaths[O];if(typeof H=="string"){if(H===T)return p(g)}else if(H instanceof RegExp){if(H.test(T))return p(g)}else if(typeof H=="function"&&H(T))return p(g)}return g}function w(g){for(var y={},b=g.childNodes,T=0;T<b.length;T++){var O=b.item(T);if(O.nodeType===s.ELEMENT_NODE){var H=l(O);r.ignoreRoot?y=B(O,H):y[H]=B(O,H)}}return y}function v(g,y){var b={};b.__cnt=0;for(var T=g.childNodes,O=0;O<T.length;O++){var H=T.item(O),G=l(H);H.nodeType!==s.COMMENT_NODE&&(b.__cnt++,b[G]==null?(b[G]=B(H,y+"."+G),D(b,G,y+"."+G)):(b[G]instanceof Array||(b[G]=[b[G]],D(b,G,y+"."+G)),b[G][b[G].length]=B(H,y+"."+G)))}for(var V=0;V<g.attributes.length;V++){var Z=g.attributes.item(V);b.__cnt++;for(var J=Z.value,W=0;W<r.attributeConverters.length;W++){var U=r.attributeConverters[W];U.test.call(null,Z.name,Z.value)&&(J=U.convert.call(null,Z.name,Z.value))}b[r.attributePrefix+Z.name]=J}var _=d(g);return _&&(b.__cnt++,b.__prefix=_),b["#text"]&&(b.__text=b["#text"],b.__text instanceof Array&&(b.__text=b.__text.join(`
|
|
6
|
+
`)),r.escapeMode&&(b.__text=a(b.__text)),r.stripWhitespaces&&(b.__text=b.__text.trim()),delete b["#text"],r.arrayAccessForm==="property"&&delete b["#text_asArray"],b.__text=A(b.__text,"#text",y+".#text")),b.hasOwnProperty("#cdata-section")&&(b.__cdata=b["#cdata-section"],delete b["#cdata-section"],r.arrayAccessForm==="property"&&delete b["#cdata-section_asArray"]),b.__cnt===1&&b.__text&&!r.keepText?b=b.__text:b.__cnt===0&&r.emptyNodeForm==="text"?b="":b.__cnt>1&&b.__text!==void 0&&r.skipEmptyTextNodesForObj&&(r.stripWhitespaces&&b.__text===""||b.__text.trim()==="")&&delete b.__text,delete b.__cnt,!r.keepCData&&!b.hasOwnProperty("__text")&&b.hasOwnProperty("__cdata")&&Object.keys(b).length===1?b.__cdata?b.__cdata:"":(r.enableToStringFunc&&(b.__text||b.__cdata)&&(b.toString=function(){return(this.__text?this.__text:"")+(this.__cdata?this.__cdata:"")}),b)}function B(g,y){return g.nodeType===s.DOCUMENT_NODE?w(g):g.nodeType===s.ELEMENT_NODE?v(g,y):g.nodeType===s.TEXT_NODE||g.nodeType===s.CDATA_SECTION_NODE?g.nodeValue:null}function N(g,y,b,T){var O="<"+(g&&g.__prefix?g.__prefix+":":"")+y;if(b)for(var H=0;H<b.length;H++){var G=b[H],V=g[G];r.escapeMode&&(V=h(V)),O+=" "+G.substr(r.attributePrefix.length)+"=",r.useDoubleQuotes?O+='"'+V+'"':O+="'"+V+"'"}return T?O+=" />":O+=">",O}function E(g,y){return"</"+(g&&g.__prefix?g.__prefix+":":"")+y+">"}function L(g,y){return g.indexOf(y,g.length-y.length)!==-1}function X(g,y){return!!(r.arrayAccessForm==="property"&&L(y.toString(),"_asArray")||y.toString().indexOf(r.attributePrefix)===0||y.toString().indexOf("__")===0||g[y]instanceof Function)}function R(g){var y=0;if(g instanceof Object)for(var b in g)X(g,b)||y++;return y}function S(g){var y=[];if(g instanceof Object)for(var b in g)b.toString().indexOf("__")===-1&&b.toString().indexOf(r.attributePrefix)===0&&y.push(b);return y}function z(g){var y="";return g.__cdata&&(y+="<![CDATA["+g.__cdata+"]]>"),(g.__text||typeof g.__text=="number"||typeof g.__text=="boolean")&&(r.escapeMode?y+=h(g.__text):y+=g.__text),y}function C(g){var y="";return g instanceof Object?y+=z(g):g!==null&&(r.escapeMode?y+=h(g):y+=g),y}function P(g,y,b){var T="";if(g.length===0)T+=N(g,y,b,!0);else for(var O=0;O<g.length;O++)T+=F(g[O],y,S(g[O]));return T}function F(g,y,b){var T="";if(r.jsAttributeFilter&&r.jsAttributeFilter.call(null,y,g))return T;if(r.jsAttributeConverter&&(g=r.jsAttributeConverter.call(null,y,g)),(g==null||g==="")&&r.selfClosingElements)T+=N(g,y,b,!0);else if(typeof g=="object")if(Object.prototype.toString.call(g)==="[object Array]")T+=P(g,y,b);else if(g instanceof Date)T+=N(g,y,b,!1),T+=r.jsDateUTC?g.toUTCString():g.toISOString(),T+=E(g,y);else{var O=R(g);O>0||typeof g.__text=="number"||typeof g.__text=="boolean"||g.__text||g.__cdata?(T+=N(g,y,b,!1),T+=M(g),T+=E(g,y)):r.selfClosingElements?T+=N(g,y,b,!0):(T+=N(g,y,b,!1),T+=E(g,y))}else T+=N(g,y,b,!1),T+=C(g),T+=E(g,y);return T}function M(g){var y="",b=R(g);if(b>0){for(var T in g)if(!X(g,T)){var O=g[T],H=S(O);y+=F(O,T,H)}}return y+=C(g),y}function I(g){if(g===void 0||typeof g!="string")return null;var y=null,b=null;if(e)y=new e(r.xmldomOptions),b=y.parseFromString(g,"text/xml");else if(window&&window.DOMParser){y=new window.DOMParser;var T=null,O=window.ActiveXObject||"ActiveXObject"in window;if(!O&&document.all&&!document.addEventListener)try{T=y.parseFromString("INVALID","text/xml").childNodes[0].namespaceURI}catch{T=null}try{b=y.parseFromString(g,"text/xml"),T!==null&&b.getElementsByTagNameNS(T,"parsererror").length>0&&(b=null)}catch{b=null}}else g.indexOf("<?")===0&&(g=g.substr(g.indexOf("?>")+2)),b=new ActiveXObject("Microsoft.XMLDOM"),b.async="false",b.loadXML(g);return b}this.asArray=function(y){return y==null?[]:y instanceof Array?y:[y]},this.toXmlDateTime=function(y){return y instanceof Date?y.toISOString():typeof y=="number"?new Date(y).toISOString():null},this.asDateTime=function(y){return typeof y=="string"?p(y):y},this.xml2dom=function(y){return I(y)},this.dom2js=function(y){return B(y,null)},this.js2dom=function(y){var b=this.js2xml(y);return I(b)},this.xml2js=function(y){var b=I(y);return b!=null?this.dom2js(b):null},this.js2xml=function(y){return M(y)},this.getVersion=function(){return i}}})})(Rt)),Rt.exports}var eo=$n();const to=Un(eo),ro=new to({attributePrefix:""});function qt(n,e){const t=ro.xml2js(n);if(!e)return t;const r=t?.catalog?.dataset?.[e];return r===void 0||Array.isArray(r)?r:[r]}function Jr(n){const e=qt(n),t=e?.gridDataset;if(!t){const u=Object.keys(e||{}).join(", ")||"none";throw new Error("Invalid NCSS dataset XML: expected gridDataset root, received: "+u)}const r=t.gridSet?.grid;if(!r)throw new Error("Invalid NCSS dataset XML: gridDataset.gridSet.grid is missing");let i=r;Ke.isObject(i)&&(i=[i]);const o=Array.isArray(t.axis)?t.axis:[t.axis].filter(Boolean);return{latLonBox:t.LatLonBox,timeSpan:t.TimeSpan,axis:o,grid:i}}function no(n){const e=String(n||"").split("."),t=e[e.length-1]?.toLowerCase()||"other";return["png","jpg","jpeg","xlsx","xls","csv","txt","json","geojson","grb","grib1","grib2","grb2","gr2","nc"].includes(t)?t:"other"}function rr(n){const{xmlJson:e,type:t}=n;return e.map(r=>t==="menu"?{label:r["xlink:title"],key:r.ID,url:r.ID,type:t,isLeaf:!1}:{label:r.name,key:r.ID,url:r.urlPath,type:t,isLeaf:!0,fileType:no(r.name)})}async function Zr(n,e,t,r,i,o,u){const s=Ae(),l=new URLSearchParams({service:"WMS",version:"1.3.0",request:"GetMetadata",item:"minmax",layers:e,styles:"",CRS:"EPSG:4326",BBOX:t.south+","+t.west+","+t.north+","+t.east,time:r||"",width:"2",height:"2"}),d=o??s.serviceBaseUrl,h=String(n).replace(/^\/+/,""),a=await Qt("wms/"+h+"?"+l.toString(),{baseUrl:d,authorization:i,signal:u}),D=(a.headers.get("content-type")||"").toLowerCase();if(!D.includes("json")){const p=await a.text();throw new Error("WMS min/max response has invalid content type: "+(D||"unknown")+"; "+p.slice(0,240))}return await a.json()}async function Kr(n,e,t={}){try{const r=String(n).replace(/^\/+|\/+$/g,""),i=await fr("catalog/"+r+"/catalog.xml",e,{baseUrl:t.serviceBaseUrl,signal:t.signal}),o=qt(i,"catalogRef"),u=qt(i,"dataset"),s=[];let l="";return o?.length&&(s.push(...rr({xmlJson:o,type:"menu"})),l="menu"),u?.length&&(s.push(...rr({xmlJson:u,type:"file"})),l="file"),{type:l,data:s}}catch{return}}async function nr(n){const e=Ae(),t=n.authorization??e.serviceAuthorization,r=n.serviceBaseUrl??e.serviceBaseUrl;let i=n.filePath,o;for(let v=0;v<6;v++){if(o=await Kr(i,t,{serviceBaseUrl:r,signal:n.signal}),!o?.data.length)return;if(o.data.reverse(),o.type==="file")break;if(o.type!=="menu"||!o.data[0]?.url)return;i=o.data[0].url}if(!o?.data.length||o.type!=="file")return;const u=o.data[0];if(!u)return;const s=n.url||u.url||i+"/"+u.label,l="/"+String(s).replace(/^\/+/,""),d=n.ncssBaseUrl??e.ncssBaseUrl,h=await Wr(d.replace(/\/$/,"")+l+"/dataset.xml",t,{baseUrl:r,signal:n.signal}),{latLonBox:a,timeSpan:D,axis:p}=Jr(h),A=p.find(v=>v.name==="time"),w=[];if(A&&D?.begin){const v=Number(A.values?.npts),B=String(A.attribute?.find(L=>L.name==="units")?.value||"").toLowerCase(),N=B.includes("hour")?"hour":B.includes("minute")?"minute":"second",E=Number(A.values?.resolution);if(v>1&&Number.isFinite(E)&&E!==0)for(let L=0;L<v;L++)w.push(Ze(D.begin).add(L*E,N).format("YYYYMMDDHHmmss"));else w.push(Ze(D.begin).format("YYYYMMDDHHmmss"))}return{type:"file",latLonBox:a,timeList:w,fileList:o.data,url:l,authorization:t}}Ze.extend(zr);const Lr="#sym:";async function oo(n,e,t){const r=await fetch(n,{credentials:"include",signal:t,headers:e?{Authorization:e}:void 0}),i=(r.headers.get("content-type")||"").toLowerCase();if(!r.ok){const u=await r.text();throw new Error(`Image request failed: ${r.status} ${r.statusText}; ${u.slice(0,240)}`)}if(!i.includes("image/")){const u=await r.text();throw new Error(`Image response has invalid content type: ${i}; ${u.slice(0,240)}`)}const o=await r.blob();return new Promise((u,s)=>{const l=new FileReader;l.onload=()=>typeof l.result=="string"?u(l.result):s(new Error("Failed to convert image to data URL")),l.onerror=()=>s(l.error??new Error("Failed to read image response")),l.readAsDataURL(o)})}function hr(n){if(typeof n=="function")return n;if(typeof n!="string"||!n.startsWith(Lr))return;const e=n.slice(Lr.length).trim();if(!e)return;const r=globalThis.__layerSymbols?.[e];if(typeof r=="function")return r;console.warn(`[LayerSymbol] 未找到符号函数: ${n}`)}function st(n){const e=Q.bboxPolygon(n),t=Q.toMercator(e),[[r,i],,[o,u]]=t.geometry.coordinates[0];return[r,i,o,u]}function Dt(n,e,t){return n+(e-n)*t}function Ut(n,e,t,r=5,i=1.2){function o(h,a,D){return Math.exp(-(h*h+a*a)/(2*D*D))}const u=Math.floor(r/2);let s=[],l=0;for(let h=-u;h<=u;h++)for(let a=-u;a<=u;a++){const D=o(a,h,i);s.push(D),l+=D}s=s.map(h=>h/l);const d=Array.from({length:t},()=>Array(e).fill(void 0));for(let h=0;h<t;h++)for(let a=0;a<e;a++){if(n[h][a]===void 0){d[h][a]=void 0;continue}let D=0,p=0,A=0;for(let w=-u;w<=u;w++)for(let v=-u;v<=u;v++){const B=Math.min(e-1,Math.max(0,a+v)),N=Math.min(t-1,Math.max(0,h+w)),E=n[N][B];E!==void 0&&(D+=E*s[A],p+=s[A]),A++}d[h][a]=p>0?D/p:void 0}return d}function Ye(n,e=1,t=3){const r=Number(n);return Number.isFinite(r)?Math.max(0,Math.min(t,r)):e}function dr(n,e,t,r){const i=Ye(r);if(i===0)return n;const o=Math.max(1,Math.ceil(i*2));return Ut(n,e,t,o*2+1,i*1.2)}function _r(n,e,t,r,i){const[o,u,s,l]=i,d=o+(s-o)*(n/(t-1)),h=l-(l-u)*(e/(r-1));return[d,h]}function $r(n,e,t,r,i){const[o,u,s,l]=i,d=o+(s-o)*(n/(t-1)),h=l-(l-u)*(e/(r-1));return[d,h]}function io(n,e,t,r){return n.map(i=>{const o=i.coordinates.map(u=>u.map(s=>s.map(([l,d])=>$r(l,d,e,t,r))));return{...i,coordinates:o,properties:i.properties}})}function uo(n,e,t,r){return n.map(i=>{const o=i.coordinates.map(u=>u.map(s=>s.map(([l,d])=>_r(l,d,e,t,r))));return{...i,coordinates:o}})}function Vt(n,e,t,r,i){const o=Math.floor(e),u=Math.min(o+1,r-1),s=Math.floor(t),l=Math.min(s+1,i-1),d=n[s*r+o],h=n[s*r+u],a=n[l*r+o],D=n[l*r+u],p=e-o,A=t-s;return d*(1-p)*(1-A)+h*p*(1-A)+a*(1-p)*A+D*p*A}async function _e(n,e,t,r,i){let o=0,u=0;const s=document.createElement("canvas"),l=s.getContext("2d"),d=new Image,h=await oo(n,r,i?.signal);return d.src=h,new Promise((a,D)=>{d.onload=()=>{o=d.width,u=d.height,s.width=o,s.height=u,l.clearRect(0,0,o,u),l.drawImage(d,0,0);const A=l.getImageData(0,0,o,u).data,[w,v]=e,B=(F,M)=>{const I=(M*o+F)*4;return[A[I]??0,A[I+1]??0,A[I+2]??0,A[I+3]??0]},N=(F,M,I,g,y=4)=>Math.abs(F-g[0])<=y&&Math.abs(M-g[1])<=y&&Math.abs(I-g[2])<=y,E=i?.detectNoDataByBorderColor!==!1;let L=[];const X=(F,M,I)=>L.some(g=>N(F,M,I,g,6));if(E){const F=B(0,0),M=B(Math.max(0,o-1),0),I=B(0,Math.max(0,u-1)),g=B(Math.max(0,o-1),Math.max(0,u-1)),y=[F,M,I,g].filter(O=>O[3]>0).map(O=>[O[0],O[1],O[2]]),b=[];for(const O of y){const H=b.find(G=>N(O[0],O[1],O[2],G.rgb,6));H?H.count+=1:b.push({rgb:O,count:1})}b.sort((O,H)=>H.count-O.count);const T=b[0];L=T&&T.count>=3?[T.rgb]:[]}const R=o*u,S=new Uint8Array(R),z=[],C=F=>{if(F<0||F>=R||S[F])return;const M=F*4,I=A[M]??0,g=A[M+1]??0,y=A[M+2]??0;(A[M+3]??0)>0&&L.length>0&&X(I,g,y)&&(S[F]=1,z.push(F))};for(let F=0;F<o;F++)C(F),C((u-1)*o+F);for(let F=0;F<u;F++)C(F*o),C(F*o+(o-1));for(let F=0;F<z.length;F++){const M=z[F],I=M%o,g=Math.floor(M/o);I>0&&C(M-1),I<o-1&&C(M+1),g>0&&C(M-o),g<u-1&&C(M+o)}const P=[];for(let F=0;F<u;F++)for(let M=0;M<o;M++){const I=(F*o+M)*4,g=F*o+M,y=A[I]??0,b=A[I+1]??0,T=A[I+2]??0;if((A[I+3]??0)===0||S[g]===1){P.push(void 0);continue}const H=.299*y+.587*b+.114*T,G=w+H/255*(v-w);G<w?t?.[0]?P.push(void 0):P.push(w):G>v?t?.[1]?P.push(void 0):P.push(v):P.push(G)}a({grayArr:P,width:o,height:u})},d.onerror=()=>D(new Error(`Failed to decode image response: ${n}`))})}function We(n){return n=n.trim(),n.endsWith("%")?parseFloat(n)/100*255:parseFloat(n)}function or(n){return n=n.trim(),n.endsWith("%")?parseFloat(n)/100:parseFloat(n)}function Ue(n){return isFinite(n)?Math.max(0,Math.min(255,Math.round(n))):0}function bt(n){if(!n)return[0,0,0,0];n=n.trim();const e=n.match(/rgba?\(\s*([0-9.+%]+)[,\s]+([0-9.+%]+)[,\s]+([0-9.+%]+)(?:[,\s]+([0-9.+%]+))?\s*\)/i);if(e){const t=We(e[1]),r=We(e[2]),i=We(e[3]),o=e[4]?or(e[4]):1;return[Ue(t),Ue(r),Ue(i),Math.round(o*255)]}if(n[0]==="#"){let t=n.slice(1);if(t.length===3&&(t=t.split("").map(r=>r+r).join("")),t.length===6){const r=parseInt(t.slice(0,2),16),i=parseInt(t.slice(2,4),16),o=parseInt(t.slice(4,6),16);return[r,i,o,255]}}try{const t=document.createElement("canvas").getContext("2d");t.fillStyle=n;const r=t.fillStyle;if(r&&r!==""){const i=r.match(/rgba?\(([^)]+)\)/);if(i){const o=i[1].split(",").map(h=>h.trim()),u=We(o[0]),s=We(o[1]),l=We(o[2]),d=o[3]?or(o[3]):1;return[Ue(u),Ue(s),Ue(l),Math.round(d*255)]}}}catch{}return[0,0,0,0]}function gr(n,e){if(!Array.isArray(n)||n.length===0)return[];if(!e||e.length!==2)return n;const t=Number(e[0]),r=Number(e[1]);if(!isFinite(t)||!isFinite(r))return n;const i=n.length,o=Math.max(0,Math.min(i,Math.floor(Math.min(t,r)))),u=Math.max(0,Math.min(i,Math.ceil(Math.max(t,r))));return n.slice(o,u)}function it(n,e){const t=gr(n,e);if(!t.length)return;const r=t.find(s=>s?.scope?.length),i=[...t].reverse().find(s=>s?.scope?.length),o=r?.scope?.length?Number(r.scope[0]):void 0,u=i?.scope?.length?Number(i.scope[i.scope.length-1]):void 0;if(!(typeof o>"u"||isNaN(o)))return typeof u>"u"||isNaN(u)?[o,o]:[o,u]}function be(n,e){const t=[],r={},i=gr(n,e);for(const u of i){const s=u?.scope?.length?Number(u.scope[0]):NaN;isNaN(s)||(t.push(s),r[s]=u.color)}return{uniqueThresholds:Array.from(new Set(t)).sort((u,s)=>u-s),colorMap:r}}const $t=new globalThis.Map;function so(n){const e=n?.config,t=(e?.legend??[]).map(r=>({name:r?.name,scope:r?.scope??[],color:r?.color}));return JSON.stringify({url:n?.url,authorization:n?.authorization??"",extent:e?.extent??[],scope:e?.scope??[],legendScope:e?.legendScope??[],legend:t})}async function Bt(n){const e=so(n),t=$t.get(e);if(t)return t;const r=(async()=>{const{config:i,url:o,authorization:u}=n;if(!i)return;const{extent:s,scope:l,legend:d,legendScope:h}=i;if(!s)return;const a=st(s),D=[-99999,99999];Ke.isNumber(l?.[0])&&(D[0]=l[0]),Ke.isNumber(l?.[1])&&(D[1]=l[1]);const{grayArr:p,width:A,height:w}=await _e(o,D,void 0,u,{signal:n.signal}),{uniqueThresholds:v,colorMap:B}=be(d,h),N=[];for(let R=0;R<w;R++){N[R]=[];for(let S=0;S<A;S++)N[R][S]=p[R*A+S]}const E=Ut(N,A,w),L=[],X=[];for(let R=0;R<w;R++){L[R]=[],X[R]=[];for(let S=0;S<A;S++){const z=N[R]&&typeof N[R][S]<"u"?N[R][S]:void 0;L[R][S]=z==null||isNaN(Number(z))?NaN:Number(z);const C=E[R]&&typeof E[R][S]<"u"?E[R][S]:void 0;X[R][S]=C==null||isNaN(Number(C))?NaN:Number(C)}}return{width:A,height:w,extent:a,rawArr2D:L,smoothArr2D:X,uniqueThresholds:v,colorMap:B}})();$t.set(e,r);try{return await r}finally{$t.delete(e)}}function en(n,e,t){const r=n[2]-n[0],i=n[3]-n[1],o=r/i;let u=e,s=Math.round(u/o);return s>t&&(s=t,u=Math.round(s*o)),{width:u,height:s}}function tn(n,e,t){const r=E=>{if(Array.isArray(E)&&E.length>=2){const L=Number(E[0]),X=Number(E[1]);if(Number.isFinite(L)&&Number.isFinite(X))return[L,X]}if(typeof E=="string"){const L=E.split(",").map(X=>Number(X.trim())).filter(X=>Number.isFinite(X));if(L.length>=2)return[L[0],L[1]]}},i=Ae(),o=Number(t?.imageSize??i.imageSize),u=Number.isFinite(o)&&o>0?Math.round(o):i.imageSize,s=st(n.config.extent),{width:l,height:d}=en(s,u,u),h=n?.config?.layerConfig??{},a=h.LAYERS,D=r(n?.config?.scope)??[0,0],p=r(n?.config?.componentScope)??r(n?.config?.uvScope)??r(h.COMPONENT_SCALE_RANGE)??r(h.COMPONENT_SCOPE)??r(h.UV_SCOPE);let A=D;if(Ke.isArray(a)&&a.length>1)if(p){const E=Math.max(Math.abs(p[0]),Math.abs(p[1]));A=[-E,E]}else{const E=Number(D[0]),L=Number(D[1]);if(Number.isFinite(E)&&Number.isFinite(L)){const X=Math.max(Math.abs(E),Math.abs(L));A=[-X,X]}}const w=A.toString(),v=String(t?.serviceBaseUrl??n?.serviceBaseUrl??n?.config?.serviceBaseUrl??i.serviceBaseUrl).replace(/\/$/,""),B=String(n.url||"").replace(/^\/+/,""),N=`${v}/wms/${B}`;if(Ke.isArray(a)){const E=[];return a.forEach(L=>{const X={...h,TIME:Ze(e).utc().format("YYYY-MM-DDTHH:mm:ss.000[Z]"),COLORSCALERANGE:w,BBOX:s.join(","),WIDTH:""+l,HEIGHT:""+d};X.LAYERS=L,E.push(`${N}?${new URLSearchParams(X).toString()}`)}),E}else{const E={...h,TIME:Ze(e).utc().format("YYYY-MM-DDTHH:mm:ss.000[Z]"),COLORSCALERANGE:w,BBOX:s.join(","),WIDTH:""+l,HEIGHT:""+d};return`${N}?${new URLSearchParams(E).toString()}`}}function ao(n,e,t,r){if(!e||e.length===0)return[0,0,0,0];if(r==="discrete"||r==="grid"){let i=e[0];for(let u=0;u<e.length&&n>=e[u];u++)i=e[u];const o=t[e.indexOf(i)];return[o[0],o[1],o[2],o[3]??255]}else{if(n<=e[0]){const A=t[0];return[A[0],A[1],A[2],A[3]??255]}if(n>=e[e.length-1]){const A=t[t.length-1];return[A[0],A[1],A[2],A[3]??255]}let i=0;for(let A=0;A<e.length-1;A++)if(n>=e[A]&&n<=e[A+1]){i=A;break}const o=e[i],u=e[i+1],s=(n-o)/(u-o),l=t[i],d=t[i+1],h=Math.round(Dt(l[0],d[0],s)),a=Math.round(Dt(l[1],d[1],s)),D=Math.round(Dt(l[2],d[2],s)),p=Math.round(Dt(l[3]??255,d[3]??255,s));return[h,a,D,p]}}Ze.extend(zr);function co(n,e){if(n&&typeof n=="object"){const t=n,r={north:Number(t.north),south:Number(t.south),east:Number(t.east),west:Number(t.west)};if(Object.values(r).every(Number.isFinite))return r}if(Array.isArray(e)&&e.length>=4){const[t,r,i,o]=e.map(Number);if([o,r,i,t].every(Number.isFinite))return{north:o,south:r,east:i,west:t}}}function lo(n){return(Array.isArray(n)?n:[n]).map(e=>String(e??"").trim()).filter(Boolean)}async function fo(n,e,t,r,i,o){const u=n.config?.scope,s=Number(u?.[0]),l=Number(u?.[1]),d=Number.isFinite(s),h=Number.isFinite(l);if(d&&h)return[s,l];const a=lo(n.config?.layerConfig?.LAYERS),D=co(i,n.config?.extent);if(!a.length)throw new Error('Layer "'+n.id+'" has no WMS LAYERS setting');if(!D)throw new Error('Layer "'+n.id+'" has no valid extent');const p=Ae(),A=n.serviceBaseUrl??o.serviceBaseUrl??p.serviceBaseUrl,w=t?Ze(t).utc().format("YYYY-MM-DDTHH:mm:ss.000[Z]"):void 0,v=await Promise.all(a.map(X=>Zr(e,X,D,w,r,A,o.signal))),B=Math.min(...v.map(X=>Number(X.min))),N=Math.max(...v.map(X=>Number(X.max))),E=d?s:B,L=h?l:N;if(!Number.isFinite(E)||!Number.isFinite(L))throw new Error('Invalid WMS min/max response for layer "'+n.id+'"');return[E,L]}async function ho(n,e={}){if((Array.isArray(n.type)?n.type:[n.type]).includes("typhoon"))return{...n,show:!0};const r=Ae();let i=n.url,o=n.time,u=n.authorization??e.authorization??r.serviceAuthorization,s;if(!i){let a=await nr({filePath:n.filePath,authorization:u,serviceBaseUrl:n.serviceBaseUrl??e.serviceBaseUrl,ncssBaseUrl:e.ncssBaseUrl,signal:e.signal});if(!a?.fileList?.length&&n.fallbackFilePath&&(a=await nr({filePath:n.fallbackFilePath,authorization:n.fallbackAuthorization??u,serviceBaseUrl:n.serviceBaseUrl??e.serviceBaseUrl,ncssBaseUrl:e.ncssBaseUrl,signal:e.signal})),!a?.fileList?.length||!a.timeList?.length&&!o)return null;i=a.url??a.fileList[0]?.url,o=o??a.timeList[0],u=a.authorization??u,s=a.latLonBox}if(!i)return null;const l=await fo(n,i,o,u,s,e),d=l?{...n,config:{...n.config,scope:l}}:n,h=n.serviceBaseUrl??e.serviceBaseUrl??r.serviceBaseUrl;return{...d,show:!0,time:o,authorization:u,url:tn({...d,url:i},o??"",{serviceBaseUrl:h})}}let Pt=null;const je=64,Je=-1e30;function Gt(n,e,t){const r=n*e,i=new Float32Array(r);for(let o=0;o<e;o++)for(let u=0;u<n;u++){const s=o*n+u,l=t?.[o]?.[u];i[s]=l==null||isNaN(Number(l))?Je:Number(l)}return i}function go(n,e,t){const r=n*e,i=new Uint8Array(r);for(let o=0;o<e;o++)for(let u=0;u<n;u++){const s=o*n+u,l=t?.[o]?.[u];i[s]=l==null||isNaN(Number(l))?0:255}return i}async function mo(){return Pt||(Pt=(async()=>{const n=navigator?.gpu;if(!n)return null;const e=await n.requestAdapter();return e?await e.requestDevice():null})(),Pt)}function Ao(){return`
|
|
7
|
+
struct Params {
|
|
8
|
+
width: u32,
|
|
9
|
+
height: u32,
|
|
10
|
+
thresholdCount: u32,
|
|
11
|
+
colorMode: u32,
|
|
12
|
+
minScope: f32,
|
|
13
|
+
maxScope: f32,
|
|
14
|
+
hasMin: u32,
|
|
15
|
+
hasMax: u32,
|
|
16
|
+
softenMaskEdge: u32,
|
|
17
|
+
_padding0: u32,
|
|
18
|
+
_padding1: u32,
|
|
19
|
+
_padding2: u32,
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
@group(0) @binding(0) var<storage, read> values: array<f32>;
|
|
23
|
+
@group(0) @binding(1) var<storage, read> maskValues: array<f32>;
|
|
24
|
+
@group(0) @binding(2) var<storage, read> thresholds: array<f32>;
|
|
25
|
+
@group(0) @binding(3) var<storage, read> colors: array<vec4<f32>>;
|
|
26
|
+
@group(0) @binding(4) var<uniform> params: Params;
|
|
27
|
+
@group(0) @binding(5) var<storage, read_write> outPixels: array<u32>;
|
|
28
|
+
|
|
29
|
+
fn packRGBA(rgba: vec4<f32>) -> u32 {
|
|
30
|
+
let r = u32(clamp(rgba.x, 0.0, 255.0));
|
|
31
|
+
let g = u32(clamp(rgba.y, 0.0, 255.0));
|
|
32
|
+
let b = u32(clamp(rgba.z, 0.0, 255.0));
|
|
33
|
+
var a = rgba.w;
|
|
34
|
+
if (a <= 1.0) {
|
|
35
|
+
a = a * 255.0;
|
|
36
|
+
}
|
|
37
|
+
let aa = u32(clamp(a, 0.0, 255.0));
|
|
38
|
+
return r | (g << 8u) | (b << 16u) | (aa << 24u);
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
fn colorDiscrete(v: f32) -> vec4<f32> {
|
|
42
|
+
var chosen = colors[0u];
|
|
43
|
+
var i: u32 = 0u;
|
|
44
|
+
loop {
|
|
45
|
+
if (i >= params.thresholdCount) {
|
|
46
|
+
break;
|
|
47
|
+
}
|
|
48
|
+
if (v >= thresholds[i]) {
|
|
49
|
+
chosen = colors[i];
|
|
50
|
+
} else {
|
|
51
|
+
break;
|
|
52
|
+
}
|
|
53
|
+
i = i + 1u;
|
|
54
|
+
}
|
|
55
|
+
return chosen;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
fn colorGradient(v: f32) -> vec4<f32> {
|
|
59
|
+
let last = params.thresholdCount - 1u;
|
|
60
|
+
if (v <= thresholds[0u]) {
|
|
61
|
+
return colors[0u];
|
|
62
|
+
}
|
|
63
|
+
if (v >= thresholds[last]) {
|
|
64
|
+
return colors[last];
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
var i: u32 = 0u;
|
|
68
|
+
loop {
|
|
69
|
+
if (i >= last) {
|
|
70
|
+
break;
|
|
71
|
+
}
|
|
72
|
+
let t0 = thresholds[i];
|
|
73
|
+
let t1 = thresholds[i + 1u];
|
|
74
|
+
if (v >= t0 && v <= t1) {
|
|
75
|
+
let denom = max(t1 - t0, 0.000001);
|
|
76
|
+
let f = clamp((v - t0) / denom, 0.0, 1.0);
|
|
77
|
+
return colors[i] * (1.0 - f) + colors[i + 1u] * f;
|
|
78
|
+
}
|
|
79
|
+
i = i + 1u;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
return colors[last];
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
fn isMaskVisible(v: f32) -> bool {
|
|
86
|
+
if (v <= ${Je/10}) {
|
|
87
|
+
return false;
|
|
88
|
+
}
|
|
89
|
+
if (params.hasMin == 1u && v < params.minScope) {
|
|
90
|
+
return false;
|
|
91
|
+
}
|
|
92
|
+
if (params.hasMax == 1u && v > params.maxScope) {
|
|
93
|
+
return false;
|
|
94
|
+
}
|
|
95
|
+
return true;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
fn maskVisibleAt(x: i32, y: i32) -> f32 {
|
|
99
|
+
if (x < 0 || y < 0 || x >= i32(params.width) || y >= i32(params.height)) {
|
|
100
|
+
return 0.0;
|
|
101
|
+
}
|
|
102
|
+
let i = u32(y) * params.width + u32(x);
|
|
103
|
+
let mv = maskValues[i];
|
|
104
|
+
return select(0.0, 1.0, isMaskVisible(mv));
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
fn maskCoverage(x: u32, y: u32) -> f32 {
|
|
108
|
+
let cx = i32(x);
|
|
109
|
+
let cy = i32(y);
|
|
110
|
+
var sum = 0.0;
|
|
111
|
+
sum += maskVisibleAt(cx - 1, cy - 1);
|
|
112
|
+
sum += maskVisibleAt(cx, cy - 1);
|
|
113
|
+
sum += maskVisibleAt(cx + 1, cy - 1);
|
|
114
|
+
sum += maskVisibleAt(cx - 1, cy);
|
|
115
|
+
sum += maskVisibleAt(cx, cy);
|
|
116
|
+
sum += maskVisibleAt(cx + 1, cy);
|
|
117
|
+
sum += maskVisibleAt(cx - 1, cy + 1);
|
|
118
|
+
sum += maskVisibleAt(cx, cy + 1);
|
|
119
|
+
sum += maskVisibleAt(cx + 1, cy + 1);
|
|
120
|
+
return sum / 9.0;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
@compute @workgroup_size(64)
|
|
124
|
+
fn main(@builtin(global_invocation_id) gid: vec3<u32>) {
|
|
125
|
+
let idx = gid.x;
|
|
126
|
+
let total = params.width * params.height;
|
|
127
|
+
if (idx >= total) {
|
|
128
|
+
return;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
let maskV = maskValues[idx];
|
|
132
|
+
if (!isMaskVisible(maskV)) {
|
|
133
|
+
outPixels[idx] = 0u;
|
|
134
|
+
return;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
let v = values[idx];
|
|
138
|
+
if (v <= ${Je/10}) {
|
|
139
|
+
outPixels[idx] = 0u;
|
|
140
|
+
return;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
var color = colorDiscrete(v);
|
|
144
|
+
if (params.colorMode == 1u) {
|
|
145
|
+
color = colorGradient(v);
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
if (params.softenMaskEdge == 1u) {
|
|
149
|
+
let x = idx % params.width;
|
|
150
|
+
let y = idx / params.width;
|
|
151
|
+
let coverage = maskCoverage(x, y);
|
|
152
|
+
let edgeAlpha = smoothstep(0.58, 0.9, coverage);
|
|
153
|
+
color.w = color.w * edgeAlpha;
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
outPixels[idx] = packRGBA(color);
|
|
157
|
+
}
|
|
158
|
+
`}function vt(n,e,t){const r=n.createBuffer({size:e.byteLength,usage:t,mappedAtCreation:!0});return new Uint8Array(r.getMappedRange()).set(new Uint8Array(e)),r.unmap(),r}function rn(n){return typeof n<"u"&&n!==null&&Number.isFinite(Number(n))}function Fr(n,e){if(!rn(n))return!1;const t=Number(n);if(t<=Je/10)return!1;const r=e&&typeof e[0]<"u",i=e&&typeof e[1]<"u";return!(r&&t<Number(e[0])||i&&t>Number(e[1]))}function po(n,e,t){const r=Math.max(0,Math.min(1,(t-n)/(e-n)));return r*r*(3-2*r)}function vo(n,e,t,r){if(!e.length||!t.length)return[0,0,0,0];const i=Math.min(e.length,t.length)-1;if(i<0)return[0,0,0,0];if(r!=="gradient"||i===0){let s=0;for(let l=0;l<=i;l++){const d=e[l]??Number.NEGATIVE_INFINITY;if(n>=d)s=l;else break}return t[s]??[0,0,0,0]}const o=e[0]??0,u=e[i]??o;if(n<=o)return t[0]??[0,0,0,0];if(n>=u)return t[i]??[0,0,0,0];for(let s=0;s<i;s++){const l=e[s]??0,d=e[s+1]??l;if(n<l||n>d)continue;const h=t[s]??[0,0,0,0],a=t[s+1]??h,D=Math.max(d-l,1e-6),p=Math.max(0,Math.min(1,(n-l)/D));return[h[0]+(a[0]-h[0])*p,h[1]+(a[1]-h[1])*p,h[2]+(a[2]-h[2])*p,h[3]+(a[3]-h[3])*p]}return t[i]??[0,0,0,0]}function Do(n){const{width:e,height:t,rawArr2D:r,smoothArr2D:i,thresholds:o,colorsRGBA:u,colorMode:s="discrete",scope:l,softenMaskEdge:d=!0}=n;if(!e||!t||!o.length||!u.length)return null;const h=document.createElement("canvas");h.width=e,h.height=t;const a=h.getContext("2d");if(!a)return null;const D=a.createImageData(e,t),p=D.data;for(let A=0;A<t;A++)for(let w=0;w<e;w++){const B=(A*e+w)*4,N=r?.[A]?.[w];if(!Fr(N,l)){p[B]=0,p[B+1]=0,p[B+2]=0,p[B+3]=0;continue}const E=i?.[A]?.[w];if(!rn(E)){p[B]=0,p[B+1]=0,p[B+2]=0,p[B+3]=0;continue}const L=vo(Number(E),o,u,s);let X=0,R=0;for(let F=A-1;F<=A+1;F++)for(let M=w-1;M<=w+1;M++)F<0||M<0||F>=t||M>=e||(R+=1,Fr(r?.[F]?.[M],l)&&(X+=1));const S=R?X/R:0,z=d?po(.58,.9,S):1,C=L[3]??255,P=Math.max(0,Math.min(255,Math.round(C*z)));p[B]=Math.max(0,Math.min(255,Math.round(L[0]??0))),p[B+1]=Math.max(0,Math.min(255,Math.round(L[1]??0))),p[B+2]=Math.max(0,Math.min(255,Math.round(L[2]??0))),p[B+3]=P}return a.putImageData(D,0,0),h}function Sr(n,e,t){const r=n.createShader(e);if(!r)return null;if(n.shaderSource(r,t),n.compileShader(r),!n.getShaderParameter(r,n.COMPILE_STATUS)){const i=n.getShaderInfoLog(r)??"";throw n.deleteShader(r),new Error(i||"WebGL shader compile failed")}return r}function yo(n,e,t){const r=Sr(n,n.VERTEX_SHADER,e),i=Sr(n,n.FRAGMENT_SHADER,t);if(!r||!i)throw new Error("WebGL shader creation failed");const o=n.createProgram();if(!o)throw n.deleteShader(r),n.deleteShader(i),new Error("WebGL program creation failed");if(n.attachShader(o,r),n.attachShader(o,i),n.linkProgram(o),n.deleteShader(r),n.deleteShader(i),!n.getProgramParameter(o,n.LINK_STATUS)){const u=n.getProgramInfoLog(o)??"";throw n.deleteProgram(o),new Error(u||"WebGL program link failed")}return o}function bo(n){const{width:e,height:t,rawArr2D:r,smoothArr2D:i,thresholds:o,colorsRGBA:u,colorMode:s="discrete",scope:l,softenMaskEdge:d=!0}=n;if(!e||!t||!o.length||!u.length)return null;const h=document.createElement("canvas");h.width=e,h.height=t;const a=h.getContext("webgl2",{alpha:!0,premultipliedAlpha:!1,antialias:!1,depth:!1,stencil:!1,preserveDrawingBuffer:!0});if(!a)return null;const D=`#version 300 es
|
|
159
|
+
in vec2 a_position;
|
|
160
|
+
out vec2 v_uv;
|
|
161
|
+
void main() {
|
|
162
|
+
// WebGL texture origin differs from ImageData row order; flip Y to keep map orientation correct.
|
|
163
|
+
v_uv = vec2((a_position.x + 1.0) * 0.5, 1.0 - (a_position.y + 1.0) * 0.5);
|
|
164
|
+
gl_Position = vec4(a_position, 0.0, 1.0);
|
|
165
|
+
}`,p=`#version 300 es
|
|
166
|
+
precision highp float;
|
|
167
|
+
precision highp sampler2D;
|
|
168
|
+
in vec2 v_uv;
|
|
169
|
+
out vec4 outColor;
|
|
170
|
+
|
|
171
|
+
uniform sampler2D u_values;
|
|
172
|
+
uniform sampler2D u_maskValues;
|
|
173
|
+
uniform int u_thresholdCount;
|
|
174
|
+
uniform int u_colorMode;
|
|
175
|
+
uniform float u_thresholds[${je}];
|
|
176
|
+
uniform vec4 u_colors[${je}];
|
|
177
|
+
uniform float u_minScope;
|
|
178
|
+
uniform float u_maxScope;
|
|
179
|
+
uniform int u_hasMin;
|
|
180
|
+
uniform int u_hasMax;
|
|
181
|
+
uniform int u_softenMaskEdge;
|
|
182
|
+
uniform sampler2D u_validMask;
|
|
183
|
+
|
|
184
|
+
bool isMaskVisible(float maskV) {
|
|
185
|
+
if (maskV <= ${Je/10}) return false;
|
|
186
|
+
if (u_hasMin == 1 && maskV < u_minScope) return false;
|
|
187
|
+
if (u_hasMax == 1 && maskV > u_maxScope) return false;
|
|
188
|
+
return true;
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
float edgeAAAlpha(vec2 uv) {
|
|
192
|
+
// Binary validity mask is sampled with LINEAR filter to do anti-aliasing instead of blur.
|
|
193
|
+
float m = texture(u_validMask, uv).r;
|
|
194
|
+
return smoothstep(0.5, 0.72, m);
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
float sampleValueAt(vec2 uv) {
|
|
198
|
+
return texture(u_values, uv).r;
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
float sampleValueGradient(vec2 uv) {
|
|
202
|
+
vec2 texSize = vec2(textureSize(u_values, 0));
|
|
203
|
+
vec2 p = uv * texSize - 0.5;
|
|
204
|
+
vec2 i0 = floor(p);
|
|
205
|
+
vec2 f = fract(p);
|
|
206
|
+
vec2 i1 = min(i0 + vec2(1.0), texSize - vec2(1.0));
|
|
207
|
+
|
|
208
|
+
vec2 uv00 = (i0 + vec2(0.5)) / texSize;
|
|
209
|
+
vec2 uv10 = (vec2(i1.x, i0.y) + vec2(0.5)) / texSize;
|
|
210
|
+
vec2 uv01 = (vec2(i0.x, i1.y) + vec2(0.5)) / texSize;
|
|
211
|
+
vec2 uv11 = (i1 + vec2(0.5)) / texSize;
|
|
212
|
+
|
|
213
|
+
float v00 = texture(u_values, uv00).r;
|
|
214
|
+
float v10 = texture(u_values, uv10).r;
|
|
215
|
+
float v01 = texture(u_values, uv01).r;
|
|
216
|
+
float v11 = texture(u_values, uv11).r;
|
|
217
|
+
float invalid = ${Je/10};
|
|
218
|
+
|
|
219
|
+
if (v00 <= invalid || v10 <= invalid || v01 <= invalid || v11 <= invalid) {
|
|
220
|
+
return sampleValueAt(uv);
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
float vx0 = mix(v00, v10, f.x);
|
|
224
|
+
float vx1 = mix(v01, v11, f.x);
|
|
225
|
+
return mix(vx0, vx1, f.y);
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
vec4 colorDiscrete(float v) {
|
|
229
|
+
vec4 chosen = u_colors[0];
|
|
230
|
+
for (int i = 0; i < ${je}; i++) {
|
|
231
|
+
if (i >= u_thresholdCount) break;
|
|
232
|
+
if (v >= u_thresholds[i]) {
|
|
233
|
+
chosen = u_colors[i];
|
|
234
|
+
} else {
|
|
235
|
+
break;
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
return chosen;
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
vec4 colorGradient(float v) {
|
|
242
|
+
int last = u_thresholdCount - 1;
|
|
243
|
+
if (v <= u_thresholds[0]) {
|
|
244
|
+
return u_colors[0];
|
|
245
|
+
}
|
|
246
|
+
if (v >= u_thresholds[last]) {
|
|
247
|
+
return u_colors[last];
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
for (int i = 0; i < ${je-1}; i++) {
|
|
251
|
+
if (i >= last) break;
|
|
252
|
+
float t0 = u_thresholds[i];
|
|
253
|
+
float t1 = u_thresholds[i + 1];
|
|
254
|
+
if (v >= t0 && v <= t1) {
|
|
255
|
+
float denom = max(t1 - t0, 0.000001);
|
|
256
|
+
float f = clamp((v - t0) / denom, 0.0, 1.0);
|
|
257
|
+
return mix(u_colors[i], u_colors[i + 1], f);
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
return u_colors[last];
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
void main() {
|
|
265
|
+
float maskV = texture(u_maskValues, v_uv).r;
|
|
266
|
+
if (!isMaskVisible(maskV)) {
|
|
267
|
+
outColor = vec4(0.0);
|
|
268
|
+
return;
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
float v = (u_colorMode == 1) ? sampleValueGradient(v_uv) : sampleValueAt(v_uv);
|
|
272
|
+
if (v <= ${Je/10}) {
|
|
273
|
+
outColor = vec4(0.0);
|
|
274
|
+
return;
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
vec4 c = (u_colorMode == 1) ? colorGradient(v) : colorDiscrete(v);
|
|
278
|
+
float edgeAlpha = (u_softenMaskEdge == 1) ? edgeAAAlpha(v_uv) : 1.0;
|
|
279
|
+
outColor = vec4(c.rgb / 255.0, (c.a / 255.0) * edgeAlpha);
|
|
280
|
+
}`;try{const A=yo(a,D,p);a.useProgram(A);const w=new Float32Array([-1,-1,1,-1,-1,1,1,1]),v=a.createBuffer();if(!v)return a.deleteProgram(A),null;a.bindBuffer(a.ARRAY_BUFFER,v),a.bufferData(a.ARRAY_BUFFER,w,a.STATIC_DRAW);const B=a.getAttribLocation(A,"a_position");if(B<0)return a.deleteBuffer(v),a.deleteProgram(A),null;a.enableVertexAttribArray(B),a.vertexAttribPointer(B,2,a.FLOAT,!1,0,0);const N=a.createTexture();if(!N)return a.deleteBuffer(v),a.deleteProgram(A),null;const E=a.createTexture();if(!E)return a.deleteTexture(N),a.deleteBuffer(v),a.deleteProgram(A),null;const L=a.createTexture();if(!L)return a.deleteTexture(E),a.deleteTexture(N),a.deleteBuffer(v),a.deleteProgram(A),null;const X=Gt(e,t,i),R=Gt(e,t,r),S=go(e,t,r);a.activeTexture(a.TEXTURE0),a.bindTexture(a.TEXTURE_2D,N),a.pixelStorei(a.UNPACK_ALIGNMENT,1),a.texParameteri(a.TEXTURE_2D,a.TEXTURE_MIN_FILTER,a.NEAREST),a.texParameteri(a.TEXTURE_2D,a.TEXTURE_MAG_FILTER,a.NEAREST),a.texParameteri(a.TEXTURE_2D,a.TEXTURE_WRAP_S,a.CLAMP_TO_EDGE),a.texParameteri(a.TEXTURE_2D,a.TEXTURE_WRAP_T,a.CLAMP_TO_EDGE),a.texImage2D(a.TEXTURE_2D,0,a.R32F,e,t,0,a.RED,a.FLOAT,X),a.activeTexture(a.TEXTURE1),a.bindTexture(a.TEXTURE_2D,E),a.texParameteri(a.TEXTURE_2D,a.TEXTURE_MIN_FILTER,a.NEAREST),a.texParameteri(a.TEXTURE_2D,a.TEXTURE_MAG_FILTER,a.NEAREST),a.texParameteri(a.TEXTURE_2D,a.TEXTURE_WRAP_S,a.CLAMP_TO_EDGE),a.texParameteri(a.TEXTURE_2D,a.TEXTURE_WRAP_T,a.CLAMP_TO_EDGE),a.texImage2D(a.TEXTURE_2D,0,a.R32F,e,t,0,a.RED,a.FLOAT,R),a.activeTexture(a.TEXTURE2),a.bindTexture(a.TEXTURE_2D,L),a.texParameteri(a.TEXTURE_2D,a.TEXTURE_MIN_FILTER,a.LINEAR),a.texParameteri(a.TEXTURE_2D,a.TEXTURE_MAG_FILTER,a.LINEAR),a.texParameteri(a.TEXTURE_2D,a.TEXTURE_WRAP_S,a.CLAMP_TO_EDGE),a.texParameteri(a.TEXTURE_2D,a.TEXTURE_WRAP_T,a.CLAMP_TO_EDGE),a.texImage2D(a.TEXTURE_2D,0,a.R8,e,t,0,a.RED,a.UNSIGNED_BYTE,S);const z=new Float32Array(je),C=new Float32Array(je*4),P=Math.min(o.length,je);for(let y=0;y<P;y++){z[y]=o[y]??0;const b=u[y]??[0,0,0,0],T=y*4;C[T]=b[0],C[T+1]=b[1],C[T+2]=b[2],C[T+3]=b[3]??255}const F=l&&typeof l[0]<"u"?Number(l[0]):0,M=l&&typeof l[1]<"u"?Number(l[1]):0,I=l&&typeof l[0]<"u"?1:0,g=l&&typeof l[1]<"u"?1:0;return a.uniform1i(a.getUniformLocation(A,"u_values"),0),a.uniform1i(a.getUniformLocation(A,"u_maskValues"),1),a.uniform1i(a.getUniformLocation(A,"u_validMask"),2),a.uniform1i(a.getUniformLocation(A,"u_thresholdCount"),P),a.uniform1i(a.getUniformLocation(A,"u_colorMode"),s==="gradient"?1:0),a.uniform1fv(a.getUniformLocation(A,"u_thresholds"),z),a.uniform4fv(a.getUniformLocation(A,"u_colors"),C),a.uniform1f(a.getUniformLocation(A,"u_minScope"),F),a.uniform1f(a.getUniformLocation(A,"u_maxScope"),M),a.uniform1i(a.getUniformLocation(A,"u_hasMin"),I),a.uniform1i(a.getUniformLocation(A,"u_hasMax"),g),a.uniform1i(a.getUniformLocation(A,"u_softenMaskEdge"),d?1:0),a.viewport(0,0,e,t),a.clearColor(0,0,0,0),a.clear(a.COLOR_BUFFER_BIT),a.drawArrays(a.TRIANGLE_STRIP,0,4),a.activeTexture(a.TEXTURE2),a.bindTexture(a.TEXTURE_2D,null),a.activeTexture(a.TEXTURE1),a.bindTexture(a.TEXTURE_2D,null),a.activeTexture(a.TEXTURE0),a.bindTexture(a.TEXTURE_2D,null),a.bindBuffer(a.ARRAY_BUFFER,null),a.deleteTexture(L),a.deleteTexture(N),a.deleteTexture(E),a.deleteBuffer(v),a.deleteProgram(A),h}catch(A){return console.warn("[FcstLayer] WebGL2 渲染失败",A),null}}async function wo(n){const{width:e,height:t,rawArr2D:r,smoothArr2D:i,thresholds:o,colorsRGBA:u,colorMode:s="discrete",scope:l,softenMaskEdge:d=!0}=n;if(!e||!t||!o.length||!u.length)return null;try{const h=await mo();if(!h)return null;h.pushErrorScope("validation");const a=e*t,D=Gt(e,t,i),p=Gt(e,t,r),A=new Float32Array(o),w=new Float32Array(A.length*4);for(let _=0;_<A.length;_++){const K=u[_]??[0,0,0,0],Y=_*4;w[Y]=K[0],w[Y+1]=K[1],w[Y+2]=K[2],w[Y+3]=K[3]??255}const v=l&&typeof l[0]<"u"?Number(l[0]):0,B=l&&typeof l[1]<"u"?Number(l[1]):0,N=l&&typeof l[0]<"u"?1:0,E=l&&typeof l[1]<"u"?1:0,L=new ArrayBuffer(48),X=new DataView(L);X.setUint32(0,e,!0),X.setUint32(4,t,!0),X.setUint32(8,A.length,!0),X.setUint32(12,s==="gradient"?1:0,!0),X.setFloat32(16,v,!0),X.setFloat32(20,B,!0),X.setUint32(24,N,!0),X.setUint32(28,E,!0),X.setUint32(32,d?1:0,!0);const R=globalThis.GPUBufferUsage,S=globalThis.GPUMapMode,z=vt(h,D.buffer,R.STORAGE|R.COPY_DST),C=vt(h,p.buffer,R.STORAGE|R.COPY_DST),P=vt(h,A.buffer,R.STORAGE|R.COPY_DST),F=vt(h,w.buffer,R.STORAGE|R.COPY_DST),M=vt(h,L,R.UNIFORM|R.COPY_DST),I=a*4,g=h.createBuffer({size:I,usage:R.STORAGE|R.COPY_SRC}),y=h.createBuffer({size:I,usage:R.COPY_DST|R.MAP_READ}),b=h.createShaderModule({code:Ao()}),T=h.createComputePipeline({layout:"auto",compute:{module:b,entryPoint:"main"}}),O=h.createBindGroup({layout:T.getBindGroupLayout(0),entries:[{binding:0,resource:{buffer:z}},{binding:1,resource:{buffer:C}},{binding:2,resource:{buffer:P}},{binding:3,resource:{buffer:F}},{binding:4,resource:{buffer:M}},{binding:5,resource:{buffer:g}}]}),H=h.createCommandEncoder(),G=H.beginComputePass();G.setPipeline(T),G.setBindGroup(0,O),G.dispatchWorkgroups(Math.ceil(a/64)),G.end(),H.copyBufferToBuffer(g,0,y,0,I),h.queue.submit([H.finish()]);const V=await h.popErrorScope();if(V)return z.destroy(),C.destroy(),P.destroy(),F.destroy(),M.destroy(),g.destroy(),y.destroy(),console.warn("[FcstLayer] WebGPU validation error",V),null;await y.mapAsync(S.READ);const Z=y.getMappedRange(),J=new Uint8ClampedArray(Z.slice(0));y.unmap();const W=document.createElement("canvas");W.width=e,W.height=t;const U=W.getContext("2d");return U?(U.putImageData(new ImageData(J,e,t),0,0),z.destroy(),C.destroy(),P.destroy(),F.destroy(),M.destroy(),g.destroy(),y.destroy(),W):null}catch(h){return console.warn("[FcstLayer] WebGPU 渲染失败",h),null}}async function nn(n){const e=bo(n);if(e)return e;const t=await wo(n);if(t)return console.warn("[FcstLayer] 当前环境不支持 WebGL2,已自动使用 WebGPU"),t;const r=Do(n);return r?(console.warn("[FcstLayer] GPU 渲染不可用,已自动回退到 Canvas2D CPU 渲染"),r):(console.warn("[FcstLayer] 渲染不可用:WebGL2/WebGPU/Canvas2D 都不可用"),null)}const Tt=4,Co=12,Bo=8;class mr{map;options;contourCache;contourLoadingTasks;rasterRenderCache;rasterRenderLoadingTasks;layerData;ready;sourceRequestVersion=0;abortController=new AbortController;constructor(e,t){this.map=e,this.options=t,this.contourCache=new Map,this.contourLoadingTasks=new globalThis.Map,this.rasterRenderCache=new globalThis.Map,this.rasterRenderLoadingTasks=new globalThis.Map,this.ready=this.add()}beginSourceRequest(){return this.abortController.abort(),this.abortController=new AbortController,++this.sourceRequestVersion}isCurrentRequest(e){return e===this.sourceRequestVersion&&!this.abortController.signal.aborted}getRequestOptions(){return{...this.options,config:{...this.options?.config??{}},signal:this.abortController.signal}}getContourCacheKey(e=this.options){const t=e?.config??{};return JSON.stringify({url:e?.url??"",authorization:e?.authorization??"",compareUrl:e?.compareUrl??"",zeroCompare:e?.zeroCompare===!0,extent:t.extent??[],scope:t.scope??[]})}setCachedContourData(e,t){for(this.contourCache.delete(e),this.contourCache.set(e,t);this.contourCache.size>Co;){const r=this.contourCache.keys().next().value;if(r===void 0)break;this.contourCache.delete(r)}}getRasterRenderCacheKey(e,t){const r=e?.config??{},i=Object.keys(t).map(Number).filter(Number.isFinite).sort((o,u)=>o-u).map(o=>[o,t[o]]);return JSON.stringify({data:this.getContourCacheKey(e),mode:r.mode??"discrete",colors:i,valueTransform:typeof r.valueTransform=="function"?String(r.valueTransform):r.valueTransform??"",alignWithIsoline:r.alignWithIsoline===!0,isolineSmooth:r.isolineSmooth!==!1,isolineSmoothness:Ye(r.isolineSmoothness)})}setCachedRasterRender(e,t){for(this.rasterRenderCache.delete(e),this.rasterRenderCache.set(e,t);this.rasterRenderCache.size>Bo;){const r=this.rasterRenderCache.keys().next().value;if(r===void 0)break;this.rasterRenderCache.delete(r)}}async add(){const{id:e,config:t}=this.options,{zIndex:r=10,opacity:i=1}=t,o=de(this.map,e),u=o?.getZIndex()??r,s=this.beginSourceRequest(),l=this.getRequestOptions(),d=await this.getSourceFromCache(l);if(!this.isCurrentRequest(s))return;const h=d??await this.getSourceFromParams(l);if(!this.isCurrentRequest(s)||!h)return;const a=new Ct({className:e,source:h,zIndex:u,opacity:i,visible:o?.getVisible()??!0});return Te(this.map,e),this.map.addLayer(a),a}async getSourceFromParams(e=this.options){const{config:t}=e,{mode:r,legend:i,legendScope:o}=t,u=await this.getOrLoadContourData(e);if(!u||e?.signal?.aborted)return;const{rawArr2D:s,smoothArr2D:l,extent:d,width:h,height:a}=u,D=this.getValueTransformFn(e),p=this.applyValueTransform2D(s,"raw",D),A=this.applyValueTransform2D(l,"smooth",D),{colorMap:w}=be(i),{colorMap:v}=be(i,o),B=it(i,o)??t.scope;return await this.getFcstRasterSource({smoothArr2D:A,rawArr2D:p,extent:d,width:h,height:a,colorMap:w,selectedColorMap:v,colorMode:r,scope:B,rasterCacheKey:this.getRasterRenderCacheKey(e,w)},e)}async getOrLoadContourData(e=this.options){const t=this.getContourCacheKey(e),r=this.contourCache.get(t);if(r&&r.schemaVersion===Tt)return this.contourCache.delete(t),this.contourCache.set(t,r),r;const i=this.contourLoadingTasks.get(t);if(i)return i;const o=(async()=>{const u=await Bt(e);if(!u)return null;const{uniqueThresholds:s,rawArr2D:l,smoothArr2D:d,extent:h,width:a,height:D}=u,p={schemaVersion:Tt,uniqueThresholds:s,rawArr2D:l,smoothArr2D:d,extent:h,width:a,height:D};return this.setCachedContourData(t,p),p})();this.contourLoadingTasks.set(t,o);try{return await o}finally{this.contourLoadingTasks.get(t)===o&&this.contourLoadingTasks.delete(t)}}async getValueByLonLat(e,t,r=!1){if(!Number.isFinite(e)||!Number.isFinite(t))return null;const i={...this.options,config:{...this.options?.config??{}}},o=await this.getOrLoadContourData(i);if(!o)return null;const{rawArr2D:u,smoothArr2D:s,extent:l,width:d,height:h}=o,a=r?s:u;if(!a||d<=0||h<=0)return null;const D=nt.fromLonLat([e,t]);if(D.length<2)return null;const p=D[0],A=D[1],[w,v,B,N]=l,E=B-w,L=N-v;if(E<=0||L<=0||p<w||p>B||A<v||A>N)return null;const X=(p-w)/E*(d-1),R=(N-A)/L*(h-1),S=Math.max(0,Math.min(d-1,Math.round(X))),z=Math.max(0,Math.min(h-1,Math.round(R))),C=a?.[z]?.[S];if(C==null||isNaN(Number(C)))return null;const P=this.applyValueTransformValue(Number(C),{x:S,y:z,width:d,height:h,source:r?"smooth":"raw"},this.getValueTransformFn(i));return P==null||isNaN(Number(P))?null:Number(P)}async getValueByLngLat(e,t,r=!1){return this.getValueByLonLat(e,t,r)}async getSourceFromCache(e=this.options){const{config:t}=e,{mode:r,legend:i,legendScope:o}=t,u=this.getContourCacheKey(e);if(this.contourCache.has(u)){const s=this.contourCache.get(u);if(!s||s.schemaVersion!==Tt)return this.contourCache.delete(u),null;this.contourCache.delete(u),this.contourCache.set(u,s);const{colorMap:l}=be(i),{colorMap:d}=be(i,o),h=this.getValueTransformFn(e),a=this.applyValueTransform2D(s.rawArr2D,"raw",h),D=this.applyValueTransform2D(s.smoothArr2D,"smooth",h);return await this.getFcstRasterSource({...s,rawArr2D:a,smoothArr2D:D,colorMap:l,selectedColorMap:d,colorMode:r,scope:it(i,o)??t.scope,rasterCacheKey:this.getRasterRenderCacheKey(e,l)},e)}return null}async getFcstRasterSource(e,t=this.options){const{rawArr2D:r,smoothArr2D:i,extent:o,width:u,height:s,colorMap:l,selectedColorMap:d=l,colorMode:h="discrete",scope:a,rasterCacheKey:D=this.getRasterRenderCacheKey(t,l)}=e,p=Object.keys(l).map(S=>Number(S)).filter(S=>!isNaN(S)).sort((S,z)=>S-z),A=p.map(S=>bt(l[S]));let w=this.rasterRenderCache.get(D);if(w)this.rasterRenderCache.delete(D),this.rasterRenderCache.set(D,w);else{let S=this.rasterRenderLoadingTasks.get(D);S||(S=(async()=>{const z=t?.config?.alignWithIsoline===!0,C=t?.config?.isolineSmooth===!1?0:Ye(t?.config?.isolineSmoothness),P=z?dr(r,u,s,C):i,F=r,M=z&&h!=="gradient"?this.createIsolineContourFills(P,u,s,p,A,void 0,t):void 0;let I;if(z&&h!=="gradient"?(I=document.createElement("canvas"),I.width=Math.max(1,Math.floor(u)),I.height=Math.max(1,Math.floor(s))):I=await nn({width:Math.max(1,Math.floor(u)),height:Math.max(1,Math.floor(s)),rawArr2D:F,smoothArr2D:P,thresholds:p,colorsRGBA:A,colorMode:h,scope:[],softenMaskEdge:!z}),!I)return null;const g={canvas:I,renderMask:F,renderValues:P,contourFills:M};return this.setCachedRasterRender(D,g),g})(),this.rasterRenderLoadingTasks.set(D,S));try{w=await S??void 0}finally{this.rasterRenderLoadingTasks.get(D)===S&&this.rasterRenderLoadingTasks.delete(D)}}if(!w)return null;const v=Object.keys(d).map(Number).filter(Number.isFinite).sort((S,z)=>S-z),B=new Set(v),N=w.contourFills?.filter(S=>B.has(S.threshold)),E=v[0],L=v[v.length-1],X=typeof L=="number"&&p.some(S=>S>L),R=typeof E=="number"&&Number.isFinite(E)&&typeof L=="number"&&Number.isFinite(L)?this.createLegendEdgeColorCanvas(w.renderValues,u,s,E,L,bt(d[E]),bt(d[L])):void 0;return this.createFcstCanvasSource(w.canvas,o,h,w.renderMask,a,t,N,t?.config?.alignWithIsoline===!0?w.renderValues:void 0,R,X)}getValueTransformFn(e=this.options){return hr(e?.config?.valueTransform)}applyValueTransformValue(e,t,r=this.getValueTransformFn()){if(!r)return e;try{const i=r(e,t);return i==null||isNaN(Number(i))?NaN:Number(i)}catch(i){return console.warn("[FcstLayer] valueTransform 执行失败,已回退原始值",i),e}}applyValueTransform2D(e,t,r=this.getValueTransformFn()){if(!r)return e;const i=e.length,o=e[0]?.length??0,u=Array.from({length:i},()=>Array(o).fill(void 0));let s=!1;for(let l=0;l<i;l++)for(let d=0;d<o;d++){const h=e[l]?.[d];if(h==null||isNaN(Number(h))){u[l][d]=NaN;continue}try{const a=r(Number(h),{x:d,y:l,width:o,height:i,source:t});u[l][d]=a==null||!Number.isFinite(Number(a))?NaN:Number(a)}catch(a){s||(console.warn("[FcstLayer] valueTransform 执行失败,已回退原始值",a),s=!0),u[l][d]=Number(h)}}return u}isMaskSmoothEnabled(e=this.options){return e?.config?.smooth===!0}getMaskSmoothIterations(e=this.options){const t=e?.config?.smoothIterations,r=Math.floor(Number(t??2));return Number.isFinite(r)?Math.max(1,Math.min(5,r)):2}chaikinSmoothRing(e,t=2){if(!e.length)return e;let r=e.slice();const i=r[0],o=r[r.length-1];if(i&&o&&i[0]===o[0]&&i[1]===o[1]&&r.length>2&&(r=r.slice(0,-1)),r.length<3)return e;for(let l=0;l<t;l++){const d=[],h=r.length;for(let a=0;a<h;a++){const D=r[a],p=r[(a+1)%h];if(!D||!p)continue;const A=D[0],w=D[1],v=p[0],B=p[1];if(typeof A!="number"||typeof w!="number"||typeof v!="number"||typeof B!="number")continue;const N=.75*A+.25*v,E=.75*w+.25*B,L=.25*A+.75*v,X=.25*w+.75*B;d.push([N,E],[L,X])}if(r=d,r.length<3)break}const s=r[0];return r.length&&s?[...r,s]:e}smoothMaskContourPolygons(e,t){if(!e.length)return e;const r=[];for(const i of e){const o=[];for(let u=0;u<i.length;u++){const s=i[u];if(!s||s.length<4){s&&o.push(s);continue}o.push(this.chaikinSmoothRing(s,t))}r.push(o)}return r.length?r:e}createVisibleMaskContourPath(e,t,r,i,o=!1,u=this.options){if(!o)return null;const s=this.getMaskSmoothIterations(u),l=t*r;if(!l)return null;const d=i&&typeof i[0]<"u",h=i&&typeof i[1]<"u",a=d?Number(i[0]):0,D=h?Number(i[1]):0,p=new Float32Array(l);let A=0;for(let E=0;E<r;E++)for(let L=0;L<t;L++){const X=E*t+L,R=e?.[E]?.[L],S=R==null||isNaN(Number(R))?void 0:Number(R);S!==void 0&&(!d||S>=a)&&(!h||S<=D)&&(p[X]=1,A+=1)}if(!A)return null;const w=It.contours().size([t,r]).thresholds([.5])(p);if(!w.length)return null;const v=[];for(const E of w){const L=E.coordinates??[];for(const X of L)v.push(X)}const B=o?this.smoothMaskContourPolygons(v,s):v,N=new Path2D;for(const E of B)for(const L of E){if(!L.length)continue;const X=L[0];if(!(!X||typeof X[0]!="number"||typeof X[1]!="number")){N.moveTo(X[0],X[1]);for(let R=1;R<L.length;R++){const S=L[R];!S||typeof S[0]!="number"||typeof S[1]!="number"||N.lineTo(S[0],S[1])}N.closePath()}}return N}createIsolineContourPath(e,t,r,i,o=this.options){const u=i&&typeof i[0]<"u"?Number(i[0]):NaN,s=i&&typeof i[1]<"u"?Number(i[1]):1/0;if(!Number.isFinite(u))return null;const l=new Float64Array(t*r);let d=0;for(let p=0;p<r;p++){const A=e[p];for(let w=0;w<t;w++){const v=A?.[w],B=v!==void 0&&Number.isFinite(v)&&v<=s;l[p*t+w]=B?v:NaN,B&&v>=u&&(d+=1)}}if(!d)return null;const h=o?.config?.isolineSmooth===!1?0:Ye(o?.config?.isolineSmoothness),a=It.contours().size([t,r]).thresholds([u]).smooth(h>0)(l);if(!a.length)return null;const D=new Path2D;for(const p of a)for(const A of p.coordinates??[])for(const w of A){const v=w[0];if(v){D.moveTo(v[0],v[1]);for(let B=1;B<w.length;B++){const N=w[B];N&&D.lineTo(N[0],N[1])}D.closePath()}}return D}createIsolineContourFills(e,t,r,i,o,u,s=this.options){const l=u&&typeof u[0]<"u"?Number(u[0]):-1/0,d=u&&typeof u[1]<"u"?Number(u[1]):1/0,h=i.filter(B=>B>=l&&B<=d);if(!h.length||t<2||r<2)return[];const a=new Float64Array(t*r);for(let B=0;B<r;B++){const N=e[B];for(let E=0;E<t;E++){const L=N?.[E];a[B*t+E]=L!==void 0&&Number.isFinite(L)?L:NaN}}const D=s?.config?.isolineSmooth===!1?0:Ye(s?.config?.isolineSmoothness),p=It.contours().size([t,r]).thresholds(h).smooth(D>0)(a),A=new globalThis.Map;i.forEach((B,N)=>{const E=o[N];E&&A.set(B,E)});const w=(B,N)=>{for(const E of N.coordinates??[])for(const L of E){const X=L[0];if(!X)continue;const R=X[0],S=X[1];if(!(typeof R!="number"||typeof S!="number")){B.moveTo(R,S);for(let z=1;z<L.length;z++){const C=L[z],P=C?.[0],F=C?.[1];typeof P=="number"&&typeof F=="number"&&B.lineTo(P,F)}B.closePath()}}},v=[];for(let B=0;B<p.length;B++){const N=p[B],E=Number(N.value),L=A.get(E);if(!L)continue;const X=new Path2D;w(X,N);const R=p[B+1];R&&w(X,R);const S=Math.max(0,Math.min(1,(L[3]??255)/255));v.push({threshold:E,path:X,color:`rgba(${L[0]}, ${L[1]}, ${L[2]}, ${S})`})}return v}createScopeMaskCanvas(e,t,r,i,o=!1){const u=i&&typeof i[0]<"u",s=i&&typeof i[1]<"u";if(!u&&!s)return null;const l=u?Number(i[0]):-1/0,d=s?Number(i[1]):1/0,h=document.createElement("canvas");h.width=Math.max(1,Math.floor(t)),h.height=Math.max(1,Math.floor(r));const a=h.getContext("2d");if(!a)return null;const D=a.createImageData(h.width,h.height),p=D.data;for(let A=0;A<h.height;A++){const w=e[A];for(let v=0;v<h.width;v++){const B=w?.[v];B===void 0||!Number.isFinite(B)||B<l||(o?B>=d:B>d)||(p[(A*h.width+v)*4+3]=255)}}return a.putImageData(D,0,0),h}createLegendEdgeColorCanvas(e,t,r,i,o,u,s){const l=document.createElement("canvas");l.width=Math.max(1,Math.floor(t)),l.height=Math.max(1,Math.floor(r));const d=l.getContext("2d");if(!d)return null;const h=d.createImageData(l.width,l.height),a=h.data;for(let D=0;D<l.height;D++){const p=e[D];for(let A=0;A<l.width;A++){const w=p?.[A];if(w===void 0||!Number.isFinite(w))continue;const v=w<=i?u:w>=o?s:void 0;if(!v)continue;const B=(D*l.width+A)*4;a[B]=v[0],a[B+1]=v[1],a[B+2]=v[2],a[B+3]=v[3]}}return d.putImageData(h,0,0),l}createFcstCanvasSource(e,t,r="discrete",i,o,u=this.options,s,l,d,h=!1){const a=document.createElement("canvas"),D=r==="gradient",p=u?.config?.pixelSnap===!0,A=u?.config?.useDevicePixelRatio===!0,w=u?.config?.alignWithIsoline===!0,v=i?this.createScopeMaskCanvas(w?l??i:i,e.width,e.height,o,h):null;return new kt({projection:"EPSG:3857",ratio:1,interpolate:D&&!w,canvasFunction:(N,E,L,X)=>{const R=A?Math.max(1,L||1):1,S=X??[1,1],z=Math.max(1,Math.floor((S[0]??1)*R)),C=Math.max(1,Math.floor((S[1]??1)*R));a.width!==z&&(a.width=z),a.height!==C&&(a.height=C);const P=a.getContext("2d",{alpha:!0});if(!P)return a;P.clearRect(0,0,z,C);const[F,M,I,g]=N,[y,b,T,O]=t,H=I-F,G=g-M;if(H<=0||G<=0)return a;const V=z/H,Z=C/G,J=(y-F)*V,W=(g-O)*Z,U=(T-y)*V,_=(O-b)*Z;if(U<=0||_<=0)return a;const K=p?Math.floor(J):J,Y=p?Math.floor(W):W,re=p?Math.ceil(J+U):J+U,ae=p?Math.ceil(W+_):W+_,$=Math.max(1,re-K),ee=Math.max(1,ae-Y);if(s?.length){P.save(),P.translate(K,Y),P.scale($/e.width,ee/e.height);for(const ce of s)P.fillStyle=ce.color,P.fill(ce.path,"evenodd");return P.restore(),a}return P.imageSmoothingEnabled=D&&!w,D&&!w&&(P.imageSmoothingQuality="high"),P.drawImage(e,K,Y,$,ee),d&&(P.save(),P.globalCompositeOperation="source-atop",P.imageSmoothingEnabled=D&&!w,D&&!w&&(P.imageSmoothingQuality="high"),P.drawImage(d,K,Y,$,ee),P.restore()),v&&(P.save(),P.globalCompositeOperation="destination-in",P.imageSmoothingEnabled=D&&!w,D&&!w&&(P.imageSmoothingQuality="high"),P.drawImage(v,K,Y,$,ee),P.restore()),a}})}async preload(e){const t={...this.options,config:{...this.options?.config??{}},url:e},r=await Bt(t);if(!r)return;const{uniqueThresholds:i,rawArr2D:o,smoothArr2D:u,extent:s,width:l,height:d}=r,h=this.getContourCacheKey(t);this.setCachedContourData(h,{schemaVersion:Tt,uniqueThresholds:i,rawArr2D:o,smoothArr2D:u,extent:s,width:l,height:d})}delete(){this.abortController.abort(),this.sourceRequestVersion++,Te(this.map,this.options.id),this.contourCache.clear(),this.contourLoadingTasks.clear(),this.rasterRenderCache.clear(),this.rasterRenderLoadingTasks.clear()}toggleVisible(e){we(this.map,this.options.id,e)}async updateParams(e){this.options={...this.options,...e,config:{...this.options?.config??{},...e?.config??{}}};const t=this.beginSourceRequest(),r=this.getRequestOptions(),{id:i}=this.options,o=de(this.map,i);if(!o){this.ready=this.add(),await this.ready;return}const u=await this.getSourceFromCache(r);if(!this.isCurrentRequest(t))return;const s=u??await this.getSourceFromParams(r);if(!this.isCurrentRequest(t)||!s)return;o.setSource(s);const l=Number(r.config?.opacity);Number.isFinite(l)&&o.setOpacity(Math.max(0,Math.min(1,l)));const d=Number(r.config?.zIndex);Number.isFinite(d)&&o.setZIndex(d)}}const Lt=1,xt=new globalThis.Map;function ir(n,e){xt.set(n,e)}function Yt(n){return xt.get(n)}function on(n){xt.delete(n)}function un(n){xt.forEach(e=>n(e))}function sn(){xt.clear()}class zt{map;options;contourCache;externalGridDataProvider;constructor(e,t,r){this.map=e,this.options=t,this.contourCache=new Map,this.externalGridDataProvider=r,this.add()}getClassName(){return`${this.options.id}-gridValue`}getRuntimeConfig(){const e=this.options?.config??{},t=e.gridConfig??{};return{...e,...t}}async add(){const e=this.getRuntimeConfig(),t=Number.isFinite(Number(e.zIndex))?Number(e.zIndex):10,r=Number.isFinite(Number(e.opacity))?Number(e.opacity):1,i=this.getClassName(),o=de(this.map,i);o&&this.delete();const u=o?o.getZIndex():t+1,s=await this.getSourceFromCache()??await this.getSourceFromParams();if(!s)return;const l=new Ct({className:i,source:s,zIndex:u,opacity:r});return this.map.addLayer(l),l}getCacheKey(){const{id:e,url:t}=this.options;return`${e}${t}`}async getOrLoadGridData(){const e=this.getCacheKey(),t=this.contourCache.get(e);if(t&&t.schemaVersion===Lt)return t;if(this.externalGridDataProvider){const o=await this.externalGridDataProvider();if(!o)return null;const u={schemaVersion:Lt,rawArr2D:o.rawArr2D,extent:o.extent,width:o.width,height:o.height};return this.contourCache.set(e,u),u}const r=await Bt(this.options);if(!r)return null;const i={schemaVersion:Lt,rawArr2D:r.rawArr2D,extent:r.extent,width:r.width,height:r.height};return this.contourCache.set(e,i),i}async getSourceFromCache(){const e=this.getCacheKey(),t=this.contourCache.get(e);return!t||t.schemaVersion!==Lt?(t&&this.contourCache.delete(e),null):this.createGridCanvasSource(t)}async getSourceFromParams(){const e=await this.getOrLoadGridData();return e?this.createGridCanvasSource(e):null}getTextDrawOptions(){const e=this.getRuntimeConfig(),t=Math.max(8,Math.floor(Number(e.pixelStep??40))),r=Math.max(10,Math.floor(Number(e.fontSize??14))),i=Math.max(0,Math.floor(Number(e.decimals??1))),o=String(e.fontColor??"#000"),u=String(e.strokeColor??"#fff"),s=Math.max(0,Number(e.strokeWidth??2)),l=String(e.fontFamily??"Arial, sans-serif"),d=e.useDevicePixelRatio===!0;return{pixelStep:t,fontSize:r,decimals:i,fontColor:o,strokeColor:u,strokeWidth:s,fontFamily:l,useDevicePixelRatio:d}}isValueInScope(e,t){if(!Number.isFinite(e))return!1;if(!t||t.length!==2)return!0;const r=Number(t[0]),i=Number(t[1]);if(!Number.isFinite(r)||!Number.isFinite(i))return!0;const o=Math.min(r,i),u=Math.max(r,i);return e>=o&&e<=u}interpolateValue(e,t,r,i,o){const u=Math.floor(i),s=Math.ceil(i),l=Math.floor(o),d=Math.ceil(o);if(u<0||s>=t||l<0||d>=r)return null;const h=Number(e[l]?.[u]),a=Number(e[l]?.[s]),D=Number(e[d]?.[u]),p=Number(e[d]?.[s]);if(![h,a,D,p].every(v=>Number.isFinite(v)))return null;const A=i-u,w=o-l;return h*(1-A)*(1-w)+a*A*(1-w)+D*(1-A)*w+p*A*w}getValueTransformFn(){const e=this.getRuntimeConfig();return hr(e?.valueTransform)}applyValueTransformValue(e,t){const r=this.getValueTransformFn();if(!r)return e;try{const i=r(e,t);return i==null||isNaN(Number(i))?NaN:Number(i)}catch(i){return console.warn("[GridLayer] valueTransform 执行失败,已回退原始值",i),e}}createGridCanvasSource(e){const t=document.createElement("canvas"),{rawArr2D:r,extent:i,width:o,height:u}=e,s=this.getTextDrawOptions(),l=this.getRuntimeConfig(),d=typeof l?.valueTransform=="function"||typeof l?.valueTransform=="string"&&l.valueTransform.trim().length>0,h=l?.valueTransformAffectsScope!==!1,a=it(this.options.config.legend,this.options.config.legendScope)??this.options.config.scope;return new kt({projection:"EPSG:3857",ratio:1,interpolate:!1,canvasFunction:(D,p,A,w)=>{const v=w??[1,1],B=Math.max(1,Math.floor(v[0]??1)),N=Math.max(1,Math.floor(v[1]??1)),E=this.map.getSize(),L=Math.max(1,Math.floor(E?.[0]??B)),X=Math.max(1,Math.floor(E?.[1]??N)),R=B/L,S=N/X,z=s.useDevicePixelRatio?Math.max(1,Number(A||1)):1,C=Math.max(.01,(R+S)*.5/z),P=B,F=N,M=L,I=X;t.width!==P&&(t.width=P),t.height!==F&&(t.height=F);const g=t.getContext("2d",{alpha:!0});if(!g)return t;g.setTransform(1,0,0,1,0,0),g.clearRect(0,0,P,F),g.font=`${Math.max(10,Math.round(s.fontSize*C))}px ${s.fontFamily}`,g.fillStyle=s.fontColor,g.strokeStyle=s.strokeColor,g.lineWidth=Math.max(0,s.strokeWidth*C),g.lineJoin="round",g.miterLimit=2,g.textAlign="center",g.textBaseline="middle";const[y,b,T,O]=D,[H,G,V,Z]=i,J=T-y,W=O-b,U=V-H,_=Z-G;if(J<=0||W<=0||U<=0||_<=0)return t;const K=Math.max(8,Math.round(s.pixelStep));for(let Y=K/2;Y<I;Y+=K)for(let re=K/2;re<M;re+=K){const ae=y+re/M*J,$=O-Y/I*W;if(ae<H||ae>V||$<G||$>Z)continue;const ee=(ae-H)/U*(o-1),ce=(Z-$)/_*(u-1),oe=this.interpolateValue(r,o,u,ee,ce);if(oe===null)continue;const ge=this.applyValueTransformValue(oe,{x:ee,y:ce,width:o,height:u,source:"raw"});if(!Number.isFinite(ge))continue;const se=d&&!h?oe:ge;if(!this.isValueInScope(se,a))continue;const pe=ge.toFixed(s.decimals),ve=re*R,fe=Y*S;g.lineWidth>0&&g.strokeText(pe,ve,fe),g.fillText(pe,ve,fe)}return t}})}delete(){Te(this.map,this.getClassName()),this.contourCache.clear()}toggleVisible(e){we(this.map,this.getClassName(),e)}async updateParams(e){this.options={...this.options,...e,config:{...this.options.config,...e?.config??{}}};const t=de(this.map,this.getClassName());if(!t){await this.add();return}const r=await this.getSourceFromCache()??await this.getSourceFromParams();r&&t.setSource(r)}}class an{map;options;contourCache;constructor(e,t){this.map=e,this.options=t,this.contourCache=new Map,this.add()}async add(){console.time();const{id:e,config:t}=this.options,{zIndex:r=10}=t,i=de(this.map,e);i&&this.delete();const o=i?i.getZIndex():r??1200,u=this.getSourceFromCache();if(u){const l=new Ct({source:u,className:e+"-arrow",zIndex:o});return this.map.addLayer(l),l}const s=await this.getArrowParams();if(s){const l=this.getArrowSource({...s,extent:this.options.config.extent,config:this.options.config}),d=new Ct({source:l,className:e+"-arrow",zIndex:o});this.map.addLayer(d)}console.timeEnd()}async getArrowParams(){const{id:e,url:t,config:r}=this.options,{cache:i,scope:o}=r,u=e+t,s=[-99999,99999];Ke.isNumber(o?.[0])&&(s[0]=o[0]),Ke.isNumber(o?.[1])&&(s[1]=o[1]);const{grayArr:l,width:d,height:h}=await _e(t,s);if(!(!l||!d||!h))return i&&this.contourCache.set(u,{grayArr:l,width:d,height:h}),{grayArr:l,width:d,height:h}}getArrowSource(e){const{grayArr:t,width:r,height:i,extent:o,config:u}=e,{pixelStep:s=20,fontSize:l=12,color:d="rgb(255,255,255)"}=u,h={angle:t,width:r,height:i},a=st(o);return this.createArrowCanvasSource(h,a,{pixelStep:s,fontSize:l,color:d})}createArrowCanvasSource(e,t,r){const{pixelStep:i=20,fontSize:o=12,color:u="rgb(255,255,255)"}=r,s=document.createElement("canvas");return new kt({projection:"EPSG:3857",ratio:1,canvasFunction:(l,d,h,a)=>{const D=a??[1,1],p=Math.max(1,Math.floor((D[0]??1)*h)),A=Math.max(1,Math.floor((D[1]??1)*h));s.width!==p&&(s.width=p),s.height!==A&&(s.height=A);const w=s.getContext("2d",{alpha:!0});if(!w)return s;w.clearRect(0,0,p,A),w.fillStyle=u,w.font=`${Math.max(1,Math.floor(o*h))}px Arial`,w.textAlign="center",w.textBaseline="middle";const[v,B,N,E]=l,[L,X,R,S]=t,z=N-v,C=E-B;if(z<=0||C<=0)return s;const P=Math.max(v,L),F=Math.max(B,X),M=Math.min(N,R),I=Math.min(E,S);if(P>=M||F>=I)return s;const g=R-L,y=S-X;if(g<=0||y<=0)return s;const b=Math.max(1,p-1),T=Math.max(1,A-1),O=Math.max(1,Math.floor(i*h)),H=Math.max(g/Math.max(1,e.width-1),y/Math.max(1,e.height-1)),G=H>0&&isFinite(d)?Math.max(1,Math.floor(d/H)):1,V=Math.max(O,Math.min(O*6,O*G)),Z=Math.max(0,Math.floor((P-v)/z*b)),J=Math.min(p-1,Math.ceil((M-v)/z*b)),W=Math.max(0,Math.floor((E-I)/C*T)),U=Math.min(A-1,Math.ceil((E-F)/C*T));if(Z>J||W>U)return s;for(let _=W;_<=U;_+=V)for(let K=Z;K<=J;K+=V){const Y=v+z*K/b,re=E-C*_/T;if(Y<L||Y>R||re<X||re>S)continue;const ae=(Y-L)/g*(e.width-1),$=(S-re)/y*(e.height-1),ee=Vt(e.angle,ae,$,e.width,e.height);if(!isFinite(ee))continue;const ce=(ee-90)*Math.PI/180;w.save(),w.translate(K,_),w.rotate(ce),w.fillText("→",0,0),w.restore()}return s}})}getSourceFromCache(){const{id:e,url:t,config:r}=this.options,{scope:i,cache:o,extent:u,pixelStep:s=20,fontSize:l=12,color:d="rgb(255,255,255)"}=r,h=e+t;if(o&&this.contourCache.has(h)){const a=this.contourCache.get(h);return this.getArrowSource({...a,extent:u,scope:i,pixelStep:s,fontSize:l,color:d})}return null}delete(){Te(this.map,this.options.id+"-arrow"),this.contourCache.clear()}toggleVisible(e){we(this.map,this.options.id+"-arrow",e)}}const Ar="26",cn=new Set(["23","24",Ar]),Eo=6,xo=["","-notes","-filtered","-other"],Xe=new globalThis.Map,Ft=new globalThis.Map,ur=new WeakMap,Mr=new globalThis.Map,St={0:"#9CF790",10:"#37A600",25:"#67B4F8",50:"#0002FE",100:"#FA03F0",250:"#710100",400:"#ffa10c",600:"#fe6301"},No={0:"#cccccc","2.5":"#a1a1a1",5:"#707070",10:"#454545",20:"#7345e6",30:"#4d0074"},Po={0:"#c3e7b9",10:"#7ec179",25:"#95c5e0",50:"#3b3a9f",100:"#b05dae"};function To(){return new DOMException("The operation was aborted","AbortError")}function wt(n){if(n?.aborted)throw n.reason??To()}function ln(n,e){let t=ur.get(n);t||(t=new globalThis.Map,ur.set(n,t));const r=(t.get(e)??0)+1;return t.set(e,r),r}function Or(n,e,t){return ur.get(n)?.get(e)===t}function Lo(n){return JSON.stringify({filePath:n.filePath,authorization:n.authorization??""})}function Fo(n,e){for(Xe.delete(n),Xe.set(n,e);Xe.size>Eo;){const t=Xe.keys().next().value;if(t===void 0)break;Xe.delete(t)}}function fn(n,e){const t=new Set(xo.map(r=>`${e}${r}`));for(const r of[...n.getLayers().getArray()])t.has(r.getClassName())&&n.removeLayer(r)}function ut(n){const e=String(n??"").trim();return cn.has(e)?e:Ar}function sr(n,e,t=.05){const r=n[0]-e[0],i=n[1]-e[1];return r*r+i*i<t*t}function hn(n){let e=0;for(let t=0;t<n.length-1;t++){const[r,i]=n[t],[o,u]=n[t+1];e+=(o-r)*(u+i)}return e>0}function So(n){const e=[];let t=n.findIndex(o=>/^CLOSED_CONTOURS:/i.test(o));if(t<0)return Q.featureCollection(e);const r=n[t].match(/CLOSED_CONTOURS:\s*(\d+)/i);let i=r?Number.parseInt(r[1],10):0;for(t++;i>0&&t<n.length;){const o=n[t].trim().match(/^(\d+)\s+(\d+)$/);if(!o){t++;continue}let u=Number.parseInt(o[2],10);const s=[];for(t++;u>0&&t<n.length;){const D=n[t].trim().split(/\s+/).map(Number).filter(Number.isFinite);for(let p=0;p+2<D.length&&u>0;p+=3)s.push([D[p],D[p+1]]),u--;t++}let l=!1;t<n.length&&/^NoLabel\s+0[^\s]*/.test(n[t].trim())&&(l=!0,t++);let d="3";const h=t<n.length?n[t].trim().match(/^([0-9]+(?:\.[0-9]+)?)\s+1$/):null;h&&(d=h[1],t++);const a=s[s.length-1];if(s.length>3&&!sr(s[0],a,.1)&&s.push([...s[0]]),s.length>3&&sr(s[0],s[s.length-1],.1)){hn(s)&&s.reverse();const D=s[0],p=s[s.length-1];(D[0]!==p[0]||D[1]!==p[1])&&s.push([...s[0]]),e.push(Q.polygon([s],{level:d,noLabelZero:l}))}i--}return e.sort((o,u)=>Number(o.properties?.level)-Number(u.properties?.level)),Q.featureCollection(e)}function Mo(n){const e=[];let t=n.findIndex(r=>/^NOTES_SYMBOL:/i.test(r));if(t<0)return e;for(t++;t<n.length;){const r=n[t].trim();if(!r||!/^\d+\s/.test(r))break;const i=r.split(/\s+/),o=i[5],u=Number.parseFloat(i[1]),s=Number.parseFloat(i[2]);o&&Number.isFinite(u)&&Number.isFinite(s)&&e.push({type:"Feature",geometry:{type:"Point",coordinates:[u,s]},properties:{text:o,noteValue:o,rawLine:r,rawParts:i}}),t++}return e}function Oo(n){const e=[];let t=n.findIndex(r=>/^SYMBOLS:/i.test(r));if(t<0)return e;for(t++;t<n.length;){const r=n[t].trim();if(!r||/^[A-Z_]+:/.test(r))break;const i=r.split(/\s+/).filter(Boolean),o=Number.parseFloat(i[1]),u=Number.parseFloat(i[2]);i.length>=3&&Number.isFinite(o)&&Number.isFinite(u)&&e.push({type:"Feature",geometry:{type:"Point",coordinates:[o,u]},properties:{symbolId:i[0],alt:Number.parseFloat(i[3]??"0"),angle:Number.parseFloat(i[4]??"0")}}),t++}return e}function Xo(n){const e=[],t=n.findIndex(u=>/^CLOSED_CONTOURS:/i.test(u)),r=t<0?n.length:t,i=/^(\d+(?:\.\d+)?)\s+\d+\s+(\d+)\s*$/;let o=0;for(;o<r;){const u=n[o].trim().match(i);if(!u){o++;continue}const s=u[1];let l=Number.parseInt(u[2],10);const d=[];for(o++;o<r&&l>0;){const D=n[o].trim().split(/\s+/).map(Number).filter(Number.isFinite);for(let p=0;p+2<D.length&&l>0;p+=3)d.push([D[p],D[p+1]]),l--;o++}let h=!1;if(o<r&&/^NoLabel\s+0[^\s]*/.test(n[o].trim())&&(h=!0,o++),!d.length)continue;const a=d.length>3&&sr(d[0],d[d.length-1],.1);a&&hn(d)&&d.reverse(),e.push({type:"Feature",geometry:{type:a?"Polygon":"LineString",coordinates:a?[d]:d},properties:{level:s,noLabelZero:h}})}return e}function Ee(n){try{const e=Q.bbox(n);return e.length<4||e.slice(0,4).some(t=>!Number.isFinite(t))?null:[e[0],e[1],e[2],e[3]]}catch{return null}}function Et(n,e){return!n||!e?!0:!(n[2]<e[0]||n[0]>e[2]||n[3]<e[1]||n[1]>e[3])}function pr(n){if(!/polygon/i.test(String(n?.geometry?.type??"")))return[n];try{return Q.flatten(n).features.map(e=>({...e,properties:{...n.properties??{},...e.properties??{}}}))}catch{return[n]}}function Ho(n,e){try{const t=Q.area(n),r=Q.area(e);return Number.isFinite(t)&&Number.isFinite(r)&&t>0&&t<r*.999999&&(Q.booleanWithin(n,e)||Q.booleanContains(e,n))}catch{return!1}}function Io(n){if(n.length<=1||!n.every(u=>Number(u?.properties?.level)===0))return n;const e=n.flatMap(pr),t=e.map(u=>{try{return Q.area(u)}catch{return 0}}),r=new globalThis.Map;if(e.forEach((u,s)=>{let l=-1,d=Number.POSITIVE_INFINITY;e.forEach((h,a)=>{const D=t[a]??0;s===a||D>=d||!Et(Ee(u),Ee(h))||!Ho(u,h)||(l=a,d=D)}),l>=0&&r.set(s,l)}),!r.size)return e;const i=new globalThis.Map;r.forEach((u,s)=>{const l=i.get(u)??[];l.push(e[s]),i.set(u,l)});const o=[];return e.forEach((u,s)=>{if(r.has(s))return;let l=[u];for(const d of i.get(s)??[])l=l.flatMap(h=>{try{if(!Et(Ee(h),Ee(d))||!Q.booleanIntersects(h,d))return[h];const a=Q.difference(Q.featureCollection([h,d]));return a?Q.flatten(a).features.map(D=>({...D,properties:{...u.properties??{},...D.properties??{}}})):[]}catch{return[h]}});o.push(...l)}),o}function Ro(n){const e=new globalThis.Map,t=[];for(const i of n){if(!/polygon/i.test(String(i?.geometry?.type??""))){t.push(i);continue}const o=`${ut(i.properties?.symbolId)}__${String(i.properties?.level??"")}`,u=e.get(o)??[];u.push(i),e.set(o,u)}const r=[];return e.forEach(i=>{const o=Io(i);if(o.length<=1){r.push(...o);return}try{const u=Q.union(Q.featureCollection(o));if(!u){r.push(...o);return}Q.flatten(u).features.forEach(s=>{s.properties={...o[0]?.properties??{},...s.properties??{}},r.push(s)})}catch{r.push(...o)}}),[...t,...r]}function zo(n,e){const t=new globalThis.Map,r=[];for(const o of n){if(!/polygon/i.test(String(o?.geometry?.type??""))){r.push(o);continue}const u=ut(o.properties?.symbolId),s=t.get(u)??[];s.push(o),t.set(u,s)}const i=[];return t.forEach(o=>{const u=o.slice().sort((l,d)=>Number(d.properties?.level)-Number(l.properties?.level)),s=[];for(const l of u){wt(e);let d=pr(l);for(const h of s)if(d=d.flatMap(a=>{try{if(!Et(Ee(a),h.bbox))return[a];if(!Q.booleanIntersects(a,h.feature))return[a];const D=Q.difference(Q.featureCollection([a,h.feature]));return D?Q.flatten(D).features.map(p=>({...p,properties:{...l.properties??{},...p.properties??{}}})):[]}catch{return[a]}}),!d.length)break;for(const h of d)s.push({feature:h,bbox:Ee(h)});i.push(...d)}}),[...r,...i]}function qo(n,e=1e-6){if(!n.length)return[];const t=(o,u)=>{const s=o[0]-u[0],l=o[1]-u[1];return s*s+l*l<=e*e},r=[];for(const o of n)(!r.length||!t(o,r[r.length-1]))&&r.push([...o]);if(r.length>1&&!t(r[0],r[r.length-1])&&r.push([...r[0]]),r.length<4)return n;const i=[r[0]];for(let o=1;o<r.length-1;o++){const u=r[o-1],s=r[o],l=r[o+1];Math.abs((s[0]-u[0])*(l[1]-u[1])-(s[1]-u[1])*(l[0]-u[0]))>e&&i.push(s)}return i.push(r[r.length-1]),i.length>=4?i:r}function Vo(n,e,t=.001){if(n?.geometry?.type!=="Polygon"||!/linestring/i.test(e?.geometry?.type??""))return Q.featureCollection([n]);if(e.geometry.type==="LineString"){const l=e.geometry.coordinates;if(Q.booleanPointInPolygon(Q.point(l[0]),n)||Q.booleanPointInPolygon(Q.point(l[l.length-1]),n))return Q.featureCollection([n])}const r=Q.lineIntersect(e,n),i=Q.explode(e);for(const l of i.features.slice(0,-1))r.features.push(l);const o=Q.buffer(e,t,{units:"kilometers"});if(!o)return Q.featureCollection([n]);const u=Q.difference(Q.featureCollection([n,o]));if(!u?.geometry)return Q.featureCollection([n]);const s=pr(u).map((l,d)=>{const h=l.geometry.coordinates[0];for(let a=0;a<h.length;a++){const D=Q.point(h[a]),p=r.features.find(A=>Q.distance(A,D,{units:"kilometers"})<=t*2);p&&(h[a]=[...p.geometry.coordinates])}return l.geometry.coordinates[0]=qo(h),l.properties={...n.properties??{},id:`${n.properties?.id??"poly"}-${d}`},l});return Q.featureCollection(s)}function Go(n,e){const t=n.split(/\r?\n/),r=So(t),i=Mo(t),o=Oo(t).filter(p=>cn.has(String(p.properties?.symbolId))),u=Xo(t).filter(p=>p.geometry?.type==="LineString"&&Number(p.properties?.level)===0);wt(e);let s=r.features;if(s.length>1)try{const p=Q.union(r);p&&(s=Q.flatten(p).features.map((A,w)=>({...A,properties:{...A.properties??{},id:A.properties?.id??`u-${w}`}})))}catch{s=r.features}const l=u.map(p=>({feature:p,bbox:Ee(p)}));for(const p of l)wt(e),s=s.flatMap(A=>{try{if(!Et(Ee(A),p.bbox))return[A];if(!Q.booleanIntersects(A,p.feature))return[A];const w=Vo(A,p.feature);return w.features.length?w.features:[A]}catch{return[A]}});const d=o.map(p=>({feature:p,point:Q.point(p.geometry.coordinates,p.properties)})),h=s.map(p=>{let A=Ar;for(const w of d)try{if(Q.booleanPointInPolygon(w.point,p)){A=ut(w.feature.properties?.symbolId);break}}catch{}return{...p,properties:{symbolId:A}}}),a=r.features.map(p=>({feature:p,bbox:Ee(p)})),D=[];for(const p of h){wt(e);const A=Ee(p);for(const w of a)if(Et(A,w.bbox))try{const v=Q.intersect(Q.featureCollection([p,w.feature]));if(!v)continue;const B={...w.feature.properties??{},...p.properties??{}};Q.flatten(v).features.forEach(N=>{N.properties={...B,...N.properties??{}},D.push(N)})}catch{}}return{vectorFeatures:zo(Ro(D),e),noteFeatures:i,symbolFeatures:o,otherFeatures:u}}async function ko(n){const e=Lo(n),t=Xe.get(e);if(t)return Xe.delete(e),Xe.set(e,t),t;if(!n.signal){const i=Ft.get(e);if(i)return i}const r=(async()=>{const i=n.authorization?{Authorization:n.authorization}:void 0,o=await fetch(n.filePath,{headers:i,signal:n.signal});if(!o.ok)throw new Error(`MICAPS request failed: ${o.status} ${o.statusText}`);const u=Go(await o.text(),n.signal);return Fo(e,u),u})();n.signal||Ft.set(e,r);try{return await r}finally{!n.signal&&Ft.get(e)===r&&Ft.delete(e)}}function er(n,e,t){const r=Number(e),i=n[String(r)];if(i)return i;if(!Number.isFinite(r))return t;const o=Object.keys(n).map(Number).filter(Number.isFinite),u=o.length?Math.max(...o):Number.POSITIVE_INFINITY;return r>u?n[String(u)]??t:t}function Qo(n,e){const t=ut(n);return er(t==="23"?No:t==="24"?Po:St,e,St[0])}function jo(n,e=10,t=4){if(typeof document>"u")return null;const r=globalThis.devicePixelRatio||1,i=`${n}_${e}_${t}_${r}`,o=Mr.get(i);if(o)return o;const u=document.createElement("canvas");u.width=Math.ceil(e*r),u.height=Math.ceil(e*r);const s=u.getContext("2d");if(!s)return null;s.setTransform(r,0,0,r,0,0),s.strokeStyle=n,s.lineWidth=t,s.beginPath(),s.moveTo(-e,e*2),s.lineTo(e*2,-e),s.moveTo(0,e*2),s.lineTo(e*3,-e),s.stroke();const l=s.createPattern(u,"repeat");return l&&Mr.set(i,l),l}function Wo(n,e,t){const{className:r,opacity:i=.8,showText:o=!1,showFillcolor:u=!0,showIsoline:s=!0,showPointMarkers:l=!1}=t,d={dataProjection:"EPSG:4326",featureProjection:n.getView().getProjection()},h=A=>new Gr().readFeatures({type:"FeatureCollection",features:A},d),a=new globalThis.Map,p=[new ot({className:r,opacity:Math.max(0,Math.min(1,i)),zIndex:t.zIndex??10,visible:t.visible??!0,source:new yt({features:h(e.vectorFeatures)}),style:A=>{const w=ut(A.get("symbolId")),v=A.get("level"),B=`${w}_${String(v)}_${o}_${u}_${s}`,N=a.get(B);if(N)return N;const E=[];if(u){const L=Qo(w,v);E.push(new j.Style({fill:new j.Fill({color:w==="24"?jo(L)??L:L})}))}return(s||o)&&E.push(new j.Style({stroke:s?new j.Stroke({color:"#000",width:1}):void 0,text:o?new j.Text({text:String(v??""),font:"bold 16px sans-serif",fill:new j.Fill({color:"#333"}),stroke:new j.Stroke({color:"#fff",width:3}),placement:"line",overflow:!0}):void 0})),a.set(B,E),E}})];if(e.noteFeatures.length&&(o||l)){const A=new globalThis.Map;p.push(new ot({className:`${r}-notes`,zIndex:(t.zIndex??10)+2,visible:t.visible??!0,source:new yt({features:h(e.noteFeatures)}),style:w=>{const v=String(w.get("text")??""),B=`${v}_${o}_${l}`;let N=A.get(B);return N||(N=new j.Style({image:l?new j.Circle({radius:4,fill:new j.Fill({color:"#ffffffcc"}),stroke:new j.Stroke({color:"#ff4d4f",width:1.5})}):void 0,text:o?new j.Text({text:v,font:"bold 14px sans-serif",fill:new j.Fill({color:"#ff4d4f"}),stroke:new j.Stroke({color:"#fff",width:2}),offsetY:-12}):void 0}),A.set(B,N)),N}}))}if(e.symbolFeatures.length&&l){const A=new globalThis.Map;p.push(new ot({className:`${r}-filtered`,zIndex:(t.zIndex??10)+3,visible:t.visible??!0,source:new yt({features:h(e.symbolFeatures)}),style:w=>{const v=ut(w.get("symbolId"));let B=A.get(v);if(!B){const N=v==="23"?"#5f4bb6":v==="24"?"#2f7ea1":"#2d9f3b";B=new j.Style({image:new j.Circle({radius:5,fill:new j.Fill({color:N}),stroke:new j.Stroke({color:"#fff",width:1.5})})}),A.set(v,B)}return B}}))}return p}async function dn(n,e){if(!e.className||!e.filePath)return;const t=ln(n,e.className),r=await ko(e);if(wt(e.signal),!Or(n,e.className,t))return;const i=n.getLayers().getArray().find(u=>u.getClassName()===e.className),o=Wo(n,r,{...e,zIndex:i?.getZIndex()??e.zIndex,visible:i?.getVisible()??e.visible});if(Or(n,e.className,t))return fn(n,e.className),o.forEach(u=>n.addLayer(u)),o[0]}function gn(n,e){ln(n,e),fn(n,e)}class mn{map;options;ready;sourceRequestVersion=0;abortController=new AbortController;constructor(e,t){this.map=e,this.options=t,this.ready=this.add()}beginSourceRequest(){return this.abortController.abort(),this.abortController=new AbortController,++this.sourceRequestVersion}getMicContourOptions(e){const t=this.options.config??{};return{className:this.options.id,filePath:e,authorization:this.options.authorization,legend:t.legend??[],legendScope:t.legendScope??[],zIndex:Number.isFinite(Number(t.zIndex))?Number(t.zIndex):10,opacity:Number.isFinite(Number(t.opacity))?Number(t.opacity):.8,showText:this.options.showText??t.showText??!1,showFillcolor:this.options.showFillcolor??t.showFillcolor??!0,showIsoline:this.options.showIsoline??t.showIsoline??!0,showPointMarkers:this.options.showPointMarkers??t.showPointMarkers??!1}}async add(){const e=this.beginSourceRequest(),t=this.abortController,r=this.options.url;if(r)try{if(await dn(this.map,{...this.getMicContourOptions(r),signal:t.signal}),e!==this.sourceRequestVersion||t.signal.aborted)return}catch(i){if(t.signal.aborted)return;throw i}}delete(){this.abortController.abort(),this.sourceRequestVersion++,gn(this.map,this.options.id)}toggleVisible(e){we(this.map,this.options.id,e),we(this.map,`${this.options.id}-notes`,e),we(this.map,`${this.options.id}-filtered`,e),we(this.map,`${this.options.id}-other`,e)}async updateParams(e){this.options={...this.options,...e,config:{...this.options.config,...e?.config??{}}},this.ready=this.add(),await this.ready}}const Uo=8,Yo=8,Jo=3,ar="rgba(0,0,0,0.8)",He=new globalThis.Map,Mt=new globalThis.Map,Ie=new globalThis.Map,Ot=new globalThis.Map,cr=new WeakMap;function vr(n,e){return n.getLayers().getArray().find(t=>t.getClassName()===e)}function An(n,e){for(const t of[...n.getLayers().getArray()])t.getClassName()===e&&n.removeLayer(t)}function pn(n){const{url:e,time:t="",authorization:r="",config:i}=n,{legend:o=[]}=i;return JSON.stringify({url:e,time:t,authorization:r,extent:i.extent??[],scope:i.scope??[],thresholds:o.map(u=>u.scope??[]),isolineSmooth:i.isolineSmooth!==!1,isolineSmoothness:vn(i)})}function Zo(n){const{url:e,time:t="",authorization:r="",config:i}=n;return JSON.stringify({url:e,time:t,authorization:r,extent:i.extent??[],scope:i.scope??[]})}function vn(n){return n.isolineSmooth===!1?0:Ye(n.isolineSmoothness)}function Ko(n,e){for(He.delete(n),He.set(n,e);He.size>Uo;){const t=He.keys().next().value;if(t===void 0)break;He.delete(t)}}function _o(n,e){for(Ie.delete(n),Ie.set(n,e);Ie.size>Yo;){const t=Ie.keys().next().value;if(t===void 0)break;Ie.delete(t)}}async function $o(n){const e=Zo(n),t=Ie.get(e);if(t)return Ie.delete(e),Ie.set(e,t),t;const r=Ot.get(e);if(r)return r;const i=(async()=>{const o=await Bt(n);if(!o)return;const u={rawArr2D:o.rawArr2D,extent:o.extent,width:o.width,height:o.height};return _o(e,u),u})();Ot.set(e,i);try{return await i}finally{Ot.get(e)===i&&Ot.delete(e)}}function Dn(n,e){let t=cr.get(n);t||(t=new globalThis.Map,cr.set(n,t));const r=(t.get(e)??0)+1;return t.set(e,r),r}function ei(n,e,t){return cr.get(n)?.get(e)===t}function ti(n){return typeof n.isolineBorderColor=="string"?n.isolineBorderColor:typeof n.isolineColor=="string"?n.isolineColor:n.isolineColor===!0?be(n.legend??[],n.legendScope).colorMap:ar}function ri(n){return be(n.legend??[],n.legendScope).colorMap}function Xr(n){if(typeof n=="string")return()=>n;const e=Object.keys(n).map(Number).filter(Number.isFinite).sort((t,r)=>t-r);return t=>{const r=n[t];if(r)return r;let i=0,o=e.length-1,u=-1;for(;i<=o;){const s=i+o>>1;e[s]<=t?(u=s,i=s+1):o=s-1}return u<0?ar:n[e[u]]||ar}}function ni(n,e,t){const r=n(e),[i,o,u,s]=bt(r);return[i,o,u,s/255*Math.max(0,Math.min(1,t))]}function Hr(n,e,t,r){const i=new globalThis.Map,o=[],[u,s,l,d]=r,h=(l-u)/e,a=(d-s)/t,D=A=>{if(!Array.isArray(A)||A.length<2)return null;const w=[];for(const v of A)!Array.isArray(v)||v.length<2||!Number.isFinite(v[0])||!Number.isFinite(v[1])||w.push([u+v[0]*h,d-v[1]*a]);return w.length>=2?w:null},p=(A,w)=>{const v=i.get(A)??[];v.push(w),i.set(A,v)};for(const A of n){const w=Number(A.value);if(!(!Number.isFinite(w)||!Array.isArray(A.coordinates))){if(A.type==="Polygon"){const v=A.coordinates.map(D).filter(B=>!!B);v.length&&(o.push({type:"Polygon",coordinates:v,value:w}),v.forEach(B=>p(w,B)))}else if(A.type==="MultiPolygon"){const v=[];for(const B of A.coordinates){const N=B.map(D).filter(E=>!!E);N.length&&(v.push(N),N.forEach(E=>p(w,E)))}v.length&&o.push({type:"MultiPolygon",coordinates:v,value:w})}}}return{lines:[...i.entries()].map(([A,w])=>w.length===1?{type:"LineString",coordinates:w[0],value:A}:{type:"MultiLineString",coordinates:w,value:A}),polygons:o.sort((A,w)=>A.value-w.value)}}function oi(n){const e=r=>!r||!Array.isArray(r.coordinates)||r.type!=="Polygon"&&r.type!=="MultiPolygon"?null:{type:"Feature",properties:{},geometry:r.type==="Polygon"?{type:"Polygon",coordinates:r.coordinates}:{type:"MultiPolygon",coordinates:r.coordinates}},t=[];for(let r=0;r<n.length;r++){const i=n[r],o=Number(i?.value),u=e(i);if(!u||!Number.isFinite(o))continue;const s=e(n[r+1]),l=s?tr.difference(tr.featureCollection([u,s])):u;l&&t.push({type:l.geometry.type,coordinates:l.geometry.coordinates,value:o})}return t}async function ii(n){const e=await $o(n);if(!e)return{lines:[],polygons:[]};const{rawArr2D:t,extent:r,width:i,height:o}=e,{uniqueThresholds:u}=be(n.config.legend??[]);if(i<2||o<2||u.length===0)return{lines:[],polygons:[]};const s=vn(n.config),l=dr(t,i,o,s),d=new Float64Array(i*o);for(let p=0;p<o;p++){const A=l[p];for(let w=0;w<i;w++){const v=A?.[w];d[p*i+w]=v===void 0||!Number.isFinite(v)?NaN:v}}const h=It.contours().size([i,o]).thresholds(u).smooth(s>0)(d),a=Hr(h,i,o,r),D=Hr(oi(h),i,o,r);return{lines:a.lines,polygons:D.polygons}}async function yn(n,e){const t=He.get(n);if(t)return He.delete(n),He.set(n,t),t;const r=Mt.get(n);if(r)return r;const i=ii(e);Mt.set(n,i);try{const o=await i;return Ko(n,o),o}finally{Mt.get(n)===i&&Mt.delete(n)}}function bn(n){const{map:e,id:t,isolineGeoJSON:r,contourGeoJSON:i=[],colorMap:o,fillColorMap:u={},fillContours:s=!1,fillOpacity:l=.7,lineWidth:d=1.2,showLabel:h=!0,zIndex:a=9999,visible:D=!0,geometryCacheKey:p,visibleThresholds:A}=n,w=Xr(o),v=Xr(u),B=A?new Set(A):void 0,N=new globalThis.Map,E=S=>{const z=Number(S.get("value"));if(B&&!B.has(z))return;const C=S.get("geometryKind")==="fill"?"fill":"line";if(C==="fill"&&!s)return;const P=`${C}:${z}`;let F=N.get(P);return F||(C==="fill"?(F=new j.Style({fill:new j.Fill({color:ni(v,z,l)}),zIndex:0}),N.set(P,F),F):(F=new j.Style({stroke:new j.Stroke({color:w(z),width:d}),text:h?new j.Text({text:Number.isInteger(z)?String(z):String(Number(z.toFixed(1))),fill:new j.Fill({color:"#fff"}),stroke:new j.Stroke({color:"#000",width:3}),placement:"line",overflow:!1}):void 0,zIndex:1}),N.set(P,F),F))},L=vr(e,t);if(p&&L instanceof ot&&L.get("isolineGeometryCacheKey")===p)return L.setStyle(E),L.setZIndex(a),L.setVisible(D),L.setDeclutter(h),L.changed(),L;const X=new Gr().readFeatures({type:"FeatureCollection",features:[...s||p?i.map(({value:S,...z})=>({type:"Feature",geometry:z,properties:{value:S,geometryKind:"fill"}})):[],...r.map(({value:S,...z})=>({type:"Feature",geometry:z,properties:{value:S,geometryKind:"line"}}))]},{dataProjection:"EPSG:3857",featureProjection:e.getView().getProjection()}),R=new ot({className:t,source:new yt({features:X}),zIndex:a,visible:D,declutter:h,style:E});return p&&R.set("isolineGeometryCacheKey",p),An(e,t),e.addLayer(R),R}async function wn(n,e){const{id:t,config:r}=e,i=Dn(n,t);if(!e.url||e.signal?.aborted)return;const o=pn(e),u=await yn(o,e);if(e.signal?.aborted||!ei(n,t,i))return;const s=vr(n,t),{uniqueThresholds:l}=be(r.legend??[],r.legendScope);return bn({map:n,id:t,isolineGeoJSON:u.lines,contourGeoJSON:u.polygons,colorMap:ti(r),fillColorMap:ri(r),fillContours:r.isolineFill===!0,fillOpacity:r.opacity,lineWidth:r.isolineLineWidth??r.lineWidth,showLabel:r.showIsolineValue??r.showIsolineLabel??!0,zIndex:r.zIndex??s?.getZIndex(),visible:s?.getVisible()??!0,geometryCacheKey:o,visibleThresholds:l})}async function ui(n,e){const t=[...e],r=async()=>{for(;t.length;){if(n.signal?.aborted)return;const i=t.shift(),o=i,u=typeof o?.format=="function"?o.format("YYYY-MM-DDTHH:mm:ss.SSS[Z]"):String(i),s={...n,time:u};await yn(pn(s),s)}};await Promise.all(Array.from({length:Math.min(Jo,t.length)},()=>r()))}function Cn(n,e){Dn(n,e),An(n,e)}function Bn(n,e,t){const r=vr(n,e);r&&r.setVisible(t)}class En{map;options;ready;abortController=new AbortController;constructor(e,t){this.map=e,this.options=t,this.ready=this.render()}async render(){this.abortController.abort();const e=new AbortController;this.abortController=e;const t=this.options.url;if(t)try{await wn(this.map,{...this.options,url:t,signal:e.signal})}catch(r){if(e.signal.aborted)return;throw r}}delete(){this.abortController.abort(),Cn(this.map,this.options.id)}toggleVisible(e){Bn(this.map,this.options.id,e)}async updateParams(e){this.options={...this.options,...e,config:{...this.options.config,...e.config??{}}},this.ready=this.render(),await this.ready}}const Ir=2;class xn extends mr{windVectorCache=new Map;windVectorLoadingTasks=new globalThis.Map;normalizeUrls(e){return Array.isArray(e)?e.filter(t=>typeof t=="string"&&!!t):typeof e=="string"&&e?[e]:[]}parseScopeValue(e){if(Array.isArray(e)&&e.length>=2){const t=Number(e[0]),r=Number(e[1]);if(Number.isFinite(t)&&Number.isFinite(r))return[t,r]}if(typeof e=="string"){const t=e.split(",").map(r=>Number(r.trim())).filter(r=>Number.isFinite(r));if(t.length>=2)return[t[0],t[1]]}}getComponentScope(e=this.options){const t=e?.config??{},r=t.layerConfig??{},i=this.parseScopeValue(t.componentScope)??this.parseScopeValue(t.uvScope)??this.parseScopeValue(r.COMPONENT_SCALE_RANGE)??this.parseScopeValue(r.COMPONENT_SCOPE)??this.parseScopeValue(r.UV_SCOPE);if(i){const s=Math.max(Math.abs(i[0]),Math.abs(i[1]));return[-s,s]}const o=[t?.scope?.[0],t?.scope?.[1]].map(s=>Math.abs(Number(s))).filter(s=>Number.isFinite(s)),u=o.length?Math.max(...o):60;return[-u,u]}buildWindSpeedGrid(e,t,r,i){const o=Array.from({length:i},()=>Array(r).fill(void 0));for(let u=0;u<i;u++)for(let s=0;s<r;s++){const l=u*r+s,d=e[l],h=t[l],a=typeof d<"u"&&Number.isFinite(Number(d)),D=typeof h<"u"&&Number.isFinite(Number(h));if(!a&&!D)continue;const p=a?Number(d):0,A=D?Number(h):0;o[u][s]=Math.sqrt(p*p+A*A)}return o}prepareGrid(e,t,r){const i=Array.from({length:r},()=>Array(t).fill(NaN));for(let o=0;o<r;o++)for(let u=0;u<t;u++){const s=e[o]?.[u];i[o][u]=s==null||isNaN(Number(s))?NaN:Number(s)}return i}getWindVectorCacheKey(e=this.options){const t=this.normalizeUrls(e?.url);return JSON.stringify({urls:t,authorization:e?.authorization??"",extent:e?.config?.extent,scope:this.getComponentScope(e)})}async getOrLoadWindVectorData(e=this.options){const{url:t,config:r,authorization:i}=e;if(!r?.extent||!Array.isArray(t))return null;const o=this.normalizeUrls(t);if(o.length<2)return null;const u=this.getWindVectorCacheKey(e),s=this.windVectorCache.get(u);if(s)return s;const l=this.windVectorLoadingTasks.get(u);if(l)return l;const d=(async()=>{const h=this.getComponentScope(e),[a,D]=await Promise.all([_e(o[0],h,void 0,i,{detectNoDataByBorderColor:!1}),_e(o[1],h,void 0,i,{detectNoDataByBorderColor:!1})]),p=Math.min(a?.width??0,D?.width??0),A=Math.min(a?.height??0,D?.height??0);if(!p||!A||!a?.grayArr||!D?.grayArr)return null;const w=new Float32Array(p*A),v=new Float32Array(p*A);for(let N=0;N<p*A;N++){const E=Number(a.grayArr[N]),L=Number(D.grayArr[N]);w[N]=Number.isFinite(E)?E:0,v[N]=Number.isFinite(L)?L:0}const B={width:p,height:A,u:w,v,extent:st(r.extent)};return this.windVectorCache.set(u,B),B})();this.windVectorLoadingTasks.set(u,d);try{return await d}finally{this.windVectorLoadingTasks.get(u)===d&&this.windVectorLoadingTasks.delete(u)}}async getOrLoadContourData(e=this.options){const{url:t,config:r}=e;if(!r?.extent)return null;if(!Array.isArray(t))return super.getOrLoadContourData(e);const i=this.normalizeUrls(t);if(i.length<2)return null;const o=JSON.stringify({urls:i,authorization:e?.authorization??"",extent:r.extent,scope:this.getComponentScope(e)}),u=this.contourCache.get(o);if(u&&u.schemaVersion===Ir)return u;const s=this.contourLoadingTasks.get(o);if(s)return s;const l=(async()=>{const d=await this.getOrLoadWindVectorData(e);if(!d)return null;const{u:h,v:a,width:D,height:p,extent:A}=d,w=this.buildWindSpeedGrid(h,a,D,p),v=Ut(w,D,p),B=this.prepareGrid(w,D,p),N=this.prepareGrid(v,D,p),E={schemaVersion:Ir,rawArr2D:B,smoothArr2D:N,extent:A,width:D,height:p};return this.contourCache.set(o,E),E})();this.contourLoadingTasks.set(o,l);try{return await l}finally{this.contourLoadingTasks.get(o)===l&&this.contourLoadingTasks.delete(o)}}async getSourceFromParams(e=this.options){const{config:t,url:r}=e;if(!t?.extent)return;if(!Array.isArray(r))return super.getSourceFromParams(e);const i=await this.getOrLoadContourData(e);if(!i)return;const{rawArr2D:o,smoothArr2D:u,extent:s,width:l,height:d}=i,h=this.getValueTransformFn(e),a=this.applyValueTransform2D(o,"raw",h),D=this.applyValueTransform2D(u,"smooth",h),{colorMap:p}=be(t.legend,t.legendScope),A=it(t.legend,t.legendScope)??t.scope;return this.getFcstRasterSource({rawArr2D:a,smoothArr2D:D,extent:s,width:l,height:d,colorMap:p,colorMode:t.mode,scope:A},e)}}const si="data:image/png;base64,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";class lr{map;options;contourCache;iconImagePromise;externalWindDataProvider;constructor(e,t,r){this.map=e,this.options=t,this.contourCache=new Map,this.iconImagePromise=null,this.externalWindDataProvider=r,this.add()}getClassName(){return this.options.id+"-windShaft"}normalizeUrls(e){return Array.isArray(e)?e.filter(t=>typeof t=="string"&&!!t):typeof e=="string"&&e?[e]:[]}getComponentScope(){const e=this.options?.config??{},t=e.layerConfig??{},r=s=>{if(Array.isArray(s)&&s.length>=2){const l=Number(s[0]),d=Number(s[1]);if(Number.isFinite(l)&&Number.isFinite(d))return[l,d]}if(typeof s=="string"){const l=s.split(",").map(d=>Number(d.trim())).filter(d=>Number.isFinite(d));if(l.length>=2)return[l[0],l[1]]}},i=r(e.componentScope)??r(e.uvScope)??r(t.COMPONENT_SCALE_RANGE)??r(t.COMPONENT_SCOPE)??r(t.UV_SCOPE);if(i){const s=Number(i[0]),l=Number(i[1]);if(Number.isFinite(s)&&Number.isFinite(l)){const d=Math.max(Math.abs(s),Math.abs(l));return[-d,d]}}const o=[e?.scope?.[0],e?.scope?.[1]].map(s=>Math.abs(Number(s))).filter(s=>Number.isFinite(s)),u=o.length?Math.max(...o):60;return[-u,u]}getCacheKey(){const e=this.normalizeUrls(this.options?.url);return JSON.stringify({id:this.options?.id,urls:e,extent:this.options?.config?.extent,scope:this.getComponentScope()})}getRuntimeConfig(){return this.options.config}getVisibleWindSpeedScope(){const e=this.getRuntimeConfig();return it(e.legend,e.legendScope)??e.scope}getWindShaftConfig(){const e=this.getRuntimeConfig(),t=e.windShaftConfig??{},r=e.gridConfig??{},i=(o,u)=>{const s=Number(o);return Number.isFinite(s)?s:u};return{pixelStep:Math.max(8,i(t.pixelStep??r.pixelStep??e.pixelStep,40)),fontSize:Math.max(10,i(t.fontSize??r.fontSize??e.fontSize,26)),color:String(t.color??e.color??"rgb(255,255,255)"),minWindSpeed:Math.max(0,i(t.minWindSpeed,.01)),speedLevelStep:Math.max(.1,i(t.speedLevelStep,2)),maxLevel:Math.max(1,Math.floor(i(t.maxLevel,30))),spriteCellSize:Math.max(1,Math.floor(i(t.spriteCellSize,32))),baseFontSize:Math.max(1,i(t.baseFontSize,32)),iconYOffsetRatio:Math.max(0,i(t.iconYOffsetRatio,.7)),firstRowMaxLevel:Math.max(0,Math.floor(i(t.firstRowMaxLevel,3))),firstRowStartX:Math.floor(i(t.firstRowStartX,28)),firstRowY:Math.floor(i(t.firstRowY,4)),secondRowOffsetX:Math.floor(i(t.secondRowOffsetX,4)),secondRowY:Math.floor(i(t.secondRowY,5))}}async getIconImage(){return this.iconImagePromise?this.iconImagePromise:(this.iconImagePromise=new Promise((e,t)=>{const r=new Image;r.crossOrigin="anonymous",r.onload=()=>e(r),r.onerror=()=>t(new Error("Failed to load wind shaft sprite image")),r.src=si}),this.iconImagePromise)}async getOrLoadWindData(){const e=this.getRuntimeConfig();if(!e?.extent)return null;const t=this.getCacheKey(),r=this.contourCache.get(t);if(r)return r;if(this.externalWindDataProvider){const p=await this.externalWindDataProvider();if(p)return this.contourCache.set(t,p),p}const i=this.normalizeUrls(this.options?.url);if(i.length<2)return null;const o=this.getComponentScope(),[u,s]=await Promise.all([_e(i[0],o,void 0,this.options?.authorization,{detectNoDataByBorderColor:!1}),_e(i[1],o,void 0,this.options?.authorization,{detectNoDataByBorderColor:!1})]),l=Math.min(u?.width??0,s?.width??0),d=Math.min(u?.height??0,s?.height??0);if(!l||!d)return null;const h=new Float32Array(l*d),a=new Float32Array(l*d);for(let p=0;p<l*d;p++){const A=Number(u.grayArr[p]),w=Number(s.grayArr[p]);h[p]=Number.isFinite(A)?A:0,a[p]=Number.isFinite(w)?w:0}const D={width:l,height:d,u:h,v:a,extent:st(e.extent)};return this.contourCache.set(t,D),D}createWindShaftSource(e,t){const r=this.getWindShaftConfig(),{pixelStep:i,fontSize:o,color:u,minWindSpeed:s,speedLevelStep:l,maxLevel:d,spriteCellSize:h,baseFontSize:a,iconYOffsetRatio:D,firstRowMaxLevel:p,firstRowStartX:A,firstRowY:w,secondRowOffsetX:v,secondRowY:B}=r,N=this.getVisibleWindSpeedScope(),E=document.createElement("canvas"),[L,X,R,S]=e.extent,z=R-L,C=S-X;return new kt({projection:"EPSG:3857",ratio:1,interpolate:!1,canvasFunction:(P,F,M,I)=>{const g=I??[1,1],y=Math.max(1,Math.floor(g[0]??1)),b=Math.max(1,Math.floor(g[1]??1));E.width!==y&&(E.width=y),E.height!==b&&(E.height=b);const T=this.map.getSize(),O=Math.max(1,Math.floor(T?.[0]??y)),H=Math.max(1,Math.floor(T?.[1]??b)),G=y/O,V=b/H,Z=(G+V)*.5,J=E.getContext("2d",{alpha:!0});if(!J)return E;J.clearRect(0,0,y,b);const W=o/a*Z,U=h*W,_=h*W,[K,Y,re,ae]=P,$=re-K,ee=ae-Y;if($<=0||ee<=0||z<=0||C<=0)return E;const ce=Math.max(K,L),oe=Math.max(Y,X),ge=Math.min(re,R),se=Math.min(ae,S);if(ce>=ge||oe>=se)return E;const pe=Math.max(1,O-1),ve=Math.max(1,H-1),fe=Math.max(8,Math.round(i)),De=Math.max(0,Math.floor((ce-K)/$*pe)),te=Math.min(O-1,Math.ceil((ge-K)/$*pe)),ie=Math.max(0,Math.floor((ae-se)/ee*ve)),xe=Math.min(H-1,Math.ceil((ae-oe)/ee*ve));if(De>te||ie>xe)return E;for(let Ce=ie;Ce<=xe;Ce+=fe)for(let Le=De;Le<=te;Le+=fe){const at=K+$*Le/pe,ct=ae-ee*Ce/ve,Re=(at-L)/z*(e.width-1),lt=(S-ct)/C*(e.height-1),ze=Vt(e.u,Re,lt,e.width,e.height),Fe=Vt(e.v,Re,lt,e.width,e.height);if(!Number.isFinite(ze)||!Number.isFinite(Fe))continue;const $e=Math.atan2(ze,Fe)*(180/Math.PI),Se=Math.sqrt(ze*ze+Fe*Fe);if(Se<=s)continue;if(Array.isArray(N)&&N.length===2){const gt=Math.min(Number(N[0]),Number(N[1])),tt=Math.max(Number(N[0]),Number(N[1]));if(Number.isFinite(gt)&&Number.isFinite(tt)&&(Se<gt||Se>tt))continue}const et=Math.min(Math.ceil(Se/l),d-1);let ft=A+et,ht=w;et>p&&(ft=et-v,ht=B),J.save();const dt=Le*G,Me=Ce*V;J.translate(dt,Me),J.rotate($e*Math.PI/180),J.drawImage(t,ft*h,ht*h,h,h,-U/2,-_*D,U,_),J.globalCompositeOperation="source-atop",J.fillStyle=u,J.fillRect(-U/2,-_*D,U,_),J.globalCompositeOperation="source-over",J.restore()}return E}})}async getSourceFromCache(){const e=this.getCacheKey(),t=this.contourCache.get(e);if(!t)return null;const r=await this.getIconImage();return this.createWindShaftSource(t,r)}async getSourceFromParams(){const e=await this.getOrLoadWindData();if(!e)return null;const t=await this.getIconImage();return this.createWindShaftSource(e,t)}async add(){const e=this.getRuntimeConfig(),t=Number.isFinite(Number(e.zIndex))?Number(e.zIndex):1200,r=Number.isFinite(Number(e.opacity))?Number(e.opacity):1,i=this.getClassName(),o=de(this.map,i);o&&this.delete();const u=o?o.getZIndex():t+1,s=await this.getSourceFromCache()??await this.getSourceFromParams();if(!s)return;const l=new Ct({source:s,className:i,zIndex:u,opacity:r});this.map.addLayer(l)}delete(){Te(this.map,this.getClassName()),this.contourCache.clear(),this.iconImagePromise=null}toggleVisible(e){we(this.map,this.getClassName(),e)}async updateParams(e){this.options={...this.options,...e,config:{...this.options.config,...e?.config??{}}};const t=de(this.map,this.getClassName());if(!t){await this.add();return}const r=await this.getSourceFromCache()??await this.getSourceFromParams();r&&t.setSource(r)}}class Nn{map;options;constructor(e,t){this.map=e,this.options=t,this.add()}getClassName(){return this.options.id}getConfig(){return this.options?.config??{}}normalizeParamValue(e){if(e!=null)return Array.isArray(e)?e.join(","):typeof e=="boolean"?e?"true":"false":String(e)}buildWmsParams(){const t=this.getConfig().layerConfig??{},r={};return Object.keys(t).forEach(i=>{const o=this.normalizeParamValue(t[i]);typeof o<"u"&&(r[i]=o)}),r}splitUrlAndParams(e){const[t,r=""]=e.split("?"),i={};return r?(new URLSearchParams(r).forEach((u,s)=>{i[s]=u}),{baseUrl:t,urlParams:i}):{baseUrl:t,urlParams:i}}getTintColorRGB(){const t=(this.options?.config?.layerConfig??{}).TINTCOLOR;if(typeof t>"u"||t===null)return null;const r=String(t).trim();if(!r)return null;const i=r.replace(/^0x/i,"#"),o=i.startsWith("#")?i.slice(1):i;if(/^[0-9a-fA-F]{3}$/.test(o)){const s=parseInt(o[0]+o[0],16),l=parseInt(o[1]+o[1],16),d=parseInt(o[2]+o[2],16);return[s,l,d]}if(/^[0-9a-fA-F]{6}$/.test(o)){const s=parseInt(o.slice(0,2),16),l=parseInt(o.slice(2,4),16),d=parseInt(o.slice(4,6),16);return[s,l,d]}const u=r.split(",").map(s=>Number(s.trim()));return u.length===3&&u.every(s=>Number.isFinite(s)&&s>=0&&s<=255)?[Math.round(u[0]),Math.round(u[1]),Math.round(u[2])]:null}tintBlobToDataUrl(e,t){return new Promise((r,i)=>{const o=new Image,u=URL.createObjectURL(e);o.onload=()=>{const s=document.createElement("canvas");s.width=o.width,s.height=o.height;const l=s.getContext("2d",{willReadFrequently:!0});if(!l){URL.revokeObjectURL(u),i(new Error("Failed to create 2d context for tint"));return}l.clearRect(0,0,s.width,s.height),l.drawImage(o,0,0);const d=l.getImageData(0,0,s.width,s.height),h=d.data;for(let a=0;a<h.length;a+=4)(h[a+3]??0)!==0&&(h[a]=t[0],h[a+1]=t[1],h[a+2]=t[2]);l.putImageData(d,0,0),URL.revokeObjectURL(u),r(s.toDataURL("image/png"))},o.onerror=()=>{URL.revokeObjectURL(u),i(new Error("Failed to decode image for tint"))},o.src=u})}createSource(){const e=this.options?.url;if(!e)return null;const t=this.options?.authorization,r=this.getTintColorRGB(),{baseUrl:i,urlParams:o}=this.splitUrlAndParams(e),u={...o,...this.buildWmsParams()};return new Vr.TileWMS({interpolate:!0,url:i,params:u,tileLoadFunction:(s,l)=>{const d=s.getImage();if(!t&&!r){d.src=l;return}fetch(l,{credentials:"include",headers:t?{Authorization:t}:void 0}).then(async h=>{const a=(h.headers.get("content-type")||"").toLowerCase();if(!h.ok){const D=await h.text();throw new Error(`WMS tile request failed: ${h.status} ${h.statusText}; ${D.slice(0,240)}`)}if(!a.includes("image/")){const D=await h.text();throw new Error(`WMS tile response is not image: ${a}; ${D.slice(0,240)}`)}return h.blob()}).then(async h=>{if(r){d.src=await this.tintBlobToDataUrl(h,r);return}const a=URL.createObjectURL(h);d.onload=()=>{URL.revokeObjectURL(a),d.onload=null,d.onerror=null},d.onerror=()=>{URL.revokeObjectURL(a),d.onload=null,d.onerror=null},d.src=a}).catch(h=>{console.error("[WmsLayer] tile load failed",{src:l,hasAuthorization:!!t,error:h}),d.src="data:image/gif;base64,R0lGODlhAQABAAAAACw="})}})}add(){const e=this.getConfig(),t=Number.isFinite(Number(e.zIndex))?Number(e.zIndex):10,r=Number.isFinite(Number(e.opacity))?Number(e.opacity):1,i=this.getClassName(),o=de(this.map,i);o&&this.delete();const u=o?o.getZIndex():t,s=this.createSource();if(!s)return;const l=new qr({className:i,source:s,zIndex:u,opacity:r});this.map.addLayer(l)}delete(){Te(this.map,this.getClassName())}toggleVisible(e){we(this.map,this.getClassName(),e)}updateParams(e){this.options={...this.options,...e,config:{...this.options.config,...e?.config??{}}};const t=de(this.map,this.getClassName());if(!t){this.add();return}const r=this.createSource();r&&t.setSource(r);const i=this.getConfig(),o=Number(i.zIndex),u=Number(i.opacity);Number.isFinite(o)&&t.setZIndex(o),Number.isFinite(u)&&t.setOpacity(u)}updateColor(e){const r={...this.options?.config?.layerConfig??{}};typeof e.styles<"u"&&(r.STYLES=e.styles),typeof e.colorScaleRange<"u"&&(r.COLORSCALERANGE=Array.isArray(e.colorScaleRange)?e.colorScaleRange.join(","):String(e.colorScaleRange)),typeof e.numColorBands<"u"&&(r.NUMCOLORBANDS=String(e.numColorBands)),typeof e.aboveMaxColor<"u"&&(r.ABOVEMAXCOLOR=e.aboveMaxColor),typeof e.belowMinColor<"u"&&(r.BELOWMINCOLOR=e.belowMinColor),typeof e.bgColor<"u"&&(r.BGCOLOR=e.bgColor),typeof e.logScale<"u"&&(r.LOGSCALE=typeof e.logScale=="boolean"?e.logScale?"true":"false":e.logScale),this.updateParams({...this.options,config:{...this.options.config,layerConfig:r}})}}function ai(n){return String(n??"").trim().replace(/\/+$/,"")}function ci(n,e){const t=Ae();return`${ai(e||t.typhoonServiceBaseUrl||t.serviceBaseUrl)}/${n.replace(/^\/+/,"")}`}async function Pn(n,e){const t=Ae(),r=e?.authorization??t.typhoonAuthorization,i=await fetch(ci(n,e?.serviceBaseUrl),{credentials:"include",signal:e?.signal,headers:r?{Authorization:r}:void 0}),o=(i.headers.get("content-type")||"").toLowerCase();if(!i.ok){const u=await i.text();throw new Error(`Typhoon request failed: ${i.status} ${i.statusText}; ${u.slice(0,240)}`)}if(!o.includes("application/json")&&!o.includes("+json")){const u=await i.text();throw new Error(`Typhoon response has invalid content type: ${o||"unknown"}; ${u.slice(0,240)}`)}return await i.json()}function Tn(n){const e=n?.dataPath||Ae().typhoonDataPath;return Pn(`fileServer/${e}/typhoon_list.json`,n)}function Ln(n,e){const t=e?.dataPath||Ae().typhoonDataPath;return Pn(`fileServer/${t}/${n}.json`,e)}const li=["BABJ|WTPQ20","RJTD|WTPQ51","RJTD|WTPQ50"],Rr=["#d9480f","#1971c2","#2b8a3e","#862e9c","#0b7285","#c92a2a"],fi={TD:"热带低压",TS:"热带风暴","TROPICAL STORM":"热带风暴",STS:"强热带风暴",TY:"台风",STY:"强台风",SuperTY:"超强台风"};function Xt(n){return Array.isArray(n)?n:Array.isArray(n?.points)?n.points:[]}function hi(n){return Number.isFinite(n?.lon)&&Number.isFinite(n?.lat)}function Ht(n){return n.filter(hi).slice().sort((e,t)=>{const r=Date.parse(e.datetime||""),i=Date.parse(t.datetime||"");return Number.isFinite(r)&&Number.isFinite(i)&&r!==i?r-i:Number(e.validtime||0)-Number(t.validtime||0)})}class Fn{map;options;abortController;styleCache;constructor(e,t){this.map=e,this.options=t,this.abortController=null,this.styleCache=new globalThis.Map,this.add()}getClassName(){return this.options.id}getConfig(){return this.options.config?.typhoonConfig??{}}async add(){de(this.map,this.getClassName())&&this.delete(),this.abortController?.abort(),this.abortController=new AbortController;try{const t=await Tn({serviceBaseUrl:this.getConfig().serviceBaseUrl,dataPath:this.getConfig().dataPath,authorization:this.options.authorization,signal:this.abortController.signal});if(this.abortController.signal.aborted)return;const r=this.getSelectedTyphoonNums(t),i=await Promise.all(r.map(o=>Ln(o,{serviceBaseUrl:this.getConfig().serviceBaseUrl,dataPath:this.getConfig().dataPath,authorization:this.options.authorization,signal:this.abortController?.signal})));if(this.abortController.signal.aborted)return;this.render(t,i)}catch(t){console.error("[TyphoonLayer] load failed",t)}}getSelectedTyphoonNums(e){const t=this.getConfig().typhoonNums?.filter(Boolean);if(t?.length)return t;const r=e[0],i=r?r.num_inati||r.num_nati:"";return i?[i]:[]}getPrimarySource(e,t){const r=t==="obs"?e.obs:e.fcst,i=Object.keys(r??{});return(this.getConfig().sourcePriority??li).find(u=>i.includes(u))??i[0]}getLastPoint(e){return e.length?e[e.length-1]:void 0}findForecastBasePoint(e,t){if(t)for(let r=e.length-1;r>=0;r--){const i=e[r];if(i.file_ts===t.file_ts||i.datetime===t.datetime)return i}}getForecastAnchorPoint(e,t,r,i){const o=r[0];if(!o)return;const u=Ht(Xt(e.obs?.[t])),s=this.findForecastBasePoint(u,o);if(s)return s;const l=this.getLastPoint(u);if(l)return l;const d=i?Ht(Xt(e.obs?.[i])):[];return this.findForecastBasePoint(d,o)??this.getLastPoint(d)}render(e,t){const r=Number.isFinite(Number(this.options.config?.zIndex))?Number(this.options.config.zIndex):30,i=de(this.map,this.getClassName());i&&this.delete();const o=i?i.getZIndex():r,u=new yt;t.forEach((l,d)=>{const h=e.find(a=>a.num_inati===l.typhoon_num);this.appendTyphoonFeatures(u,l,h,Rr[d%Rr.length])});const s=new ot({className:this.getClassName(),source:u,zIndex:o,style:l=>this.createStyle(l)});this.map.addLayer(s),this.getConfig().fitToExtent!==!1&&!u.isEmpty()&&this.map.getView().fit(u.getExtent(),{padding:[80,80,80,80],duration:350,maxZoom:7})}appendTyphoonFeatures(e,t,r,i){const o=r?.name_cn||t.name_cn||t.name_en||t.typhoon_num,u=this.getPrimarySource(t,"obs");if(Object.entries(t.obs??{}).forEach(([d,h])=>{const a=Ht(Xt(h));if(!a.length)return;const D=d===u;this.addLineFeature(e,a,{kind:"obs",sourceName:d,color:i,isPrimary:D,typhoonName:o,typhoonNum:t.typhoon_num}),D&&this.addPointFeatures(e,a,{kind:"obs",sourceName:d,color:i,typhoonName:o,typhoonNum:t.typhoon_num})}),this.getConfig().showForecast===!1)return;const l=this.getPrimarySource(t,"fcst");Object.entries(t.fcst??{}).forEach(([d,h])=>{const a=Ht(Xt(h));if(!a.length)return;const D=d===l,p=this.getForecastAnchorPoint(t,d,a,u),A=p?[p,...a]:a;this.addLineFeature(e,A,{kind:"fcst",sourceName:d,color:i,isPrimary:D,typhoonName:o,typhoonNum:t.typhoon_num}),this.addForecastLabelFeature(e,a[a.length-1],{sourceName:d,color:i,isPrimary:D,typhoonName:o,typhoonNum:t.typhoon_num})})}addLineFeature(e,t,r){if(!(t.length<2))for(let i=1;i<t.length;i++){const o=t[i-1],u=t[i],s=new Zt.LineString([nt.fromLonLat([o.lon,o.lat]),nt.fromLonLat([u.lon,u.lat])]);e.addFeature(new Jt({geometry:s,featureType:`${r.kind}-line`,grade:u.grade,...r}))}}addPointFeatures(e,t,r){t.forEach((i,o)=>{const u=o===t.length-1,s=new Jt({geometry:new Zt.Point(nt.fromLonLat([i.lon,i.lat])),featureType:u?"latest-point":"obs-point",datetime:i.datetime,grade:i.grade,windMax:i.wind_max_ms,pressure:i.prs_hpa,...r});e.addFeature(s)})}addForecastLabelFeature(e,t,r){const i=new Jt({geometry:new Zt.Point(nt.fromLonLat([t.lon,t.lat])),featureType:"fcst-label",datetime:t.datetime,grade:t.grade,windMax:t.wind_max_ms,pressure:t.prs_hpa,...r});e.addFeature(i)}createStyle(e){const t=String(e.get("featureType")||""),r=String(e.get("color")||"#d9480f"),i=String(e.get("sourceName")||""),o=String(e.get("grade")||""),u=String(e.get("typhoonName")||""),s=!!e.get("isPrimary"),l=[t,r,i,o,u,s].join("|"),d=this.styleCache.get(l);if(d)return d;const h=this.getGradeColor(o,r);let a;if(t==="obs-line")a=new j.Style({stroke:new j.Stroke({color:s?h:`${h}80`,width:s?3:1.5})});else if(t==="fcst-line")a=new j.Style({stroke:new j.Stroke({color:s?h:`${h}80`,width:s?2:1.25,lineDash:[8,8]})});else if(t==="fcst-label")a=new j.Style({image:new j.Circle({radius:s?4.5:3.5,fill:new j.Fill({color:h}),stroke:new j.Stroke({color:"#fff",width:1.5})}),text:new j.Text({text:i,font:s?"bold 12px sans-serif":"12px sans-serif",fill:new j.Fill({color:"#1f2937"}),stroke:new j.Stroke({color:"#fff",width:4}),offsetX:8,offsetY:-8,textAlign:"left"})});else{const D=t==="latest-point";a=new j.Style({image:new j.Circle({radius:D?6:4,fill:new j.Fill({color:h}),stroke:new j.Stroke({color:"#fff",width:D?2:1.5})}),text:D?new j.Text({text:u,font:"bold 13px sans-serif",fill:new j.Fill({color:"#1f2937"}),stroke:new j.Stroke({color:"#fff",width:4}),offsetY:-16}):void 0})}return this.styleCache.set(l,a),a}getGradeColor(e,t){const r=String(e||"").trim();if(!r)return t;const i=fi[r]||r,o=this.options.config.legend.find(s=>s.name===i),u=this.options.config.legend.find(s=>s.name==="其他");return o?.color||u?.color||t}delete(){this.abortController?.abort(),Te(this.map,this.getClassName())}toggleVisible(e){we(this.map,this.getClassName(),e)}updateParams(e){this.options={...this.options,...e,config:{...this.options.config,...e?.config??{}}},this.add()}}const di={center:[118.7969,32.0603],zoom:5,layers:[]};function gi(n,e){e?.mapMethodsConfig&&Qr(e.mapMethodsConfig);const t={...di,...e??{}};return new Promise(r=>{const i=new Mn.Map({target:n,layers:[],view:new On({center:nt.fromLonLat(t.center),zoom:t.zoom}),controls:[]});t.layers.forEach(o=>{Sn(i,o)}),r(i)})}function de(n,e){return n.getLayers().getArray().find(r=>r.getClassName()===e)}function Te(n,e){const t=de(n,e);t&&n.removeLayer(t)}function Sn(n,e){const t=new qr({className:e.id,source:new Vr.XYZ({...e.source}),zIndex:e.zIndex??0});n.addLayer(t)}function mi(n,e){Te(n,e)}function we(n,e,t){if(!n)return;const r=de(n,e);r&&r.setVisible(t)}const ue=[];function Ai(n,e){if(!n)return;const t=Array.isArray(e.type)?e.type:[e.type];if(t.includes("gradual")){const r=new mr(n,e);if(ue.push(r),t.includes("grid")){const i={...e,type:"grid"},o=new zt(n,i,async()=>{const u=await r.getOrLoadContourData();return u?{rawArr2D:u.rawArr2D,extent:u.extent,width:u.width,height:u.height}:null});ir(e.id,o)}}else if(t.includes("uv")){const r=new xn(n,e);if(ue.push(r),t.includes("grid")){const i={...e,type:"grid"},o=new zt(n,i,async()=>{const u=await r.getOrLoadContourData();return u?{rawArr2D:u.rawArr2D,extent:u.extent,width:u.width,height:u.height}:null});ir(e.id,o)}if(t.includes("windShaft")){const i=new lr(n,e,async()=>r.getOrLoadWindVectorData());ue.push(i)}}else if(t.includes("grid")){const r=new zt(n,e);ue.push(r)}else if(t.includes("arrow")){const r=new an(n,e);ue.push(r)}else if(t.includes("micaps")){const r=new mn(n,e);ue.push(r)}else if(t.includes("isoline")||t.includes("contour")){const r=new En(n,e);ue.push(r)}else if(t.includes("wms")){const r=new Nn(n,e);ue.push(r)}else if(t.includes("typhoon")){const r=new Fn(n,e);ue.push(r)}else if(t.includes("windShaft")){const r=new lr(n,e);ue.push(r)}}function pi(n){for(let t=ue.length-1;t>=0;t--)ue[t].options.id===n&&(ue[t].delete(),ue.splice(t,1));const e=Yt(n);e&&(e.delete(),on(n))}function vi(){ue.forEach(n=>{n.delete()}),un(n=>{n.delete()}),sn(),ue.length=0}function Di(n,e){ue.filter(i=>i.options.id===n).forEach(i=>{i.toggleVisible(e)});const r=Yt(n);r&&r.toggleVisible(e)}function yi(n){const e=ue.filter(r=>r.options.id===n.id);console.log("🚀 ~ updateLayer ~ layer:",ue,n,e),e.forEach(r=>{r.updateParams(n)});const t=Yt(n.id);t&&t.updateParams({...n,type:"grid"})}function bi(n,e){ue.filter(r=>r.options.id===n).forEach(r=>{typeof r.updateColor=="function"&&r.updateColor(e)})}function wi(){return ue}function Ci(){const n=new globalThis.Map;return ue.forEach(e=>{const t=e?.options;!t?.id||n.has(t.id)||n.set(t.id,t)}),Array.from(n.values())}function Bi(n,e,t,r,i=!1){if(!n)return Promise.resolve(null);const o=ue.find(u=>u.options.id===e);return o&&typeof o.getValueByLonLat=="function"?o.getValueByLonLat(t,r,i):Promise.resolve(null)}exports.ArrowLayer=an;exports.CommonMethods=Hn;exports.FcstLayer=mr;exports.GridLayer=zt;exports.IsolineLayer=En;exports.MicLayer=mn;exports.TyphoonLayer=Fn;exports.WindLayer=xn;exports.WindShaft=lr;exports.WmsLayer=Nn;exports.addIsolineLayer=bn;exports.addTile=Sn;exports.bboxFromLonlatTo3857=st;exports.bilinearInterpolate=Vt;exports.clampByte=Ue;exports.clearAllLayers=vi;exports.clearLinkedGridLayerMap=sn;exports.configureMapMethods=Qr;exports.convertContourGeoJSONTo3857=uo;exports.convertContourGeoJSONToLngLat=io;exports.createIsoline=wn;exports.createMicContour=dn;exports.createTdsRequestUrl=jr;exports.deleteLinkedGridLayer=on;exports.fetchExcel=Qn;exports.fetchImageBase64=Ur;exports.fetchTdsGet=jt;exports.fetchTdsImageBase64=Wn;exports.fetchTdsResponse=Qt;exports.fetchTxtOrJson=kn;exports.fetchXMLFromUrl=Wr;exports.fetchXmlData=fr;exports.forEachLinkedGridLayer=un;exports.gaussianBlur2D=Ut;exports.generateLegend=be;exports.getContourParams=Bt;exports.getGrayDataFromImage=_e;exports.getLayerByClassName=de;exports.getLegendItemsByScope=gr;exports.getLegendValueScope=it;exports.getLinkedGridLayer=Yt;exports.getLoadedLayerOptions=Ci;exports.getLoadedLayers=wi;exports.getMapMethodsConfig=Ae;exports.getMenuList=Kr;exports.getNCXmlData=Jr;exports.getNodeData=rr;exports.getTyphoonDetail=Ln;exports.getTyphoonList=Tn;exports.getUrlFromTime=tn;exports.getValueByLonLat=Bi;exports.getVariableMinMax=Zr;exports.getWidthAndHeight=en;exports.getXmlData=nr;exports.initMap=gi;exports.lerp=Dt;exports.loadLayer=Ai;exports.mapValueToRGBA=ao;exports.normalizeSmoothnessLevel=Ye;exports.parseAlpha=or;exports.parseColorToRGBA=bt;exports.parseCssNumber=We;exports.parseXML=qt;exports.pixelTo3857=_r;exports.pixelToLngLat=$r;exports.preloadIsoline=ui;exports.removeIsolineLayer=Cn;exports.removeLayer=Te;exports.removeLayerById=pi;exports.removeMicContour=gn;exports.removeTile=mi;exports.renderFcstCanvasByWebGPU=nn;exports.resetMapMethodsConfig=In;exports.resolveLayerLoadOptions=ho;exports.resolveSymFunction=hr;exports.setLinkedGridLayer=ir;exports.smoothGridByLevel=dr;exports.toggleIsolineLayer=Bn;exports.toggleLayerShowHide=we;exports.toggleVisibleById=Di;exports.updateLayer=yi;exports.updateWmsLayerColor=bi;
|