diff --git a/lib/fxp.cjs b/lib/fxp.cjs index 750ed089..9a7b1655 100644 --- a/lib/fxp.cjs +++ b/lib/fxp.cjs @@ -1 +1 @@ -(()=>{"use strict";var t={d:(e,n)=>{for(var i in n)t.o(n,i)&&!t.o(e,i)&&Object.defineProperty(e,i,{enumerable:!0,get:n[i]})},o:(t,e)=>Object.prototype.hasOwnProperty.call(t,e),r:t=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})}},e={};t.r(e),t.d(e,{XMLBuilder:()=>Gt,XMLParser:()=>At,XMLValidator:()=>Wt});const n=":A-Za-z_\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD",i=new RegExp("^["+n+"]["+n+"\\-.\\d\\u00B7\\u0300-\\u036F\\u203F-\\u2040]*$");function s(t,e){const n=[];let i=e.exec(t);for(;i;){const s=[];s.startIndex=e.lastIndex-i[0].length;const r=i.length;for(let t=0;t"!==t[r]&&" "!==t[r]&&"\t"!==t[r]&&"\n"!==t[r]&&"\r"!==t[r];r++)l+=t[r];if(l=l.trim(),"/"===l[l.length-1]&&(l=l.substring(0,l.length-1),r--),!y(l)){let e;return e=0===l.trim().length?"Invalid space after '<'.":"Tag '"+l+"' is an invalid name.",N("InvalidTag",e,v(t,r))}const h=f(t,r);if(!1===h)return N("InvalidAttr","Attributes for '"+l+"' have open quote.",v(t,r));let d=h.value;if(r=h.index,"/"===d[d.length-1]){const n=r-d.length;d=d.substring(0,d.length-1);const s=x(d,e);if(!0!==s)return N(s.err.code,s.err.msg,v(t,n+s.err.line));i=!0}else if(a){if(!h.tagClosed)return N("InvalidTag","Closing tag '"+l+"' doesn't have proper closing.",v(t,r));if(d.trim().length>0)return N("InvalidTag","Closing tag '"+l+"' can't have attributes or invalid starting.",v(t,o));if(0===n.length)return N("InvalidTag","Closing tag '"+l+"' has not been opened.",v(t,o));{const e=n.pop();if(l!==e.tagName){let n=v(t,e.tagStartPos);return N("InvalidTag","Expected closing tag '"+e.tagName+"' (opened in line "+n.line+", col "+n.col+") instead of closing tag '"+l+"'.",v(t,o))}0==n.length&&(s=!0)}}else{const a=x(d,e);if(!0!==a)return N(a.err.code,a.err.msg,v(t,r-d.length+a.err.line));if(!0===s)return N("InvalidXml","Multiple possible root nodes found.",v(t,r));-1!==e.unpairedTags.indexOf(l)||n.push({tagName:l,tagStartPos:o}),i=!0}for(r++;r0)||N("InvalidXml","Invalid '"+JSON.stringify(n.map(t=>t.tagName),null,4).replace(/\r?\n/g,"")+"' found.",{line:1,col:1}):N("InvalidXml","Start tag expected.",1)}function p(t){return" "===t||"\t"===t||"\n"===t||"\r"===t}function u(t,e){const n=e;for(;e5&&"xml"===i)return N("InvalidXml","XML declaration allowed only at the start of the document.",v(t,e));if("?"==t[e]&&">"==t[e+1]){e++;break}continue}return e}function c(t,e){if(t.length>e+5&&"-"===t[e+1]&&"-"===t[e+2]){for(e+=3;e"===t[e+2]){e+=2;break}}else if(t.length>e+8&&"D"===t[e+1]&&"O"===t[e+2]&&"C"===t[e+3]&&"T"===t[e+4]&&"Y"===t[e+5]&&"P"===t[e+6]&&"E"===t[e+7]){let n=1;for(e+=8;e"===t[e]&&(n--,0===n))break}else if(t.length>e+9&&"["===t[e+1]&&"C"===t[e+2]&&"D"===t[e+3]&&"A"===t[e+4]&&"T"===t[e+5]&&"A"===t[e+6]&&"["===t[e+7])for(e+=8;e"===t[e+2]){e+=2;break}return e}const d='"',g="'";function f(t,e){let n="",i="",s=!1;for(;e"===t[e]&&""===i){s=!0;break}n+=t[e]}return""===i&&{value:n,index:e,tagClosed:s}}const m=new RegExp("(\\s*)([^\\s=]+)(\\s*=)?(\\s*(['\"])(([\\s\\S])*?)\\5)?","g");function x(t,e){const n=s(t,m),i={};for(let t=0;to.includes(t)?"__"+t:t,S={preserveOrder:!1,attributeNamePrefix:"@_",attributesGroupName:!1,textNodeName:"#text",ignoreAttributes:!0,removeNSPrefix:!1,allowBooleanAttributes:!1,parseTagValue:!0,parseAttributeValue:!1,trimValues:!0,cdataPropName:!1,numberParseOptions:{hex:!0,leadingZeros:!0,eNotation:!0},tagValueProcessor:function(t,e){return e},attributeValueProcessor:function(t,e){return e},stopNodes:[],alwaysCreateTextNode:!1,isArray:()=>!1,commentPropName:!1,unpairedTags:[],processEntities:!0,htmlEntities:!1,ignoreDeclaration:!1,ignorePiTags:!1,transformTagName:!1,transformAttributeName:!1,updateTag:function(t,e,n){return t},captureMetaData:!1,maxNestedTags:100,strictReservedNames:!0,jPath:!0,onDangerousProperty:_};function T(t,e){if("string"!=typeof t)return;const n=t.toLowerCase();if(o.some(t=>n===t.toLowerCase()))throw new Error(`[SECURITY] Invalid ${e}: "${t}" is a reserved JavaScript keyword that could cause prototype pollution`);if(a.some(t=>n===t.toLowerCase()))throw new Error(`[SECURITY] Invalid ${e}: "${t}" is a reserved JavaScript keyword that could cause prototype pollution`)}function A(t){return"boolean"==typeof t?{enabled:t,maxEntitySize:1e4,maxExpansionDepth:10,maxTotalExpansions:1e3,maxExpandedLength:1e5,maxEntityCount:100,allowedTags:null,tagFilter:null}:"object"==typeof t&&null!==t?{enabled:!1!==t.enabled,maxEntitySize:Math.max(1,t.maxEntitySize??1e4),maxExpansionDepth:Math.max(1,t.maxExpansionDepth??1e4),maxTotalExpansions:Math.max(1,t.maxTotalExpansions??1/0),maxExpandedLength:Math.max(1,t.maxExpandedLength??1e5),maxEntityCount:Math.max(1,t.maxEntityCount??1e3),allowedTags:t.allowedTags??null,tagFilter:t.tagFilter??null}:A(!0)}const P=function(t){const e=Object.assign({},S,t),n=[{value:e.attributeNamePrefix,name:"attributeNamePrefix"},{value:e.attributesGroupName,name:"attributesGroupName"},{value:e.textNodeName,name:"textNodeName"},{value:e.cdataPropName,name:"cdataPropName"},{value:e.commentPropName,name:"commentPropName"}];for(const{value:t,name:e}of n)t&&T(t,e);return null===e.onDangerousProperty&&(e.onDangerousProperty=_),e.processEntities=A(e.processEntities),e.unpairedTagsSet=new Set(e.unpairedTags),e.stopNodes&&Array.isArray(e.stopNodes)&&(e.stopNodes=e.stopNodes.map(t=>"string"==typeof t&&t.startsWith("*.")?".."+t.substring(2):t)),e};let C;C="function"!=typeof Symbol?"@@xmlMetadata":Symbol("XML Node Metadata");class O{constructor(t){this.tagname=t,this.child=[],this[":@"]=Object.create(null)}add(t,e){"__proto__"===t&&(t="#__proto__"),this.child.push({[t]:e})}addChild(t,e){"__proto__"===t.tagname&&(t.tagname="#__proto__"),t[":@"]&&Object.keys(t[":@"]).length>0?this.child.push({[t.tagname]:t.child,":@":t[":@"]}):this.child.push({[t.tagname]:t.child}),void 0!==e&&(this.child[this.child.length-1][C]={startIndex:e})}static getMetaDataSymbol(){return C}}class ${constructor(t){this.suppressValidationErr=!t,this.options=t}readDocType(t,e){const n=Object.create(null);let i=0;if("O"!==t[e+3]||"C"!==t[e+4]||"T"!==t[e+5]||"Y"!==t[e+6]||"P"!==t[e+7]||"E"!==t[e+8])throw new Error("Invalid Tag instead of DOCTYPE");{e+=9;let s=1,r=!1,o=!1,a="";for(;e"===t[e]){if(o?"-"===t[e-1]&&"-"===t[e-2]&&(o=!1,s--):s--,0===s)break}else"["===t[e]?r=!0:a+=t[e];else{if(r&&D(t,"!ENTITY",e)){let s,r;if(e+=7,[s,r,e]=this.readEntityExp(t,e+1,this.suppressValidationErr),-1===r.indexOf("&")){if(!1!==this.options.enabled&&null!=this.options.maxEntityCount&&i>=this.options.maxEntityCount)throw new Error(`Entity count (${i+1}) exceeds maximum allowed (${this.options.maxEntityCount})`);const t=s.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");n[s]={regx:RegExp(`&${t};`,"g"),val:r},i++}}else if(r&&D(t,"!ELEMENT",e)){e+=8;const{index:n}=this.readElementExp(t,e+1);e=n}else if(r&&D(t,"!ATTLIST",e))e+=8;else if(r&&D(t,"!NOTATION",e)){e+=9;const{index:n}=this.readNotationExp(t,e+1,this.suppressValidationErr);e=n}else{if(!D(t,"!--",e))throw new Error("Invalid DOCTYPE");o=!0}s++,a=""}if(0!==s)throw new Error("Unclosed DOCTYPE")}return{entities:n,i:e}}readEntityExp(t,e){const n=e=I(t,e);for(;ethis.options.maxEntitySize)throw new Error(`Entity "${i}" size (${s.length}) exceeds maximum allowed size (${this.options.maxEntitySize})`);return[i,s,--e]}readNotationExp(t,e){const n=e=I(t,e);for(;e{for(;e0?t[t.length-1].tag:void 0}getCurrentNamespace(){const t=this._matcher.path;return t.length>0?t[t.length-1].namespace:void 0}getAttrValue(t){const e=this._matcher.path;if(0!==e.length)return e[e.length-1].values?.[t]}hasAttr(t){const e=this._matcher.path;if(0===e.length)return!1;const n=e[e.length-1];return void 0!==n.values&&t in n.values}getPosition(){const t=this._matcher.path;return 0===t.length?-1:t[t.length-1].position??0}getCounter(){const t=this._matcher.path;return 0===t.length?-1:t[t.length-1].counter??0}getIndex(){return this.getPosition()}getDepth(){return this._matcher.path.length}toString(t,e=!0){return this._matcher.toString(t,e)}toArray(){return this._matcher.path.map(t=>t.tag)}matches(t){return this._matcher.matches(t)}matchesAny(t){return t.matchesAny(this._matcher)}}class R{constructor(t={}){this.separator=t.separator||".",this.path=[],this.siblingStacks=[],this._pathStringCache=null,this._view=new F(this)}push(t,e=null,n=null){this._pathStringCache=null,this.path.length>0&&(this.path[this.path.length-1].values=void 0);const i=this.path.length;this.siblingStacks[i]||(this.siblingStacks[i]=new Map);const s=this.siblingStacks[i],r=n?`${n}:${t}`:t,o=s.get(r)||0;let a=0;for(const t of s.values())a+=t;s.set(r,o+1);const l={tag:t,position:a,counter:o};null!=n&&(l.namespace=n),null!=e&&(l.values=e),this.path.push(l)}pop(){if(0===this.path.length)return;this._pathStringCache=null;const t=this.path.pop();return this.siblingStacks.length>this.path.length+1&&(this.siblingStacks.length=this.path.length+1),t}updateCurrent(t){if(this.path.length>0){const e=this.path[this.path.length-1];null!=t&&(e.values=t)}}getCurrentTag(){return this.path.length>0?this.path[this.path.length-1].tag:void 0}getCurrentNamespace(){return this.path.length>0?this.path[this.path.length-1].namespace:void 0}getAttrValue(t){if(0!==this.path.length)return this.path[this.path.length-1].values?.[t]}hasAttr(t){if(0===this.path.length)return!1;const e=this.path[this.path.length-1];return void 0!==e.values&&t in e.values}getPosition(){return 0===this.path.length?-1:this.path[this.path.length-1].position??0}getCounter(){return 0===this.path.length?-1:this.path[this.path.length-1].counter??0}getIndex(){return this.getPosition()}getDepth(){return this.path.length}toString(t,e=!0){const n=t||this.separator;if(n===this.separator&&!0===e){if(null!==this._pathStringCache)return this._pathStringCache;const t=this.path.map(t=>t.namespace?`${t.namespace}:${t.tag}`:t.tag).join(n);return this._pathStringCache=t,t}return this.path.map(t=>e&&t.namespace?`${t.namespace}:${t.tag}`:t.tag).join(n)}toArray(){return this.path.map(t=>t.tag)}reset(){this._pathStringCache=null,this.path=[],this.siblingStacks=[]}matches(t){const e=t.segments;return 0!==e.length&&(t.hasDeepWildcard()?this._matchWithDeepWildcard(e):this._matchSimple(e))}_matchSimple(t){if(this.path.length!==t.length)return!1;for(let e=0;e=0&&e>=0;){const i=t[n];if("deep-wildcard"===i.type){if(n--,n<0)return!0;const i=t[n];let s=!1;for(let t=e;t>=0;t--)if(this._matchSegment(i,this.path[t],t===this.path.length-1)){e=t-1,n--,s=!0;break}if(!s)return!1}else{if(!this._matchSegment(i,this.path[e],e===this.path.length-1))return!1;e--,n--}}return n<0}_matchSegment(t,e,n){if("*"!==t.tag&&t.tag!==e.tag)return!1;if(void 0!==t.namespace&&"*"!==t.namespace&&t.namespace!==e.namespace)return!1;if(void 0!==t.attrName){if(!n)return!1;if(!e.values||!(t.attrName in e.values))return!1;if(void 0!==t.attrValue&&String(e.values[t.attrName])!==String(t.attrValue))return!1}if(void 0!==t.position){if(!n)return!1;const i=e.counter??0;if("first"===t.position&&0!==i)return!1;if("odd"===t.position&&i%2!=1)return!1;if("even"===t.position&&i%2!=0)return!1;if("nth"===t.position&&i!==t.positionValue)return!1}return!0}matchesAny(t){return t.matchesAny(this)}snapshot(){return{path:this.path.map(t=>({...t})),siblingStacks:this.siblingStacks.map(t=>new Map(t))}}restore(t){this._pathStringCache=null,this.path=t.path.map(t=>({...t})),this.siblingStacks=t.siblingStacks.map(t=>new Map(t))}readOnly(){return this._view}}class B{constructor(t,e={},n){this.pattern=t,this.separator=e.separator||".",this.segments=this._parse(t),this.data=n,this._hasDeepWildcard=this.segments.some(t=>"deep-wildcard"===t.type),this._hasAttributeCondition=this.segments.some(t=>void 0!==t.attrName),this._hasPositionSelector=this.segments.some(t=>void 0!==t.position)}_parse(t){const e=[];let n=0,i="";for(;n"},lt:{regex:/&(lt|#0*60|#x0*3[Cc]);/g,val:"<"},quot:{regex:/&(quot|#0*34|#x0*22);/g,val:'"'}},U=/&(amp|#0*38|#x0*26);/g,q=new Set("!?\\\\/[]$%{}^&*()<>|+");function Y(t){for(const e of t)if(q.has(e))throw new Error(`[EntityReplacer] Invalid character '${e}' in entity name: "${t}"`);return t}function X(t){return t.replace(/[.\-+*:]/g,"\\$&")}function z(t,e,n=!1){return!1===t||null===t?null:!0===t?e:void 0===t?n?e:null:"object"==typeof t?t:null}function Z(t){const e=[];for(const n of Object.keys(t)){const i=t[n];if("object"==typeof i&&null!==i&&void 0!==i.val)e.push([n,{regex:i.regex??i.regx,val:i.val}]);else if("string"==typeof i){if(-1!==i.indexOf("&"))continue;Y(n),e.push([n,{regex:new RegExp("&"+X(n)+";","g"),val:i}])}}return e}class J{constructor(t={}){var e;this._defaultTable=z(t.default,W,!0),this._systemTable=z(t.system,null,!1),this._ampEnabled=!1!==t.amp&&null!==t.amp,this._maxTotalExpansions=t.maxTotalExpansions||0,this._maxExpandedLength=t.maxExpandedLength||0,this._applyLimitsTo="all"===(e=t.applyLimitsTo??"external")?"all":"string"==typeof e?new Set([e]):Array.isArray(e)?new Set(e):new Set(["external"]),this._postCheck="function"==typeof t.postCheck?t.postCheck:t=>t,this._limitExternal="all"===this._applyLimitsTo||this._applyLimitsTo instanceof Set&&this._applyLimitsTo.has("external"),this._limitSystem="all"===this._applyLimitsTo||this._applyLimitsTo instanceof Set&&this._applyLimitsTo.has("system"),this._limitDefault="all"===this._applyLimitsTo||this._applyLimitsTo instanceof Set&&this._applyLimitsTo.has("default"),this._defaultEntries=this._defaultTable?Object.entries(this._defaultTable):[],this._systemEntries=this._systemTable?Object.entries(this._systemTable):[],this._persistentEntries=[],this._inputEntries=[],this._totalExpansions=0,this._expandedLength=0}setExternalEntities(t){this._persistentEntries=Z(t)}addExternalEntity(t,e){Y(t),"string"==typeof e&&-1===e.indexOf("&")&&this._persistentEntries.push([t,{regex:new RegExp("&"+X(t)+";","g"),val:e}])}addInputEntities(t){this._totalExpansions=0,this._expandedLength=0,this._inputEntries=Z(t)}reset(){this._inputEntries=[],this._totalExpansions=0,this._expandedLength=0}replace(t){if("string"!=typeof t||0===t.length)return t;if(-1===t.indexOf("&"))return t;const e=t;return this._persistentEntries.length>0&&(t=this._applyEntries(t,this._persistentEntries,this._limitExternal)),this._inputEntries.length>0&&-1!==t.indexOf("&")&&(t=this._applyEntries(t,this._inputEntries,this._limitExternal)),this._defaultEntries.length>0&&-1!==t.indexOf("&")&&(t=this._applyEntries(t,this._defaultEntries,this._limitDefault)),this._systemEntries.length>0&&-1!==t.indexOf("&")&&(t=this._applyEntries(t,this._systemEntries,this._limitSystem)),this._ampEnabled&&-1!==t.indexOf("&")&&(t=t.replace(U,"&")),this._postCheck(t,e)}parse(t){return this.replace(t)}_applyEntries(t,e,n){const i=n&&this._maxTotalExpansions>0,s=n&&this._maxExpandedLength>0,r=i||s;for(let n=0;n(e++,"function"==typeof o.val?o.val(...t):o.val)),e>0&&(this._totalExpansions+=e,this._totalExpansions>this._maxTotalExpansions))throw new Error(`[EntityReplacer] Entity expansion count limit exceeded: ${this._totalExpansions} > ${this._maxTotalExpansions}`)}else if(s&&!i){const e=t.length,n=(t=t.replace(o.regex,o.val)).length-e;if(n>0&&(this._expandedLength+=n,this._expandedLength>this._maxExpandedLength))throw new Error(`[EntityReplacer] Expanded content length limit exceeded: ${this._expandedLength} > ${this._maxExpandedLength}`)}else{const e=t.length;let n=0;if(t=t.replace(o.regex,(...t)=>(n++,"function"==typeof o.val?o.val(...t):o.val)),n>0&&(this._totalExpansions+=n,this._totalExpansions>this._maxTotalExpansions))throw new Error(`[EntityReplacer] Entity expansion count limit exceeded: ${this._totalExpansions} > ${this._maxTotalExpansions}`);const i=t.length-e;if(i>0&&(this._expandedLength+=i,this._expandedLength>this._maxExpandedLength))throw new Error(`[EntityReplacer] Expanded content length limit exceeded: ${this._expandedLength} > ${this._maxExpandedLength}`)}else t=t.replace(o.regex,o.val)}return t}}const K={nbsp:{regex:/&(nbsp|#0*160|#x0*[Aa]0);/g,val:" "},copy:{regex:/&(copy|#0*169|#x0*[Aa]9);/g,val:"©"},reg:{regex:/&(reg|#0*174|#x0*[Aa][Ee]);/g,val:"®"},trade:{regex:/&(trade|#0*8482|#x0*2122);/g,val:"™"},mdash:{regex:/&(mdash|#0*8212|#x0*2014);/g,val:"—"},ndash:{regex:/&(ndash|#0*8211|#x0*2013);/g,val:"–"},hellip:{regex:/&(hellip|#0*8230|#x0*2026);/g,val:"…"},laquo:{regex:/&(laquo|#0*171|#x0*[Aa][Bb]);/g,val:"«"},raquo:{regex:/&(raquo|#0*187|#x0*[Bb][Bb]);/g,val:"»"},lsquo:{regex:/&(lsquo|#0*8216|#x0*2018);/g,val:"‘"},rsquo:{regex:/&(rsquo|#0*8217|#x0*2019);/g,val:"’"},ldquo:{regex:/&(ldquo|#0*8220|#x0*201[Cc]);/g,val:"“"},rdquo:{regex:/&(rdquo|#0*8221|#x0*201[Dd]);/g,val:"”"},bull:{regex:/&(bull|#0*8226|#x0*2022);/g,val:"•"},para:{regex:/&(para|#0*182|#x0*[Bb]6);/g,val:"¶"},sect:{regex:/&(sect|#0*167|#x0*[Aa]7);/g,val:"§"},deg:{regex:/&(deg|#0*176|#x0*[Bb]0);/g,val:"°"},frac12:{regex:/&(frac12|#0*189|#x0*[Bb][Dd]);/g,val:"½"},frac14:{regex:/&(frac14|#0*188|#x0*[Bb][Cc]);/g,val:"¼"},frac34:{regex:/&(frac34|#0*190|#x0*[Bb][Ee]);/g,val:"¾"},inr:{regex:/&(inr|#0*8377);/g,val:"₹"}},Q={cent:{regex:/&(cent|#0*162|#x0*[Aa]2);/g,val:"¢"},pound:{regex:/&(pound|#0*163|#x0*[Aa]3);/g,val:"£"},yen:{regex:/&(yen|#0*165|#x0*[Aa]5);/g,val:"¥"},euro:{regex:/&(euro|#0*8364|#x0*20[Aa][Cc]);/g,val:"€"},inr:{regex:/&(inr|#0*8377|#x0*20[Bb]9);/g,val:"₹"},curren:{regex:/&(curren|#0*164|#x0*[Aa]4);/g,val:"¤"},fnof:{regex:/&(fnof|#0*402|#x0*192);/g,val:"ƒ"}},H={num_dec:{regex:/�*([0-9]{1,7});/g,val:(t,e)=>tt(e,10,"&#")},num_hex:{regex:/�*([0-9a-fA-F]{1,6});/g,val:(t,e)=>tt(e,16,"&#x")}};function tt(t,e,n){const i=Number.parseInt(t,e);return i>=0&&i<=1114111?String.fromCodePoint(i):n+t+";"}function et(t,e){if(!t)return{};const n=e.attributesGroupName?t[e.attributesGroupName]:t;if(!n)return{};const i={};for(const t in n)t.startsWith(e.attributeNamePrefix)?i[t.substring(e.attributeNamePrefix.length)]=n[t]:i[t]=n[t];return i}function nt(t){if(!t||"string"!=typeof t)return;const e=t.indexOf(":");if(-1!==e&&e>0){const n=t.substring(0,e);if("xmlns"!==n)return n}}class it{constructor(t){var e;this.options=t,this.currentNode=null,this.tagsNodeStack=[],this.parseXml=lt,this.parseTextData=st,this.resolveNameSpace=rt,this.buildAttributesMap=at,this.isItStopNode=ct,this.replaceEntitiesValue=pt,this.readStopNodeData=mt,this.saveTextToParentTag=ut,this.addChild=ht,this.ignoreAttributesFn="function"==typeof(e=this.options.ignoreAttributes)?e:Array.isArray(e)?t=>{for(const n of e){if("string"==typeof n&&t===n)return!0;if(n instanceof RegExp&&n.test(t))return!0}}:()=>!1,this.entityExpansionCount=0,this.currentExpandedLength=0,this.entityReplacer=new J({default:!0,system:this.options.htmlEntities?{...K,...H,...Q}:{},maxTotalExpansions:this.options.processEntities.maxTotalExpansions,maxExpandedLength:this.options.processEntities.maxExpandedLength,applyLimitsTo:"all"}),this.matcher=new R,this.readonlyMatcher=this.matcher.readOnly(),this.isCurrentNodeStopNode=!1,this.stopNodeExpressionsSet=new G;const n=this.options.stopNodes;if(n&&n.length>0){for(let t=0;t0)){o||(t=this.replaceEntitiesValue(t,e,n));const i=a.jPath?n.toString():n,l=a.tagValueProcessor(e,t,i,s,r);return null==l?t:typeof l!=typeof t||l!==t?l:a.trimValues||t.trim()===t?xt(t,a.parseTagValue,a.numberParseOptions):t}}function rt(t){if(this.options.removeNSPrefix){const e=t.split(":"),n="/"===t.charAt(0)?"/":"";if("xmlns"===e[0])return"";2===e.length&&(t=n+e[1])}return t}const ot=new RegExp("([^\\s=]+)\\s*(=\\s*(['\"])([\\s\\S]*?)\\3)?","gm");function at(t,e,n){const i=this.options;if(!0!==i.ignoreAttributes&&"string"==typeof t){const r=s(t,ot),o=r.length,a={},l=new Array(o);let h=!1;const p={};for(let t=0;t",a,"Closing Tag is not closed.");let r=t.substring(a+2,e).trim();if(s.removeNSPrefix){const t=r.indexOf(":");-1!==t&&(r=r.substr(t+1))}r=bt(s.transformTagName,r,"",s).tagName,n&&(i=this.saveTextToParentTag(i,n,this.readonlyMatcher));const o=this.matcher.getCurrentTag();if(r&&s.unpairedTagsSet.has(r))throw new Error(`Unpaired tag can not be used as closing tag: `);o&&s.unpairedTagsSet.has(o)&&(this.matcher.pop(),this.tagsNodeStack.pop()),this.matcher.pop(),this.isCurrentNodeStopNode=!1,n=this.tagsNodeStack.pop(),i="",a=e}else if(63===l){let e=ft(t,a,!1,"?>");if(!e)throw new Error("Pi Tag is not closed.");if(i=this.saveTextToParentTag(i,n,this.readonlyMatcher),s.ignoreDeclaration&&"?xml"===e.tagName||s.ignorePiTags);else{const t=new O(e.tagName);t.add(s.textNodeName,""),e.tagName!==e.tagExp&&e.attrExpPresent&&(t[":@"]=this.buildAttributesMap(e.tagExp,this.matcher,e.tagName)),this.addChild(n,t,this.readonlyMatcher,a)}a=e.closeIndex+1}else if(33===l&&45===t.charCodeAt(a+2)&&45===t.charCodeAt(a+3)){const e=dt(t,"--\x3e",a+4,"Comment is not closed.");if(s.commentPropName){const r=t.substring(a+4,e-2);i=this.saveTextToParentTag(i,n,this.readonlyMatcher),n.add(s.commentPropName,[{[s.textNodeName]:r}])}a=e}else if(33===l&&68===t.charCodeAt(a+2)){const e=r.readDocType(t,a);this.entityReplacer.addInputEntities(e.entities),a=e.i}else if(33===l&&91===t.charCodeAt(a+2)){const e=dt(t,"]]>",a,"CDATA is not closed.")-2,r=t.substring(a+9,e);i=this.saveTextToParentTag(i,n,this.readonlyMatcher);let o=this.parseTextData(r,n.tagname,this.readonlyMatcher,!0,!1,!0,!0);null==o&&(o=""),s.cdataPropName?n.add(s.cdataPropName,[{[s.textNodeName]:r}]):n.add(s.textNodeName,o),a=e+2}else{let r=ft(t,a,s.removeNSPrefix);if(!r){const e=t.substring(Math.max(0,a-50),Math.min(o,a+50));throw new Error(`readTagExp returned undefined at position ${a}. Context: "${e}"`)}let l=r.tagName;const h=r.rawTagName;let p=r.tagExp,u=r.attrExpPresent,c=r.closeIndex;if(({tagName:l,tagExp:p}=bt(s.transformTagName,l,p,s)),s.strictReservedNames&&(l===s.commentPropName||l===s.cdataPropName||l===s.textNodeName||l===s.attributesGroupName))throw new Error(`Invalid tag name: ${l}`);n&&i&&"!xml"!==n.tagname&&(i=this.saveTextToParentTag(i,n,this.readonlyMatcher,!1));const d=n;d&&s.unpairedTagsSet.has(d.tagname)&&(n=this.tagsNodeStack.pop(),this.matcher.pop());let g=!1;p.length>0&&p.lastIndexOf("/")===p.length-1&&(g=!0,"/"===l[l.length-1]?(l=l.substr(0,l.length-1),p=l):p=p.substr(0,p.length-1),u=l!==p);let f,m=null,x={};f=nt(h),l!==e.tagname&&this.matcher.push(l,{},f),l!==p&&u&&(m=this.buildAttributesMap(p,this.matcher,l),m&&(x=et(m,s))),l!==e.tagname&&(this.isCurrentNodeStopNode=this.isItStopNode());const b=a;if(this.isCurrentNodeStopNode){let e="";if(g)a=r.closeIndex;else if(s.unpairedTagsSet.has(l))a=r.closeIndex;else{const n=this.readStopNodeData(t,h,c+1);if(!n)throw new Error(`Unexpected end of ${h}`);a=n.i,e=n.tagContent}const i=new O(l);m&&(i[":@"]=m),i.add(s.textNodeName,e),this.matcher.pop(),this.isCurrentNodeStopNode=!1,this.addChild(n,i,this.readonlyMatcher,b)}else{if(g){({tagName:l,tagExp:p}=bt(s.transformTagName,l,p,s));const t=new O(l);m&&(t[":@"]=m),this.addChild(n,t,this.readonlyMatcher,b),this.matcher.pop(),this.isCurrentNodeStopNode=!1}else{if(s.unpairedTagsSet.has(l)){const t=new O(l);m&&(t[":@"]=m),this.addChild(n,t,this.readonlyMatcher,b),this.matcher.pop(),this.isCurrentNodeStopNode=!1,a=r.closeIndex;continue}{const t=new O(l);if(this.tagsNodeStack.length>s.maxNestedTags)throw new Error("Maximum nested tags exceeded");this.tagsNodeStack.push(n),m&&(t[":@"]=m),this.addChild(n,t,this.readonlyMatcher,b),n=t}}i="",a=c}}}else i+=t[a];return e.child};function ht(t,e,n,i){this.options.captureMetaData||(i=void 0);const s=this.options.jPath?n.toString():n,r=this.options.updateTag(e.tagname,s,e[":@"]);!1===r||("string"==typeof r?(e.tagname=r,t.addChild(e,i)):t.addChild(e,i))}function pt(t,e,n){const i=this.options.processEntities;if(!i||!i.enabled)return t;if(i.allowedTags){const s=this.options.jPath?n.toString():n;if(!(Array.isArray(i.allowedTags)?i.allowedTags.includes(e):i.allowedTags(e,s)))return t}if(i.tagFilter){const s=this.options.jPath?n.toString():n;if(!i.tagFilter(e,s))return t}return this.entityReplacer.replace(t)}function ut(t,e,n,i){return t&&(void 0===i&&(i=0===e.child.length),void 0!==(t=this.parseTextData(t,e.tagname,n,!1,!!e[":@"]&&0!==Object.keys(e[":@"]).length,i))&&""!==t&&e.add(this.options.textNodeName,t),t=""),t}function ct(){return 0!==this.stopNodeExpressionsSet.size&&this.matcher.matchesAny(this.stopNodeExpressionsSet)}function dt(t,e,n,i){const s=t.indexOf(e,n);if(-1===s)throw new Error(i);return s+e.length-1}function gt(t,e,n,i){const s=t.indexOf(e,n);if(-1===s)throw new Error(i);return s}function ft(t,e,n,i=">"){const s=function(t,e,n=">"){let i=0;const s=[],r=t.length,o=n.charCodeAt(0),a=n.length>1?n.charCodeAt(1):-1;for(let n=e;n",n,`${e} is not closed`);if(t.substring(n+2,r).trim()===e&&(s--,0===s))return{tagContent:t.substring(i,n),i:r};n=r}else if(63===r)n=dt(t,"?>",n+1,"StopNode is not closed.");else if(33===r&&45===t.charCodeAt(n+2)&&45===t.charCodeAt(n+3))n=dt(t,"--\x3e",n+3,"StopNode is not closed.");else if(33===r&&91===t.charCodeAt(n+2))n=dt(t,"]]>",n,"StopNode is not closed.")-2;else{const i=ft(t,n,">");i&&((i&&i.tagName)===e&&"/"!==i.tagExp[i.tagExp.length-1]&&s++,n=i.closeIndex)}}}function xt(t,e,n){if(e&&"string"==typeof t){const e=t.trim();return"true"===e||"false"!==e&&function(t,e={}){if(e=Object.assign({},V,e),!t||"string"!=typeof t)return t;let n=t.trim();if(0===n.length)return t;if(void 0!==e.skipLike&&e.skipLike.test(n))return t;if("0"===n)return 0;if(e.hex&&L.test(n))return function(t){if(parseInt)return parseInt(t,16);if(Number.parseInt)return Number.parseInt(t,16);if(window&&window.parseInt)return window.parseInt(t,16);throw new Error("parseInt, Number.parseInt, window.parseInt are not supported")}(n);if(isFinite(n)){if(n.includes("e")||n.includes("E"))return function(t,e,n){if(!n.eNotation)return t;const i=e.match(k);if(i){let s=i[1]||"";const r=-1===i[3].indexOf("e")?"E":"e",o=i[2],a=s?t[o.length+1]===r:t[o.length]===r;return o.length>1&&a?t:(1!==o.length||!i[3].startsWith(`.${r}`)&&i[3][0]!==r)&&o.length>0?n.leadingZeros&&!a?(e=(i[1]||"")+i[3],Number(e)):t:Number(e)}return t}(t,n,e);{const s=M.exec(n);if(s){const r=s[1]||"",o=s[2];let a=(i=s[3])&&-1!==i.indexOf(".")?("."===(i=i.replace(/0+$/,""))?i="0":"."===i[0]?i="0"+i:"."===i[i.length-1]&&(i=i.substring(0,i.length-1)),i):i;const l=r?"."===t[o.length+1]:"."===t[o.length];if(!e.leadingZeros&&(o.length>1||1===o.length&&!l))return t;{const i=Number(n),s=String(i);if(0===i)return i;if(-1!==s.search(/[eE]/))return e.eNotation?i:t;if(-1!==n.indexOf("."))return"0"===s||s===a||s===`${r}${a}`?i:t;let l=o?a:n;return o?l===s||r+l===s?i:t:l===s||l===r+s?i:t}}return t}}var i;return function(t,e,n){const i=e===1/0;switch(n.infinity.toLowerCase()){case"null":return null;case"infinity":return e;case"string":return i?"Infinity":"-Infinity";default:return t}}(t,Number(n),e)}(t,n)}return void 0!==t?t:""}function bt(t,e,n,i){if(t){const i=t(e);n===e&&(n=i),e=i}return{tagName:e=Nt(e,i),tagExp:n}}function Nt(t,e){if(a.includes(t))throw new Error(`[SECURITY] Invalid name: "${t}" is a reserved JavaScript keyword that could cause prototype pollution`);return o.includes(t)?e.onDangerousProperty(t):t}const Et=O.getMetaDataSymbol();function yt(t,e){if(!t||"object"!=typeof t)return{};if(!e)return t;const n={};for(const i in t)i.startsWith(e)?n[i.substring(e.length)]=t[i]:n[i]=t[i];return n}function vt(t,e,n,i){return wt(t,e,n,i)}function wt(t,e,n,i){let s;const r={};for(let o=0;o0&&(r[e.textNodeName]=s):void 0!==s&&(r[e.textNodeName]=s),r}function _t(t){const e=Object.keys(t);for(let t=0;t0&&(n="\n");const i=[];if(e.stopNodes&&Array.isArray(e.stopNodes))for(let t=0;te.maxNestedTags)throw new Error("Maximum nested tags exceeded");if(!Array.isArray(t)){if(null!=t){let n=t.toString();return n=Mt(n,e),n}return""}for(let a=0;a`,o=!1,i.pop();continue}if(h===e.commentPropName){r+=n+`\x3c!--${l[h][0][e.textNodeName]}--\x3e`,o=!0,i.pop();continue}if("?"===h[0]){const t=jt(l[":@"],e,u),s="?xml"===h?"":n;let a=l[h][0][e.textNodeName];a=0!==a.length?" "+a:"",r+=s+`<${h}${a}${t}?>`,o=!0,i.pop();continue}let c=n;""!==c&&(c+=e.indentBy);const d=n+`<${h}${jt(l[":@"],e,u)}`;let g;g=u?$t(l[h],e):Ct(l[h],e,c,i,s),-1!==e.unpairedTags.indexOf(h)?e.suppressUnpairedNode?r+=d+">":r+=d+"/>":g&&0!==g.length||!e.suppressEmptyNode?g&&g.endsWith(">")?r+=d+`>${g}${n}`:(r+=d+">",g&&""!==n&&(g.includes("/>")||g.includes("`):r+=d+"/>",o=!0,i.pop()}return r}function Ot(t,e){if(!t||e.ignoreAttributes)return null;const n={};let i=!1;for(let s in t)Object.prototype.hasOwnProperty.call(t,s)&&(n[s.startsWith(e.attributeNamePrefix)?s.substr(e.attributeNamePrefix.length):s]=t[s],i=!0);return i?n:null}function $t(t,e){if(!Array.isArray(t))return null!=t?t.toString():"";let n="";for(let i=0;i${i}`:n+=`<${r}${t}/>`}}}return n}function It(t,e){let n="";if(t&&!e.ignoreAttributes)for(let i in t){if(!Object.prototype.hasOwnProperty.call(t,i))continue;let s=t[i];!0===s&&e.suppressBooleanAttributes?n+=` ${i.substr(e.attributeNamePrefix.length)}`:n+=` ${i.substr(e.attributeNamePrefix.length)}="${s}"`}return n}function Dt(t){const e=Object.keys(t);for(let n=0;n0&&e.processEntities)for(let n=0;n","g"),val:">"},{regex:new RegExp("<","g"),val:"<"},{regex:new RegExp("'","g"),val:"'"},{regex:new RegExp('"',"g"),val:"""}],processEntities:!0,stopNodes:[],oneListGroup:!1,maxNestedTags:100,jPath:!0};function kt(t){if(this.options=Object.assign({},Vt,t),this.options.stopNodes&&Array.isArray(this.options.stopNodes)&&(this.options.stopNodes=this.options.stopNodes.map(t=>"string"==typeof t&&t.startsWith("*.")?".."+t.substring(2):t)),this.stopNodeExpressions=[],this.options.stopNodes&&Array.isArray(this.options.stopNodes))for(let t=0;t{for(const n of e){if("string"==typeof n&&t===n)return!0;if(n instanceof RegExp&&n.test(t))return!0}}:()=>!1,this.attrPrefixLen=this.options.attributeNamePrefix.length,this.isAttribute=Bt),this.processTextOrObjNode=Ft,this.options.format?(this.indentate=Rt,this.tagEndChar=">\n",this.newLine="\n"):(this.indentate=function(){return""},this.tagEndChar=">",this.newLine="")}function Ft(t,e,n,i){const s=this.extractAttributes(t);if(i.push(e,s),this.checkStopNode(i)){const s=this.buildRawContent(t),r=this.buildAttributesForStopNode(t);return i.pop(),this.buildObjectNode(s,e,r,n)}const r=this.j2x(t,n+1,i);return i.pop(),void 0!==t[this.options.textNodeName]&&1===Object.keys(t).length?this.buildTextValNode(t[this.options.textNodeName],e,r.attrStr,n,i):this.buildObjectNode(r.val,e,r.attrStr,n)}function Rt(t){return this.options.indentBy.repeat(t)}function Bt(t){return!(!t.startsWith(this.options.attributeNamePrefix)||t===this.options.textNodeName)&&t.substr(this.attrPrefixLen)}kt.prototype.build=function(t){if(this.options.preserveOrder)return Pt(t,this.options);{Array.isArray(t)&&this.options.arrayNodeName&&this.options.arrayNodeName.length>1&&(t={[this.options.arrayNodeName]:t});const e=new R;return this.j2x(t,0,e).val}},kt.prototype.j2x=function(t,e,n){let i="",s="";if(this.options.maxNestedTags&&n.getDepth()>=this.options.maxNestedTags)throw new Error("Maximum nested tags exceeded");const r=this.options.jPath?n.toString():n,o=this.checkStopNode(n);for(let a in t)if(Object.prototype.hasOwnProperty.call(t,a))if(void 0===t[a])this.isAttribute(a)&&(s+="");else if(null===t[a])this.isAttribute(a)||a===this.options.cdataPropName?s+="":"?"===a[0]?s+=this.indentate(e)+"<"+a+"?"+this.tagEndChar:s+=this.indentate(e)+"<"+a+"/"+this.tagEndChar;else if(t[a]instanceof Date)s+=this.buildTextValNode(t[a],a,"",e,n);else if("object"!=typeof t[a]){const l=this.isAttribute(a);if(l&&!this.ignoreAttributesFn(l,r))i+=this.buildAttrPairStr(l,""+t[a],o);else if(!l)if(a===this.options.textNodeName){let e=this.options.tagValueProcessor(a,""+t[a]);s+=this.replaceEntitiesValue(e)}else{n.push(a);const i=this.checkStopNode(n);if(n.pop(),i){const n=""+t[a];s+=""===n?this.indentate(e)+"<"+a+this.closeTag(a)+this.tagEndChar:this.indentate(e)+"<"+a+">"+n+""+t+"${t}`;else if("object"==typeof t&&null!==t){const i=this.buildRawContent(t),s=this.buildAttributesForStopNode(t);e+=""===i?`<${n}${s}/>`:`<${n}${s}>${i}`}}else if("object"==typeof i&&null!==i){const t=this.buildRawContent(i),s=this.buildAttributesForStopNode(i);e+=""===t?`<${n}${s}/>`:`<${n}${s}>${t}`}else e+=`<${n}>${i}`}return e},kt.prototype.buildAttributesForStopNode=function(t){if(!t||"object"!=typeof t)return"";let e="";if(this.options.attributesGroupName&&t[this.options.attributesGroupName]){const n=t[this.options.attributesGroupName];for(let t in n){if(!Object.prototype.hasOwnProperty.call(n,t))continue;const i=t.startsWith(this.options.attributeNamePrefix)?t.substring(this.options.attributeNamePrefix.length):t,s=n[t];!0===s&&this.options.suppressBooleanAttributes?e+=" "+i:e+=" "+i+'="'+s+'"'}}else for(let n in t){if(!Object.prototype.hasOwnProperty.call(t,n))continue;const i=this.isAttribute(n);if(i){const s=t[n];!0===s&&this.options.suppressBooleanAttributes?e+=" "+i:e+=" "+i+'="'+s+'"'}}return e},kt.prototype.buildObjectNode=function(t,e,n,i){if(""===t)return"?"===e[0]?this.indentate(i)+"<"+e+n+"?"+this.tagEndChar:this.indentate(i)+"<"+e+n+this.closeTag(e)+this.tagEndChar;{let s=""+t+s}},kt.prototype.closeTag=function(t){let e="";return-1!==this.options.unpairedTags.indexOf(t)?this.options.suppressUnpairedNode||(e="/"):e=this.options.suppressEmptyNode?"/":`>`+this.newLine;if(!1!==this.options.commentPropName&&e===this.options.commentPropName)return this.indentate(i)+`\x3c!--${t}--\x3e`+this.newLine;if("?"===e[0])return this.indentate(i)+"<"+e+n+"?"+this.tagEndChar;{let s=this.options.tagValueProcessor(e,t);return s=this.replaceEntitiesValue(s),""===s?this.indentate(i)+"<"+e+n+this.closeTag(e)+this.tagEndChar:this.indentate(i)+"<"+e+n+">"+s+"0&&this.options.processEntities)for(let e=0;e{"use strict";var t={d:(e,n)=>{for(var i in n)t.o(n,i)&&!t.o(e,i)&&Object.defineProperty(e,i,{enumerable:!0,get:n[i]})},o:(t,e)=>Object.prototype.hasOwnProperty.call(t,e),r:t=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})}},e={};t.r(e),t.d(e,{XMLBuilder:()=>Bt,XMLParser:()=>Tt,XMLValidator:()=>Ut});const n=":A-Za-z_\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD",i=new RegExp("^["+n+"]["+n+"\\-.\\d\\u00B7\\u0300-\\u036F\\u203F-\\u2040]*$");function s(t,e){const n=[];let i=e.exec(t);for(;i;){const s=[];s.startIndex=e.lastIndex-i[0].length;const r=i.length;for(let t=0;t"!==t[r]&&" "!==t[r]&&"\t"!==t[r]&&"\n"!==t[r]&&"\r"!==t[r];r++)h+=t[r];if(h=h.trim(),"/"===h[h.length-1]&&(h=h.substring(0,h.length-1),r--),!E(h)){let e;return e=0===h.trim().length?"Invalid space after '<'.":"Tag '"+h+"' is an invalid name.",b("InvalidTag",e,w(t,r))}const l=g(t,r);if(!1===l)return b("InvalidAttr","Attributes for '"+h+"' have open quote.",w(t,r));let d=l.value;if(r=l.index,"/"===d[d.length-1]){const n=r-d.length;d=d.substring(0,d.length-1);const s=x(d,e);if(!0!==s)return b(s.err.code,s.err.msg,w(t,n+s.err.line));i=!0}else if(a){if(!l.tagClosed)return b("InvalidTag","Closing tag '"+h+"' doesn't have proper closing.",w(t,r));if(d.trim().length>0)return b("InvalidTag","Closing tag '"+h+"' can't have attributes or invalid starting.",w(t,o));if(0===n.length)return b("InvalidTag","Closing tag '"+h+"' has not been opened.",w(t,o));{const e=n.pop();if(h!==e.tagName){let n=w(t,e.tagStartPos);return b("InvalidTag","Expected closing tag '"+e.tagName+"' (opened in line "+n.line+", col "+n.col+") instead of closing tag '"+h+"'.",w(t,o))}0==n.length&&(s=!0)}}else{const a=x(d,e);if(!0!==a)return b(a.err.code,a.err.msg,w(t,r-d.length+a.err.line));if(!0===s)return b("InvalidXml","Multiple possible root nodes found.",w(t,r));-1!==e.unpairedTags.indexOf(h)||n.push({tagName:h,tagStartPos:o}),i=!0}for(r++;r0)||b("InvalidXml","Invalid '"+JSON.stringify(n.map(t=>t.tagName),null,4).replace(/\r?\n/g,"")+"' found.",{line:1,col:1}):b("InvalidXml","Start tag expected.",1)}function u(t){return" "===t||"\t"===t||"\n"===t||"\r"===t}function p(t,e){const n=e;for(;e5&&"xml"===i)return b("InvalidXml","XML declaration allowed only at the start of the document.",w(t,e));if("?"==t[e]&&">"==t[e+1]){e++;break}continue}return e}function c(t,e){if(t.length>e+5&&"-"===t[e+1]&&"-"===t[e+2]){for(e+=3;e"===t[e+2]){e+=2;break}}else if(t.length>e+8&&"D"===t[e+1]&&"O"===t[e+2]&&"C"===t[e+3]&&"T"===t[e+4]&&"Y"===t[e+5]&&"P"===t[e+6]&&"E"===t[e+7]){let n=1;for(e+=8;e"===t[e]&&(n--,0===n))break}else if(t.length>e+9&&"["===t[e+1]&&"C"===t[e+2]&&"D"===t[e+3]&&"A"===t[e+4]&&"T"===t[e+5]&&"A"===t[e+6]&&"["===t[e+7])for(e+=8;e"===t[e+2]){e+=2;break}return e}const d='"',f="'";function g(t,e){let n="",i="",s=!1;for(;e"===t[e]&&""===i){s=!0;break}n+=t[e]}return""===i&&{value:n,index:e,tagClosed:s}}const m=new RegExp("(\\s*)([^\\s=]+)(\\s*=)?(\\s*(['\"])(([\\s\\S])*?)\\5)?","g");function x(t,e){const n=s(t,m),i={};for(let t=0;to.includes(t)?"__"+t:t,_={preserveOrder:!1,attributeNamePrefix:"@_",attributesGroupName:!1,textNodeName:"#text",ignoreAttributes:!0,removeNSPrefix:!1,allowBooleanAttributes:!1,parseTagValue:!0,parseAttributeValue:!1,trimValues:!0,cdataPropName:!1,numberParseOptions:{hex:!0,leadingZeros:!0,eNotation:!0},tagValueProcessor:function(t,e){return e},attributeValueProcessor:function(t,e){return e},stopNodes:[],alwaysCreateTextNode:!1,isArray:()=>!1,commentPropName:!1,unpairedTags:[],processEntities:!0,htmlEntities:!1,entityDecoder:null,ignoreDeclaration:!1,ignorePiTags:!1,transformTagName:!1,transformAttributeName:!1,updateTag:function(t,e,n){return t},captureMetaData:!1,maxNestedTags:100,strictReservedNames:!0,jPath:!0,onDangerousProperty:S};function A(t,e){if("string"!=typeof t)return;const n=t.toLowerCase();if(o.some(t=>n===t.toLowerCase()))throw new Error(`[SECURITY] Invalid ${e}: "${t}" is a reserved JavaScript keyword that could cause prototype pollution`);if(a.some(t=>n===t.toLowerCase()))throw new Error(`[SECURITY] Invalid ${e}: "${t}" is a reserved JavaScript keyword that could cause prototype pollution`)}function T(t,e){return"boolean"==typeof t?{enabled:t,maxEntitySize:1e4,maxExpansionDepth:1e4,maxTotalExpansions:1/0,maxExpandedLength:1e5,maxEntityCount:1e3,allowedTags:null,tagFilter:null,appliesTo:"all"}:"object"==typeof t&&null!==t?{enabled:!1!==t.enabled,maxEntitySize:Math.max(1,t.maxEntitySize??1e4),maxExpansionDepth:Math.max(1,t.maxExpansionDepth??1e4),maxTotalExpansions:Math.max(1,t.maxTotalExpansions??1/0),maxExpandedLength:Math.max(1,t.maxExpandedLength??1e5),maxEntityCount:Math.max(1,t.maxEntityCount??1e3),allowedTags:t.allowedTags??null,tagFilter:t.tagFilter??null,appliesTo:t.appliesTo??"all"}:T(!0)}const C=function(t){const e=Object.assign({},_,t),n=[{value:e.attributeNamePrefix,name:"attributeNamePrefix"},{value:e.attributesGroupName,name:"attributesGroupName"},{value:e.textNodeName,name:"textNodeName"},{value:e.cdataPropName,name:"cdataPropName"},{value:e.commentPropName,name:"commentPropName"}];for(const{value:t,name:e}of n)t&&A(t,e);return null===e.onDangerousProperty&&(e.onDangerousProperty=S),e.processEntities=T(e.processEntities,e.htmlEntities),e.unpairedTagsSet=new Set(e.unpairedTags),e.stopNodes&&Array.isArray(e.stopNodes)&&(e.stopNodes=e.stopNodes.map(t=>"string"==typeof t&&t.startsWith("*.")?".."+t.substring(2):t)),e};let P;P="function"!=typeof Symbol?"@@xmlMetadata":Symbol("XML Node Metadata");class O{constructor(t){this.tagname=t,this.child=[],this[":@"]=Object.create(null)}add(t,e){"__proto__"===t&&(t="#__proto__"),this.child.push({[t]:e})}addChild(t,e){"__proto__"===t.tagname&&(t.tagname="#__proto__"),t[":@"]&&Object.keys(t[":@"]).length>0?this.child.push({[t.tagname]:t.child,":@":t[":@"]}):this.child.push({[t.tagname]:t.child}),void 0!==e&&(this.child[this.child.length-1][P]={startIndex:e})}static getMetaDataSymbol(){return P}}class ${constructor(t){this.suppressValidationErr=!t,this.options=t}readDocType(t,e){const n=Object.create(null);let i=0;if("O"!==t[e+3]||"C"!==t[e+4]||"T"!==t[e+5]||"Y"!==t[e+6]||"P"!==t[e+7]||"E"!==t[e+8])throw new Error("Invalid Tag instead of DOCTYPE");{e+=9;let s=1,r=!1,o=!1,a="";for(;e"===t[e]){if(o?"-"===t[e-1]&&"-"===t[e-2]&&(o=!1,s--):s--,0===s)break}else"["===t[e]?r=!0:a+=t[e];else{if(r&&D(t,"!ENTITY",e)){let s,r;if(e+=7,[s,r,e]=this.readEntityExp(t,e+1,this.suppressValidationErr),-1===r.indexOf("&")){if(!1!==this.options.enabled&&null!=this.options.maxEntityCount&&i>=this.options.maxEntityCount)throw new Error(`Entity count (${i+1}) exceeds maximum allowed (${this.options.maxEntityCount})`);n[s]=r,i++}}else if(r&&D(t,"!ELEMENT",e)){e+=8;const{index:n}=this.readElementExp(t,e+1);e=n}else if(r&&D(t,"!ATTLIST",e))e+=8;else if(r&&D(t,"!NOTATION",e)){e+=9;const{index:n}=this.readNotationExp(t,e+1,this.suppressValidationErr);e=n}else{if(!D(t,"!--",e))throw new Error("Invalid DOCTYPE");o=!0}s++,a=""}if(0!==s)throw new Error("Unclosed DOCTYPE")}return{entities:n,i:e}}readEntityExp(t,e){const n=e=I(t,e);for(;ethis.options.maxEntitySize)throw new Error(`Entity "${i}" size (${s.length}) exceeds maximum allowed size (${this.options.maxEntitySize})`);return[i,s,--e]}readNotationExp(t,e){const n=e=I(t,e);for(;e{for(;e0?t[t.length-1].tag:void 0}getCurrentNamespace(){const t=this._matcher.path;return t.length>0?t[t.length-1].namespace:void 0}getAttrValue(t){const e=this._matcher.path;if(0!==e.length)return e[e.length-1].values?.[t]}hasAttr(t){const e=this._matcher.path;if(0===e.length)return!1;const n=e[e.length-1];return void 0!==n.values&&t in n.values}getPosition(){const t=this._matcher.path;return 0===t.length?-1:t[t.length-1].position??0}getCounter(){const t=this._matcher.path;return 0===t.length?-1:t[t.length-1].counter??0}getIndex(){return this.getPosition()}getDepth(){return this._matcher.path.length}toString(t,e=!0){return this._matcher.toString(t,e)}toArray(){return this._matcher.path.map(t=>t.tag)}matches(t){return this._matcher.matches(t)}matchesAny(t){return t.matchesAny(this._matcher)}}class R{constructor(t={}){this.separator=t.separator||".",this.path=[],this.siblingStacks=[],this._pathStringCache=null,this._view=new F(this)}push(t,e=null,n=null){this._pathStringCache=null,this.path.length>0&&(this.path[this.path.length-1].values=void 0);const i=this.path.length;this.siblingStacks[i]||(this.siblingStacks[i]=new Map);const s=this.siblingStacks[i],r=n?`${n}:${t}`:t,o=s.get(r)||0;let a=0;for(const t of s.values())a+=t;s.set(r,o+1);const h={tag:t,position:a,counter:o};null!=n&&(h.namespace=n),null!=e&&(h.values=e),this.path.push(h)}pop(){if(0===this.path.length)return;this._pathStringCache=null;const t=this.path.pop();return this.siblingStacks.length>this.path.length+1&&(this.siblingStacks.length=this.path.length+1),t}updateCurrent(t){if(this.path.length>0){const e=this.path[this.path.length-1];null!=t&&(e.values=t)}}getCurrentTag(){return this.path.length>0?this.path[this.path.length-1].tag:void 0}getCurrentNamespace(){return this.path.length>0?this.path[this.path.length-1].namespace:void 0}getAttrValue(t){if(0!==this.path.length)return this.path[this.path.length-1].values?.[t]}hasAttr(t){if(0===this.path.length)return!1;const e=this.path[this.path.length-1];return void 0!==e.values&&t in e.values}getPosition(){return 0===this.path.length?-1:this.path[this.path.length-1].position??0}getCounter(){return 0===this.path.length?-1:this.path[this.path.length-1].counter??0}getIndex(){return this.getPosition()}getDepth(){return this.path.length}toString(t,e=!0){const n=t||this.separator;if(n===this.separator&&!0===e){if(null!==this._pathStringCache)return this._pathStringCache;const t=this.path.map(t=>t.namespace?`${t.namespace}:${t.tag}`:t.tag).join(n);return this._pathStringCache=t,t}return this.path.map(t=>e&&t.namespace?`${t.namespace}:${t.tag}`:t.tag).join(n)}toArray(){return this.path.map(t=>t.tag)}reset(){this._pathStringCache=null,this.path=[],this.siblingStacks=[]}matches(t){const e=t.segments;return 0!==e.length&&(t.hasDeepWildcard()?this._matchWithDeepWildcard(e):this._matchSimple(e))}_matchSimple(t){if(this.path.length!==t.length)return!1;for(let e=0;e=0&&e>=0;){const i=t[n];if("deep-wildcard"===i.type){if(n--,n<0)return!0;const i=t[n];let s=!1;for(let t=e;t>=0;t--)if(this._matchSegment(i,this.path[t],t===this.path.length-1)){e=t-1,n--,s=!0;break}if(!s)return!1}else{if(!this._matchSegment(i,this.path[e],e===this.path.length-1))return!1;e--,n--}}return n<0}_matchSegment(t,e,n){if("*"!==t.tag&&t.tag!==e.tag)return!1;if(void 0!==t.namespace&&"*"!==t.namespace&&t.namespace!==e.namespace)return!1;if(void 0!==t.attrName){if(!n)return!1;if(!e.values||!(t.attrName in e.values))return!1;if(void 0!==t.attrValue&&String(e.values[t.attrName])!==String(t.attrValue))return!1}if(void 0!==t.position){if(!n)return!1;const i=e.counter??0;if("first"===t.position&&0!==i)return!1;if("odd"===t.position&&i%2!=1)return!1;if("even"===t.position&&i%2!=0)return!1;if("nth"===t.position&&i!==t.positionValue)return!1}return!0}matchesAny(t){return t.matchesAny(this)}snapshot(){return{path:this.path.map(t=>({...t})),siblingStacks:this.siblingStacks.map(t=>new Map(t))}}restore(t){this._pathStringCache=null,this.path=t.path.map(t=>({...t})),this.siblingStacks=t.siblingStacks.map(t=>new Map(t))}readOnly(){return this._view}}class G{constructor(t,e={},n){this.pattern=t,this.separator=e.separator||".",this.segments=this._parse(t),this.data=n,this._hasDeepWildcard=this.segments.some(t=>"deep-wildcard"===t.type),this._hasAttributeCondition=this.segments.some(t=>void 0!==t.attrName),this._hasPositionSelector=this.segments.some(t=>void 0!==t.position)}_parse(t){const e=[];let n=0,i="";for(;n",lt:"<",quot:'"'},X={nbsp:" ",copy:"©",reg:"®",trade:"™",mdash:"—",ndash:"–",hellip:"…",laquo:"«",raquo:"»",lsquo:"‘",rsquo:"’",ldquo:"“",rdquo:"”",bull:"•",para:"¶",sect:"§",deg:"°",frac12:"½",frac14:"¼",frac34:"¾"},Y=new Set("!?\\\\/[]$%{}^&*()<>|+");function z(t){if("#"===t[0])throw new Error(`[EntityReplacer] Invalid character '#' in entity name: "${t}"`);for(const e of t)if(Y.has(e))throw new Error(`[EntityReplacer] Invalid character '${e}' in entity name: "${t}"`);return t}function q(...t){const e=Object.create(null);for(const n of t)if(n)for(const t of Object.keys(n)){const i=n[t];if("string"==typeof i)e[t]=i;else if(i&&"object"==typeof i&&void 0!==i.val){const n=i.val;"string"==typeof n&&(e[t]=n)}}return e}const Z="external",J="base",K="all",Q=Object.freeze({allow:0,leave:1,remove:2,throw:3}),H=new Set([9,10,13]);class tt{constructor(t={}){var e;this._limit=t.limit||{},this._maxTotalExpansions=this._limit.maxTotalExpansions||0,this._maxExpandedLength=this._limit.maxExpandedLength||0,this._postCheck="function"==typeof t.postCheck?t.postCheck:t=>t,this._limitTiers=(e=this._limit.applyLimitsTo??Z)&&e!==Z?e===K?new Set([K]):e===J?new Set([J]):Array.isArray(e)?new Set(e):new Set([Z]):new Set([Z]),this._numericAllowed=t.numericAllowed??!0,this._baseMap=q(W,t.namedEntities||null),this._externalMap=Object.create(null),this._inputMap=Object.create(null),this._totalExpansions=0,this._expandedLength=0,this._removeSet=new Set(t.remove&&Array.isArray(t.remove)?t.remove:[]),this._leaveSet=new Set(t.leave&&Array.isArray(t.leave)?t.leave:[]);const n=function(t){if(!t)return{xmlVersion:1,onLevel:Q.allow,nullLevel:Q.remove};const e=1.1===t.xmlVersion?1.1:1,n=Q[t.onNCR]??Q.allow,i=Q[t.nullNCR]??Q.remove;return{xmlVersion:e,onLevel:n,nullLevel:Math.max(i,Q.remove)}}(t.ncr);this._ncrXmlVersion=n.xmlVersion,this._ncrOnLevel=n.onLevel,this._ncrNullLevel=n.nullLevel}setExternalEntities(t){if(t)for(const e of Object.keys(t))z(e);this._externalMap=q(t)}addExternalEntity(t,e){z(t),"string"==typeof e&&-1===e.indexOf("&")&&(this._externalMap[t]=e)}addInputEntities(t){this._totalExpansions=0,this._expandedLength=0,this._inputMap=q(t)}reset(){return this._inputMap=Object.create(null),this._totalExpansions=0,this._expandedLength=0,this}setXmlVersion(t){this._ncrXmlVersion=1.1===t?1.1:1}decode(t){if("string"!=typeof t||0===t.length)return t;const e=t,n=[],i=t.length;let s=0,r=0;const o=this._maxTotalExpansions>0,a=this._maxExpandedLength>0,h=o||a;for(;r=i||59!==t.charCodeAt(e)){r++;continue}const l=t.slice(r+1,e);if(0===l.length){r++;continue}let u,p;if(this._removeSet.has(l))u="",void 0===p&&(p=Z);else{if(this._leaveSet.has(l)){r++;continue}if(35===l.charCodeAt(0)){const t=this._resolveNCR(l);if(void 0===t){r++;continue}u=t,p=J}else{const t=this._resolveName(l);u=t?.value,p=t?.tier}}if(void 0!==u){if(r>s&&n.push(t.slice(s,r)),n.push(u),s=e+1,r=s,h&&this._tierCounts(p)){if(o&&(this._totalExpansions++,this._totalExpansions>this._maxTotalExpansions))throw new Error(`[EntityReplacer] Entity expansion count limit exceeded: ${this._totalExpansions} > ${this._maxTotalExpansions}`);if(a){const t=u.length-(l.length+2);if(t>0&&(this._expandedLength+=t,this._expandedLength>this._maxExpandedLength))throw new Error(`[EntityReplacer] Expanded content length limit exceeded: ${this._expandedLength} > ${this._maxExpandedLength}`)}}}else r++}s=55296&&t<=57343||1===this._ncrXmlVersion&&t>=1&&t<=31&&!H.has(t)?Q.remove:-1}_applyNCRAction(t,e,n){switch(t){case Q.allow:return String.fromCodePoint(n);case Q.remove:return"";case Q.leave:return;case Q.throw:throw new Error(`[EntityDecoder] Prohibited numeric character reference &${e}; (U+${n.toString(16).toUpperCase().padStart(4,"0")})`);default:return String.fromCodePoint(n)}}_resolveNCR(t){const e=t.charCodeAt(1);let n;if(n=120===e||88===e?parseInt(t.slice(2),16):parseInt(t.slice(1),10),Number.isNaN(n)||n<0||n>1114111)return;const i=this._classifyNCR(n);if(!this._numericAllowed&&i0){const n=t.substring(0,e);if("xmlns"!==n)return n}}class it{constructor(t){var e;this.options=t,this.currentNode=null,this.tagsNodeStack=[],this.parseXml=ht,this.parseTextData=st,this.resolveNameSpace=rt,this.buildAttributesMap=at,this.isItStopNode=ct,this.replaceEntitiesValue=ut,this.readStopNodeData=mt,this.saveTextToParentTag=pt,this.addChild=lt,this.ignoreAttributesFn="function"==typeof(e=this.options.ignoreAttributes)?e:Array.isArray(e)?t=>{for(const n of e){if("string"==typeof n&&t===n)return!0;if(n instanceof RegExp&&n.test(t))return!0}}:()=>!1,this.entityExpansionCount=0,this.currentExpandedLength=0;let n={...W};this.options.entityDecoder?this.entityDecoder=this.options.entityDecoder:("object"==typeof this.options.htmlEntities?n=this.options.htmlEntities:!0===this.options.htmlEntities&&(n={...X,...U}),this.entityDecoder=new tt({namedEntities:n,numericAllowed:this.options.htmlEntities,limit:{maxTotalExpansions:this.options.processEntities.maxTotalExpansions,maxExpandedLength:this.options.processEntities.maxExpandedLength,applyLimitsTo:this.options.processEntities.appliesTo}})),this.matcher=new R,this.readonlyMatcher=this.matcher.readOnly(),this.isCurrentNodeStopNode=!1,this.stopNodeExpressionsSet=new B;const i=this.options.stopNodes;if(i&&i.length>0){for(let t=0;t0)){o||(t=this.replaceEntitiesValue(t,e,n));const i=a.jPath?n.toString():n,h=a.tagValueProcessor(e,t,i,s,r);return null==h?t:typeof h!=typeof t||h!==t?h:a.trimValues||t.trim()===t?xt(t,a.parseTagValue,a.numberParseOptions):t}}function rt(t){if(this.options.removeNSPrefix){const e=t.split(":"),n="/"===t.charAt(0)?"/":"";if("xmlns"===e[0])return"";2===e.length&&(t=n+e[1])}return t}const ot=new RegExp("([^\\s=]+)\\s*(=\\s*(['\"])([\\s\\S]*?)\\3)?","gm");function at(t,e,n){const i=this.options;if(!0!==i.ignoreAttributes&&"string"==typeof t){const r=s(t,ot),o=r.length,a={},h=new Array(o);let l=!1;const u={};for(let t=0;t",a,"Closing Tag is not closed.");let r=t.substring(a+2,e).trim();if(s.removeNSPrefix){const t=r.indexOf(":");-1!==t&&(r=r.substr(t+1))}r=Nt(s.transformTagName,r,"",s).tagName,n&&(i=this.saveTextToParentTag(i,n,this.readonlyMatcher));const o=this.matcher.getCurrentTag();if(r&&s.unpairedTagsSet.has(r))throw new Error(`Unpaired tag can not be used as closing tag: `);o&&s.unpairedTagsSet.has(o)&&(this.matcher.pop(),this.tagsNodeStack.pop()),this.matcher.pop(),this.isCurrentNodeStopNode=!1,n=this.tagsNodeStack.pop(),i="",a=e}else if(63===h){let e=gt(t,a,!1,"?>");if(!e)throw new Error("Pi Tag is not closed.");i=this.saveTextToParentTag(i,n,this.readonlyMatcher);const r=this.buildAttributesMap(e.tagExp,this.matcher,e.tagName);if(r&&r.version&&this.entityDecoder.setXmlVersion(r.version),s.ignoreDeclaration&&"?xml"===e.tagName||s.ignorePiTags);else{const t=new O(e.tagName);t.add(s.textNodeName,""),e.tagName!==e.tagExp&&e.attrExpPresent&&(t[":@"]=r),this.addChild(n,t,this.readonlyMatcher,a)}a=e.closeIndex+1}else if(33===h&&45===t.charCodeAt(a+2)&&45===t.charCodeAt(a+3)){const e=dt(t,"--\x3e",a+4,"Comment is not closed.");if(s.commentPropName){const r=t.substring(a+4,e-2);i=this.saveTextToParentTag(i,n,this.readonlyMatcher),n.add(s.commentPropName,[{[s.textNodeName]:r}])}a=e}else if(33===h&&68===t.charCodeAt(a+2)){const e=r.readDocType(t,a);this.entityDecoder.addInputEntities(e.entities),a=e.i}else if(33===h&&91===t.charCodeAt(a+2)){const e=dt(t,"]]>",a,"CDATA is not closed.")-2,r=t.substring(a+9,e);i=this.saveTextToParentTag(i,n,this.readonlyMatcher);let o=this.parseTextData(r,n.tagname,this.readonlyMatcher,!0,!1,!0,!0);null==o&&(o=""),s.cdataPropName?n.add(s.cdataPropName,[{[s.textNodeName]:r}]):n.add(s.textNodeName,o),a=e+2}else{let r=gt(t,a,s.removeNSPrefix);if(!r){const e=t.substring(Math.max(0,a-50),Math.min(o,a+50));throw new Error(`readTagExp returned undefined at position ${a}. Context: "${e}"`)}let h=r.tagName;const l=r.rawTagName;let u=r.tagExp,p=r.attrExpPresent,c=r.closeIndex;if(({tagName:h,tagExp:u}=Nt(s.transformTagName,h,u,s)),s.strictReservedNames&&(h===s.commentPropName||h===s.cdataPropName||h===s.textNodeName||h===s.attributesGroupName))throw new Error(`Invalid tag name: ${h}`);n&&i&&"!xml"!==n.tagname&&(i=this.saveTextToParentTag(i,n,this.readonlyMatcher,!1));const d=n;d&&s.unpairedTagsSet.has(d.tagname)&&(n=this.tagsNodeStack.pop(),this.matcher.pop());let f=!1;u.length>0&&u.lastIndexOf("/")===u.length-1&&(f=!0,"/"===h[h.length-1]?(h=h.substr(0,h.length-1),u=h):u=u.substr(0,u.length-1),p=h!==u);let g,m=null,x={};g=nt(l),h!==e.tagname&&this.matcher.push(h,{},g),h!==u&&p&&(m=this.buildAttributesMap(u,this.matcher,h),m&&(x=et(m,s))),h!==e.tagname&&(this.isCurrentNodeStopNode=this.isItStopNode());const N=a;if(this.isCurrentNodeStopNode){let e="";if(f)a=r.closeIndex;else if(s.unpairedTagsSet.has(h))a=r.closeIndex;else{const n=this.readStopNodeData(t,l,c+1);if(!n)throw new Error(`Unexpected end of ${l}`);a=n.i,e=n.tagContent}const i=new O(h);m&&(i[":@"]=m),i.add(s.textNodeName,e),this.matcher.pop(),this.isCurrentNodeStopNode=!1,this.addChild(n,i,this.readonlyMatcher,N)}else{if(f){({tagName:h,tagExp:u}=Nt(s.transformTagName,h,u,s));const t=new O(h);m&&(t[":@"]=m),this.addChild(n,t,this.readonlyMatcher,N),this.matcher.pop(),this.isCurrentNodeStopNode=!1}else{if(s.unpairedTagsSet.has(h)){const t=new O(h);m&&(t[":@"]=m),this.addChild(n,t,this.readonlyMatcher,N),this.matcher.pop(),this.isCurrentNodeStopNode=!1,a=r.closeIndex;continue}{const t=new O(h);if(this.tagsNodeStack.length>s.maxNestedTags)throw new Error("Maximum nested tags exceeded");this.tagsNodeStack.push(n),m&&(t[":@"]=m),this.addChild(n,t,this.readonlyMatcher,N),n=t}}i="",a=c}}}else i+=t[a];return e.child};function lt(t,e,n,i){this.options.captureMetaData||(i=void 0);const s=this.options.jPath?n.toString():n,r=this.options.updateTag(e.tagname,s,e[":@"]);!1===r||("string"==typeof r?(e.tagname=r,t.addChild(e,i)):t.addChild(e,i))}function ut(t,e,n){const i=this.options.processEntities;if(!i||!i.enabled)return t;if(i.allowedTags){const s=this.options.jPath?n.toString():n;if(!(Array.isArray(i.allowedTags)?i.allowedTags.includes(e):i.allowedTags(e,s)))return t}if(i.tagFilter){const s=this.options.jPath?n.toString():n;if(!i.tagFilter(e,s))return t}return this.entityDecoder.decode(t)}function pt(t,e,n,i){return t&&(void 0===i&&(i=0===e.child.length),void 0!==(t=this.parseTextData(t,e.tagname,n,!1,!!e[":@"]&&0!==Object.keys(e[":@"]).length,i))&&""!==t&&e.add(this.options.textNodeName,t),t=""),t}function ct(){return 0!==this.stopNodeExpressionsSet.size&&this.matcher.matchesAny(this.stopNodeExpressionsSet)}function dt(t,e,n,i){const s=t.indexOf(e,n);if(-1===s)throw new Error(i);return s+e.length-1}function ft(t,e,n,i){const s=t.indexOf(e,n);if(-1===s)throw new Error(i);return s}function gt(t,e,n,i=">"){const s=function(t,e,n=">"){let i=0,s=!1;const r=t.length,o=n.charCodeAt(0),a=n.length>1?n.charCodeAt(1):-1;let h=-1;for(let n=e;n",n,`${e} is not closed`);if(t.substring(n+2,r).trim()===e&&(s--,0===s))return{tagContent:t.substring(i,n),i:r};n=r}else if(63===r)n=dt(t,"?>",n+1,"StopNode is not closed.");else if(33===r&&45===t.charCodeAt(n+2)&&45===t.charCodeAt(n+3))n=dt(t,"--\x3e",n+3,"StopNode is not closed.");else if(33===r&&91===t.charCodeAt(n+2))n=dt(t,"]]>",n,"StopNode is not closed.")-2;else{const i=gt(t,n,">");i&&((i&&i.tagName)===e&&"/"!==i.tagExp[i.tagExp.length-1]&&s++,n=i.closeIndex)}}}function xt(t,e,n){if(e&&"string"==typeof t){const e=t.trim();return"true"===e||"false"!==e&&function(t,e={}){if(e=Object.assign({},L,e),!t||"string"!=typeof t)return t;let n=t.trim();if(0===n.length)return t;if(void 0!==e.skipLike&&e.skipLike.test(n))return t;if("0"===n)return 0;if(e.hex&&j.test(n))return function(t){if(parseInt)return parseInt(t,16);if(Number.parseInt)return Number.parseInt(t,16);if(window&&window.parseInt)return window.parseInt(t,16);throw new Error("parseInt, Number.parseInt, window.parseInt are not supported")}(n);if(isFinite(n)){if(n.includes("e")||n.includes("E"))return function(t,e,n){if(!n.eNotation)return t;const i=e.match(k);if(i){let s=i[1]||"";const r=-1===i[3].indexOf("e")?"E":"e",o=i[2],a=s?t[o.length+1]===r:t[o.length]===r;return o.length>1&&a?t:(1!==o.length||!i[3].startsWith(`.${r}`)&&i[3][0]!==r)&&o.length>0?n.leadingZeros&&!a?(e=(i[1]||"")+i[3],Number(e)):t:Number(e)}return t}(t,n,e);{const s=V.exec(n);if(s){const r=s[1]||"",o=s[2];let a=(i=s[3])&&-1!==i.indexOf(".")?("."===(i=i.replace(/0+$/,""))?i="0":"."===i[0]?i="0"+i:"."===i[i.length-1]&&(i=i.substring(0,i.length-1)),i):i;const h=r?"."===t[o.length+1]:"."===t[o.length];if(!e.leadingZeros&&(o.length>1||1===o.length&&!h))return t;{const i=Number(n),s=String(i);if(0===i)return i;if(-1!==s.search(/[eE]/))return e.eNotation?i:t;if(-1!==n.indexOf("."))return"0"===s||s===a||s===`${r}${a}`?i:t;let h=o?a:n;return o?h===s||r+h===s?i:t:h===s||h===r+s?i:t}}return t}}var i;return function(t,e,n){const i=e===1/0;switch(n.infinity.toLowerCase()){case"null":return null;case"infinity":return e;case"string":return i?"Infinity":"-Infinity";default:return t}}(t,Number(n),e)}(t,n)}return void 0!==t?t:""}function Nt(t,e,n,i){if(t){const i=t(e);n===e&&(n=i),e=i}return{tagName:e=bt(e,i),tagExp:n}}function bt(t,e){if(a.includes(t))throw new Error(`[SECURITY] Invalid name: "${t}" is a reserved JavaScript keyword that could cause prototype pollution`);return o.includes(t)?e.onDangerousProperty(t):t}const yt=O.getMetaDataSymbol();function Et(t,e){if(!t||"object"!=typeof t)return{};if(!e)return t;const n={};for(const i in t)i.startsWith(e)?n[i.substring(e.length)]=t[i]:n[i]=t[i];return n}function wt(t,e,n,i){return vt(t,e,n,i)}function vt(t,e,n,i){let s;const r={};for(let o=0;o0&&(r[e.textNodeName]=s):void 0!==s&&(r[e.textNodeName]=s),r}function St(t){const e=Object.keys(t);for(let t=0;t0&&(n="\n");const i=[];if(e.stopNodes&&Array.isArray(e.stopNodes))for(let t=0;te.maxNestedTags)throw new Error("Maximum nested tags exceeded");if(!Array.isArray(t)){if(null!=t){let n=t.toString();return n=Vt(n,e),n}return""}for(let a=0;a`,o=!1,i.pop();continue}if(l===e.commentPropName){r+=n+`\x3c!--${h[l][0][e.textNodeName]}--\x3e`,o=!0,i.pop();continue}if("?"===l[0]){const t=Mt(h[":@"],e,p),s="?xml"===l?"":n;let a=h[l][0][e.textNodeName];a=0!==a.length?" "+a:"",r+=s+`<${l}${a}${t}?>`,o=!0,i.pop();continue}let c=n;""!==c&&(c+=e.indentBy);const d=n+`<${l}${Mt(h[":@"],e,p)}`;let f;f=p?$t(h[l],e):Pt(h[l],e,c,i,s),-1!==e.unpairedTags.indexOf(l)?e.suppressUnpairedNode?r+=d+">":r+=d+"/>":f&&0!==f.length||!e.suppressEmptyNode?f&&f.endsWith(">")?r+=d+`>${f}${n}`:(r+=d+">",f&&""!==n&&(f.includes("/>")||f.includes("`):r+=d+"/>",o=!0,i.pop()}return r}function Ot(t,e){if(!t||e.ignoreAttributes)return null;const n={};let i=!1;for(let s in t)Object.prototype.hasOwnProperty.call(t,s)&&(n[s.startsWith(e.attributeNamePrefix)?s.substr(e.attributeNamePrefix.length):s]=t[s],i=!0);return i?n:null}function $t(t,e){if(!Array.isArray(t))return null!=t?t.toString():"";let n="";for(let i=0;i${i}`:n+=`<${r}${t}/>`}}}return n}function It(t,e){let n="";if(t&&!e.ignoreAttributes)for(let i in t){if(!Object.prototype.hasOwnProperty.call(t,i))continue;let s=t[i];!0===s&&e.suppressBooleanAttributes?n+=` ${i.substr(e.attributeNamePrefix.length)}`:n+=` ${i.substr(e.attributeNamePrefix.length)}="${s}"`}return n}function Dt(t){const e=Object.keys(t);for(let n=0;n0&&e.processEntities)for(let n=0;n","g"),val:">"},{regex:new RegExp("<","g"),val:"<"},{regex:new RegExp("'","g"),val:"'"},{regex:new RegExp('"',"g"),val:"""}],processEntities:!0,stopNodes:[],oneListGroup:!1,maxNestedTags:100,jPath:!0};function kt(t){if(this.options=Object.assign({},Lt,t),this.options.stopNodes&&Array.isArray(this.options.stopNodes)&&(this.options.stopNodes=this.options.stopNodes.map(t=>"string"==typeof t&&t.startsWith("*.")?".."+t.substring(2):t)),this.stopNodeExpressions=[],this.options.stopNodes&&Array.isArray(this.options.stopNodes))for(let t=0;t{for(const n of e){if("string"==typeof n&&t===n)return!0;if(n instanceof RegExp&&n.test(t))return!0}}:()=>!1,this.attrPrefixLen=this.options.attributeNamePrefix.length,this.isAttribute=Gt),this.processTextOrObjNode=Ft,this.options.format?(this.indentate=Rt,this.tagEndChar=">\n",this.newLine="\n"):(this.indentate=function(){return""},this.tagEndChar=">",this.newLine="")}function Ft(t,e,n,i){const s=this.extractAttributes(t);if(i.push(e,s),this.checkStopNode(i)){const s=this.buildRawContent(t),r=this.buildAttributesForStopNode(t);return i.pop(),this.buildObjectNode(s,e,r,n)}const r=this.j2x(t,n+1,i);return i.pop(),void 0!==t[this.options.textNodeName]&&1===Object.keys(t).length?this.buildTextValNode(t[this.options.textNodeName],e,r.attrStr,n,i):this.buildObjectNode(r.val,e,r.attrStr,n)}function Rt(t){return this.options.indentBy.repeat(t)}function Gt(t){return!(!t.startsWith(this.options.attributeNamePrefix)||t===this.options.textNodeName)&&t.substr(this.attrPrefixLen)}kt.prototype.build=function(t){if(this.options.preserveOrder)return Ct(t,this.options);{Array.isArray(t)&&this.options.arrayNodeName&&this.options.arrayNodeName.length>1&&(t={[this.options.arrayNodeName]:t});const e=new R;return this.j2x(t,0,e).val}},kt.prototype.j2x=function(t,e,n){let i="",s="";if(this.options.maxNestedTags&&n.getDepth()>=this.options.maxNestedTags)throw new Error("Maximum nested tags exceeded");const r=this.options.jPath?n.toString():n,o=this.checkStopNode(n);for(let a in t)if(Object.prototype.hasOwnProperty.call(t,a))if(void 0===t[a])this.isAttribute(a)&&(s+="");else if(null===t[a])this.isAttribute(a)||a===this.options.cdataPropName?s+="":"?"===a[0]?s+=this.indentate(e)+"<"+a+"?"+this.tagEndChar:s+=this.indentate(e)+"<"+a+"/"+this.tagEndChar;else if(t[a]instanceof Date)s+=this.buildTextValNode(t[a],a,"",e,n);else if("object"!=typeof t[a]){const h=this.isAttribute(a);if(h&&!this.ignoreAttributesFn(h,r))i+=this.buildAttrPairStr(h,""+t[a],o);else if(!h)if(a===this.options.textNodeName){let e=this.options.tagValueProcessor(a,""+t[a]);s+=this.replaceEntitiesValue(e)}else{n.push(a);const i=this.checkStopNode(n);if(n.pop(),i){const n=""+t[a];s+=""===n?this.indentate(e)+"<"+a+this.closeTag(a)+this.tagEndChar:this.indentate(e)+"<"+a+">"+n+""+t+"${t}`;else if("object"==typeof t&&null!==t){const i=this.buildRawContent(t),s=this.buildAttributesForStopNode(t);e+=""===i?`<${n}${s}/>`:`<${n}${s}>${i}`}}else if("object"==typeof i&&null!==i){const t=this.buildRawContent(i),s=this.buildAttributesForStopNode(i);e+=""===t?`<${n}${s}/>`:`<${n}${s}>${t}`}else e+=`<${n}>${i}`}return e},kt.prototype.buildAttributesForStopNode=function(t){if(!t||"object"!=typeof t)return"";let e="";if(this.options.attributesGroupName&&t[this.options.attributesGroupName]){const n=t[this.options.attributesGroupName];for(let t in n){if(!Object.prototype.hasOwnProperty.call(n,t))continue;const i=t.startsWith(this.options.attributeNamePrefix)?t.substring(this.options.attributeNamePrefix.length):t,s=n[t];!0===s&&this.options.suppressBooleanAttributes?e+=" "+i:e+=" "+i+'="'+s+'"'}}else for(let n in t){if(!Object.prototype.hasOwnProperty.call(t,n))continue;const i=this.isAttribute(n);if(i){const s=t[n];!0===s&&this.options.suppressBooleanAttributes?e+=" "+i:e+=" "+i+'="'+s+'"'}}return e},kt.prototype.buildObjectNode=function(t,e,n,i){if(""===t)return"?"===e[0]?this.indentate(i)+"<"+e+n+"?"+this.tagEndChar:this.indentate(i)+"<"+e+n+this.closeTag(e)+this.tagEndChar;{let s=""+t+s}},kt.prototype.closeTag=function(t){let e="";return-1!==this.options.unpairedTags.indexOf(t)?this.options.suppressUnpairedNode||(e="/"):e=this.options.suppressEmptyNode?"/":`>`+this.newLine;if(!1!==this.options.commentPropName&&e===this.options.commentPropName)return this.indentate(i)+`\x3c!--${t}--\x3e`+this.newLine;if("?"===e[0])return this.indentate(i)+"<"+e+n+"?"+this.tagEndChar;{let s=this.options.tagValueProcessor(e,t);return s=this.replaceEntitiesValue(s),""===s?this.indentate(i)+"<"+e+n+this.closeTag(e)+this.tagEndChar:this.indentate(i)+"<"+e+n+">"+s+"0&&this.options.processEntities)for(let e=0;e(()=>{"use strict";var t={d:(e,r)=>{for(var i in r)t.o(r,i)&&!t.o(e,i)&&Object.defineProperty(e,i,{enumerable:!0,get:r[i]})},o:(t,e)=>Object.prototype.hasOwnProperty.call(t,e),r:t=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})}},e={};t.r(e),t.d(e,{XMLBuilder:()=>Wt,XMLParser:()=>Ct,XMLValidator:()=>qt});var r=":A-Za-z_\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD",i=new RegExp("^["+r+"]["+r+"\\-.\\d\\u00B7\\u0300-\\u036F\\u203F-\\u2040]*$");function n(t,e){for(var r=[],i=e.exec(t);i;){var n=[];n.startIndex=e.lastIndex-i[0].length;for(var s=i.length,a=0;a"!==t[s]&&" "!==t[s]&&"\t"!==t[s]&&"\n"!==t[s]&&"\r"!==t[s];s++)l+=t[s];if("/"===(l=l.trim())[l.length-1]&&(l=l.substring(0,l.length-1),s--),!N(l))return b("InvalidTag",0===l.trim().length?"Invalid space after '<'.":"Tag '"+l+"' is an invalid name.",E(t,s));var c=g(t,s);if(!1===c)return b("InvalidAttr","Attributes for '"+l+"' have open quote.",E(t,s));var f=c.value;if(s=c.index,"/"===f[f.length-1]){var m=s-f.length,y=x(f=f.substring(0,f.length-1),e);if(!0!==y)return b(y.err.code,y.err.msg,E(t,m+y.err.line));i=!0}else if(o){if(!c.tagClosed)return b("InvalidTag","Closing tag '"+l+"' doesn't have proper closing.",E(t,s));if(f.trim().length>0)return b("InvalidTag","Closing tag '"+l+"' can't have attributes or invalid starting.",E(t,a));if(0===r.length)return b("InvalidTag","Closing tag '"+l+"' has not been opened.",E(t,a));var w=r.pop();if(l!==w.tagName){var _=E(t,w.tagStartPos);return b("InvalidTag","Expected closing tag '"+w.tagName+"' (opened in line "+_.line+", col "+_.col+") instead of closing tag '"+l+"'.",E(t,a))}0==r.length&&(n=!0)}else{var S=x(f,e);if(!0!==S)return b(S.err.code,S.err.msg,E(t,s-f.length+S.err.line));if(!0===n)return b("InvalidXml","Multiple possible root nodes found.",E(t,s));-1!==e.unpairedTags.indexOf(l)||r.push({tagName:l,tagStartPos:a}),i=!0}for(s++;s0)||b("InvalidXml","Invalid '"+JSON.stringify(r.map(function(t){return t.tagName}),null,4).replace(/\r?\n/g,"")+"' found.",{line:1,col:1}):b("InvalidXml","Start tag expected.",1)}function u(t){return" "===t||"\t"===t||"\n"===t||"\r"===t}function p(t,e){for(var r=e;e5&&"xml"===i)return b("InvalidXml","XML declaration allowed only at the start of the document.",E(t,e));if("?"==t[e]&&">"==t[e+1]){e++;break}}return e}function d(t,e){if(t.length>e+5&&"-"===t[e+1]&&"-"===t[e+2]){for(e+=3;e"===t[e+2]){e+=2;break}}else if(t.length>e+8&&"D"===t[e+1]&&"O"===t[e+2]&&"C"===t[e+3]&&"T"===t[e+4]&&"Y"===t[e+5]&&"P"===t[e+6]&&"E"===t[e+7]){var r=1;for(e+=8;e"===t[e]&&0===--r)break}else if(t.length>e+9&&"["===t[e+1]&&"C"===t[e+2]&&"D"===t[e+3]&&"A"===t[e+4]&&"T"===t[e+5]&&"A"===t[e+6]&&"["===t[e+7])for(e+=8;e"===t[e+2]){e+=2;break}return e}var c='"',f="'";function g(t,e){for(var r="",i="",n=!1;e"===t[e]&&""===i){n=!0;break}r+=t[e]}return""===i&&{value:r,index:e,tagClosed:n}}var m=new RegExp("(\\s*)([^\\s=]+)(\\s*=)?(\\s*(['\"])(([\\s\\S])*?)\\5)?","g");function x(t,e){for(var r=n(t,m),i={},s=0;s0?this.child.push(((r={})[t.tagname]=t.child,r[":@"]=t[":@"],r)):this.child.push(((i={})[t.tagname]=t.child,i)),void 0!==e&&(this.child[this.child.length-1][P]={startIndex:e})},t.getMetaDataSymbol=function(){return P},t}(),I=function(){function t(t){this.suppressValidationErr=!t,this.options=t}var e=t.prototype;return e.readDocType=function(t,e){var r=Object.create(null),i=0;if("O"!==t[e+3]||"C"!==t[e+4]||"T"!==t[e+5]||"Y"!==t[e+6]||"P"!==t[e+7]||"E"!==t[e+8])throw new Error("Invalid Tag instead of DOCTYPE");e+=9;for(var n=1,s=!1,a=!1;e"===t[e]){if(a?"-"===t[e-1]&&"-"===t[e-2]&&(a=!1,n--):n--,0===n)break}else"["===t[e]?s=!0:t[e];else{if(s&&j(t,"!ENTITY",e)){e+=7;var o=void 0,h=void 0,l=this.readEntityExp(t,e+1,this.suppressValidationErr);if(o=l[0],h=l[1],e=l[2],-1===h.indexOf("&")){if(!1!==this.options.enabled&&null!=this.options.maxEntityCount&&i>=this.options.maxEntityCount)throw new Error("Entity count ("+(i+1)+") exceeds maximum allowed ("+this.options.maxEntityCount+")");var u=o.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");r[o]={regx:RegExp("&"+u+";","g"),val:h},i++}}else if(s&&j(t,"!ELEMENT",e))e+=8,e=this.readElementExp(t,e+1).index;else if(s&&j(t,"!ATTLIST",e))e+=8;else if(s&&j(t,"!NOTATION",e))e+=9,e=this.readNotationExp(t,e+1,this.suppressValidationErr).index;else{if(!j(t,"!--",e))throw new Error("Invalid DOCTYPE");a=!0}n++}if(0!==n)throw new Error("Unclosed DOCTYPE");return{entities:r,i:e}},e.readEntityExp=function(t,e){for(var r=e=$(t,e);ethis.options.maxEntitySize)throw new Error('Entity "'+i+'" size ('+n.length+") exceeds maximum allowed size ("+this.options.maxEntitySize+")");return[i,n,--e]},e.readNotationExp=function(t,e){for(var r=e=$(t,e);et.length)&&(e=t.length);for(var r=0,i=Array(e);r0?t[t.length-1].tag:void 0}getCurrentNamespace(){const t=this._matcher.path;return t.length>0?t[t.length-1].namespace:void 0}getAttrValue(t){const e=this._matcher.path;if(0!==e.length)return e[e.length-1].values?.[t]}hasAttr(t){const e=this._matcher.path;if(0===e.length)return!1;const r=e[e.length-1];return void 0!==r.values&&t in r.values}getPosition(){const t=this._matcher.path;return 0===t.length?-1:t[t.length-1].position??0}getCounter(){const t=this._matcher.path;return 0===t.length?-1:t[t.length-1].counter??0}getIndex(){return this.getPosition()}getDepth(){return this._matcher.path.length}toString(t,e=!0){return this._matcher.toString(t,e)}toArray(){return this._matcher.path.map(t=>t.tag)}matches(t){return this._matcher.matches(t)}matchesAny(t){return t.matchesAny(this._matcher)}}class B{constructor(t={}){this.separator=t.separator||".",this.path=[],this.siblingStacks=[],this._pathStringCache=null,this._view=new R(this)}push(t,e=null,r=null){this._pathStringCache=null,this.path.length>0&&(this.path[this.path.length-1].values=void 0);const i=this.path.length;this.siblingStacks[i]||(this.siblingStacks[i]=new Map);const n=this.siblingStacks[i],s=r?`${r}:${t}`:t,a=n.get(s)||0;let o=0;for(const t of n.values())o+=t;n.set(s,a+1);const h={tag:t,position:o,counter:a};null!=r&&(h.namespace=r),null!=e&&(h.values=e),this.path.push(h)}pop(){if(0===this.path.length)return;this._pathStringCache=null;const t=this.path.pop();return this.siblingStacks.length>this.path.length+1&&(this.siblingStacks.length=this.path.length+1),t}updateCurrent(t){if(this.path.length>0){const e=this.path[this.path.length-1];null!=t&&(e.values=t)}}getCurrentTag(){return this.path.length>0?this.path[this.path.length-1].tag:void 0}getCurrentNamespace(){return this.path.length>0?this.path[this.path.length-1].namespace:void 0}getAttrValue(t){if(0!==this.path.length)return this.path[this.path.length-1].values?.[t]}hasAttr(t){if(0===this.path.length)return!1;const e=this.path[this.path.length-1];return void 0!==e.values&&t in e.values}getPosition(){return 0===this.path.length?-1:this.path[this.path.length-1].position??0}getCounter(){return 0===this.path.length?-1:this.path[this.path.length-1].counter??0}getIndex(){return this.getPosition()}getDepth(){return this.path.length}toString(t,e=!0){const r=t||this.separator;if(r===this.separator&&!0===e){if(null!==this._pathStringCache)return this._pathStringCache;const t=this.path.map(t=>t.namespace?`${t.namespace}:${t.tag}`:t.tag).join(r);return this._pathStringCache=t,t}return this.path.map(t=>e&&t.namespace?`${t.namespace}:${t.tag}`:t.tag).join(r)}toArray(){return this.path.map(t=>t.tag)}reset(){this._pathStringCache=null,this.path=[],this.siblingStacks=[]}matches(t){const e=t.segments;return 0!==e.length&&(t.hasDeepWildcard()?this._matchWithDeepWildcard(e):this._matchSimple(e))}_matchSimple(t){if(this.path.length!==t.length)return!1;for(let e=0;e=0&&e>=0;){const i=t[r];if("deep-wildcard"===i.type){if(r--,r<0)return!0;const i=t[r];let n=!1;for(let t=e;t>=0;t--)if(this._matchSegment(i,this.path[t],t===this.path.length-1)){e=t-1,r--,n=!0;break}if(!n)return!1}else{if(!this._matchSegment(i,this.path[e],e===this.path.length-1))return!1;e--,r--}}return r<0}_matchSegment(t,e,r){if("*"!==t.tag&&t.tag!==e.tag)return!1;if(void 0!==t.namespace&&"*"!==t.namespace&&t.namespace!==e.namespace)return!1;if(void 0!==t.attrName){if(!r)return!1;if(!e.values||!(t.attrName in e.values))return!1;if(void 0!==t.attrValue&&String(e.values[t.attrName])!==String(t.attrValue))return!1}if(void 0!==t.position){if(!r)return!1;const i=e.counter??0;if("first"===t.position&&0!==i)return!1;if("odd"===t.position&&i%2!=1)return!1;if("even"===t.position&&i%2!=0)return!1;if("nth"===t.position&&i!==t.positionValue)return!1}return!0}matchesAny(t){return t.matchesAny(this)}snapshot(){return{path:this.path.map(t=>({...t})),siblingStacks:this.siblingStacks.map(t=>new Map(t))}}restore(t){this._pathStringCache=null,this.path=t.path.map(t=>({...t})),this.siblingStacks=t.siblingStacks.map(t=>new Map(t))}readOnly(){return this._view}}class G{constructor(t,e={},r){this.pattern=t,this.separator=e.separator||".",this.segments=this._parse(t),this.data=r,this._hasDeepWildcard=this.segments.some(t=>"deep-wildcard"===t.type),this._hasAttributeCondition=this.segments.some(t=>void 0!==t.attrName),this._hasPositionSelector=this.segments.some(t=>void 0!==t.position)}_parse(t){const e=[];let r=0,i="";for(;r"},lt:{regex:/&(lt|#0*60|#x0*3[Cc]);/g,val:"<"},quot:{regex:/&(quot|#0*34|#x0*22);/g,val:'"'}},q=/&(amp|#0*38|#x0*26);/g,Y=new Set("!?\\\\/[]$%{}^&*()<>|+");function X(t){for(const e of t)if(Y.has(e))throw new Error(`[EntityReplacer] Invalid character '${e}' in entity name: "${t}"`);return t}function z(t){return t.replace(/[.\-+*:]/g,"\\$&")}function Z(t,e,r=!1){return!1===t||null===t?null:!0===t?e:void 0===t?r?e:null:"object"==typeof t?t:null}function J(t){const e=[];for(const r of Object.keys(t)){const i=t[r];if("object"==typeof i&&null!==i&&void 0!==i.val)e.push([r,{regex:i.regex??i.regx,val:i.val}]);else if("string"==typeof i){if(-1!==i.indexOf("&"))continue;X(r),e.push([r,{regex:new RegExp("&"+z(r)+";","g"),val:i}])}}return e}class K{constructor(t={}){var e;this._defaultTable=Z(t.default,W,!0),this._systemTable=Z(t.system,null,!1),this._ampEnabled=!1!==t.amp&&null!==t.amp,this._maxTotalExpansions=t.maxTotalExpansions||0,this._maxExpandedLength=t.maxExpandedLength||0,this._applyLimitsTo="all"===(e=t.applyLimitsTo??"external")?"all":"string"==typeof e?new Set([e]):Array.isArray(e)?new Set(e):new Set(["external"]),this._postCheck="function"==typeof t.postCheck?t.postCheck:t=>t,this._limitExternal="all"===this._applyLimitsTo||this._applyLimitsTo instanceof Set&&this._applyLimitsTo.has("external"),this._limitSystem="all"===this._applyLimitsTo||this._applyLimitsTo instanceof Set&&this._applyLimitsTo.has("system"),this._limitDefault="all"===this._applyLimitsTo||this._applyLimitsTo instanceof Set&&this._applyLimitsTo.has("default"),this._defaultEntries=this._defaultTable?Object.entries(this._defaultTable):[],this._systemEntries=this._systemTable?Object.entries(this._systemTable):[],this._persistentEntries=[],this._inputEntries=[],this._totalExpansions=0,this._expandedLength=0}setExternalEntities(t){this._persistentEntries=J(t)}addExternalEntity(t,e){X(t),"string"==typeof e&&-1===e.indexOf("&")&&this._persistentEntries.push([t,{regex:new RegExp("&"+z(t)+";","g"),val:e}])}addInputEntities(t){this._totalExpansions=0,this._expandedLength=0,this._inputEntries=J(t)}reset(){this._inputEntries=[],this._totalExpansions=0,this._expandedLength=0}replace(t){if("string"!=typeof t||0===t.length)return t;if(-1===t.indexOf("&"))return t;const e=t;return this._persistentEntries.length>0&&(t=this._applyEntries(t,this._persistentEntries,this._limitExternal)),this._inputEntries.length>0&&-1!==t.indexOf("&")&&(t=this._applyEntries(t,this._inputEntries,this._limitExternal)),this._defaultEntries.length>0&&-1!==t.indexOf("&")&&(t=this._applyEntries(t,this._defaultEntries,this._limitDefault)),this._systemEntries.length>0&&-1!==t.indexOf("&")&&(t=this._applyEntries(t,this._systemEntries,this._limitSystem)),this._ampEnabled&&-1!==t.indexOf("&")&&(t=t.replace(q,"&")),this._postCheck(t,e)}parse(t){return this.replace(t)}_applyEntries(t,e,r){const i=r&&this._maxTotalExpansions>0,n=r&&this._maxExpandedLength>0,s=i||n;for(let r=0;r(e++,"function"==typeof a.val?a.val(...t):a.val)),e>0&&(this._totalExpansions+=e,this._totalExpansions>this._maxTotalExpansions))throw new Error(`[EntityReplacer] Entity expansion count limit exceeded: ${this._totalExpansions} > ${this._maxTotalExpansions}`)}else if(n&&!i){const e=t.length,r=(t=t.replace(a.regex,a.val)).length-e;if(r>0&&(this._expandedLength+=r,this._expandedLength>this._maxExpandedLength))throw new Error(`[EntityReplacer] Expanded content length limit exceeded: ${this._expandedLength} > ${this._maxExpandedLength}`)}else{const e=t.length;let r=0;if(t=t.replace(a.regex,(...t)=>(r++,"function"==typeof a.val?a.val(...t):a.val)),r>0&&(this._totalExpansions+=r,this._totalExpansions>this._maxTotalExpansions))throw new Error(`[EntityReplacer] Entity expansion count limit exceeded: ${this._totalExpansions} > ${this._maxTotalExpansions}`);const i=t.length-e;if(i>0&&(this._expandedLength+=i,this._expandedLength>this._maxExpandedLength))throw new Error(`[EntityReplacer] Expanded content length limit exceeded: ${this._expandedLength} > ${this._maxExpandedLength}`)}else t=t.replace(a.regex,a.val)}return t}}const Q={nbsp:{regex:/&(nbsp|#0*160|#x0*[Aa]0);/g,val:" "},copy:{regex:/&(copy|#0*169|#x0*[Aa]9);/g,val:"©"},reg:{regex:/&(reg|#0*174|#x0*[Aa][Ee]);/g,val:"®"},trade:{regex:/&(trade|#0*8482|#x0*2122);/g,val:"™"},mdash:{regex:/&(mdash|#0*8212|#x0*2014);/g,val:"—"},ndash:{regex:/&(ndash|#0*8211|#x0*2013);/g,val:"–"},hellip:{regex:/&(hellip|#0*8230|#x0*2026);/g,val:"…"},laquo:{regex:/&(laquo|#0*171|#x0*[Aa][Bb]);/g,val:"«"},raquo:{regex:/&(raquo|#0*187|#x0*[Bb][Bb]);/g,val:"»"},lsquo:{regex:/&(lsquo|#0*8216|#x0*2018);/g,val:"‘"},rsquo:{regex:/&(rsquo|#0*8217|#x0*2019);/g,val:"’"},ldquo:{regex:/&(ldquo|#0*8220|#x0*201[Cc]);/g,val:"“"},rdquo:{regex:/&(rdquo|#0*8221|#x0*201[Dd]);/g,val:"”"},bull:{regex:/&(bull|#0*8226|#x0*2022);/g,val:"•"},para:{regex:/&(para|#0*182|#x0*[Bb]6);/g,val:"¶"},sect:{regex:/&(sect|#0*167|#x0*[Aa]7);/g,val:"§"},deg:{regex:/&(deg|#0*176|#x0*[Bb]0);/g,val:"°"},frac12:{regex:/&(frac12|#0*189|#x0*[Bb][Dd]);/g,val:"½"},frac14:{regex:/&(frac14|#0*188|#x0*[Bb][Cc]);/g,val:"¼"},frac34:{regex:/&(frac34|#0*190|#x0*[Bb][Ee]);/g,val:"¾"},inr:{regex:/&(inr|#0*8377);/g,val:"₹"}},H={cent:{regex:/&(cent|#0*162|#x0*[Aa]2);/g,val:"¢"},pound:{regex:/&(pound|#0*163|#x0*[Aa]3);/g,val:"£"},yen:{regex:/&(yen|#0*165|#x0*[Aa]5);/g,val:"¥"},euro:{regex:/&(euro|#0*8364|#x0*20[Aa][Cc]);/g,val:"€"},inr:{regex:/&(inr|#0*8377|#x0*20[Bb]9);/g,val:"₹"},curren:{regex:/&(curren|#0*164|#x0*[Aa]4);/g,val:"¤"},fnof:{regex:/&(fnof|#0*402|#x0*192);/g,val:"ƒ"}},tt={num_dec:{regex:/�*([0-9]{1,7});/g,val:(t,e)=>et(e,10,"&#")},num_hex:{regex:/�*([0-9a-fA-F]{1,6});/g,val:(t,e)=>et(e,16,"&#x")}};function et(t,e,r){const i=Number.parseInt(t,e);return i>=0&&i<=1114111?String.fromCodePoint(i):r+t+";"}function rt(){return rt=Object.assign?Object.assign.bind():function(t){for(var e=1;e0){var r=t.substring(0,e);if("xmlns"!==r)return r}}}var st=function(t){var e;this.options=t,this.currentNode=null,this.tagsNodeStack=[],this.parseXml=ut,this.parseTextData=at,this.resolveNameSpace=ot,this.buildAttributesMap=lt,this.isItStopNode=ft,this.replaceEntitiesValue=dt,this.readStopNodeData=vt,this.saveTextToParentTag=ct,this.addChild=pt,this.ignoreAttributesFn="function"==typeof(e=this.options.ignoreAttributes)?e:Array.isArray(e)?function(t){for(var r,i=function(t,e){var r="undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(r)return(r=r.call(t)).next.bind(r);if(Array.isArray(t)||(r=function(t,e){if(t){if("string"==typeof t)return F(t,e);var r={}.toString.call(t).slice(8,-1);return"Object"===r&&t.constructor&&(r=t.constructor.name),"Map"===r||"Set"===r?Array.from(t):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?F(t,e):void 0}}(t))||e&&t&&"number"==typeof t.length){r&&(t=r);var i=0;return function(){return i>=t.length?{done:!0}:{done:!1,value:t[i++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}(e);!(r=i()).done;){var n=r.value;if("string"==typeof n&&t===n)return!0;if(n instanceof RegExp&&n.test(t))return!0}}:function(){return!1},this.entityExpansionCount=0,this.currentExpandedLength=0,this.entityReplacer=new K({default:!0,system:this.options.htmlEntities?rt({},Q,tt,H):{},maxTotalExpansions:this.options.processEntities.maxTotalExpansions,maxExpandedLength:this.options.processEntities.maxExpandedLength,applyLimitsTo:"all"}),this.matcher=new B,this.readonlyMatcher=this.matcher.readOnly(),this.isCurrentNodeStopNode=!1,this.stopNodeExpressionsSet=new U;var r=this.options.stopNodes;if(r&&r.length>0){for(var i=0;i0)){a||(t=this.replaceEntitiesValue(t,e,r));var h=o.jPath?r.toString():r,l=o.tagValueProcessor(e,t,h,n,s);return null==l?t:typeof l!=typeof t||l!==t?l:o.trimValues||t.trim()===t?bt(t,o.parseTagValue,o.numberParseOptions):t}}function ot(t){if(this.options.removeNSPrefix){var e=t.split(":"),r="/"===t.charAt(0)?"/":"";if("xmlns"===e[0])return"";2===e.length&&(t=r+e[1])}return t}var ht=new RegExp("([^\\s=]+)\\s*(=\\s*(['\"])([\\s\\S]*?)\\3)?","gm");function lt(t,e,r){var i=this.options;if(!0!==i.ignoreAttributes&&"string"==typeof t){for(var s=n(t,ht),a=s.length,o={},h=new Array(a),l=!1,u={},p=0;p",o,"Closing Tag is not closed."),u=t.substring(o+2,l).trim();if(n.removeNSPrefix){var p=u.indexOf(":");-1!==p&&(u=u.substr(p+1))}u=yt(n.transformTagName,u,"",n).tagName,r&&(i=this.saveTextToParentTag(i,r,this.readonlyMatcher));var d=this.matcher.getCurrentTag();if(u&&n.unpairedTagsSet.has(u))throw new Error("Unpaired tag can not be used as closing tag: ");d&&n.unpairedTagsSet.has(d)&&(this.matcher.pop(),this.tagsNodeStack.pop()),this.matcher.pop(),this.isCurrentNodeStopNode=!1,r=this.tagsNodeStack.pop(),i="",o=l}else if(63===h){var c=xt(t,o,!1,"?>");if(!c)throw new Error("Pi Tag is not closed.");if(i=this.saveTextToParentTag(i,r,this.readonlyMatcher),n.ignoreDeclaration&&"?xml"===c.tagName||n.ignorePiTags);else{var f=new O(c.tagName);f.add(n.textNodeName,""),c.tagName!==c.tagExp&&c.attrExpPresent&&(f[":@"]=this.buildAttributesMap(c.tagExp,this.matcher,c.tagName)),this.addChild(r,f,this.readonlyMatcher,o)}o=c.closeIndex+1}else if(33===h&&45===t.charCodeAt(o+2)&&45===t.charCodeAt(o+3)){var g=gt(t,"--\x3e",o+4,"Comment is not closed.");if(n.commentPropName){var m,x=t.substring(o+4,g-2);i=this.saveTextToParentTag(i,r,this.readonlyMatcher),r.add(n.commentPropName,[(m={},m[n.textNodeName]=x,m)])}o=g}else if(33===h&&68===t.charCodeAt(o+2)){var v=s.readDocType(t,o);this.entityReplacer.addInputEntities(v.entities),o=v.i}else if(33===h&&91===t.charCodeAt(o+2)){var b=gt(t,"]]>",o,"CDATA is not closed.")-2,y=t.substring(o+9,b);i=this.saveTextToParentTag(i,r,this.readonlyMatcher);var N,E=this.parseTextData(y,r.tagname,this.readonlyMatcher,!0,!1,!0,!0);null==E&&(E=""),n.cdataPropName?r.add(n.cdataPropName,[(N={},N[n.textNodeName]=y,N)]):r.add(n.textNodeName,E),o=b+2}else{var w=xt(t,o,n.removeNSPrefix);if(!w){var _=t.substring(Math.max(0,o-50),Math.min(a,o+50));throw new Error("readTagExp returned undefined at position "+o+'. Context: "'+_+'"')}var S=w.tagName,T=w.rawTagName,A=w.tagExp,P=w.attrExpPresent,C=w.closeIndex,$=yt(n.transformTagName,S,A,n);if(S=$.tagName,A=$.tagExp,n.strictReservedNames&&(S===n.commentPropName||S===n.cdataPropName||S===n.textNodeName||S===n.attributesGroupName))throw new Error("Invalid tag name: "+S);r&&i&&"!xml"!==r.tagname&&(i=this.saveTextToParentTag(i,r,this.readonlyMatcher,!1));var j=r;j&&n.unpairedTagsSet.has(j.tagname)&&(r=this.tagsNodeStack.pop(),this.matcher.pop());var D=!1;A.length>0&&A.lastIndexOf("/")===A.length-1&&(D=!0,A="/"===S[S.length-1]?S=S.substr(0,S.length-1):A.substr(0,A.length-1),P=S!==A);var L,M=null;L=nt(T),S!==e.tagname&&this.matcher.push(S,{},L),S!==A&&P&&(M=this.buildAttributesMap(A,this.matcher,S))&&it(M,n),S!==e.tagname&&(this.isCurrentNodeStopNode=this.isItStopNode());var V=o;if(this.isCurrentNodeStopNode){var k="";if(D)o=w.closeIndex;else if(n.unpairedTagsSet.has(S))o=w.closeIndex;else{var F=this.readStopNodeData(t,T,C+1);if(!F)throw new Error("Unexpected end of "+T);o=F.i,k=F.tagContent}var R=new O(S);M&&(R[":@"]=M),R.add(n.textNodeName,k),this.matcher.pop(),this.isCurrentNodeStopNode=!1,this.addChild(r,R,this.readonlyMatcher,V)}else{if(D){var B=yt(n.transformTagName,S,A,n);S=B.tagName,A=B.tagExp;var G=new O(S);M&&(G[":@"]=M),this.addChild(r,G,this.readonlyMatcher,V),this.matcher.pop(),this.isCurrentNodeStopNode=!1}else{if(n.unpairedTagsSet.has(S)){var U=new O(S);M&&(U[":@"]=M),this.addChild(r,U,this.readonlyMatcher,V),this.matcher.pop(),this.isCurrentNodeStopNode=!1,o=w.closeIndex;continue}var W=new O(S);if(this.tagsNodeStack.length>n.maxNestedTags)throw new Error("Maximum nested tags exceeded");this.tagsNodeStack.push(r),M&&(W[":@"]=M),this.addChild(r,W,this.readonlyMatcher,V),r=W}i="",o=C}}}else i+=t[o];return e.child};function pt(t,e,r,i){this.options.captureMetaData||(i=void 0);var n=this.options.jPath?r.toString():r,s=this.options.updateTag(e.tagname,n,e[":@"]);!1===s||("string"==typeof s?(e.tagname=s,t.addChild(e,i)):t.addChild(e,i))}function dt(t,e,r){var i=this.options.processEntities;if(!i||!i.enabled)return t;if(i.allowedTags){var n=this.options.jPath?r.toString():r;if(!(Array.isArray(i.allowedTags)?i.allowedTags.includes(e):i.allowedTags(e,n)))return t}if(i.tagFilter){var s=this.options.jPath?r.toString():r;if(!i.tagFilter(e,s))return t}return this.entityReplacer.replace(t)}function ct(t,e,r,i){return t&&(void 0===i&&(i=0===e.child.length),void 0!==(t=this.parseTextData(t,e.tagname,r,!1,!!e[":@"]&&0!==Object.keys(e[":@"]).length,i))&&""!==t&&e.add(this.options.textNodeName,t),t=""),t}function ft(){return 0!==this.stopNodeExpressionsSet.size&&this.matcher.matchesAny(this.stopNodeExpressionsSet)}function gt(t,e,r,i){var n=t.indexOf(e,r);if(-1===n)throw new Error(i);return n+e.length-1}function mt(t,e,r,i){var n=t.indexOf(e,r);if(-1===n)throw new Error(i);return n}function xt(t,e,r,i){void 0===i&&(i=">");var n=function(t,e,r){void 0===r&&(r=">");for(var i=0,n=[],s=t.length,a=r.charCodeAt(0),o=r.length>1?r.charCodeAt(1):-1,h=e;h",r,e+" is not closed");if(t.substring(r+2,o).trim()===e&&0===--n)return{tagContent:t.substring(i,r),i:o};r=o}else if(63===a)r=gt(t,"?>",r+1,"StopNode is not closed.");else if(33===a&&45===t.charCodeAt(r+2)&&45===t.charCodeAt(r+3))r=gt(t,"--\x3e",r+3,"StopNode is not closed.");else if(33===a&&91===t.charCodeAt(r+2))r=gt(t,"]]>",r,"StopNode is not closed.")-2;else{var h=xt(t,r,">");h&&((h&&h.tagName)===e&&"/"!==h.tagExp[h.tagExp.length-1]&&n++,r=h.closeIndex)}}}function bt(t,e,r){if(e&&"string"==typeof t){var i=t.trim();return"true"===i||"false"!==i&&function(t,e={}){if(e=Object.assign({},V,e),!t||"string"!=typeof t)return t;let r=t.trim();if(0===r.length)return t;if(void 0!==e.skipLike&&e.skipLike.test(r))return t;if("0"===r)return 0;if(e.hex&&L.test(r))return function(t){if(parseInt)return parseInt(t,16);if(Number.parseInt)return Number.parseInt(t,16);if(window&&window.parseInt)return window.parseInt(t,16);throw new Error("parseInt, Number.parseInt, window.parseInt are not supported")}(r);if(isFinite(r)){if(r.includes("e")||r.includes("E"))return function(t,e,r){if(!r.eNotation)return t;const i=e.match(k);if(i){let n=i[1]||"";const s=-1===i[3].indexOf("e")?"E":"e",a=i[2],o=n?t[a.length+1]===s:t[a.length]===s;return a.length>1&&o?t:(1!==a.length||!i[3].startsWith(`.${s}`)&&i[3][0]!==s)&&a.length>0?r.leadingZeros&&!o?(e=(i[1]||"")+i[3],Number(e)):t:Number(e)}return t}(t,r,e);{const n=M.exec(r);if(n){const s=n[1]||"",a=n[2];let o=(i=n[3])&&-1!==i.indexOf(".")?("."===(i=i.replace(/0+$/,""))?i="0":"."===i[0]?i="0"+i:"."===i[i.length-1]&&(i=i.substring(0,i.length-1)),i):i;const h=s?"."===t[a.length+1]:"."===t[a.length];if(!e.leadingZeros&&(a.length>1||1===a.length&&!h))return t;{const i=Number(r),n=String(i);if(0===i)return i;if(-1!==n.search(/[eE]/))return e.eNotation?i:t;if(-1!==r.indexOf("."))return"0"===n||n===o||n===`${s}${o}`?i:t;let h=a?o:r;return a?h===n||s+h===n?i:t:h===n||h===s+n?i:t}}return t}}var i;return function(t,e,r){const i=e===1/0;switch(r.infinity.toLowerCase()){case"null":return null;case"infinity":return e;case"string":return i?"Infinity":"-Infinity";default:return t}}(t,Number(r),e)}(t,r)}return void 0!==t?t:""}function yt(t,e,r,i){if(t){var n=t(e);r===e&&(r=n),e=n}return{tagName:e=Nt(e,i),tagExp:r}}function Nt(t,e){if(o.includes(t))throw new Error('[SECURITY] Invalid name: "'+t+'" is a reserved JavaScript keyword that could cause prototype pollution');return a.includes(t)?e.onDangerousProperty(t):t}var Et=O.getMetaDataSymbol();function wt(t,e){if(!t||"object"!=typeof t)return{};if(!e)return t;var r={};for(var i in t)i.startsWith(e)?r[i.substring(e.length)]=t[i]:r[i]=t[i];return r}function _t(t,e,r,i){return St(t,e,r,i)}function St(t,e,r,i){for(var n,s={},a=0;a0&&(s[e.textNodeName]=n):void 0!==n&&(s[e.textNodeName]=n),s}function Tt(t){for(var e=Object.keys(t),r=0;r0&&(r="\n");const i=[];if(e.stopNodes&&Array.isArray(e.stopNodes))for(let t=0;te.maxNestedTags)throw new Error("Maximum nested tags exceeded");if(!Array.isArray(t)){if(null!=t){let r=t.toString();return r=kt(r,e),r}return""}for(let o=0;o`,a=!1,i.pop();continue}if(l===e.commentPropName){s+=r+`\x3c!--${h[l][0][e.textNodeName]}--\x3e`,a=!0,i.pop();continue}if("?"===l[0]){const t=Mt(h[":@"],e,p),n="?xml"===l?"":r;let o=h[l][0][e.textNodeName];o=0!==o.length?" "+o:"",s+=n+`<${l}${o}${t}?>`,a=!0,i.pop();continue}let d=r;""!==d&&(d+=e.indentBy);const c=r+`<${l}${Mt(h[":@"],e,p)}`;let f;f=p?jt(h[l],e):It(h[l],e,d,i,n),-1!==e.unpairedTags.indexOf(l)?e.suppressUnpairedNode?s+=c+">":s+=c+"/>":f&&0!==f.length||!e.suppressEmptyNode?f&&f.endsWith(">")?s+=c+`>${f}${r}`:(s+=c+">",f&&""!==r&&(f.includes("/>")||f.includes("`):s+=c+"/>",a=!0,i.pop()}return s}function $t(t,e){if(!t||e.ignoreAttributes)return null;const r={};let i=!1;for(let n in t)Object.prototype.hasOwnProperty.call(t,n)&&(r[n.startsWith(e.attributeNamePrefix)?n.substr(e.attributeNamePrefix.length):n]=t[n],i=!0);return i?r:null}function jt(t,e){if(!Array.isArray(t))return null!=t?t.toString():"";let r="";for(let i=0;i${i}`:r+=`<${s}${t}/>`}}}return r}function Dt(t,e){let r="";if(t&&!e.ignoreAttributes)for(let i in t){if(!Object.prototype.hasOwnProperty.call(t,i))continue;let n=t[i];!0===n&&e.suppressBooleanAttributes?r+=` ${i.substr(e.attributeNamePrefix.length)}`:r+=` ${i.substr(e.attributeNamePrefix.length)}="${n}"`}return r}function Lt(t){const e=Object.keys(t);for(let r=0;r0&&e.processEntities)for(let r=0;r","g"),val:">"},{regex:new RegExp("<","g"),val:"<"},{regex:new RegExp("'","g"),val:"'"},{regex:new RegExp('"',"g"),val:"""}],processEntities:!0,stopNodes:[],oneListGroup:!1,maxNestedTags:100,jPath:!0};function Rt(t){if(this.options=Object.assign({},Ft,t),this.options.stopNodes&&Array.isArray(this.options.stopNodes)&&(this.options.stopNodes=this.options.stopNodes.map(t=>"string"==typeof t&&t.startsWith("*.")?".."+t.substring(2):t)),this.stopNodeExpressions=[],this.options.stopNodes&&Array.isArray(this.options.stopNodes))for(let t=0;t{for(const r of e){if("string"==typeof r&&t===r)return!0;if(r instanceof RegExp&&r.test(t))return!0}}:()=>!1,this.attrPrefixLen=this.options.attributeNamePrefix.length,this.isAttribute=Ut),this.processTextOrObjNode=Bt,this.options.format?(this.indentate=Gt,this.tagEndChar=">\n",this.newLine="\n"):(this.indentate=function(){return""},this.tagEndChar=">",this.newLine="")}function Bt(t,e,r,i){const n=this.extractAttributes(t);if(i.push(e,n),this.checkStopNode(i)){const n=this.buildRawContent(t),s=this.buildAttributesForStopNode(t);return i.pop(),this.buildObjectNode(n,e,s,r)}const s=this.j2x(t,r+1,i);return i.pop(),void 0!==t[this.options.textNodeName]&&1===Object.keys(t).length?this.buildTextValNode(t[this.options.textNodeName],e,s.attrStr,r,i):this.buildObjectNode(s.val,e,s.attrStr,r)}function Gt(t){return this.options.indentBy.repeat(t)}function Ut(t){return!(!t.startsWith(this.options.attributeNamePrefix)||t===this.options.textNodeName)&&t.substr(this.attrPrefixLen)}Rt.prototype.build=function(t){if(this.options.preserveOrder)return Ot(t,this.options);{Array.isArray(t)&&this.options.arrayNodeName&&this.options.arrayNodeName.length>1&&(t={[this.options.arrayNodeName]:t});const e=new B;return this.j2x(t,0,e).val}},Rt.prototype.j2x=function(t,e,r){let i="",n="";if(this.options.maxNestedTags&&r.getDepth()>=this.options.maxNestedTags)throw new Error("Maximum nested tags exceeded");const s=this.options.jPath?r.toString():r,a=this.checkStopNode(r);for(let o in t)if(Object.prototype.hasOwnProperty.call(t,o))if(void 0===t[o])this.isAttribute(o)&&(n+="");else if(null===t[o])this.isAttribute(o)||o===this.options.cdataPropName?n+="":"?"===o[0]?n+=this.indentate(e)+"<"+o+"?"+this.tagEndChar:n+=this.indentate(e)+"<"+o+"/"+this.tagEndChar;else if(t[o]instanceof Date)n+=this.buildTextValNode(t[o],o,"",e,r);else if("object"!=typeof t[o]){const h=this.isAttribute(o);if(h&&!this.ignoreAttributesFn(h,s))i+=this.buildAttrPairStr(h,""+t[o],a);else if(!h)if(o===this.options.textNodeName){let e=this.options.tagValueProcessor(o,""+t[o]);n+=this.replaceEntitiesValue(e)}else{r.push(o);const i=this.checkStopNode(r);if(r.pop(),i){const r=""+t[o];n+=""===r?this.indentate(e)+"<"+o+this.closeTag(o)+this.tagEndChar:this.indentate(e)+"<"+o+">"+r+""+t+"${t}`;else if("object"==typeof t&&null!==t){const i=this.buildRawContent(t),n=this.buildAttributesForStopNode(t);e+=""===i?`<${r}${n}/>`:`<${r}${n}>${i}`}}else if("object"==typeof i&&null!==i){const t=this.buildRawContent(i),n=this.buildAttributesForStopNode(i);e+=""===t?`<${r}${n}/>`:`<${r}${n}>${t}`}else e+=`<${r}>${i}`}return e},Rt.prototype.buildAttributesForStopNode=function(t){if(!t||"object"!=typeof t)return"";let e="";if(this.options.attributesGroupName&&t[this.options.attributesGroupName]){const r=t[this.options.attributesGroupName];for(let t in r){if(!Object.prototype.hasOwnProperty.call(r,t))continue;const i=t.startsWith(this.options.attributeNamePrefix)?t.substring(this.options.attributeNamePrefix.length):t,n=r[t];!0===n&&this.options.suppressBooleanAttributes?e+=" "+i:e+=" "+i+'="'+n+'"'}}else for(let r in t){if(!Object.prototype.hasOwnProperty.call(t,r))continue;const i=this.isAttribute(r);if(i){const n=t[r];!0===n&&this.options.suppressBooleanAttributes?e+=" "+i:e+=" "+i+'="'+n+'"'}}return e},Rt.prototype.buildObjectNode=function(t,e,r,i){if(""===t)return"?"===e[0]?this.indentate(i)+"<"+e+r+"?"+this.tagEndChar:this.indentate(i)+"<"+e+r+this.closeTag(e)+this.tagEndChar;{let n=""+t+n}},Rt.prototype.closeTag=function(t){let e="";return-1!==this.options.unpairedTags.indexOf(t)?this.options.suppressUnpairedNode||(e="/"):e=this.options.suppressEmptyNode?"/":`>`+this.newLine;if(!1!==this.options.commentPropName&&e===this.options.commentPropName)return this.indentate(i)+`\x3c!--${t}--\x3e`+this.newLine;if("?"===e[0])return this.indentate(i)+"<"+e+r+"?"+this.tagEndChar;{let n=this.options.tagValueProcessor(e,t);return n=this.replaceEntitiesValue(n),""===n?this.indentate(i)+"<"+e+r+this.closeTag(e)+this.tagEndChar:this.indentate(i)+"<"+e+r+">"+n+"0&&this.options.processEntities)for(let e=0;e(()=>{"use strict";var t={d:(e,r)=>{for(var i in r)t.o(r,i)&&!t.o(e,i)&&Object.defineProperty(e,i,{enumerable:!0,get:r[i]})},o:(t,e)=>Object.prototype.hasOwnProperty.call(t,e),r:t=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})}},e={};t.r(e),t.d(e,{XMLBuilder:()=>Wt,XMLParser:()=>Pt,XMLValidator:()=>Xt});var r=":A-Za-z_\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD",i=new RegExp("^["+r+"]["+r+"\\-.\\d\\u00B7\\u0300-\\u036F\\u203F-\\u2040]*$");function n(t,e){for(var r=[],i=e.exec(t);i;){var n=[];n.startIndex=e.lastIndex-i[0].length;for(var s=i.length,a=0;a"!==t[s]&&" "!==t[s]&&"\t"!==t[s]&&"\n"!==t[s]&&"\r"!==t[s];s++)l+=t[s];if("/"===(l=l.trim())[l.length-1]&&(l=l.substring(0,l.length-1),s--),!y(l))return b("InvalidTag",0===l.trim().length?"Invalid space after '<'.":"Tag '"+l+"' is an invalid name.",E(t,s));var c=g(t,s);if(!1===c)return b("InvalidAttr","Attributes for '"+l+"' have open quote.",E(t,s));var f=c.value;if(s=c.index,"/"===f[f.length-1]){var m=s-f.length,N=v(f=f.substring(0,f.length-1),e);if(!0!==N)return b(N.err.code,N.err.msg,E(t,m+N.err.line));i=!0}else if(o){if(!c.tagClosed)return b("InvalidTag","Closing tag '"+l+"' doesn't have proper closing.",E(t,s));if(f.trim().length>0)return b("InvalidTag","Closing tag '"+l+"' can't have attributes or invalid starting.",E(t,a));if(0===r.length)return b("InvalidTag","Closing tag '"+l+"' has not been opened.",E(t,a));var w=r.pop();if(l!==w.tagName){var S=E(t,w.tagStartPos);return b("InvalidTag","Expected closing tag '"+w.tagName+"' (opened in line "+S.line+", col "+S.col+") instead of closing tag '"+l+"'.",E(t,a))}0==r.length&&(n=!0)}else{var _=v(f,e);if(!0!==_)return b(_.err.code,_.err.msg,E(t,s-f.length+_.err.line));if(!0===n)return b("InvalidXml","Multiple possible root nodes found.",E(t,s));-1!==e.unpairedTags.indexOf(l)||r.push({tagName:l,tagStartPos:a}),i=!0}for(s++;s0)||b("InvalidXml","Invalid '"+JSON.stringify(r.map(function(t){return t.tagName}),null,4).replace(/\r?\n/g,"")+"' found.",{line:1,col:1}):b("InvalidXml","Start tag expected.",1)}function u(t){return" "===t||"\t"===t||"\n"===t||"\r"===t}function p(t,e){for(var r=e;e5&&"xml"===i)return b("InvalidXml","XML declaration allowed only at the start of the document.",E(t,e));if("?"==t[e]&&">"==t[e+1]){e++;break}}return e}function d(t,e){if(t.length>e+5&&"-"===t[e+1]&&"-"===t[e+2]){for(e+=3;e"===t[e+2]){e+=2;break}}else if(t.length>e+8&&"D"===t[e+1]&&"O"===t[e+2]&&"C"===t[e+3]&&"T"===t[e+4]&&"Y"===t[e+5]&&"P"===t[e+6]&&"E"===t[e+7]){var r=1;for(e+=8;e"===t[e]&&0===--r)break}else if(t.length>e+9&&"["===t[e+1]&&"C"===t[e+2]&&"D"===t[e+3]&&"A"===t[e+4]&&"T"===t[e+5]&&"A"===t[e+6]&&"["===t[e+7])for(e+=8;e"===t[e+2]){e+=2;break}return e}var c='"',f="'";function g(t,e){for(var r="",i="",n=!1;e"===t[e]&&""===i){n=!0;break}r+=t[e]}return""===i&&{value:r,index:e,tagClosed:n}}var m=new RegExp("(\\s*)([^\\s=]+)(\\s*=)?(\\s*(['\"])(([\\s\\S])*?)\\5)?","g");function v(t,e){for(var r=n(t,m),i={},s=0;s0?this.child.push(((r={})[t.tagname]=t.child,r[":@"]=t[":@"],r)):this.child.push(((i={})[t.tagname]=t.child,i)),void 0!==e&&(this.child[this.child.length-1][C]={startIndex:e})},t.getMetaDataSymbol=function(){return C},t}(),I=function(){function t(t){this.suppressValidationErr=!t,this.options=t}var e=t.prototype;return e.readDocType=function(t,e){var r=Object.create(null),i=0;if("O"!==t[e+3]||"C"!==t[e+4]||"T"!==t[e+5]||"Y"!==t[e+6]||"P"!==t[e+7]||"E"!==t[e+8])throw new Error("Invalid Tag instead of DOCTYPE");e+=9;for(var n=1,s=!1,a=!1;e"===t[e]){if(a?"-"===t[e-1]&&"-"===t[e-2]&&(a=!1,n--):n--,0===n)break}else"["===t[e]?s=!0:t[e];else{if(s&&D(t,"!ENTITY",e)){e+=7;var o,h=void 0,l=this.readEntityExp(t,e+1,this.suppressValidationErr);if(o=l[0],h=l[1],e=l[2],-1===h.indexOf("&")){if(!1!==this.options.enabled&&null!=this.options.maxEntityCount&&i>=this.options.maxEntityCount)throw new Error("Entity count ("+(i+1)+") exceeds maximum allowed ("+this.options.maxEntityCount+")");r[o]=h,i++}}else if(s&&D(t,"!ELEMENT",e))e+=8,e=this.readElementExp(t,e+1).index;else if(s&&D(t,"!ATTLIST",e))e+=8;else if(s&&D(t,"!NOTATION",e))e+=9,e=this.readNotationExp(t,e+1,this.suppressValidationErr).index;else{if(!D(t,"!--",e))throw new Error("Invalid DOCTYPE");a=!0}n++}if(0!==n)throw new Error("Unclosed DOCTYPE");return{entities:r,i:e}},e.readEntityExp=function(t,e){for(var r=e=j(t,e);ethis.options.maxEntitySize)throw new Error('Entity "'+i+'" size ('+n.length+") exceeds maximum allowed size ("+this.options.maxEntitySize+")");return[i,n,--e]},e.readNotationExp=function(t,e){for(var r=e=j(t,e);et.length)&&(e=t.length);for(var r=0,i=Array(e);r0?t[t.length-1].tag:void 0}getCurrentNamespace(){const t=this._matcher.path;return t.length>0?t[t.length-1].namespace:void 0}getAttrValue(t){const e=this._matcher.path;if(0!==e.length)return e[e.length-1].values?.[t]}hasAttr(t){const e=this._matcher.path;if(0===e.length)return!1;const r=e[e.length-1];return void 0!==r.values&&t in r.values}getPosition(){const t=this._matcher.path;return 0===t.length?-1:t[t.length-1].position??0}getCounter(){const t=this._matcher.path;return 0===t.length?-1:t[t.length-1].counter??0}getIndex(){return this.getPosition()}getDepth(){return this._matcher.path.length}toString(t,e=!0){return this._matcher.toString(t,e)}toArray(){return this._matcher.path.map(t=>t.tag)}matches(t){return this._matcher.matches(t)}matchesAny(t){return t.matchesAny(this._matcher)}}class G{constructor(t={}){this.separator=t.separator||".",this.path=[],this.siblingStacks=[],this._pathStringCache=null,this._view=new R(this)}push(t,e=null,r=null){this._pathStringCache=null,this.path.length>0&&(this.path[this.path.length-1].values=void 0);const i=this.path.length;this.siblingStacks[i]||(this.siblingStacks[i]=new Map);const n=this.siblingStacks[i],s=r?`${r}:${t}`:t,a=n.get(s)||0;let o=0;for(const t of n.values())o+=t;n.set(s,a+1);const h={tag:t,position:o,counter:a};null!=r&&(h.namespace=r),null!=e&&(h.values=e),this.path.push(h)}pop(){if(0===this.path.length)return;this._pathStringCache=null;const t=this.path.pop();return this.siblingStacks.length>this.path.length+1&&(this.siblingStacks.length=this.path.length+1),t}updateCurrent(t){if(this.path.length>0){const e=this.path[this.path.length-1];null!=t&&(e.values=t)}}getCurrentTag(){return this.path.length>0?this.path[this.path.length-1].tag:void 0}getCurrentNamespace(){return this.path.length>0?this.path[this.path.length-1].namespace:void 0}getAttrValue(t){if(0!==this.path.length)return this.path[this.path.length-1].values?.[t]}hasAttr(t){if(0===this.path.length)return!1;const e=this.path[this.path.length-1];return void 0!==e.values&&t in e.values}getPosition(){return 0===this.path.length?-1:this.path[this.path.length-1].position??0}getCounter(){return 0===this.path.length?-1:this.path[this.path.length-1].counter??0}getIndex(){return this.getPosition()}getDepth(){return this.path.length}toString(t,e=!0){const r=t||this.separator;if(r===this.separator&&!0===e){if(null!==this._pathStringCache)return this._pathStringCache;const t=this.path.map(t=>t.namespace?`${t.namespace}:${t.tag}`:t.tag).join(r);return this._pathStringCache=t,t}return this.path.map(t=>e&&t.namespace?`${t.namespace}:${t.tag}`:t.tag).join(r)}toArray(){return this.path.map(t=>t.tag)}reset(){this._pathStringCache=null,this.path=[],this.siblingStacks=[]}matches(t){const e=t.segments;return 0!==e.length&&(t.hasDeepWildcard()?this._matchWithDeepWildcard(e):this._matchSimple(e))}_matchSimple(t){if(this.path.length!==t.length)return!1;for(let e=0;e=0&&e>=0;){const i=t[r];if("deep-wildcard"===i.type){if(r--,r<0)return!0;const i=t[r];let n=!1;for(let t=e;t>=0;t--)if(this._matchSegment(i,this.path[t],t===this.path.length-1)){e=t-1,r--,n=!0;break}if(!n)return!1}else{if(!this._matchSegment(i,this.path[e],e===this.path.length-1))return!1;e--,r--}}return r<0}_matchSegment(t,e,r){if("*"!==t.tag&&t.tag!==e.tag)return!1;if(void 0!==t.namespace&&"*"!==t.namespace&&t.namespace!==e.namespace)return!1;if(void 0!==t.attrName){if(!r)return!1;if(!e.values||!(t.attrName in e.values))return!1;if(void 0!==t.attrValue&&String(e.values[t.attrName])!==String(t.attrValue))return!1}if(void 0!==t.position){if(!r)return!1;const i=e.counter??0;if("first"===t.position&&0!==i)return!1;if("odd"===t.position&&i%2!=1)return!1;if("even"===t.position&&i%2!=0)return!1;if("nth"===t.position&&i!==t.positionValue)return!1}return!0}matchesAny(t){return t.matchesAny(this)}snapshot(){return{path:this.path.map(t=>({...t})),siblingStacks:this.siblingStacks.map(t=>new Map(t))}}restore(t){this._pathStringCache=null,this.path=t.path.map(t=>({...t})),this.siblingStacks=t.siblingStacks.map(t=>new Map(t))}readOnly(){return this._view}}class U{constructor(t,e={},r){this.pattern=t,this.separator=e.separator||".",this.segments=this._parse(t),this.data=r,this._hasDeepWildcard=this.segments.some(t=>"deep-wildcard"===t.type),this._hasAttributeCondition=this.segments.some(t=>void 0!==t.attrName),this._hasPositionSelector=this.segments.some(t=>void 0!==t.position)}_parse(t){const e=[];let r=0,i="";for(;r",lt:"<",quot:'"'},Y={nbsp:" ",copy:"©",reg:"®",trade:"™",mdash:"—",ndash:"–",hellip:"…",laquo:"«",raquo:"»",lsquo:"‘",rsquo:"’",ldquo:"“",rdquo:"”",bull:"•",para:"¶",sect:"§",deg:"°",frac12:"½",frac14:"¼",frac34:"¾"},z=new Set("!?\\\\/[]$%{}^&*()<>|+");function q(t){if("#"===t[0])throw new Error(`[EntityReplacer] Invalid character '#' in entity name: "${t}"`);for(const e of t)if(z.has(e))throw new Error(`[EntityReplacer] Invalid character '${e}' in entity name: "${t}"`);return t}function Z(...t){const e=Object.create(null);for(const r of t)if(r)for(const t of Object.keys(r)){const i=r[t];if("string"==typeof i)e[t]=i;else if(i&&"object"==typeof i&&void 0!==i.val){const r=i.val;"string"==typeof r&&(e[t]=r)}}return e}const J="external",K="base",Q="all",H=Object.freeze({allow:0,leave:1,remove:2,throw:3}),tt=new Set([9,10,13]);class et{constructor(t={}){var e;this._limit=t.limit||{},this._maxTotalExpansions=this._limit.maxTotalExpansions||0,this._maxExpandedLength=this._limit.maxExpandedLength||0,this._postCheck="function"==typeof t.postCheck?t.postCheck:t=>t,this._limitTiers=(e=this._limit.applyLimitsTo??J)&&e!==J?e===Q?new Set([Q]):e===K?new Set([K]):Array.isArray(e)?new Set(e):new Set([J]):new Set([J]),this._numericAllowed=t.numericAllowed??!0,this._baseMap=Z(X,t.namedEntities||null),this._externalMap=Object.create(null),this._inputMap=Object.create(null),this._totalExpansions=0,this._expandedLength=0,this._removeSet=new Set(t.remove&&Array.isArray(t.remove)?t.remove:[]),this._leaveSet=new Set(t.leave&&Array.isArray(t.leave)?t.leave:[]);const r=function(t){if(!t)return{xmlVersion:1,onLevel:H.allow,nullLevel:H.remove};const e=1.1===t.xmlVersion?1.1:1,r=H[t.onNCR]??H.allow,i=H[t.nullNCR]??H.remove;return{xmlVersion:e,onLevel:r,nullLevel:Math.max(i,H.remove)}}(t.ncr);this._ncrXmlVersion=r.xmlVersion,this._ncrOnLevel=r.onLevel,this._ncrNullLevel=r.nullLevel}setExternalEntities(t){if(t)for(const e of Object.keys(t))q(e);this._externalMap=Z(t)}addExternalEntity(t,e){q(t),"string"==typeof e&&-1===e.indexOf("&")&&(this._externalMap[t]=e)}addInputEntities(t){this._totalExpansions=0,this._expandedLength=0,this._inputMap=Z(t)}reset(){return this._inputMap=Object.create(null),this._totalExpansions=0,this._expandedLength=0,this}setXmlVersion(t){this._ncrXmlVersion=1.1===t?1.1:1}decode(t){if("string"!=typeof t||0===t.length)return t;const e=t,r=[],i=t.length;let n=0,s=0;const a=this._maxTotalExpansions>0,o=this._maxExpandedLength>0,h=a||o;for(;s=i||59!==t.charCodeAt(e)){s++;continue}const l=t.slice(s+1,e);if(0===l.length){s++;continue}let u,p;if(this._removeSet.has(l))u="",void 0===p&&(p=J);else{if(this._leaveSet.has(l)){s++;continue}if(35===l.charCodeAt(0)){const t=this._resolveNCR(l);if(void 0===t){s++;continue}u=t,p=K}else{const t=this._resolveName(l);u=t?.value,p=t?.tier}}if(void 0!==u){if(s>n&&r.push(t.slice(n,s)),r.push(u),n=e+1,s=n,h&&this._tierCounts(p)){if(a&&(this._totalExpansions++,this._totalExpansions>this._maxTotalExpansions))throw new Error(`[EntityReplacer] Entity expansion count limit exceeded: ${this._totalExpansions} > ${this._maxTotalExpansions}`);if(o){const t=u.length-(l.length+2);if(t>0&&(this._expandedLength+=t,this._expandedLength>this._maxExpandedLength))throw new Error(`[EntityReplacer] Expanded content length limit exceeded: ${this._expandedLength} > ${this._maxExpandedLength}`)}}}else s++}n=55296&&t<=57343||1===this._ncrXmlVersion&&t>=1&&t<=31&&!tt.has(t)?H.remove:-1}_applyNCRAction(t,e,r){switch(t){case H.allow:return String.fromCodePoint(r);case H.remove:return"";case H.leave:return;case H.throw:throw new Error(`[EntityDecoder] Prohibited numeric character reference &${e}; (U+${r.toString(16).toUpperCase().padStart(4,"0")})`);default:return String.fromCodePoint(r)}}_resolveNCR(t){const e=t.charCodeAt(1);let r;if(r=120===e||88===e?parseInt(t.slice(2),16):parseInt(t.slice(1),10),Number.isNaN(r)||r<0||r>1114111)return;const i=this._classifyNCR(r);if(!this._numericAllowed&&i0){var r=t.substring(0,e);if("xmlns"!==r)return r}}}var st=function(t){var e;this.options=t,this.currentNode=null,this.tagsNodeStack=[],this.parseXml=ut,this.parseTextData=at,this.resolveNameSpace=ot,this.buildAttributesMap=lt,this.isItStopNode=ft,this.replaceEntitiesValue=dt,this.readStopNodeData=xt,this.saveTextToParentTag=ct,this.addChild=pt,this.ignoreAttributesFn="function"==typeof(e=this.options.ignoreAttributes)?e:Array.isArray(e)?function(t){for(var r,i=function(t,e){var r="undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(r)return(r=r.call(t)).next.bind(r);if(Array.isArray(t)||(r=function(t,e){if(t){if("string"==typeof t)return F(t,e);var r={}.toString.call(t).slice(8,-1);return"Object"===r&&t.constructor&&(r=t.constructor.name),"Map"===r||"Set"===r?Array.from(t):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?F(t,e):void 0}}(t))||e&&t&&"number"==typeof t.length){r&&(t=r);var i=0;return function(){return i>=t.length?{done:!0}:{done:!1,value:t[i++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}(e);!(r=i()).done;){var n=r.value;if("string"==typeof n&&t===n)return!0;if(n instanceof RegExp&&n.test(t))return!0}}:function(){return!1},this.entityExpansionCount=0,this.currentExpandedLength=0;var r=rt({},X);this.options.entityDecoder?this.entityDecoder=this.options.entityDecoder:("object"==typeof this.options.htmlEntities?r=this.options.htmlEntities:!0===this.options.htmlEntities&&(r=rt({},Y,W)),this.entityDecoder=new et({namedEntities:r,numericAllowed:this.options.htmlEntities,limit:{maxTotalExpansions:this.options.processEntities.maxTotalExpansions,maxExpandedLength:this.options.processEntities.maxExpandedLength,applyLimitsTo:this.options.processEntities.appliesTo}})),this.matcher=new G,this.readonlyMatcher=this.matcher.readOnly(),this.isCurrentNodeStopNode=!1,this.stopNodeExpressionsSet=new B;var i=this.options.stopNodes;if(i&&i.length>0){for(var n=0;n0)){a||(t=this.replaceEntitiesValue(t,e,r));var h=o.jPath?r.toString():r,l=o.tagValueProcessor(e,t,h,n,s);return null==l?t:typeof l!=typeof t||l!==t?l:o.trimValues||t.trim()===t?bt(t,o.parseTagValue,o.numberParseOptions):t}}function ot(t){if(this.options.removeNSPrefix){var e=t.split(":"),r="/"===t.charAt(0)?"/":"";if("xmlns"===e[0])return"";2===e.length&&(t=r+e[1])}return t}var ht=new RegExp("([^\\s=]+)\\s*(=\\s*(['\"])([\\s\\S]*?)\\3)?","gm");function lt(t,e,r){var i=this.options;if(!0!==i.ignoreAttributes&&"string"==typeof t){for(var s=n(t,ht),a=s.length,o={},h=new Array(a),l=!1,u={},p=0;p",o,"Closing Tag is not closed."),u=t.substring(o+2,l).trim();if(n.removeNSPrefix){var p=u.indexOf(":");-1!==p&&(u=u.substr(p+1))}u=Nt(n.transformTagName,u,"",n).tagName,r&&(i=this.saveTextToParentTag(i,r,this.readonlyMatcher));var d=this.matcher.getCurrentTag();if(u&&n.unpairedTagsSet.has(u))throw new Error("Unpaired tag can not be used as closing tag: ");d&&n.unpairedTagsSet.has(d)&&(this.matcher.pop(),this.tagsNodeStack.pop()),this.matcher.pop(),this.isCurrentNodeStopNode=!1,r=this.tagsNodeStack.pop(),i="",o=l}else if(63===h){var c=vt(t,o,!1,"?>");if(!c)throw new Error("Pi Tag is not closed.");i=this.saveTextToParentTag(i,r,this.readonlyMatcher);var f=this.buildAttributesMap(c.tagExp,this.matcher,c.tagName);if(f&&f.version&&this.entityDecoder.setXmlVersion(f.version),n.ignoreDeclaration&&"?xml"===c.tagName||n.ignorePiTags);else{var g=new O(c.tagName);g.add(n.textNodeName,""),c.tagName!==c.tagExp&&c.attrExpPresent&&(g[":@"]=f),this.addChild(r,g,this.readonlyMatcher,o)}o=c.closeIndex+1}else if(33===h&&45===t.charCodeAt(o+2)&&45===t.charCodeAt(o+3)){var m=gt(t,"--\x3e",o+4,"Comment is not closed.");if(n.commentPropName){var v,x=t.substring(o+4,m-2);i=this.saveTextToParentTag(i,r,this.readonlyMatcher),r.add(n.commentPropName,[(v={},v[n.textNodeName]=x,v)])}o=m}else if(33===h&&68===t.charCodeAt(o+2)){var b=s.readDocType(t,o);this.entityDecoder.addInputEntities(b.entities),o=b.i}else if(33===h&&91===t.charCodeAt(o+2)){var N=gt(t,"]]>",o,"CDATA is not closed.")-2,y=t.substring(o+9,N);i=this.saveTextToParentTag(i,r,this.readonlyMatcher);var E,w=this.parseTextData(y,r.tagname,this.readonlyMatcher,!0,!1,!0,!0);null==w&&(w=""),n.cdataPropName?r.add(n.cdataPropName,[(E={},E[n.textNodeName]=y,E)]):r.add(n.textNodeName,w),o=N+2}else{var S=vt(t,o,n.removeNSPrefix);if(!S){var _=t.substring(Math.max(0,o-50),Math.min(a,o+50));throw new Error("readTagExp returned undefined at position "+o+'. Context: "'+_+'"')}var A=S.tagName,T=S.rawTagName,C=S.tagExp,P=S.attrExpPresent,j=S.closeIndex,D=Nt(n.transformTagName,A,C,n);if(A=D.tagName,C=D.tagExp,n.strictReservedNames&&(A===n.commentPropName||A===n.cdataPropName||A===n.textNodeName||A===n.attributesGroupName))throw new Error("Invalid tag name: "+A);r&&i&&"!xml"!==r.tagname&&(i=this.saveTextToParentTag(i,r,this.readonlyMatcher,!1));var M=r;M&&n.unpairedTagsSet.has(M.tagname)&&(r=this.tagsNodeStack.pop(),this.matcher.pop());var $=!1;C.length>0&&C.lastIndexOf("/")===C.length-1&&($=!0,C="/"===A[A.length-1]?A=A.substr(0,A.length-1):C.substr(0,C.length-1),P=A!==C);var V,L=null;V=nt(T),A!==e.tagname&&this.matcher.push(A,{},V),A!==C&&P&&(L=this.buildAttributesMap(C,this.matcher,A))&&it(L,n),A!==e.tagname&&(this.isCurrentNodeStopNode=this.isItStopNode());var k=o;if(this.isCurrentNodeStopNode){var F="";if($)o=S.closeIndex;else if(n.unpairedTagsSet.has(A))o=S.closeIndex;else{var R=this.readStopNodeData(t,T,j+1);if(!R)throw new Error("Unexpected end of "+T);o=R.i,F=R.tagContent}var G=new O(A);L&&(G[":@"]=L),G.add(n.textNodeName,F),this.matcher.pop(),this.isCurrentNodeStopNode=!1,this.addChild(r,G,this.readonlyMatcher,k)}else{if($){var U=Nt(n.transformTagName,A,C,n);A=U.tagName,C=U.tagExp;var B=new O(A);L&&(B[":@"]=L),this.addChild(r,B,this.readonlyMatcher,k),this.matcher.pop(),this.isCurrentNodeStopNode=!1}else{if(n.unpairedTagsSet.has(A)){var W=new O(A);L&&(W[":@"]=L),this.addChild(r,W,this.readonlyMatcher,k),this.matcher.pop(),this.isCurrentNodeStopNode=!1,o=S.closeIndex;continue}var X=new O(A);if(this.tagsNodeStack.length>n.maxNestedTags)throw new Error("Maximum nested tags exceeded");this.tagsNodeStack.push(r),L&&(X[":@"]=L),this.addChild(r,X,this.readonlyMatcher,k),r=X}i="",o=j}}}else i+=t[o];return e.child};function pt(t,e,r,i){this.options.captureMetaData||(i=void 0);var n=this.options.jPath?r.toString():r,s=this.options.updateTag(e.tagname,n,e[":@"]);!1===s||("string"==typeof s?(e.tagname=s,t.addChild(e,i)):t.addChild(e,i))}function dt(t,e,r){var i=this.options.processEntities;if(!i||!i.enabled)return t;if(i.allowedTags){var n=this.options.jPath?r.toString():r;if(!(Array.isArray(i.allowedTags)?i.allowedTags.includes(e):i.allowedTags(e,n)))return t}if(i.tagFilter){var s=this.options.jPath?r.toString():r;if(!i.tagFilter(e,s))return t}return this.entityDecoder.decode(t)}function ct(t,e,r,i){return t&&(void 0===i&&(i=0===e.child.length),void 0!==(t=this.parseTextData(t,e.tagname,r,!1,!!e[":@"]&&0!==Object.keys(e[":@"]).length,i))&&""!==t&&e.add(this.options.textNodeName,t),t=""),t}function ft(){return 0!==this.stopNodeExpressionsSet.size&&this.matcher.matchesAny(this.stopNodeExpressionsSet)}function gt(t,e,r,i){var n=t.indexOf(e,r);if(-1===n)throw new Error(i);return n+e.length-1}function mt(t,e,r,i){var n=t.indexOf(e,r);if(-1===n)throw new Error(i);return n}function vt(t,e,r,i){void 0===i&&(i=">");var n=function(t,e,r){void 0===r&&(r=">");for(var i=0,n=!1,s=t.length,a=r.charCodeAt(0),o=r.length>1?r.charCodeAt(1):-1,h=-1,l=e;l",r,e+" is not closed");if(t.substring(r+2,o).trim()===e&&0===--n)return{tagContent:t.substring(i,r),i:o};r=o}else if(63===a)r=gt(t,"?>",r+1,"StopNode is not closed.");else if(33===a&&45===t.charCodeAt(r+2)&&45===t.charCodeAt(r+3))r=gt(t,"--\x3e",r+3,"StopNode is not closed.");else if(33===a&&91===t.charCodeAt(r+2))r=gt(t,"]]>",r,"StopNode is not closed.")-2;else{var h=vt(t,r,">");h&&((h&&h.tagName)===e&&"/"!==h.tagExp[h.tagExp.length-1]&&n++,r=h.closeIndex)}}}function bt(t,e,r){if(e&&"string"==typeof t){var i=t.trim();return"true"===i||"false"!==i&&function(t,e={}){if(e=Object.assign({},L,e),!t||"string"!=typeof t)return t;let r=t.trim();if(0===r.length)return t;if(void 0!==e.skipLike&&e.skipLike.test(r))return t;if("0"===r)return 0;if(e.hex&&$.test(r))return function(t){if(parseInt)return parseInt(t,16);if(Number.parseInt)return Number.parseInt(t,16);if(window&&window.parseInt)return window.parseInt(t,16);throw new Error("parseInt, Number.parseInt, window.parseInt are not supported")}(r);if(isFinite(r)){if(r.includes("e")||r.includes("E"))return function(t,e,r){if(!r.eNotation)return t;const i=e.match(k);if(i){let n=i[1]||"";const s=-1===i[3].indexOf("e")?"E":"e",a=i[2],o=n?t[a.length+1]===s:t[a.length]===s;return a.length>1&&o?t:(1!==a.length||!i[3].startsWith(`.${s}`)&&i[3][0]!==s)&&a.length>0?r.leadingZeros&&!o?(e=(i[1]||"")+i[3],Number(e)):t:Number(e)}return t}(t,r,e);{const n=V.exec(r);if(n){const s=n[1]||"",a=n[2];let o=(i=n[3])&&-1!==i.indexOf(".")?("."===(i=i.replace(/0+$/,""))?i="0":"."===i[0]?i="0"+i:"."===i[i.length-1]&&(i=i.substring(0,i.length-1)),i):i;const h=s?"."===t[a.length+1]:"."===t[a.length];if(!e.leadingZeros&&(a.length>1||1===a.length&&!h))return t;{const i=Number(r),n=String(i);if(0===i)return i;if(-1!==n.search(/[eE]/))return e.eNotation?i:t;if(-1!==r.indexOf("."))return"0"===n||n===o||n===`${s}${o}`?i:t;let h=a?o:r;return a?h===n||s+h===n?i:t:h===n||h===s+n?i:t}}return t}}var i;return function(t,e,r){const i=e===1/0;switch(r.infinity.toLowerCase()){case"null":return null;case"infinity":return e;case"string":return i?"Infinity":"-Infinity";default:return t}}(t,Number(r),e)}(t,r)}return void 0!==t?t:""}function Nt(t,e,r,i){if(t){var n=t(e);r===e&&(r=n),e=n}return{tagName:e=yt(e,i),tagExp:r}}function yt(t,e){if(o.includes(t))throw new Error('[SECURITY] Invalid name: "'+t+'" is a reserved JavaScript keyword that could cause prototype pollution');return a.includes(t)?e.onDangerousProperty(t):t}var Et=O.getMetaDataSymbol();function wt(t,e){if(!t||"object"!=typeof t)return{};if(!e)return t;var r={};for(var i in t)i.startsWith(e)?r[i.substring(e.length)]=t[i]:r[i]=t[i];return r}function St(t,e,r,i){return _t(t,e,r,i)}function _t(t,e,r,i){for(var n,s={},a=0;a0&&(s[e.textNodeName]=n):void 0!==n&&(s[e.textNodeName]=n),s}function At(t){for(var e=Object.keys(t),r=0;r0&&(r="\n");const i=[];if(e.stopNodes&&Array.isArray(e.stopNodes))for(let t=0;te.maxNestedTags)throw new Error("Maximum nested tags exceeded");if(!Array.isArray(t)){if(null!=t){let r=t.toString();return r=kt(r,e),r}return""}for(let o=0;o`,a=!1,i.pop();continue}if(l===e.commentPropName){s+=r+`\x3c!--${h[l][0][e.textNodeName]}--\x3e`,a=!0,i.pop();continue}if("?"===l[0]){const t=Vt(h[":@"],e,p),n="?xml"===l?"":r;let o=h[l][0][e.textNodeName];o=0!==o.length?" "+o:"",s+=n+`<${l}${o}${t}?>`,a=!0,i.pop();continue}let d=r;""!==d&&(d+=e.indentBy);const c=r+`<${l}${Vt(h[":@"],e,p)}`;let f;f=p?Dt(h[l],e):It(h[l],e,d,i,n),-1!==e.unpairedTags.indexOf(l)?e.suppressUnpairedNode?s+=c+">":s+=c+"/>":f&&0!==f.length||!e.suppressEmptyNode?f&&f.endsWith(">")?s+=c+`>${f}${r}`:(s+=c+">",f&&""!==r&&(f.includes("/>")||f.includes("`):s+=c+"/>",a=!0,i.pop()}return s}function jt(t,e){if(!t||e.ignoreAttributes)return null;const r={};let i=!1;for(let n in t)Object.prototype.hasOwnProperty.call(t,n)&&(r[n.startsWith(e.attributeNamePrefix)?n.substr(e.attributeNamePrefix.length):n]=t[n],i=!0);return i?r:null}function Dt(t,e){if(!Array.isArray(t))return null!=t?t.toString():"";let r="";for(let i=0;i${i}`:r+=`<${s}${t}/>`}}}return r}function Mt(t,e){let r="";if(t&&!e.ignoreAttributes)for(let i in t){if(!Object.prototype.hasOwnProperty.call(t,i))continue;let n=t[i];!0===n&&e.suppressBooleanAttributes?r+=` ${i.substr(e.attributeNamePrefix.length)}`:r+=` ${i.substr(e.attributeNamePrefix.length)}="${n}"`}return r}function $t(t){const e=Object.keys(t);for(let r=0;r0&&e.processEntities)for(let r=0;r","g"),val:">"},{regex:new RegExp("<","g"),val:"<"},{regex:new RegExp("'","g"),val:"'"},{regex:new RegExp('"',"g"),val:"""}],processEntities:!0,stopNodes:[],oneListGroup:!1,maxNestedTags:100,jPath:!0};function Rt(t){if(this.options=Object.assign({},Ft,t),this.options.stopNodes&&Array.isArray(this.options.stopNodes)&&(this.options.stopNodes=this.options.stopNodes.map(t=>"string"==typeof t&&t.startsWith("*.")?".."+t.substring(2):t)),this.stopNodeExpressions=[],this.options.stopNodes&&Array.isArray(this.options.stopNodes))for(let t=0;t{for(const r of e){if("string"==typeof r&&t===r)return!0;if(r instanceof RegExp&&r.test(t))return!0}}:()=>!1,this.attrPrefixLen=this.options.attributeNamePrefix.length,this.isAttribute=Bt),this.processTextOrObjNode=Gt,this.options.format?(this.indentate=Ut,this.tagEndChar=">\n",this.newLine="\n"):(this.indentate=function(){return""},this.tagEndChar=">",this.newLine="")}function Gt(t,e,r,i){const n=this.extractAttributes(t);if(i.push(e,n),this.checkStopNode(i)){const n=this.buildRawContent(t),s=this.buildAttributesForStopNode(t);return i.pop(),this.buildObjectNode(n,e,s,r)}const s=this.j2x(t,r+1,i);return i.pop(),void 0!==t[this.options.textNodeName]&&1===Object.keys(t).length?this.buildTextValNode(t[this.options.textNodeName],e,s.attrStr,r,i):this.buildObjectNode(s.val,e,s.attrStr,r)}function Ut(t){return this.options.indentBy.repeat(t)}function Bt(t){return!(!t.startsWith(this.options.attributeNamePrefix)||t===this.options.textNodeName)&&t.substr(this.attrPrefixLen)}Rt.prototype.build=function(t){if(this.options.preserveOrder)return Ot(t,this.options);{Array.isArray(t)&&this.options.arrayNodeName&&this.options.arrayNodeName.length>1&&(t={[this.options.arrayNodeName]:t});const e=new G;return this.j2x(t,0,e).val}},Rt.prototype.j2x=function(t,e,r){let i="",n="";if(this.options.maxNestedTags&&r.getDepth()>=this.options.maxNestedTags)throw new Error("Maximum nested tags exceeded");const s=this.options.jPath?r.toString():r,a=this.checkStopNode(r);for(let o in t)if(Object.prototype.hasOwnProperty.call(t,o))if(void 0===t[o])this.isAttribute(o)&&(n+="");else if(null===t[o])this.isAttribute(o)||o===this.options.cdataPropName?n+="":"?"===o[0]?n+=this.indentate(e)+"<"+o+"?"+this.tagEndChar:n+=this.indentate(e)+"<"+o+"/"+this.tagEndChar;else if(t[o]instanceof Date)n+=this.buildTextValNode(t[o],o,"",e,r);else if("object"!=typeof t[o]){const h=this.isAttribute(o);if(h&&!this.ignoreAttributesFn(h,s))i+=this.buildAttrPairStr(h,""+t[o],a);else if(!h)if(o===this.options.textNodeName){let e=this.options.tagValueProcessor(o,""+t[o]);n+=this.replaceEntitiesValue(e)}else{r.push(o);const i=this.checkStopNode(r);if(r.pop(),i){const r=""+t[o];n+=""===r?this.indentate(e)+"<"+o+this.closeTag(o)+this.tagEndChar:this.indentate(e)+"<"+o+">"+r+""+t+"${t}`;else if("object"==typeof t&&null!==t){const i=this.buildRawContent(t),n=this.buildAttributesForStopNode(t);e+=""===i?`<${r}${n}/>`:`<${r}${n}>${i}`}}else if("object"==typeof i&&null!==i){const t=this.buildRawContent(i),n=this.buildAttributesForStopNode(i);e+=""===t?`<${r}${n}/>`:`<${r}${n}>${t}`}else e+=`<${r}>${i}`}return e},Rt.prototype.buildAttributesForStopNode=function(t){if(!t||"object"!=typeof t)return"";let e="";if(this.options.attributesGroupName&&t[this.options.attributesGroupName]){const r=t[this.options.attributesGroupName];for(let t in r){if(!Object.prototype.hasOwnProperty.call(r,t))continue;const i=t.startsWith(this.options.attributeNamePrefix)?t.substring(this.options.attributeNamePrefix.length):t,n=r[t];!0===n&&this.options.suppressBooleanAttributes?e+=" "+i:e+=" "+i+'="'+n+'"'}}else for(let r in t){if(!Object.prototype.hasOwnProperty.call(t,r))continue;const i=this.isAttribute(r);if(i){const n=t[r];!0===n&&this.options.suppressBooleanAttributes?e+=" "+i:e+=" "+i+'="'+n+'"'}}return e},Rt.prototype.buildObjectNode=function(t,e,r,i){if(""===t)return"?"===e[0]?this.indentate(i)+"<"+e+r+"?"+this.tagEndChar:this.indentate(i)+"<"+e+r+this.closeTag(e)+this.tagEndChar;{let n=""+t+n}},Rt.prototype.closeTag=function(t){let e="";return-1!==this.options.unpairedTags.indexOf(t)?this.options.suppressUnpairedNode||(e="/"):e=this.options.suppressEmptyNode?"/":`>`+this.newLine;if(!1!==this.options.commentPropName&&e===this.options.commentPropName)return this.indentate(i)+`\x3c!--${t}--\x3e`+this.newLine;if("?"===e[0])return this.indentate(i)+"<"+e+r+"?"+this.tagEndChar;{let n=this.options.tagValueProcessor(e,t);return n=this.replaceEntitiesValue(n),""===n?this.indentate(i)+"<"+e+r+this.closeTag(e)+this.tagEndChar:this.indentate(i)+"<"+e+r+">"+n+"0&&this.options.processEntities)for(let e=0;e {\nreturn ","// The require scope\nvar __webpack_require__ = {};\n\n","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","'use strict';\n\nconst nameStartChar = ':A-Za-z_\\\\u00C0-\\\\u00D6\\\\u00D8-\\\\u00F6\\\\u00F8-\\\\u02FF\\\\u0370-\\\\u037D\\\\u037F-\\\\u1FFF\\\\u200C-\\\\u200D\\\\u2070-\\\\u218F\\\\u2C00-\\\\u2FEF\\\\u3001-\\\\uD7FF\\\\uF900-\\\\uFDCF\\\\uFDF0-\\\\uFFFD';\nconst nameChar = nameStartChar + '\\\\-.\\\\d\\\\u00B7\\\\u0300-\\\\u036F\\\\u203F-\\\\u2040';\nexport const nameRegexp = '[' + nameStartChar + '][' + nameChar + ']*';\nconst regexName = new RegExp('^' + nameRegexp + '$');\n\nexport function getAllMatches(string, regex) {\n const matches = [];\n let match = regex.exec(string);\n while (match) {\n const allmatches = [];\n allmatches.startIndex = regex.lastIndex - match[0].length;\n const len = match.length;\n for (let index = 0; index < len; index++) {\n allmatches.push(match[index]);\n }\n matches.push(allmatches);\n match = regex.exec(string);\n }\n return matches;\n}\n\nexport const isName = function (string) {\n const match = regexName.exec(string);\n return !(match === null || typeof match === 'undefined');\n}\n\nexport function isExist(v) {\n return typeof v !== 'undefined';\n}\n\nexport function isEmptyObject(obj) {\n return Object.keys(obj).length === 0;\n}\n\nexport function getValue(v) {\n if (exports.isExist(v)) {\n return v;\n } else {\n return '';\n }\n}\n\n/**\n * Dangerous property names that could lead to prototype pollution or security issues\n */\nexport const DANGEROUS_PROPERTY_NAMES = [\n // '__proto__',\n // 'constructor',\n // 'prototype',\n 'hasOwnProperty',\n 'toString',\n 'valueOf',\n '__defineGetter__',\n '__defineSetter__',\n '__lookupGetter__',\n '__lookupSetter__'\n];\n\nexport const criticalProperties = [\"__proto__\", \"constructor\", \"prototype\"];","'use strict';\n\nimport { getAllMatches, isName } from './util.js';\n\nconst defaultOptions = {\n allowBooleanAttributes: false, //A tag can have attributes without any value\n unpairedTags: []\n};\n\n//const tagsPattern = new RegExp(\"<\\\\/?([\\\\w:\\\\-_\\.]+)\\\\s*\\/?>\",\"g\");\nexport function validate(xmlData, options) {\n options = Object.assign({}, defaultOptions, options);\n\n //xmlData = xmlData.replace(/(\\r\\n|\\n|\\r)/gm,\"\");//make it single line\n //xmlData = xmlData.replace(/(^\\s*<\\?xml.*?\\?>)/g,\"\");//Remove XML starting tag\n //xmlData = xmlData.replace(/()/g,\"\");//Remove DOCTYPE\n const tags = [];\n let tagFound = false;\n\n //indicates that the root tag has been closed (aka. depth 0 has been reached)\n let reachedRoot = false;\n\n if (xmlData[0] === '\\ufeff') {\n // check for byte order mark (BOM)\n xmlData = xmlData.substr(1);\n }\n\n for (let i = 0; i < xmlData.length; i++) {\n\n if (xmlData[i] === '<' && xmlData[i + 1] === '?') {\n i += 2;\n i = readPI(xmlData, i);\n if (i.err) return i;\n } else if (xmlData[i] === '<') {\n //starting of tag\n //read until you reach to '>' avoiding any '>' in attribute value\n let tagStartPos = i;\n i++;\n\n if (xmlData[i] === '!') {\n i = readCommentAndCDATA(xmlData, i);\n continue;\n } else {\n let closingTag = false;\n if (xmlData[i] === '/') {\n //closing tag\n closingTag = true;\n i++;\n }\n //read tagname\n let tagName = '';\n for (; i < xmlData.length &&\n xmlData[i] !== '>' &&\n xmlData[i] !== ' ' &&\n xmlData[i] !== '\\t' &&\n xmlData[i] !== '\\n' &&\n xmlData[i] !== '\\r'; i++\n ) {\n tagName += xmlData[i];\n }\n tagName = tagName.trim();\n //console.log(tagName);\n\n if (tagName[tagName.length - 1] === '/') {\n //self closing tag without attributes\n tagName = tagName.substring(0, tagName.length - 1);\n //continue;\n i--;\n }\n if (!validateTagName(tagName)) {\n let msg;\n if (tagName.trim().length === 0) {\n msg = \"Invalid space after '<'.\";\n } else {\n msg = \"Tag '\" + tagName + \"' is an invalid name.\";\n }\n return getErrorObject('InvalidTag', msg, getLineNumberForPosition(xmlData, i));\n }\n\n const result = readAttributeStr(xmlData, i);\n if (result === false) {\n return getErrorObject('InvalidAttr', \"Attributes for '\" + tagName + \"' have open quote.\", getLineNumberForPosition(xmlData, i));\n }\n let attrStr = result.value;\n i = result.index;\n\n if (attrStr[attrStr.length - 1] === '/') {\n //self closing tag\n const attrStrStart = i - attrStr.length;\n attrStr = attrStr.substring(0, attrStr.length - 1);\n const isValid = validateAttributeString(attrStr, options);\n if (isValid === true) {\n tagFound = true;\n //continue; //text may presents after self closing tag\n } else {\n //the result from the nested function returns the position of the error within the attribute\n //in order to get the 'true' error line, we need to calculate the position where the attribute begins (i - attrStr.length) and then add the position within the attribute\n //this gives us the absolute index in the entire xml, which we can use to find the line at last\n return getErrorObject(isValid.err.code, isValid.err.msg, getLineNumberForPosition(xmlData, attrStrStart + isValid.err.line));\n }\n } else if (closingTag) {\n if (!result.tagClosed) {\n return getErrorObject('InvalidTag', \"Closing tag '\" + tagName + \"' doesn't have proper closing.\", getLineNumberForPosition(xmlData, i));\n } else if (attrStr.trim().length > 0) {\n return getErrorObject('InvalidTag', \"Closing tag '\" + tagName + \"' can't have attributes or invalid starting.\", getLineNumberForPosition(xmlData, tagStartPos));\n } else if (tags.length === 0) {\n return getErrorObject('InvalidTag', \"Closing tag '\" + tagName + \"' has not been opened.\", getLineNumberForPosition(xmlData, tagStartPos));\n } else {\n const otg = tags.pop();\n if (tagName !== otg.tagName) {\n let openPos = getLineNumberForPosition(xmlData, otg.tagStartPos);\n return getErrorObject('InvalidTag',\n \"Expected closing tag '\" + otg.tagName + \"' (opened in line \" + openPos.line + \", col \" + openPos.col + \") instead of closing tag '\" + tagName + \"'.\",\n getLineNumberForPosition(xmlData, tagStartPos));\n }\n\n //when there are no more tags, we reached the root level.\n if (tags.length == 0) {\n reachedRoot = true;\n }\n }\n } else {\n const isValid = validateAttributeString(attrStr, options);\n if (isValid !== true) {\n //the result from the nested function returns the position of the error within the attribute\n //in order to get the 'true' error line, we need to calculate the position where the attribute begins (i - attrStr.length) and then add the position within the attribute\n //this gives us the absolute index in the entire xml, which we can use to find the line at last\n return getErrorObject(isValid.err.code, isValid.err.msg, getLineNumberForPosition(xmlData, i - attrStr.length + isValid.err.line));\n }\n\n //if the root level has been reached before ...\n if (reachedRoot === true) {\n return getErrorObject('InvalidXml', 'Multiple possible root nodes found.', getLineNumberForPosition(xmlData, i));\n } else if (options.unpairedTags.indexOf(tagName) !== -1) {\n //don't push into stack\n } else {\n tags.push({ tagName, tagStartPos });\n }\n tagFound = true;\n }\n\n //skip tag text value\n //It may include comments and CDATA value\n for (i++; i < xmlData.length; i++) {\n if (xmlData[i] === '<') {\n if (xmlData[i + 1] === '!') {\n //comment or CADATA\n i++;\n i = readCommentAndCDATA(xmlData, i);\n continue;\n } else if (xmlData[i + 1] === '?') {\n i = readPI(xmlData, ++i);\n if (i.err) return i;\n } else {\n break;\n }\n } else if (xmlData[i] === '&') {\n const afterAmp = validateAmpersand(xmlData, i);\n if (afterAmp == -1)\n return getErrorObject('InvalidChar', \"char '&' is not expected.\", getLineNumberForPosition(xmlData, i));\n i = afterAmp;\n } else {\n if (reachedRoot === true && !isWhiteSpace(xmlData[i])) {\n return getErrorObject('InvalidXml', \"Extra text at the end\", getLineNumberForPosition(xmlData, i));\n }\n }\n } //end of reading tag text value\n if (xmlData[i] === '<') {\n i--;\n }\n }\n } else {\n if (isWhiteSpace(xmlData[i])) {\n continue;\n }\n return getErrorObject('InvalidChar', \"char '\" + xmlData[i] + \"' is not expected.\", getLineNumberForPosition(xmlData, i));\n }\n }\n\n if (!tagFound) {\n return getErrorObject('InvalidXml', 'Start tag expected.', 1);\n } else if (tags.length == 1) {\n return getErrorObject('InvalidTag', \"Unclosed tag '\" + tags[0].tagName + \"'.\", getLineNumberForPosition(xmlData, tags[0].tagStartPos));\n } else if (tags.length > 0) {\n return getErrorObject('InvalidXml', \"Invalid '\" +\n JSON.stringify(tags.map(t => t.tagName), null, 4).replace(/\\r?\\n/g, '') +\n \"' found.\", { line: 1, col: 1 });\n }\n\n return true;\n};\n\nfunction isWhiteSpace(char) {\n return char === ' ' || char === '\\t' || char === '\\n' || char === '\\r';\n}\n/**\n * Read Processing insstructions and skip\n * @param {*} xmlData\n * @param {*} i\n */\nfunction readPI(xmlData, i) {\n const start = i;\n for (; i < xmlData.length; i++) {\n if (xmlData[i] == '?' || xmlData[i] == ' ') {\n //tagname\n const tagname = xmlData.substr(start, i - start);\n if (i > 5 && tagname === 'xml') {\n return getErrorObject('InvalidXml', 'XML declaration allowed only at the start of the document.', getLineNumberForPosition(xmlData, i));\n } else if (xmlData[i] == '?' && xmlData[i + 1] == '>') {\n //check if valid attribut string\n i++;\n break;\n } else {\n continue;\n }\n }\n }\n return i;\n}\n\nfunction readCommentAndCDATA(xmlData, i) {\n if (xmlData.length > i + 5 && xmlData[i + 1] === '-' && xmlData[i + 2] === '-') {\n //comment\n for (i += 3; i < xmlData.length; i++) {\n if (xmlData[i] === '-' && xmlData[i + 1] === '-' && xmlData[i + 2] === '>') {\n i += 2;\n break;\n }\n }\n } else if (\n xmlData.length > i + 8 &&\n xmlData[i + 1] === 'D' &&\n xmlData[i + 2] === 'O' &&\n xmlData[i + 3] === 'C' &&\n xmlData[i + 4] === 'T' &&\n xmlData[i + 5] === 'Y' &&\n xmlData[i + 6] === 'P' &&\n xmlData[i + 7] === 'E'\n ) {\n let angleBracketsCount = 1;\n for (i += 8; i < xmlData.length; i++) {\n if (xmlData[i] === '<') {\n angleBracketsCount++;\n } else if (xmlData[i] === '>') {\n angleBracketsCount--;\n if (angleBracketsCount === 0) {\n break;\n }\n }\n }\n } else if (\n xmlData.length > i + 9 &&\n xmlData[i + 1] === '[' &&\n xmlData[i + 2] === 'C' &&\n xmlData[i + 3] === 'D' &&\n xmlData[i + 4] === 'A' &&\n xmlData[i + 5] === 'T' &&\n xmlData[i + 6] === 'A' &&\n xmlData[i + 7] === '['\n ) {\n for (i += 8; i < xmlData.length; i++) {\n if (xmlData[i] === ']' && xmlData[i + 1] === ']' && xmlData[i + 2] === '>') {\n i += 2;\n break;\n }\n }\n }\n\n return i;\n}\n\nconst doubleQuote = '\"';\nconst singleQuote = \"'\";\n\n/**\n * Keep reading xmlData until '<' is found outside the attribute value.\n * @param {string} xmlData\n * @param {number} i\n */\nfunction readAttributeStr(xmlData, i) {\n let attrStr = '';\n let startChar = '';\n let tagClosed = false;\n for (; i < xmlData.length; i++) {\n if (xmlData[i] === doubleQuote || xmlData[i] === singleQuote) {\n if (startChar === '') {\n startChar = xmlData[i];\n } else if (startChar !== xmlData[i]) {\n //if vaue is enclosed with double quote then single quotes are allowed inside the value and vice versa\n } else {\n startChar = '';\n }\n } else if (xmlData[i] === '>') {\n if (startChar === '') {\n tagClosed = true;\n break;\n }\n }\n attrStr += xmlData[i];\n }\n if (startChar !== '') {\n return false;\n }\n\n return {\n value: attrStr,\n index: i,\n tagClosed: tagClosed\n };\n}\n\n/**\n * Select all the attributes whether valid or invalid.\n */\nconst validAttrStrRegxp = new RegExp('(\\\\s*)([^\\\\s=]+)(\\\\s*=)?(\\\\s*([\\'\"])(([\\\\s\\\\S])*?)\\\\5)?', 'g');\n\n//attr, =\"sd\", a=\"amit's\", a=\"sd\"b=\"saf\", ab cd=\"\"\n\nfunction validateAttributeString(attrStr, options) {\n //console.log(\"start:\"+attrStr+\":end\");\n\n //if(attrStr.trim().length === 0) return true; //empty string\n\n const matches = getAllMatches(attrStr, validAttrStrRegxp);\n const attrNames = {};\n\n for (let i = 0; i < matches.length; i++) {\n if (matches[i][1].length === 0) {\n //nospace before attribute name: a=\"sd\"b=\"saf\"\n return getErrorObject('InvalidAttr', \"Attribute '\" + matches[i][2] + \"' has no space in starting.\", getPositionFromMatch(matches[i]))\n } else if (matches[i][3] !== undefined && matches[i][4] === undefined) {\n return getErrorObject('InvalidAttr', \"Attribute '\" + matches[i][2] + \"' is without value.\", getPositionFromMatch(matches[i]));\n } else if (matches[i][3] === undefined && !options.allowBooleanAttributes) {\n //independent attribute: ab\n return getErrorObject('InvalidAttr', \"boolean attribute '\" + matches[i][2] + \"' is not allowed.\", getPositionFromMatch(matches[i]));\n }\n /* else if(matches[i][6] === undefined){//attribute without value: ab=\n return { err: { code:\"InvalidAttr\",msg:\"attribute \" + matches[i][2] + \" has no value assigned.\"}};\n } */\n const attrName = matches[i][2];\n if (!validateAttrName(attrName)) {\n return getErrorObject('InvalidAttr', \"Attribute '\" + attrName + \"' is an invalid name.\", getPositionFromMatch(matches[i]));\n }\n if (!Object.prototype.hasOwnProperty.call(attrNames, attrName)) {\n //check for duplicate attribute.\n attrNames[attrName] = 1;\n } else {\n return getErrorObject('InvalidAttr', \"Attribute '\" + attrName + \"' is repeated.\", getPositionFromMatch(matches[i]));\n }\n }\n\n return true;\n}\n\nfunction validateNumberAmpersand(xmlData, i) {\n let re = /\\d/;\n if (xmlData[i] === 'x') {\n i++;\n re = /[\\da-fA-F]/;\n }\n for (; i < xmlData.length; i++) {\n if (xmlData[i] === ';')\n return i;\n if (!xmlData[i].match(re))\n break;\n }\n return -1;\n}\n\nfunction validateAmpersand(xmlData, i) {\n // https://www.w3.org/TR/xml/#dt-charref\n i++;\n if (xmlData[i] === ';')\n return -1;\n if (xmlData[i] === '#') {\n i++;\n return validateNumberAmpersand(xmlData, i);\n }\n let count = 0;\n for (; i < xmlData.length; i++, count++) {\n if (xmlData[i].match(/\\w/) && count < 20)\n continue;\n if (xmlData[i] === ';')\n break;\n return -1;\n }\n return i;\n}\n\nfunction getErrorObject(code, message, lineNumber) {\n return {\n err: {\n code: code,\n msg: message,\n line: lineNumber.line || lineNumber,\n col: lineNumber.col,\n },\n };\n}\n\nfunction validateAttrName(attrName) {\n return isName(attrName);\n}\n\n// const startsWithXML = /^xml/i;\n\nfunction validateTagName(tagname) {\n return isName(tagname) /* && !tagname.match(startsWithXML) */;\n}\n\n//this function returns the line number for the character at the given index\nfunction getLineNumberForPosition(xmlData, index) {\n const lines = xmlData.substring(0, index).split(/\\r?\\n/);\n return {\n line: lines.length,\n\n // column number is last line's length + 1, because column numbering starts at 1:\n col: lines[lines.length - 1].length + 1\n };\n}\n\n//this function returns the position of the first character of match within attrStr\nfunction getPositionFromMatch(match) {\n return match.startIndex + match[1].length;\n}\n","import { DANGEROUS_PROPERTY_NAMES, criticalProperties } from \"../util.js\";\n\nconst defaultOnDangerousProperty = (name) => {\n if (DANGEROUS_PROPERTY_NAMES.includes(name)) {\n return \"__\" + name;\n }\n return name;\n};\n\n\nexport const defaultOptions = {\n preserveOrder: false,\n attributeNamePrefix: '@_',\n attributesGroupName: false,\n textNodeName: '#text',\n ignoreAttributes: true,\n removeNSPrefix: false, // remove NS from tag name or attribute name if true\n allowBooleanAttributes: false, //a tag can have attributes without any value\n //ignoreRootElement : false,\n parseTagValue: true,\n parseAttributeValue: false,\n trimValues: true, //Trim string values of tag and attributes\n cdataPropName: false,\n numberParseOptions: {\n hex: true,\n leadingZeros: true,\n eNotation: true\n },\n tagValueProcessor: function (tagName, val) {\n return val;\n },\n attributeValueProcessor: function (attrName, val) {\n return val;\n },\n stopNodes: [], //nested tags will not be parsed even for errors\n alwaysCreateTextNode: false,\n isArray: () => false,\n commentPropName: false,\n unpairedTags: [],\n processEntities: true,\n htmlEntities: false,\n ignoreDeclaration: false,\n ignorePiTags: false,\n transformTagName: false,\n transformAttributeName: false,\n updateTag: function (tagName, jPath, attrs) {\n return tagName\n },\n // skipEmptyListItem: false\n captureMetaData: false,\n maxNestedTags: 100,\n strictReservedNames: true,\n jPath: true, // if true, pass jPath string to callbacks; if false, pass matcher instance\n onDangerousProperty: defaultOnDangerousProperty\n};\n\n\n/**\n * Validates that a property name is safe to use\n * @param {string} propertyName - The property name to validate\n * @param {string} optionName - The option field name (for error message)\n * @throws {Error} If property name is dangerous\n */\nfunction validatePropertyName(propertyName, optionName) {\n if (typeof propertyName !== 'string') {\n return; // Only validate string property names\n }\n\n const normalized = propertyName.toLowerCase();\n if (DANGEROUS_PROPERTY_NAMES.some(dangerous => normalized === dangerous.toLowerCase())) {\n throw new Error(\n `[SECURITY] Invalid ${optionName}: \"${propertyName}\" is a reserved JavaScript keyword that could cause prototype pollution`\n );\n }\n\n if (criticalProperties.some(dangerous => normalized === dangerous.toLowerCase())) {\n throw new Error(\n `[SECURITY] Invalid ${optionName}: \"${propertyName}\" is a reserved JavaScript keyword that could cause prototype pollution`\n );\n }\n}\n\n/**\n * Normalizes processEntities option for backward compatibility\n * @param {boolean|object} value \n * @returns {object} Always returns normalized object\n */\nfunction normalizeProcessEntities(value) {\n // Boolean backward compatibility\n if (typeof value === 'boolean') {\n return {\n enabled: value, // true or false\n maxEntitySize: 10000,\n maxExpansionDepth: 10,\n maxTotalExpansions: 1000,\n maxExpandedLength: 100000,\n maxEntityCount: 100,\n allowedTags: null,\n tagFilter: null\n };\n }\n\n // Object config - merge with defaults\n if (typeof value === 'object' && value !== null) {\n return {\n enabled: value.enabled !== false,\n maxEntitySize: Math.max(1, value.maxEntitySize ?? 10000),\n maxExpansionDepth: Math.max(1, value.maxExpansionDepth ?? 10000),\n maxTotalExpansions: Math.max(1, value.maxTotalExpansions ?? Infinity),\n maxExpandedLength: Math.max(1, value.maxExpandedLength ?? 100000),\n maxEntityCount: Math.max(1, value.maxEntityCount ?? 1000),\n allowedTags: value.allowedTags ?? null,\n tagFilter: value.tagFilter ?? null\n };\n }\n\n // Default to enabled with limits\n return normalizeProcessEntities(true);\n}\n\nexport const buildOptions = function (options) {\n const built = Object.assign({}, defaultOptions, options);\n\n // Validate property names to prevent prototype pollution\n const propertyNameOptions = [\n { value: built.attributeNamePrefix, name: 'attributeNamePrefix' },\n { value: built.attributesGroupName, name: 'attributesGroupName' },\n { value: built.textNodeName, name: 'textNodeName' },\n { value: built.cdataPropName, name: 'cdataPropName' },\n { value: built.commentPropName, name: 'commentPropName' }\n ];\n\n for (const { value, name } of propertyNameOptions) {\n if (value) {\n validatePropertyName(value, name);\n }\n }\n\n if (built.onDangerousProperty === null) {\n built.onDangerousProperty = defaultOnDangerousProperty;\n }\n\n // Always normalize processEntities for backward compatibility and validation\n built.processEntities = normalizeProcessEntities(built.processEntities);\n built.unpairedTagsSet = new Set(built.unpairedTags);\n // Convert old-style stopNodes for backward compatibility\n if (built.stopNodes && Array.isArray(built.stopNodes)) {\n built.stopNodes = built.stopNodes.map(node => {\n if (typeof node === 'string' && node.startsWith('*.')) {\n // Old syntax: *.tagname meant \"tagname anywhere\"\n // Convert to new syntax: ..tagname\n return '..' + node.substring(2);\n }\n return node;\n });\n }\n //console.debug(built.processEntities)\n return built;\n};","'use strict';\n\nlet METADATA_SYMBOL;\n\nif (typeof Symbol !== \"function\") {\n METADATA_SYMBOL = \"@@xmlMetadata\";\n} else {\n METADATA_SYMBOL = Symbol(\"XML Node Metadata\");\n}\n\nexport default class XmlNode {\n constructor(tagname) {\n this.tagname = tagname;\n this.child = []; //nested tags, text, cdata, comments in order\n this[\":@\"] = Object.create(null); //attributes map\n }\n add(key, val) {\n // this.child.push( {name : key, val: val, isCdata: isCdata });\n if (key === \"__proto__\") key = \"#__proto__\";\n this.child.push({ [key]: val });\n }\n addChild(node, startIndex) {\n if (node.tagname === \"__proto__\") node.tagname = \"#__proto__\";\n if (node[\":@\"] && Object.keys(node[\":@\"]).length > 0) {\n this.child.push({ [node.tagname]: node.child, [\":@\"]: node[\":@\"] });\n } else {\n this.child.push({ [node.tagname]: node.child });\n }\n // if requested, add the startIndex\n if (startIndex !== undefined) {\n // Note: for now we just overwrite the metadata. If we had more complex metadata,\n // we might need to do an object append here: metadata = { ...metadata, startIndex }\n this.child[this.child.length - 1][METADATA_SYMBOL] = { startIndex };\n }\n }\n /** symbol used for metadata */\n static getMetaDataSymbol() {\n return METADATA_SYMBOL;\n }\n}\n","import { isName } from '../util.js';\n\nexport default class DocTypeReader {\n constructor(options) {\n this.suppressValidationErr = !options;\n this.options = options;\n }\n\n readDocType(xmlData, i) {\n const entities = Object.create(null);\n let entityCount = 0;\n\n if (xmlData[i + 3] === 'O' &&\n xmlData[i + 4] === 'C' &&\n xmlData[i + 5] === 'T' &&\n xmlData[i + 6] === 'Y' &&\n xmlData[i + 7] === 'P' &&\n xmlData[i + 8] === 'E') {\n i = i + 9;\n let angleBracketsCount = 1;\n let hasBody = false, comment = false;\n let exp = \"\";\n for (; i < xmlData.length; i++) {\n if (xmlData[i] === '<' && !comment) { //Determine the tag type\n if (hasBody && hasSeq(xmlData, \"!ENTITY\", i)) {\n i += 7;\n let entityName, val;\n [entityName, val, i] = this.readEntityExp(xmlData, i + 1, this.suppressValidationErr);\n if (val.indexOf(\"&\") === -1) { //Parameter entities are not supported\n if (this.options.enabled !== false &&\n this.options.maxEntityCount != null &&\n entityCount >= this.options.maxEntityCount) {\n throw new Error(\n `Entity count (${entityCount + 1}) exceeds maximum allowed (${this.options.maxEntityCount})`\n );\n }\n //const escaped = entityName.replace(/[.\\-+*:]/g, '\\\\.');\n const escaped = entityName.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n entities[entityName] = {\n regx: RegExp(`&${escaped};`, \"g\"),\n val: val\n };\n entityCount++;\n }\n }\n else if (hasBody && hasSeq(xmlData, \"!ELEMENT\", i)) {\n i += 8;//Not supported\n const { index } = this.readElementExp(xmlData, i + 1);\n i = index;\n } else if (hasBody && hasSeq(xmlData, \"!ATTLIST\", i)) {\n i += 8;//Not supported\n // const {index} = this.readAttlistExp(xmlData,i+1);\n // i = index;\n } else if (hasBody && hasSeq(xmlData, \"!NOTATION\", i)) {\n i += 9;//Not supported\n const { index } = this.readNotationExp(xmlData, i + 1, this.suppressValidationErr);\n i = index;\n } else if (hasSeq(xmlData, \"!--\", i)) comment = true;\n else throw new Error(`Invalid DOCTYPE`);\n\n angleBracketsCount++;\n exp = \"\";\n } else if (xmlData[i] === '>') { //Read tag content\n if (comment) {\n if (xmlData[i - 1] === \"-\" && xmlData[i - 2] === \"-\") {\n comment = false;\n angleBracketsCount--;\n }\n } else {\n angleBracketsCount--;\n }\n if (angleBracketsCount === 0) {\n break;\n }\n } else if (xmlData[i] === '[') {\n hasBody = true;\n } else {\n exp += xmlData[i];\n }\n }\n if (angleBracketsCount !== 0) {\n throw new Error(`Unclosed DOCTYPE`);\n }\n } else {\n throw new Error(`Invalid Tag instead of DOCTYPE`);\n }\n return { entities, i };\n }\n readEntityExp(xmlData, i) {\n //External entities are not supported\n // \n\n //Parameter entities are not supported\n // \n\n //Internal entities are supported\n // \n\n // Skip leading whitespace after this.options.maxEntitySize) {\n throw new Error(\n `Entity \"${entityName}\" size (${entityValue.length}) exceeds maximum allowed size (${this.options.maxEntitySize})`\n );\n }\n\n i--;\n return [entityName, entityValue, i];\n }\n\n readNotationExp(xmlData, i) {\n // Skip leading whitespace after \n // \n // \n // \n // \n\n // Skip leading whitespace after {\n while (index < data.length && /\\s/.test(data[index])) {\n index++;\n }\n return index;\n};\n\n\n\nfunction hasSeq(data, seq, i) {\n for (let j = 0; j < seq.length; j++) {\n if (seq[j] !== data[i + j + 1]) return false;\n }\n return true;\n}\n\nfunction validateEntityName(name) {\n if (isName(name))\n return name;\n else\n throw new Error(`Invalid entity name ${name}`);\n}","const hexRegex = /^[-+]?0x[a-fA-F0-9]+$/;\nconst numRegex = /^([\\-\\+])?(0*)([0-9]*(\\.[0-9]*)?)$/;\n// const octRegex = /^0x[a-z0-9]+/;\n// const binRegex = /0x[a-z0-9]+/;\n\n\nconst consider = {\n hex: true,\n // oct: false,\n leadingZeros: true,\n decimalPoint: \"\\.\",\n eNotation: true,\n //skipLike: /regex/,\n infinity: \"original\", // \"null\", \"infinity\" (Infinity type), \"string\" (\"Infinity\" (the string literal))\n};\n\nexport default function toNumber(str, options = {}) {\n options = Object.assign({}, consider, options);\n if (!str || typeof str !== \"string\") return str;\n\n let trimmedStr = str.trim();\n\n if (trimmedStr.length === 0) return str;\n else if (options.skipLike !== undefined && options.skipLike.test(trimmedStr)) return str;\n else if (trimmedStr === \"0\") return 0;\n else if (options.hex && hexRegex.test(trimmedStr)) {\n return parse_int(trimmedStr, 16);\n // }else if (options.oct && octRegex.test(str)) {\n // return Number.parseInt(val, 8);\n } else if (!isFinite(trimmedStr)) { //Infinity\n return handleInfinity(str, Number(trimmedStr), options);\n } else if (trimmedStr.includes('e') || trimmedStr.includes('E')) { //eNotation\n return resolveEnotation(str, trimmedStr, options);\n // }else if (options.parseBin && binRegex.test(str)) {\n // return Number.parseInt(val, 2);\n } else {\n //separate negative sign, leading zeros, and rest number\n const match = numRegex.exec(trimmedStr);\n // +00.123 => [ , '+', '00', '.123', ..\n if (match) {\n const sign = match[1] || \"\";\n const leadingZeros = match[2];\n let numTrimmedByZeros = trimZeros(match[3]); //complete num without leading zeros\n const decimalAdjacentToLeadingZeros = sign ? // 0., -00., 000.\n str[leadingZeros.length + 1] === \".\"\n : str[leadingZeros.length] === \".\";\n\n //trim ending zeros for floating number\n if (!options.leadingZeros //leading zeros are not allowed\n && (leadingZeros.length > 1\n || (leadingZeros.length === 1 && !decimalAdjacentToLeadingZeros))) {\n // 00, 00.3, +03.24, 03, 03.24\n return str;\n }\n else {//no leading zeros or leading zeros are allowed\n const num = Number(trimmedStr);\n const parsedStr = String(num);\n\n if (num === 0) return num;\n if (parsedStr.search(/[eE]/) !== -1) { //given number is long and parsed to eNotation\n if (options.eNotation) return num;\n else return str;\n } else if (trimmedStr.indexOf(\".\") !== -1) { //floating number\n if (parsedStr === \"0\") return num; //0.0\n else if (parsedStr === numTrimmedByZeros) return num; //0.456. 0.79000\n else if (parsedStr === `${sign}${numTrimmedByZeros}`) return num;\n else return str;\n }\n\n let n = leadingZeros ? numTrimmedByZeros : trimmedStr;\n if (leadingZeros) {\n // -009 => -9\n return (n === parsedStr) || (sign + n === parsedStr) ? num : str\n } else {\n // +9\n return (n === parsedStr) || (n === sign + parsedStr) ? num : str\n }\n }\n } else { //non-numeric string\n return str;\n }\n }\n}\n\nconst eNotationRegx = /^([-+])?(0*)(\\d*(\\.\\d*)?[eE][-\\+]?\\d+)$/;\nfunction resolveEnotation(str, trimmedStr, options) {\n if (!options.eNotation) return str;\n const notation = trimmedStr.match(eNotationRegx);\n if (notation) {\n let sign = notation[1] || \"\";\n const eChar = notation[3].indexOf(\"e\") === -1 ? \"E\" : \"e\";\n const leadingZeros = notation[2];\n const eAdjacentToLeadingZeros = sign ? // 0E.\n str[leadingZeros.length + 1] === eChar\n : str[leadingZeros.length] === eChar;\n\n if (leadingZeros.length > 1 && eAdjacentToLeadingZeros) return str;\n else if (leadingZeros.length === 1\n && (notation[3].startsWith(`.${eChar}`) || notation[3][0] === eChar)) {\n return Number(trimmedStr);\n } else if (leadingZeros.length > 0) {\n // Has leading zeros — only accept if leadingZeros option allows it\n if (options.leadingZeros && !eAdjacentToLeadingZeros) {\n trimmedStr = (notation[1] || \"\") + notation[3];\n return Number(trimmedStr);\n } else return str;\n } else {\n // No leading zeros — always valid e-notation, parse it\n return Number(trimmedStr);\n }\n } else {\n return str;\n }\n}\n\n/**\n * \n * @param {string} numStr without leading zeros\n * @returns \n */\nfunction trimZeros(numStr) {\n if (numStr && numStr.indexOf(\".\") !== -1) {//float\n numStr = numStr.replace(/0+$/, \"\"); //remove ending zeros\n if (numStr === \".\") numStr = \"0\";\n else if (numStr[0] === \".\") numStr = \"0\" + numStr;\n else if (numStr[numStr.length - 1] === \".\") numStr = numStr.substring(0, numStr.length - 1);\n return numStr;\n }\n return numStr;\n}\n\nfunction parse_int(numStr, base) {\n //polyfill\n if (parseInt) return parseInt(numStr, base);\n else if (Number.parseInt) return Number.parseInt(numStr, base);\n else if (window && window.parseInt) return window.parseInt(numStr, base);\n else throw new Error(\"parseInt, Number.parseInt, window.parseInt are not supported\")\n}\n\n/**\n * Handle infinite values based on user option\n * @param {string} str - original input string\n * @param {number} num - parsed number (Infinity or -Infinity)\n * @param {object} options - user options\n * @returns {string|number|null} based on infinity option\n */\nfunction handleInfinity(str, num, options) {\n const isPositive = num === Infinity;\n\n switch (options.infinity.toLowerCase()) {\n case \"null\":\n return null;\n case \"infinity\":\n return num; // Return Infinity or -Infinity\n case \"string\":\n return isPositive ? \"Infinity\" : \"-Infinity\";\n case \"original\":\n default:\n return str; // Return original string like \"1e1000\"\n }\n}","import ExpressionSet from \"./ExpressionSet.js\";\n\n/**\n * MatcherView - A lightweight read-only view over a Matcher's internal state.\n *\n * Created once by Matcher and reused across all callbacks. Holds a direct\n * reference to the parent Matcher so it always reflects current parser state\n * with zero copying or freezing overhead.\n *\n * Users receive this via {@link Matcher#readOnly} or directly from parser\n * callbacks. It exposes all query and matching methods but has no mutation\n * methods — misuse is caught at the TypeScript level rather than at runtime.\n *\n * @example\n * const matcher = new Matcher();\n * const view = matcher.readOnly();\n *\n * matcher.push(\"root\", {});\n * view.getCurrentTag(); // \"root\"\n * view.getDepth(); // 1\n */\nexport class MatcherView {\n /**\n * @param {Matcher} matcher - The parent Matcher instance to read from.\n */\n constructor(matcher) {\n this._matcher = matcher;\n }\n\n /**\n * Get the path separator used by the parent matcher.\n * @returns {string}\n */\n get separator() {\n return this._matcher.separator;\n }\n\n /**\n * Get current tag name.\n * @returns {string|undefined}\n */\n getCurrentTag() {\n const path = this._matcher.path;\n return path.length > 0 ? path[path.length - 1].tag : undefined;\n }\n\n /**\n * Get current namespace.\n * @returns {string|undefined}\n */\n getCurrentNamespace() {\n const path = this._matcher.path;\n return path.length > 0 ? path[path.length - 1].namespace : undefined;\n }\n\n /**\n * Get current node's attribute value.\n * @param {string} attrName\n * @returns {*}\n */\n getAttrValue(attrName) {\n const path = this._matcher.path;\n if (path.length === 0) return undefined;\n return path[path.length - 1].values?.[attrName];\n }\n\n /**\n * Check if current node has an attribute.\n * @param {string} attrName\n * @returns {boolean}\n */\n hasAttr(attrName) {\n const path = this._matcher.path;\n if (path.length === 0) return false;\n const current = path[path.length - 1];\n return current.values !== undefined && attrName in current.values;\n }\n\n /**\n * Get current node's sibling position (child index in parent).\n * @returns {number}\n */\n getPosition() {\n const path = this._matcher.path;\n if (path.length === 0) return -1;\n return path[path.length - 1].position ?? 0;\n }\n\n /**\n * Get current node's repeat counter (occurrence count of this tag name).\n * @returns {number}\n */\n getCounter() {\n const path = this._matcher.path;\n if (path.length === 0) return -1;\n return path[path.length - 1].counter ?? 0;\n }\n\n /**\n * Get current node's sibling index (alias for getPosition).\n * @returns {number}\n * @deprecated Use getPosition() or getCounter() instead\n */\n getIndex() {\n return this.getPosition();\n }\n\n /**\n * Get current path depth.\n * @returns {number}\n */\n getDepth() {\n return this._matcher.path.length;\n }\n\n /**\n * Get path as string.\n * @param {string} [separator] - Optional separator (uses default if not provided)\n * @param {boolean} [includeNamespace=true]\n * @returns {string}\n */\n toString(separator, includeNamespace = true) {\n return this._matcher.toString(separator, includeNamespace);\n }\n\n /**\n * Get path as array of tag names.\n * @returns {string[]}\n */\n toArray() {\n return this._matcher.path.map(n => n.tag);\n }\n\n /**\n * Match current path against an Expression.\n * @param {Expression} expression\n * @returns {boolean}\n */\n matches(expression) {\n return this._matcher.matches(expression);\n }\n\n /**\n * Match any expression in the given set against the current path.\n * @param {ExpressionSet} exprSet\n * @returns {boolean}\n */\n matchesAny(exprSet) {\n return exprSet.matchesAny(this._matcher);\n }\n}\n\n/**\n * Matcher - Tracks current path in XML/JSON tree and matches against Expressions.\n *\n * The matcher maintains a stack of nodes representing the current path from root to\n * current tag. It only stores attribute values for the current (top) node to minimize\n * memory usage. Sibling tracking is used to auto-calculate position and counter.\n *\n * Use {@link Matcher#readOnly} to obtain a {@link MatcherView} safe to pass to\n * user callbacks — it always reflects current state with no Proxy overhead.\n *\n * @example\n * const matcher = new Matcher();\n * matcher.push(\"root\", {});\n * matcher.push(\"users\", {});\n * matcher.push(\"user\", { id: \"123\", type: \"admin\" });\n *\n * const expr = new Expression(\"root.users.user\");\n * matcher.matches(expr); // true\n */\nexport default class Matcher {\n /**\n * Create a new Matcher.\n * @param {Object} [options={}]\n * @param {string} [options.separator='.'] - Default path separator\n */\n constructor(options = {}) {\n this.separator = options.separator || '.';\n this.path = [];\n this.siblingStacks = [];\n // Each path node: { tag, values, position, counter, namespace? }\n // values only present for current (last) node\n // Each siblingStacks entry: Map tracking occurrences at each level\n this._pathStringCache = null;\n this._view = new MatcherView(this);\n }\n\n /**\n * Push a new tag onto the path.\n * @param {string} tagName\n * @param {Object|null} [attrValues=null]\n * @param {string|null} [namespace=null]\n */\n push(tagName, attrValues = null, namespace = null) {\n this._pathStringCache = null;\n\n // Remove values from previous current node (now becoming ancestor)\n if (this.path.length > 0) {\n this.path[this.path.length - 1].values = undefined;\n }\n\n // Get or create sibling tracking for current level\n const currentLevel = this.path.length;\n if (!this.siblingStacks[currentLevel]) {\n this.siblingStacks[currentLevel] = new Map();\n }\n\n const siblings = this.siblingStacks[currentLevel];\n\n // Create a unique key for sibling tracking that includes namespace\n const siblingKey = namespace ? `${namespace}:${tagName}` : tagName;\n\n // Calculate counter (how many times this tag appeared at this level)\n const counter = siblings.get(siblingKey) || 0;\n\n // Calculate position (total children at this level so far)\n let position = 0;\n for (const count of siblings.values()) {\n position += count;\n }\n\n // Update sibling count for this tag\n siblings.set(siblingKey, counter + 1);\n\n // Create new node\n const node = {\n tag: tagName,\n position: position,\n counter: counter\n };\n\n if (namespace !== null && namespace !== undefined) {\n node.namespace = namespace;\n }\n\n if (attrValues !== null && attrValues !== undefined) {\n node.values = attrValues;\n }\n\n this.path.push(node);\n }\n\n /**\n * Pop the last tag from the path.\n * @returns {Object|undefined} The popped node\n */\n pop() {\n if (this.path.length === 0) return undefined;\n this._pathStringCache = null;\n\n const node = this.path.pop();\n\n if (this.siblingStacks.length > this.path.length + 1) {\n this.siblingStacks.length = this.path.length + 1;\n }\n\n return node;\n }\n\n /**\n * Update current node's attribute values.\n * Useful when attributes are parsed after push.\n * @param {Object} attrValues\n */\n updateCurrent(attrValues) {\n if (this.path.length > 0) {\n const current = this.path[this.path.length - 1];\n if (attrValues !== null && attrValues !== undefined) {\n current.values = attrValues;\n }\n }\n }\n\n /**\n * Get current tag name.\n * @returns {string|undefined}\n */\n getCurrentTag() {\n return this.path.length > 0 ? this.path[this.path.length - 1].tag : undefined;\n }\n\n /**\n * Get current namespace.\n * @returns {string|undefined}\n */\n getCurrentNamespace() {\n return this.path.length > 0 ? this.path[this.path.length - 1].namespace : undefined;\n }\n\n /**\n * Get current node's attribute value.\n * @param {string} attrName\n * @returns {*}\n */\n getAttrValue(attrName) {\n if (this.path.length === 0) return undefined;\n return this.path[this.path.length - 1].values?.[attrName];\n }\n\n /**\n * Check if current node has an attribute.\n * @param {string} attrName\n * @returns {boolean}\n */\n hasAttr(attrName) {\n if (this.path.length === 0) return false;\n const current = this.path[this.path.length - 1];\n return current.values !== undefined && attrName in current.values;\n }\n\n /**\n * Get current node's sibling position (child index in parent).\n * @returns {number}\n */\n getPosition() {\n if (this.path.length === 0) return -1;\n return this.path[this.path.length - 1].position ?? 0;\n }\n\n /**\n * Get current node's repeat counter (occurrence count of this tag name).\n * @returns {number}\n */\n getCounter() {\n if (this.path.length === 0) return -1;\n return this.path[this.path.length - 1].counter ?? 0;\n }\n\n /**\n * Get current node's sibling index (alias for getPosition).\n * @returns {number}\n * @deprecated Use getPosition() or getCounter() instead\n */\n getIndex() {\n return this.getPosition();\n }\n\n /**\n * Get current path depth.\n * @returns {number}\n */\n getDepth() {\n return this.path.length;\n }\n\n /**\n * Get path as string.\n * @param {string} [separator] - Optional separator (uses default if not provided)\n * @param {boolean} [includeNamespace=true]\n * @returns {string}\n */\n toString(separator, includeNamespace = true) {\n const sep = separator || this.separator;\n const isDefault = (sep === this.separator && includeNamespace === true);\n\n if (isDefault) {\n if (this._pathStringCache !== null) {\n return this._pathStringCache;\n }\n const result = this.path.map(n =>\n (n.namespace) ? `${n.namespace}:${n.tag}` : n.tag\n ).join(sep);\n this._pathStringCache = result;\n return result;\n }\n\n return this.path.map(n =>\n (includeNamespace && n.namespace) ? `${n.namespace}:${n.tag}` : n.tag\n ).join(sep);\n }\n\n /**\n * Get path as array of tag names.\n * @returns {string[]}\n */\n toArray() {\n return this.path.map(n => n.tag);\n }\n\n /**\n * Reset the path to empty.\n */\n reset() {\n this._pathStringCache = null;\n this.path = [];\n this.siblingStacks = [];\n }\n\n /**\n * Match current path against an Expression.\n * @param {Expression} expression\n * @returns {boolean}\n */\n matches(expression) {\n const segments = expression.segments;\n\n if (segments.length === 0) {\n return false;\n }\n\n if (expression.hasDeepWildcard()) {\n return this._matchWithDeepWildcard(segments);\n }\n\n return this._matchSimple(segments);\n }\n\n /**\n * @private\n */\n _matchSimple(segments) {\n if (this.path.length !== segments.length) {\n return false;\n }\n\n for (let i = 0; i < segments.length; i++) {\n if (!this._matchSegment(segments[i], this.path[i], i === this.path.length - 1)) {\n return false;\n }\n }\n\n return true;\n }\n\n /**\n * @private\n */\n _matchWithDeepWildcard(segments) {\n let pathIdx = this.path.length - 1;\n let segIdx = segments.length - 1;\n\n while (segIdx >= 0 && pathIdx >= 0) {\n const segment = segments[segIdx];\n\n if (segment.type === 'deep-wildcard') {\n segIdx--;\n\n if (segIdx < 0) {\n return true;\n }\n\n const nextSeg = segments[segIdx];\n let found = false;\n\n for (let i = pathIdx; i >= 0; i--) {\n if (this._matchSegment(nextSeg, this.path[i], i === this.path.length - 1)) {\n pathIdx = i - 1;\n segIdx--;\n found = true;\n break;\n }\n }\n\n if (!found) {\n return false;\n }\n } else {\n if (!this._matchSegment(segment, this.path[pathIdx], pathIdx === this.path.length - 1)) {\n return false;\n }\n pathIdx--;\n segIdx--;\n }\n }\n\n return segIdx < 0;\n }\n\n /**\n * @private\n */\n _matchSegment(segment, node, isCurrentNode) {\n if (segment.tag !== '*' && segment.tag !== node.tag) {\n return false;\n }\n\n if (segment.namespace !== undefined) {\n if (segment.namespace !== '*' && segment.namespace !== node.namespace) {\n return false;\n }\n }\n\n if (segment.attrName !== undefined) {\n if (!isCurrentNode) {\n return false;\n }\n\n if (!node.values || !(segment.attrName in node.values)) {\n return false;\n }\n\n if (segment.attrValue !== undefined) {\n if (String(node.values[segment.attrName]) !== String(segment.attrValue)) {\n return false;\n }\n }\n }\n\n if (segment.position !== undefined) {\n if (!isCurrentNode) {\n return false;\n }\n\n const counter = node.counter ?? 0;\n\n if (segment.position === 'first' && counter !== 0) {\n return false;\n } else if (segment.position === 'odd' && counter % 2 !== 1) {\n return false;\n } else if (segment.position === 'even' && counter % 2 !== 0) {\n return false;\n } else if (segment.position === 'nth' && counter !== segment.positionValue) {\n return false;\n }\n }\n\n return true;\n }\n\n /**\n * Match any expression in the given set against the current path.\n * @param {ExpressionSet} exprSet\n * @returns {boolean}\n */\n matchesAny(exprSet) {\n return exprSet.matchesAny(this);\n }\n\n /**\n * Create a snapshot of current state.\n * @returns {Object}\n */\n snapshot() {\n return {\n path: this.path.map(node => ({ ...node })),\n siblingStacks: this.siblingStacks.map(map => new Map(map))\n };\n }\n\n /**\n * Restore state from snapshot.\n * @param {Object} snapshot\n */\n restore(snapshot) {\n this._pathStringCache = null;\n this.path = snapshot.path.map(node => ({ ...node }));\n this.siblingStacks = snapshot.siblingStacks.map(map => new Map(map));\n }\n\n /**\n * Return the read-only {@link MatcherView} for this matcher.\n *\n * The same instance is returned on every call — no allocation occurs.\n * It always reflects the current parser state and is safe to pass to\n * user callbacks without risk of accidental mutation.\n *\n * @returns {MatcherView}\n *\n * @example\n * const view = matcher.readOnly();\n * // pass view to callbacks — it stays in sync automatically\n * view.matches(expr); // ✓\n * view.getCurrentTag(); // ✓\n * // view.push(...) // ✗ method does not exist — caught by TypeScript\n */\n readOnly() {\n return this._view;\n }\n}","/**\n * Expression - Parses and stores a tag pattern expression\n * \n * Patterns are parsed once and stored in an optimized structure for fast matching.\n * \n * @example\n * const expr = new Expression(\"root.users.user\");\n * const expr2 = new Expression(\"..user[id]:first\");\n * const expr3 = new Expression(\"root/users/user\", { separator: '/' });\n */\nexport default class Expression {\n /**\n * Create a new Expression\n * @param {string} pattern - Pattern string (e.g., \"root.users.user\", \"..user[id]\")\n * @param {Object} options - Configuration options\n * @param {string} options.separator - Path separator (default: '.')\n */\n constructor(pattern, options = {}, data) {\n this.pattern = pattern;\n this.separator = options.separator || '.';\n this.segments = this._parse(pattern);\n this.data = data;\n // Cache expensive checks for performance (O(1) instead of O(n))\n this._hasDeepWildcard = this.segments.some(seg => seg.type === 'deep-wildcard');\n this._hasAttributeCondition = this.segments.some(seg => seg.attrName !== undefined);\n this._hasPositionSelector = this.segments.some(seg => seg.position !== undefined);\n }\n\n /**\n * Parse pattern string into segments\n * @private\n * @param {string} pattern - Pattern to parse\n * @returns {Array} Array of segment objects\n */\n _parse(pattern) {\n const segments = [];\n\n // Split by separator but handle \"..\" specially\n let i = 0;\n let currentPart = '';\n\n while (i < pattern.length) {\n if (pattern[i] === this.separator) {\n // Check if next char is also separator (deep wildcard)\n if (i + 1 < pattern.length && pattern[i + 1] === this.separator) {\n // Flush current part if any\n if (currentPart.trim()) {\n segments.push(this._parseSegment(currentPart.trim()));\n currentPart = '';\n }\n // Add deep wildcard\n segments.push({ type: 'deep-wildcard' });\n i += 2; // Skip both separators\n } else {\n // Regular separator\n if (currentPart.trim()) {\n segments.push(this._parseSegment(currentPart.trim()));\n }\n currentPart = '';\n i++;\n }\n } else {\n currentPart += pattern[i];\n i++;\n }\n }\n\n // Flush remaining part\n if (currentPart.trim()) {\n segments.push(this._parseSegment(currentPart.trim()));\n }\n\n return segments;\n }\n\n /**\n * Parse a single segment\n * @private\n * @param {string} part - Segment string (e.g., \"user\", \"ns::user\", \"user[id]\", \"ns::user:first\")\n * @returns {Object} Segment object\n */\n _parseSegment(part) {\n const segment = { type: 'tag' };\n\n // NEW NAMESPACE SYNTAX (v2.0):\n // ============================\n // Namespace uses DOUBLE colon (::)\n // Position uses SINGLE colon (:)\n // \n // Examples:\n // \"user\" → tag\n // \"user:first\" → tag + position\n // \"user[id]\" → tag + attribute\n // \"user[id]:first\" → tag + attribute + position\n // \"ns::user\" → namespace + tag\n // \"ns::user:first\" → namespace + tag + position\n // \"ns::user[id]\" → namespace + tag + attribute\n // \"ns::user[id]:first\" → namespace + tag + attribute + position\n // \"ns::first\" → namespace + tag named \"first\" (NO ambiguity!)\n //\n // This eliminates all ambiguity:\n // :: = namespace separator\n // : = position selector\n // [] = attributes\n\n // Step 1: Extract brackets [attr] or [attr=value]\n let bracketContent = null;\n let withoutBrackets = part;\n\n const bracketMatch = part.match(/^([^\\[]+)(\\[[^\\]]*\\])(.*)$/);\n if (bracketMatch) {\n withoutBrackets = bracketMatch[1] + bracketMatch[3];\n if (bracketMatch[2]) {\n const content = bracketMatch[2].slice(1, -1);\n if (content) {\n bracketContent = content;\n }\n }\n }\n\n // Step 2: Check for namespace (double colon ::)\n let namespace = undefined;\n let tagAndPosition = withoutBrackets;\n\n if (withoutBrackets.includes('::')) {\n const nsIndex = withoutBrackets.indexOf('::');\n namespace = withoutBrackets.substring(0, nsIndex).trim();\n tagAndPosition = withoutBrackets.substring(nsIndex + 2).trim(); // Skip ::\n\n if (!namespace) {\n throw new Error(`Invalid namespace in pattern: ${part}`);\n }\n }\n\n // Step 3: Parse tag and position (single colon :)\n let tag = undefined;\n let positionMatch = null;\n\n if (tagAndPosition.includes(':')) {\n const colonIndex = tagAndPosition.lastIndexOf(':'); // Use last colon for position\n const tagPart = tagAndPosition.substring(0, colonIndex).trim();\n const posPart = tagAndPosition.substring(colonIndex + 1).trim();\n\n // Verify position is a valid keyword\n const isPositionKeyword = ['first', 'last', 'odd', 'even'].includes(posPart) ||\n /^nth\\(\\d+\\)$/.test(posPart);\n\n if (isPositionKeyword) {\n tag = tagPart;\n positionMatch = posPart;\n } else {\n // Not a valid position keyword, treat whole thing as tag\n tag = tagAndPosition;\n }\n } else {\n tag = tagAndPosition;\n }\n\n if (!tag) {\n throw new Error(`Invalid segment pattern: ${part}`);\n }\n\n segment.tag = tag;\n if (namespace) {\n segment.namespace = namespace;\n }\n\n // Step 4: Parse attributes\n if (bracketContent) {\n if (bracketContent.includes('=')) {\n const eqIndex = bracketContent.indexOf('=');\n segment.attrName = bracketContent.substring(0, eqIndex).trim();\n segment.attrValue = bracketContent.substring(eqIndex + 1).trim();\n } else {\n segment.attrName = bracketContent.trim();\n }\n }\n\n // Step 5: Parse position selector\n if (positionMatch) {\n const nthMatch = positionMatch.match(/^nth\\((\\d+)\\)$/);\n if (nthMatch) {\n segment.position = 'nth';\n segment.positionValue = parseInt(nthMatch[1], 10);\n } else {\n segment.position = positionMatch;\n }\n }\n\n return segment;\n }\n\n /**\n * Get the number of segments\n * @returns {number}\n */\n get length() {\n return this.segments.length;\n }\n\n /**\n * Check if expression contains deep wildcard\n * @returns {boolean}\n */\n hasDeepWildcard() {\n return this._hasDeepWildcard;\n }\n\n /**\n * Check if expression has attribute conditions\n * @returns {boolean}\n */\n hasAttributeCondition() {\n return this._hasAttributeCondition;\n }\n\n /**\n * Check if expression has position selectors\n * @returns {boolean}\n */\n hasPositionSelector() {\n return this._hasPositionSelector;\n }\n\n /**\n * Get string representation\n * @returns {string}\n */\n toString() {\n return this.pattern;\n }\n}","/**\n * ExpressionSet - An indexed collection of Expressions for efficient bulk matching\n *\n * Instead of iterating all expressions on every tag, ExpressionSet pre-indexes\n * them at insertion time by depth and terminal tag name. At match time, only\n * the relevant bucket is evaluated — typically reducing checks from O(E) to O(1)\n * lookup plus O(small bucket) matches.\n *\n * Three buckets are maintained:\n * - `_byDepthAndTag` — exact depth + exact tag name (tightest, used first)\n * - `_wildcardByDepth` — exact depth + wildcard tag `*` (depth-matched only)\n * - `_deepWildcards` — expressions containing `..` (cannot be depth-indexed)\n *\n * @example\n * import { Expression, ExpressionSet } from 'fast-xml-tagger';\n *\n * // Build once at config time\n * const stopNodes = new ExpressionSet();\n * stopNodes.add(new Expression('root.users.user'));\n * stopNodes.add(new Expression('root.config.setting'));\n * stopNodes.add(new Expression('..script'));\n *\n * // Query on every tag — hot path\n * if (stopNodes.matchesAny(matcher)) { ... }\n */\nexport default class ExpressionSet {\n constructor() {\n /** @type {Map} depth:tag → expressions */\n this._byDepthAndTag = new Map();\n\n /** @type {Map} depth → wildcard-tag expressions */\n this._wildcardByDepth = new Map();\n\n /** @type {import('./Expression.js').default[]} expressions containing deep wildcard (..) */\n this._deepWildcards = [];\n\n /** @type {Set} pattern strings already added — used for deduplication */\n this._patterns = new Set();\n\n /** @type {boolean} whether the set is sealed against further additions */\n this._sealed = false;\n }\n\n /**\n * Add an Expression to the set.\n * Duplicate patterns (same pattern string) are silently ignored.\n *\n * @param {import('./Expression.js').default} expression - A pre-constructed Expression instance\n * @returns {this} for chaining\n * @throws {TypeError} if called after seal()\n *\n * @example\n * set.add(new Expression('root.users.user'));\n * set.add(new Expression('..script'));\n */\n add(expression) {\n if (this._sealed) {\n throw new TypeError(\n 'ExpressionSet is sealed. Create a new ExpressionSet to add more expressions.'\n );\n }\n\n // Deduplicate by pattern string\n if (this._patterns.has(expression.pattern)) return this;\n this._patterns.add(expression.pattern);\n\n if (expression.hasDeepWildcard()) {\n this._deepWildcards.push(expression);\n return this;\n }\n\n const depth = expression.length;\n const lastSeg = expression.segments[expression.segments.length - 1];\n const tag = lastSeg?.tag;\n\n if (!tag || tag === '*') {\n // Can index by depth but not by tag\n if (!this._wildcardByDepth.has(depth)) this._wildcardByDepth.set(depth, []);\n this._wildcardByDepth.get(depth).push(expression);\n } else {\n // Tightest bucket: depth + tag\n const key = `${depth}:${tag}`;\n if (!this._byDepthAndTag.has(key)) this._byDepthAndTag.set(key, []);\n this._byDepthAndTag.get(key).push(expression);\n }\n\n return this;\n }\n\n /**\n * Add multiple expressions at once.\n *\n * @param {import('./Expression.js').default[]} expressions - Array of Expression instances\n * @returns {this} for chaining\n *\n * @example\n * set.addAll([\n * new Expression('root.users.user'),\n * new Expression('root.config.setting'),\n * ]);\n */\n addAll(expressions) {\n for (const expr of expressions) this.add(expr);\n return this;\n }\n\n /**\n * Check whether a pattern string is already present in the set.\n *\n * @param {import('./Expression.js').default} expression\n * @returns {boolean}\n */\n has(expression) {\n return this._patterns.has(expression.pattern);\n }\n\n /**\n * Number of expressions in the set.\n * @type {number}\n */\n get size() {\n return this._patterns.size;\n }\n\n /**\n * Seal the set against further modifications.\n * Useful to prevent accidental mutations after config is built.\n * Calling add() or addAll() on a sealed set throws a TypeError.\n *\n * @returns {this}\n */\n seal() {\n this._sealed = true;\n return this;\n }\n\n /**\n * Whether the set has been sealed.\n * @type {boolean}\n */\n get isSealed() {\n return this._sealed;\n }\n\n /**\n * Test whether the matcher's current path matches any expression in the set.\n *\n * Evaluation order (cheapest → most expensive):\n * 1. Exact depth + tag bucket — O(1) lookup, typically 0–2 expressions\n * 2. Depth-only wildcard bucket — O(1) lookup, rare\n * 3. Deep-wildcard list — always checked, but usually small\n *\n * @param {import('./Matcher.js').default} matcher - Matcher instance (or readOnly view)\n * @returns {boolean} true if any expression matches the current path\n *\n * @example\n * if (stopNodes.matchesAny(matcher)) {\n * // handle stop node\n * }\n */\n matchesAny(matcher) {\n return this.findMatch(matcher) !== null;\n }\n /**\n * Find and return the first Expression that matches the matcher's current path.\n *\n * Uses the same evaluation order as matchesAny (cheapest → most expensive):\n * 1. Exact depth + tag bucket\n * 2. Depth-only wildcard bucket\n * 3. Deep-wildcard list\n *\n * @param {import('./Matcher.js').default} matcher - Matcher instance (or readOnly view)\n * @returns {import('./Expression.js').default | null} the first matching Expression, or null\n *\n * @example\n * const expr = stopNodes.findMatch(matcher);\n * if (expr) {\n * // access expr.config, expr.pattern, etc.\n * }\n */\n findMatch(matcher) {\n const depth = matcher.getDepth();\n const tag = matcher.getCurrentTag();\n\n // 1. Tightest bucket — most expressions live here\n const exactKey = `${depth}:${tag}`;\n const exactBucket = this._byDepthAndTag.get(exactKey);\n if (exactBucket) {\n for (let i = 0; i < exactBucket.length; i++) {\n if (matcher.matches(exactBucket[i])) return exactBucket[i];\n }\n }\n\n // 2. Depth-matched wildcard-tag expressions\n const wildcardBucket = this._wildcardByDepth.get(depth);\n if (wildcardBucket) {\n for (let i = 0; i < wildcardBucket.length; i++) {\n if (matcher.matches(wildcardBucket[i])) return wildcardBucket[i];\n }\n }\n\n // 3. Deep wildcards — cannot be pre-filtered by depth or tag\n for (let i = 0; i < this._deepWildcards.length; i++) {\n if (matcher.matches(this._deepWildcards[i])) return this._deepWildcards[i];\n }\n\n return null;\n }\n}\n","// ---------------------------------------------------------------------------\n// Built-in entity tables\n// ---------------------------------------------------------------------------\n\n/**\n * Standard XML entities — always processed after external/system so they\n * cannot be overridden by DOCTYPE, and & is deferred to its own final pass.\n *\n * Each entry: { regex: RegExp, val: string }\n */\nconst DEFAULT_XML_ENTITIES = {\n apos: { regex: /&(apos|#0*39|#x0*27);/g, val: \"'\" },\n gt: { regex: /&(gt|#0*62|#x0*3[Ee]);/g, val: '>' },\n lt: { regex: /&(lt|#0*60|#x0*3[Cc]);/g, val: '<' },\n quot: { regex: /&(quot|#0*34|#x0*22);/g, val: '\"' },\n};\n\n/** & — always expanded last to avoid double-expansion. */\nconst AMP_ENTITY = { regex: /&(amp|#0*38|#x0*26);/g, val: '&' };\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nconst SPECIAL_CHARS = new Set('!?\\\\\\\\/[]$%{}^&*()<>|+');\n\n/**\n * Validate that an entity name contains no regex-special or otherwise\n * dangerous characters.\n * @param {string} name\n * @returns {string} the name, unchanged\n * @throws {Error} on invalid characters\n */\nfunction validateEntityName(name) {\n for (const ch of name) {\n if (SPECIAL_CHARS.has(ch)) {\n throw new Error(`[EntityReplacer] Invalid character '${ch}' in entity name: \"${name}\"`);\n }\n }\n return name;\n}\n\n/**\n * Escape a string for use inside a RegExp character class / alternation.\n */\nfunction escapeForRegex(str) {\n return str.replace(/[.\\-+*:]/g, '\\\\$&');\n}\n\n/**\n * Resolve a constructor option to an entity table (plain object) or null.\n */\nfunction resolveTable(option, builtIn, enabledByDefault = false) {\n if (option === false || option === null) return null;\n if (option === true) return builtIn;\n if (option === undefined) return enabledByDefault ? builtIn : null;\n if (typeof option === 'object') return option;\n return null;\n}\n\n/**\n * Convert a category name or array of names into a Set.\n */\nfunction resolveApplyLimitsTo(spec) {\n if (spec === 'all') return 'all';\n if (typeof spec === 'string') return new Set([spec]);\n if (Array.isArray(spec)) return new Set(spec);\n return new Set(['external']);\n}\n\n/**\n * Build an entries array from a raw map of name → string|{regex,val}.\n * Skips string values that contain '&' (recursive expansion risk).\n * Normalises DocTypeReader's `regx` spelling to `regex`.\n *\n * @param {object} map\n * @returns {Array<[string, {regex: RegExp, val: string}]>}\n */\nfunction buildEntries(map) {\n const entries = [];\n for (const key of Object.keys(map)) {\n const raw = map[key];\n if (typeof raw === 'object' && raw !== null && (raw.val !== undefined)) {\n // Accept pre-built { regex, val } or DocTypeReader's { regx, val }\n entries.push([key, { regex: raw.regex ?? raw.regx, val: raw.val }]);\n } else if (typeof raw === 'string') {\n if (raw.indexOf('&') !== -1) continue; // skip — would cause recursive expansion\n validateEntityName(key);\n entries.push([key, {\n regex: new RegExp('&' + escapeForRegex(key) + ';', 'g'),\n val: raw,\n }]);\n }\n }\n return entries;\n}\n\n// ---------------------------------------------------------------------------\n// EntityReplacer\n// ---------------------------------------------------------------------------\n\n/**\n * Standalone, zero-dependency entity replacer for XML/HTML content.\n *\n * Entity categories:\n * - **persistent external** — configured once, survive across documents.\n * Set via `setExternalEntities()` or built up via `addExternalEntity()`.\n * - **input / runtime** — DOCTYPE entities for the *current* document only.\n * Injected via `addInputEntities()`. Wiped on every `getInstance()` call\n * so they never leak between documents.\n *\n * Replacement order (fixed):\n * 1. persistent external\n * 2. input / runtime (DOCTYPE)\n * 3. system (named entity groups)\n * 4. default (lt / gt / apos / quot)\n * 5. amp (& final pass)\n *\n * @example\n * const replacer = new EntityReplacer({ default: true, system: COMMON_HTML });\n * replacer.setExternalEntities({ brand: 'Acme' });\n *\n * // Builder factory calls getInstance() before each document:\n * const instance = replacer.getInstance();\n * // Builder calls addInputEntities() if DOCTYPE entities are present:\n * instance.addInputEntities({ version: '1.0' });\n * instance.replace('&brand; v&version; <'); // 'Acme v1.0 <'\n */\nexport default class EntityReplacer {\n /**\n * @param {object} [options]\n * @param {boolean|object|null} [options.default=true]\n * @param {boolean|object|null} [options.amp=true]\n * @param {boolean|object|null} [options.system=false]\n * @param {number} [options.maxTotalExpansions=0]\n * @param {number} [options.maxExpandedLength=0]\n * @param {'external'|'all'|string[]} [options.applyLimitsTo='external']\n * @param {((resolved: string, original: string) => string)|null} [options.postCheck=null]\n */\n constructor(options = {}) {\n // Immutable config resolved at construction\n this._defaultTable = resolveTable(options.default, DEFAULT_XML_ENTITIES, true);\n this._systemTable = resolveTable(options.system, null, false);\n this._ampEnabled = options.amp !== false && options.amp !== null;\n\n this._maxTotalExpansions = options.maxTotalExpansions || 0;\n this._maxExpandedLength = options.maxExpandedLength || 0;\n this._applyLimitsTo = resolveApplyLimitsTo(options.applyLimitsTo ?? 'external');\n this._postCheck = typeof options.postCheck === 'function' ? options.postCheck : r => r;\n\n // Pre-computed category limit flags\n this._limitExternal = this._applyLimitsTo === 'all' || (this._applyLimitsTo instanceof Set && this._applyLimitsTo.has('external'));\n this._limitSystem = this._applyLimitsTo === 'all' || (this._applyLimitsTo instanceof Set && this._applyLimitsTo.has('system'));\n this._limitDefault = this._applyLimitsTo === 'all' || (this._applyLimitsTo instanceof Set && this._applyLimitsTo.has('default'));\n\n // Frozen immutable entry arrays\n this._defaultEntries = this._defaultTable ? Object.entries(this._defaultTable) : [];\n this._systemEntries = this._systemTable ? Object.entries(this._systemTable) : [];\n\n // Persistent external entities — survive across documents\n /** @type {Array<[string, {regex: RegExp, val: string}]>} */\n this._persistentEntries = [];\n\n // Input / runtime entities — current document only, reset per getInstance()\n /** @type {Array<[string, {regex: RegExp, val: string}]>} */\n this._inputEntries = [];\n\n // Per-document counters — reset in getInstance()\n this._totalExpansions = 0;\n this._expandedLength = 0;\n }\n\n // -------------------------------------------------------------------------\n // Persistent external entity registration (survives across documents)\n // -------------------------------------------------------------------------\n\n /**\n * Replace the full set of persistent external entities.\n * These are never wiped between documents.\n *\n * @param {Record} map\n */\n setExternalEntities(map) {\n this._persistentEntries = buildEntries(map);\n }\n\n /**\n * Add a single persistent external entity without disturbing existing ones.\n *\n * @param {string} key — bare entity name, e.g. `'copy'`\n * @param {string} value — replacement string, e.g. `'©'`\n */\n addExternalEntity(key, value) {\n validateEntityName(key);\n if (typeof value === 'string' && value.indexOf('&') === -1) {\n this._persistentEntries.push([key, {\n regex: new RegExp('&' + escapeForRegex(key) + ';', 'g'),\n val: value,\n }]);\n }\n }\n\n // -------------------------------------------------------------------------\n // Input / runtime entity registration (per document)\n // -------------------------------------------------------------------------\n\n /**\n * Inject DOCTYPE (input/runtime) entities for the current document.\n * These are stored separately from persistent entities and wiped on the\n * next `getInstance()` call so they never leak into subsequent documents.\n *\n * Also resets per-document expansion counters.\n *\n * @param {Record} map\n */\n addInputEntities(map) {\n this._totalExpansions = 0;\n this._expandedLength = 0;\n this._inputEntries = buildEntries(map);\n }\n\n // -------------------------------------------------------------------------\n // getInstance — builder factory integration point\n // -------------------------------------------------------------------------\n\n /**\n * Reset all per-document state (input entities + expansion counters) and\n * return `this`.\n *\n * The builder factory calls this each time it creates a new builder instance\n * so DOCTYPE entities from a previous document are never carried over.\n *\n */\n reset() {\n this._inputEntries = [];\n this._totalExpansions = 0;\n this._expandedLength = 0;\n }\n\n // -------------------------------------------------------------------------\n // Primary API\n // -------------------------------------------------------------------------\n\n /**\n * Replace all entity references in `str`.\n *\n * Processing order:\n * 1. persistent external\n * 2. input / runtime (DOCTYPE)\n * 3. system\n * 4. default (lt/gt/apos/quot)\n * 5. amp\n * 6. postCheck hook\n *\n * @param {string} str\n * @returns {string}\n */\n replace(str) {\n if (typeof str !== 'string' || str.length === 0) return str;\n if (str.indexOf('&') === -1) return str; // fast path\n\n const original = str;\n\n\n // 1. Persistent external entities\n if (this._persistentEntries.length > 0) {\n str = this._applyEntries(str, this._persistentEntries, this._limitExternal);\n }\n\n // 2. Input / runtime entities (DOCTYPE)\n if (this._inputEntries.length > 0 && str.indexOf('&') !== -1) {\n str = this._applyEntries(str, this._inputEntries, this._limitExternal);\n }\n\n // 3. Default XML entities (lt / gt / apos / quot)\n if (this._defaultEntries.length > 0 && str.indexOf('&') !== -1) {\n str = this._applyEntries(str, this._defaultEntries, this._limitDefault);\n }\n\n // 4. System (named groups)\n if (this._systemEntries.length > 0 && str.indexOf('&') !== -1) {\n str = this._applyEntries(str, this._systemEntries, this._limitSystem);\n }\n\n // 5. & — always last\n if (this._ampEnabled && str.indexOf('&') !== -1) {\n str = str.replace(AMP_ENTITY.regex, AMP_ENTITY.val);\n }\n\n // 6. postCheck\n str = this._postCheck(str, original);\n\n return str;\n }\n\n\n /**\n * \n * @param {string} val \n * @returns \n */\n parse(val) {\n return this.replace(val);\n }\n // -------------------------------------------------------------------------\n // Private helpers\n // -------------------------------------------------------------------------\n\n _applyEntries(str, entries, track) {\n const limitExpansions = track && this._maxTotalExpansions > 0;\n const limitLength = track && this._maxExpandedLength > 0;\n const trackAny = limitExpansions || limitLength;\n\n for (let i = 0; i < entries.length; i++) {\n if (str.indexOf('&') === -1) break;\n\n const entity = entries[i][1];\n\n if (!trackAny) {\n str = str.replace(entity.regex, entity.val);\n continue;\n }\n\n if (limitExpansions && !limitLength) {\n let count = 0;\n str = str.replace(entity.regex, (...args) => {\n count++;\n return typeof entity.val === 'function' ? entity.val(...args) : entity.val;\n });\n if (count > 0) {\n this._totalExpansions += count;\n if (this._totalExpansions > this._maxTotalExpansions) {\n throw new Error(\n `[EntityReplacer] Entity expansion count limit exceeded: ` +\n `${this._totalExpansions} > ${this._maxTotalExpansions}`\n );\n }\n }\n } else if (limitLength && !limitExpansions) {\n const before = str.length;\n str = str.replace(entity.regex, entity.val);\n const delta = str.length - before;\n if (delta > 0) {\n this._expandedLength += delta;\n if (this._expandedLength > this._maxExpandedLength) {\n throw new Error(\n `[EntityReplacer] Expanded content length limit exceeded: ` +\n `${this._expandedLength} > ${this._maxExpandedLength}`\n );\n }\n }\n } else {\n const before = str.length;\n let count = 0;\n str = str.replace(entity.regex, (...args) => {\n count++;\n return typeof entity.val === 'function' ? entity.val(...args) : entity.val;\n });\n if (count > 0) {\n this._totalExpansions += count;\n if (this._totalExpansions > this._maxTotalExpansions) {\n throw new Error(\n `[EntityReplacer] Entity expansion count limit exceeded: ` +\n `${this._totalExpansions} > ${this._maxTotalExpansions}`\n );\n }\n }\n const delta = str.length - before;\n if (delta > 0) {\n this._expandedLength += delta;\n if (this._expandedLength > this._maxExpandedLength) {\n throw new Error(\n `[EntityReplacer] Expanded content length limit exceeded: ` +\n `${this._expandedLength} > ${this._maxExpandedLength}`\n );\n }\n }\n }\n }\n return str;\n }\n}\n\n// Re-export the built-in tables for advanced users who want to extend them\nexport { DEFAULT_XML_ENTITIES, AMP_ENTITY };\n","// ---------------------------------------------------------------------------\n// Named entity groups — importable separately and freely composable.\n// All groups are plain objects; no magic, no classes.\n// ---------------------------------------------------------------------------\n\n/**\n * ~20 most commonly needed HTML named entities.\n * @type {Record string) }>}\n */\nexport const COMMON_HTML = {\n nbsp: { regex: /&(nbsp|#0*160|#x0*[Aa]0);/g, val: '\\u00a0' },\n copy: { regex: /&(copy|#0*169|#x0*[Aa]9);/g, val: '\\u00a9' },\n reg: { regex: /&(reg|#0*174|#x0*[Aa][Ee]);/g, val: '\\u00ae' },\n trade: { regex: /&(trade|#0*8482|#x0*2122);/g, val: '\\u2122' },\n mdash: { regex: /&(mdash|#0*8212|#x0*2014);/g, val: '\\u2014' },\n ndash: { regex: /&(ndash|#0*8211|#x0*2013);/g, val: '\\u2013' },\n hellip: { regex: /&(hellip|#0*8230|#x0*2026);/g, val: '\\u2026' },\n laquo: { regex: /&(laquo|#0*171|#x0*[Aa][Bb]);/g, val: '\\u00ab' },\n raquo: { regex: /&(raquo|#0*187|#x0*[Bb][Bb]);/g, val: '\\u00bb' },\n lsquo: { regex: /&(lsquo|#0*8216|#x0*2018);/g, val: '\\u2018' },\n rsquo: { regex: /&(rsquo|#0*8217|#x0*2019);/g, val: '\\u2019' },\n ldquo: { regex: /&(ldquo|#0*8220|#x0*201[Cc]);/g, val: '\\u201c' },\n rdquo: { regex: /&(rdquo|#0*8221|#x0*201[Dd]);/g, val: '\\u201d' },\n bull: { regex: /&(bull|#0*8226|#x0*2022);/g, val: '\\u2022' },\n para: { regex: /&(para|#0*182|#x0*[Bb]6);/g, val: '\\u00b6' },\n sect: { regex: /&(sect|#0*167|#x0*[Aa]7);/g, val: '\\u00a7' },\n deg: { regex: /&(deg|#0*176|#x0*[Bb]0);/g, val: '\\u00b0' },\n frac12: { regex: /&(frac12|#0*189|#x0*[Bb][Dd]);/g, val: '\\u00bd' },\n frac14: { regex: /&(frac14|#0*188|#x0*[Bb][Cc]);/g, val: '\\u00bc' },\n frac34: { regex: /&(frac34|#0*190|#x0*[Bb][Ee]);/g, val: '\\u00be' },\n inr: { regex: /&(inr|#0*8377);/g, val: \"₹\" },\n};\n\n/**\n * Currency symbol entities.\n */\nexport const CURRENCY_ENTITIES = {\n cent: { regex: /&(cent|#0*162|#x0*[Aa]2);/g, val: '\\u00a2' },\n pound: { regex: /&(pound|#0*163|#x0*[Aa]3);/g, val: '\\u00a3' },\n yen: { regex: /&(yen|#0*165|#x0*[Aa]5);/g, val: '\\u00a5' },\n euro: { regex: /&(euro|#0*8364|#x0*20[Aa][Cc]);/g, val: '\\u20ac' },\n inr: { regex: /&(inr|#0*8377|#x0*20[Bb]9);/g, val: '\\u20b9' },\n curren: { regex: /&(curren|#0*164|#x0*[Aa]4);/g, val: '\\u00a4' },\n fnof: { regex: /&(fnof|#0*402|#x0*192);/g, val: '\\u0192' },\n};\n\n/**\n * Mathematical operator entities.\n */\nexport const MATH_ENTITIES = {\n times: { regex: /&(times|#0*215|#x0*[Dd]7);/g, val: '\\u00d7' },\n divide: { regex: /&(divide|#0*247|#x0*[Ff]7);/g, val: '\\u00f7' },\n plusmn: { regex: /&(plusmn|#0*177|#x0*[Bb]1);/g, val: '\\u00b1' },\n minus: { regex: /&(minus|#0*8722|#x0*2212);/g, val: '\\u2212' },\n sup2: { regex: /&(sup2|#0*178|#x0*[Bb]2);/g, val: '\\u00b2' },\n sup3: { regex: /&(sup3|#0*179|#x0*[Bb]3);/g, val: '\\u00b3' },\n sup1: { regex: /&(sup1|#0*185|#x0*[Bb]9);/g, val: '\\u00b9' },\n frac12: { regex: /&(frac12|#0*189|#x0*[Bb][Dd]);/g, val: '\\u00bd' },\n frac14: { regex: /&(frac14|#0*188|#x0*[Bb][Cc]);/g, val: '\\u00bc' },\n frac34: { regex: /&(frac34|#0*190|#x0*[Bb][Ee]);/g, val: '\\u00be' },\n permil: { regex: /&(permil|#0*8240|#x0*2030);/g, val: '\\u2030' },\n infin: { regex: /&(infin|#0*8734|#x0*221[Ee]);/g, val: '\\u221e' },\n sum: { regex: /&(sum|#0*8721|#x0*2211);/g, val: '\\u2211' },\n prod: { regex: /&(prod|#0*8719|#x0*220[Ff]);/g, val: '\\u220f' },\n radic: { regex: /&(radic|#0*8730|#x0*221[Aa]);/g, val: '\\u221a' },\n ne: { regex: /&(ne|#0*8800|#x0*2260);/g, val: '\\u2260' },\n le: { regex: /&(le|#0*8804|#x0*2264);/g, val: '\\u2264' },\n ge: { regex: /&(ge|#0*8805|#x0*2265);/g, val: '\\u2265' },\n};\n\n/**\n * Arrow entities.\n */\nexport const ARROW_ENTITIES = {\n larr: { regex: /&(larr|#0*8592|#x0*2190);/g, val: '\\u2190' },\n uarr: { regex: /&(uarr|#0*8593|#x0*2191);/g, val: '\\u2191' },\n rarr: { regex: /&(rarr|#0*8594|#x0*2192);/g, val: '\\u2192' },\n darr: { regex: /&(darr|#0*8595|#x0*2193);/g, val: '\\u2193' },\n harr: { regex: /&(harr|#0*8596|#x0*2194);/g, val: '\\u2194' },\n lArr: { regex: /&(lArr|#0*8656|#x0*21[Dd]0);/g, val: '\\u21d0' },\n uArr: { regex: /&(uArr|#0*8657|#x0*21[Dd]1);/g, val: '\\u21d1' },\n rArr: { regex: /&(rArr|#0*8658|#x0*21[Dd]2);/g, val: '\\u21d2' },\n dArr: { regex: /&(dArr|#0*8659|#x0*21[Dd]3);/g, val: '\\u21d3' },\n hArr: { regex: /&(hArr|#0*8660|#x0*21[Dd]4);/g, val: '\\u21d4' },\n};\n\n/**\n * Numeric character references — decimal &#NNN; and hex &#xHH;\n * These are function-replacers; they expand any valid code point.\n */\nexport const NUMERIC_ENTITIES = {\n num_dec: {\n regex: /�*([0-9]{1,7});/g,\n val: (_, s) => fromCodePoint(s, 10, \"&#\"),\n },\n num_hex: {\n regex: /�*([0-9a-fA-F]{1,6});/g,\n val: (_, s) => fromCodePoint(s, 16, \"&#x\"),\n },\n};\n\nfunction fromCodePoint(str, base, prefix) {\n const codePoint = Number.parseInt(str, base);\n\n if (codePoint >= 0 && codePoint <= 0x10FFFF) {\n return String.fromCodePoint(codePoint);\n } else {\n return prefix + str + \";\";\n }\n}","'use strict';\n///@ts-check\n\nimport { getAllMatches, isExist, DANGEROUS_PROPERTY_NAMES, criticalProperties } from '../util.js';\nimport xmlNode from './xmlNode.js';\nimport DocTypeReader from './DocTypeReader.js';\nimport toNumber from \"strnum\";\nimport getIgnoreAttributesFn from \"../ignoreAttributes.js\";\nimport { Expression, Matcher } from 'path-expression-matcher';\nimport { ExpressionSet } from 'path-expression-matcher';\nimport EntityReplacer, { COMMON_HTML, NUMERIC_ENTITIES, CURRENCY_ENTITIES } from '@nodable/entities';\n\n// const regx =\n// '<((!\\\\[CDATA\\\\[([\\\\s\\\\S]*?)(]]>))|((NAME:)?(NAME))([^>]*)>|((\\\\/)(NAME)\\\\s*>))([^<]*)'\n// .replace(/NAME/g, util.nameRegexp);\n\n//const tagsRegx = new RegExp(\"<(\\\\/?[\\\\w:\\\\-\\._]+)([^>]*)>(\\\\s*\"+cdataRegx+\")*([^<]+)?\",\"g\");\n//const tagsRegx = new RegExp(\"<(\\\\/?)((\\\\w*:)?([\\\\w:\\\\-\\._]+))([^>]*)>([^<]*)(\"+cdataRegx+\"([^<]*))*([^<]+)?\",\"g\");\n\n// Helper functions for attribute and namespace handling\n\n/**\n * Extract raw attributes (without prefix) from prefixed attribute map\n * @param {object} prefixedAttrs - Attributes with prefix from buildAttributesMap\n * @param {object} options - Parser options containing attributeNamePrefix\n * @returns {object} Raw attributes for matcher\n */\nfunction extractRawAttributes(prefixedAttrs, options) {\n if (!prefixedAttrs) return {};\n\n // Handle attributesGroupName option\n const attrs = options.attributesGroupName\n ? prefixedAttrs[options.attributesGroupName]\n : prefixedAttrs;\n\n if (!attrs) return {};\n\n const rawAttrs = {};\n for (const key in attrs) {\n // Remove the attribute prefix to get raw name\n if (key.startsWith(options.attributeNamePrefix)) {\n const rawName = key.substring(options.attributeNamePrefix.length);\n rawAttrs[rawName] = attrs[key];\n } else {\n // Attribute without prefix (shouldn't normally happen, but be safe)\n rawAttrs[key] = attrs[key];\n }\n }\n return rawAttrs;\n}\n\n/**\n * Extract namespace from raw tag name\n * @param {string} rawTagName - Tag name possibly with namespace (e.g., \"soap:Envelope\")\n * @returns {string|undefined} Namespace or undefined\n */\nfunction extractNamespace(rawTagName) {\n if (!rawTagName || typeof rawTagName !== 'string') return undefined;\n\n const colonIndex = rawTagName.indexOf(':');\n if (colonIndex !== -1 && colonIndex > 0) {\n const ns = rawTagName.substring(0, colonIndex);\n // Don't treat xmlns as a namespace\n if (ns !== 'xmlns') {\n return ns;\n }\n }\n return undefined;\n}\n\nexport default class OrderedObjParser {\n constructor(options) {\n this.options = options;\n this.currentNode = null;\n this.tagsNodeStack = [];\n this.parseXml = parseXml;\n this.parseTextData = parseTextData;\n this.resolveNameSpace = resolveNameSpace;\n this.buildAttributesMap = buildAttributesMap;\n this.isItStopNode = isItStopNode;\n this.replaceEntitiesValue = replaceEntitiesValue;\n this.readStopNodeData = readStopNodeData;\n this.saveTextToParentTag = saveTextToParentTag;\n this.addChild = addChild;\n this.ignoreAttributesFn = getIgnoreAttributesFn(this.options.ignoreAttributes)\n this.entityExpansionCount = 0;\n this.currentExpandedLength = 0;\n\n this.entityReplacer = new EntityReplacer({\n default: true,\n // amp: true,\n system: this.options.htmlEntities ? { ...COMMON_HTML, ...NUMERIC_ENTITIES, ...CURRENCY_ENTITIES } : {},\n maxTotalExpansions: this.options.processEntities.maxTotalExpansions,\n maxExpandedLength: this.options.processEntities.maxExpandedLength,\n applyLimitsTo: \"all\",\n //postCheck: resolved => resolved\n });\n\n // Initialize path matcher for path-expression-matcher\n this.matcher = new Matcher();\n\n // Live read-only proxy of matcher — PEM creates and caches this internally.\n // All user callbacks receive this instead of the mutable matcher.\n this.readonlyMatcher = this.matcher.readOnly();\n\n // Flag to track if current node is a stop node (optimization)\n this.isCurrentNodeStopNode = false;\n\n // Pre-compile stopNodes expressions\n this.stopNodeExpressionsSet = new ExpressionSet();\n const stopNodesOpts = this.options.stopNodes;\n if (stopNodesOpts && stopNodesOpts.length > 0) {\n for (let i = 0; i < stopNodesOpts.length; i++) {\n const stopNodeExp = stopNodesOpts[i];\n if (typeof stopNodeExp === 'string') {\n // Convert string to Expression object\n this.stopNodeExpressionsSet.add(new Expression(stopNodeExp));\n } else if (stopNodeExp instanceof Expression) {\n // Already an Expression object\n this.stopNodeExpressionsSet.add(stopNodeExp);\n }\n }\n this.stopNodeExpressionsSet.seal();\n }\n }\n\n}\n\n\n/**\n * @param {string} val\n * @param {string} tagName\n * @param {string|Matcher} jPath - jPath string or Matcher instance based on options.jPath\n * @param {boolean} dontTrim\n * @param {boolean} hasAttributes\n * @param {boolean} isLeafNode\n * @param {boolean} escapeEntities\n */\nfunction parseTextData(val, tagName, jPath, dontTrim, hasAttributes, isLeafNode, escapeEntities) {\n const options = this.options;\n if (val !== undefined) {\n if (options.trimValues && !dontTrim) {\n val = val.trim();\n }\n if (val.length > 0) {\n if (!escapeEntities) val = this.replaceEntitiesValue(val, tagName, jPath);\n\n // Pass jPath string or matcher based on options.jPath setting\n const jPathOrMatcher = options.jPath ? jPath.toString() : jPath;\n const newval = options.tagValueProcessor(tagName, val, jPathOrMatcher, hasAttributes, isLeafNode);\n if (newval === null || newval === undefined) {\n //don't parse\n return val;\n } else if (typeof newval !== typeof val || newval !== val) {\n //overwrite\n return newval;\n } else if (options.trimValues) {\n return parseValue(val, options.parseTagValue, options.numberParseOptions);\n } else {\n const trimmedVal = val.trim();\n if (trimmedVal === val) {\n return parseValue(val, options.parseTagValue, options.numberParseOptions);\n } else {\n return val;\n }\n }\n }\n }\n}\n\nfunction resolveNameSpace(tagname) {\n if (this.options.removeNSPrefix) {\n const tags = tagname.split(':');\n const prefix = tagname.charAt(0) === '/' ? '/' : '';\n if (tags[0] === 'xmlns') {\n return '';\n }\n if (tags.length === 2) {\n tagname = prefix + tags[1];\n }\n }\n return tagname;\n}\n\n//TODO: change regex to capture NS\n//const attrsRegx = new RegExp(\"([\\\\w\\\\-\\\\.\\\\:]+)\\\\s*=\\\\s*(['\\\"])((.|\\n)*?)\\\\2\",\"gm\");\nconst attrsRegx = new RegExp('([^\\\\s=]+)\\\\s*(=\\\\s*([\\'\"])([\\\\s\\\\S]*?)\\\\3)?', 'gm');\n\nfunction buildAttributesMap(attrStr, jPath, tagName) {\n const options = this.options;\n if (options.ignoreAttributes !== true && typeof attrStr === 'string') {\n // attrStr = attrStr.replace(/\\r?\\n/g, ' ');\n //attrStr = attrStr || attrStr.trim();\n\n const matches = getAllMatches(attrStr, attrsRegx);\n const len = matches.length; //don't make it inline\n const attrs = {};\n\n // Pre-process values once: trim + entity replacement\n // Reused in both matcher update and second pass\n const processedVals = new Array(len);\n let hasRawAttrs = false;\n const rawAttrsForMatcher = {};\n\n for (let i = 0; i < len; i++) {\n const attrName = this.resolveNameSpace(matches[i][1]);\n const oldVal = matches[i][4];\n\n if (attrName.length && oldVal !== undefined) {\n let val = oldVal;\n if (options.trimValues) val = val.trim();\n val = this.replaceEntitiesValue(val, tagName, this.readonlyMatcher);\n processedVals[i] = val;\n\n rawAttrsForMatcher[attrName] = val;\n hasRawAttrs = true;\n }\n }\n\n // Update matcher ONCE before second pass, if applicable\n if (hasRawAttrs && typeof jPath === 'object' && jPath.updateCurrent) {\n jPath.updateCurrent(rawAttrsForMatcher);\n }\n\n // Hoist toString() once — path doesn't change during attribute processing\n const jPathStr = options.jPath ? jPath.toString() : this.readonlyMatcher;\n\n // Second pass: apply processors, build final attrs\n let hasAttrs = false;\n for (let i = 0; i < len; i++) {\n const attrName = this.resolveNameSpace(matches[i][1]);\n\n if (this.ignoreAttributesFn(attrName, jPathStr)) continue;\n\n let aName = options.attributeNamePrefix + attrName;\n\n if (attrName.length) {\n if (options.transformAttributeName) {\n aName = options.transformAttributeName(aName);\n }\n aName = sanitizeName(aName, options);\n\n if (matches[i][4] !== undefined) {\n // Reuse already-processed value — no double entity replacement\n const oldVal = processedVals[i];\n\n const newVal = options.attributeValueProcessor(attrName, oldVal, jPathStr);\n if (newVal === null || newVal === undefined) {\n attrs[aName] = oldVal;\n } else if (typeof newVal !== typeof oldVal || newVal !== oldVal) {\n attrs[aName] = newVal;\n } else {\n attrs[aName] = parseValue(oldVal, options.parseAttributeValue, options.numberParseOptions);\n }\n hasAttrs = true;\n } else if (options.allowBooleanAttributes) {\n attrs[aName] = true;\n hasAttrs = true;\n }\n }\n }\n\n if (!hasAttrs) return;\n\n if (options.attributesGroupName) {\n const attrCollection = {};\n attrCollection[options.attributesGroupName] = attrs;\n return attrCollection;\n }\n return attrs;\n }\n}\nconst parseXml = function (xmlData) {\n xmlData = xmlData.replace(/\\r\\n?/g, \"\\n\"); //TODO: remove this line\n const xmlObj = new xmlNode('!xml');\n let currentNode = xmlObj;\n let textData = \"\";\n\n // Reset matcher for new document\n this.matcher.reset();\n\n // Reset entity expansion counters for this document\n this.entityExpansionCount = 0;\n this.currentExpandedLength = 0;\n const options = this.options;\n const docTypeReader = new DocTypeReader(options.processEntities);\n const xmlLen = xmlData.length;\n for (let i = 0; i < xmlLen; i++) {//for each char in XML data\n const ch = xmlData[i];\n if (ch === '<') {\n // const nextIndex = i+1;\n // const _2ndChar = xmlData[nextIndex];\n const c1 = xmlData.charCodeAt(i + 1);\n if (c1 === 47) {//Closing Tag '/'\n const closeIndex = findClosingIndex(xmlData, \">\", i, \"Closing Tag is not closed.\")\n let tagName = xmlData.substring(i + 2, closeIndex).trim();\n\n if (options.removeNSPrefix) {\n const colonIndex = tagName.indexOf(\":\");\n if (colonIndex !== -1) {\n tagName = tagName.substr(colonIndex + 1);\n }\n }\n\n tagName = transformTagName(options.transformTagName, tagName, \"\", options).tagName;\n\n if (currentNode) {\n textData = this.saveTextToParentTag(textData, currentNode, this.readonlyMatcher);\n }\n\n //check if last tag of nested tag was unpaired tag\n const lastTagName = this.matcher.getCurrentTag();\n if (tagName && options.unpairedTagsSet.has(tagName)) {\n throw new Error(`Unpaired tag can not be used as closing tag: `);\n }\n if (lastTagName && options.unpairedTagsSet.has(lastTagName)) {\n // Pop the unpaired tag\n this.matcher.pop();\n this.tagsNodeStack.pop();\n }\n // Pop the closing tag\n this.matcher.pop();\n this.isCurrentNodeStopNode = false; // Reset flag when closing tag\n\n currentNode = this.tagsNodeStack.pop();//avoid recursion, set the parent tag scope\n textData = \"\";\n i = closeIndex;\n } else if (c1 === 63) { //'?'\n\n let tagData = readTagExp(xmlData, i, false, \"?>\");\n if (!tagData) throw new Error(\"Pi Tag is not closed.\");\n\n textData = this.saveTextToParentTag(textData, currentNode, this.readonlyMatcher);\n if ((options.ignoreDeclaration && tagData.tagName === \"?xml\") || options.ignorePiTags) {\n //do nothing\n } else {\n\n const childNode = new xmlNode(tagData.tagName);\n childNode.add(options.textNodeName, \"\");\n\n if (tagData.tagName !== tagData.tagExp && tagData.attrExpPresent) {\n childNode[\":@\"] = this.buildAttributesMap(tagData.tagExp, this.matcher, tagData.tagName);\n }\n this.addChild(currentNode, childNode, this.readonlyMatcher, i);\n }\n\n\n i = tagData.closeIndex + 1;\n } else if (c1 === 33\n && xmlData.charCodeAt(i + 2) === 45\n && xmlData.charCodeAt(i + 3) === 45) { //'!--'\n const endIndex = findClosingIndex(xmlData, \"-->\", i + 4, \"Comment is not closed.\")\n if (options.commentPropName) {\n const comment = xmlData.substring(i + 4, endIndex - 2);\n\n textData = this.saveTextToParentTag(textData, currentNode, this.readonlyMatcher);\n\n currentNode.add(options.commentPropName, [{ [options.textNodeName]: comment }]);\n }\n i = endIndex;\n } else if (c1 === 33\n && xmlData.charCodeAt(i + 2) === 68) { //'!D'\n const result = docTypeReader.readDocType(xmlData, i);\n this.entityReplacer.addInputEntities(result.entities);\n i = result.i;\n } else if (c1 === 33\n && xmlData.charCodeAt(i + 2) === 91) { // '!['\n const closeIndex = findClosingIndex(xmlData, \"]]>\", i, \"CDATA is not closed.\") - 2;\n const tagExp = xmlData.substring(i + 9, closeIndex);\n\n textData = this.saveTextToParentTag(textData, currentNode, this.readonlyMatcher);\n\n let val = this.parseTextData(tagExp, currentNode.tagname, this.readonlyMatcher, true, false, true, true);\n if (val == undefined) val = \"\";\n\n //cdata should be set even if it is 0 length string\n if (options.cdataPropName) {\n currentNode.add(options.cdataPropName, [{ [options.textNodeName]: tagExp }]);\n } else {\n currentNode.add(options.textNodeName, val);\n }\n\n i = closeIndex + 2;\n } else {//Opening tag\n let result = readTagExp(xmlData, i, options.removeNSPrefix);\n\n // Safety check: readTagExp can return undefined\n if (!result) {\n // Log context for debugging\n const context = xmlData.substring(Math.max(0, i - 50), Math.min(xmlLen, i + 50));\n throw new Error(`readTagExp returned undefined at position ${i}. Context: \"${context}\"`);\n }\n\n let tagName = result.tagName;\n const rawTagName = result.rawTagName;\n let tagExp = result.tagExp;\n let attrExpPresent = result.attrExpPresent;\n let closeIndex = result.closeIndex;\n\n ({ tagName, tagExp } = transformTagName(options.transformTagName, tagName, tagExp, options));\n\n if (options.strictReservedNames &&\n (tagName === options.commentPropName\n || tagName === options.cdataPropName\n || tagName === options.textNodeName\n || tagName === options.attributesGroupName\n )) {\n throw new Error(`Invalid tag name: ${tagName}`);\n }\n\n //save text as child node\n if (currentNode && textData) {\n if (currentNode.tagname !== '!xml') {\n //when nested tag is found\n textData = this.saveTextToParentTag(textData, currentNode, this.readonlyMatcher, false);\n }\n }\n\n //check if last tag was unpaired tag\n const lastTag = currentNode;\n if (lastTag && options.unpairedTagsSet.has(lastTag.tagname)) {\n currentNode = this.tagsNodeStack.pop();\n this.matcher.pop();\n }\n\n // Clean up self-closing syntax BEFORE processing attributes\n // This is where tagExp gets the trailing / removed\n let isSelfClosing = false;\n if (tagExp.length > 0 && tagExp.lastIndexOf(\"/\") === tagExp.length - 1) {\n isSelfClosing = true;\n if (tagName[tagName.length - 1] === \"/\") {\n tagName = tagName.substr(0, tagName.length - 1);\n tagExp = tagName;\n } else {\n tagExp = tagExp.substr(0, tagExp.length - 1);\n }\n\n // Re-check attrExpPresent after cleaning\n attrExpPresent = (tagName !== tagExp);\n }\n\n // Now process attributes with CLEAN tagExp (no trailing /)\n let prefixedAttrs = null;\n let rawAttrs = {};\n let namespace = undefined;\n\n // Extract namespace from rawTagName\n namespace = extractNamespace(rawTagName);\n\n // Push tag to matcher FIRST (with empty attrs for now) so callbacks see correct path\n if (tagName !== xmlObj.tagname) {\n this.matcher.push(tagName, {}, namespace);\n }\n\n // Now build attributes - callbacks will see correct matcher state\n if (tagName !== tagExp && attrExpPresent) {\n // Build attributes (returns prefixed attributes for the tree)\n // Note: buildAttributesMap now internally updates the matcher with raw attributes\n prefixedAttrs = this.buildAttributesMap(tagExp, this.matcher, tagName);\n\n if (prefixedAttrs) {\n // Extract raw attributes (without prefix) for our use\n rawAttrs = extractRawAttributes(prefixedAttrs, options);\n }\n }\n\n // Now check if this is a stop node (after attributes are set)\n if (tagName !== xmlObj.tagname) {\n this.isCurrentNodeStopNode = this.isItStopNode();\n }\n\n const startIndex = i;\n if (this.isCurrentNodeStopNode) {\n let tagContent = \"\";\n\n // For self-closing tags, content is empty\n if (isSelfClosing) {\n i = result.closeIndex;\n }\n //unpaired tag\n else if (options.unpairedTagsSet.has(tagName)) {\n i = result.closeIndex;\n }\n //normal tag\n else {\n //read until closing tag is found\n const result = this.readStopNodeData(xmlData, rawTagName, closeIndex + 1);\n if (!result) throw new Error(`Unexpected end of ${rawTagName}`);\n i = result.i;\n tagContent = result.tagContent;\n }\n\n const childNode = new xmlNode(tagName);\n\n if (prefixedAttrs) {\n childNode[\":@\"] = prefixedAttrs;\n }\n\n // For stop nodes, store raw content as-is without any processing\n childNode.add(options.textNodeName, tagContent);\n\n this.matcher.pop(); // Pop the stop node tag\n this.isCurrentNodeStopNode = false; // Reset flag\n\n this.addChild(currentNode, childNode, this.readonlyMatcher, startIndex);\n } else {\n //selfClosing tag\n if (isSelfClosing) {\n ({ tagName, tagExp } = transformTagName(options.transformTagName, tagName, tagExp, options));\n\n const childNode = new xmlNode(tagName);\n if (prefixedAttrs) {\n childNode[\":@\"] = prefixedAttrs;\n }\n this.addChild(currentNode, childNode, this.readonlyMatcher, startIndex);\n this.matcher.pop(); // Pop self-closing tag\n this.isCurrentNodeStopNode = false; // Reset flag\n }\n else if (options.unpairedTagsSet.has(tagName)) {//unpaired tag\n const childNode = new xmlNode(tagName);\n if (prefixedAttrs) {\n childNode[\":@\"] = prefixedAttrs;\n }\n this.addChild(currentNode, childNode, this.readonlyMatcher, startIndex);\n this.matcher.pop(); // Pop unpaired tag\n this.isCurrentNodeStopNode = false; // Reset flag\n i = result.closeIndex;\n // Continue to next iteration without changing currentNode\n continue;\n }\n //opening tag\n else {\n const childNode = new xmlNode(tagName);\n if (this.tagsNodeStack.length > options.maxNestedTags) {\n throw new Error(\"Maximum nested tags exceeded\");\n }\n this.tagsNodeStack.push(currentNode);\n\n if (prefixedAttrs) {\n childNode[\":@\"] = prefixedAttrs;\n }\n this.addChild(currentNode, childNode, this.readonlyMatcher, startIndex);\n currentNode = childNode;\n }\n textData = \"\";\n i = closeIndex;\n }\n }\n } else {\n textData += xmlData[i];\n }\n }\n return xmlObj.child;\n}\n\nfunction addChild(currentNode, childNode, matcher, startIndex) {\n // unset startIndex if not requested\n if (!this.options.captureMetaData) startIndex = undefined;\n\n // Pass jPath string or matcher based on options.jPath setting\n const jPathOrMatcher = this.options.jPath ? matcher.toString() : matcher;\n const result = this.options.updateTag(childNode.tagname, jPathOrMatcher, childNode[\":@\"])\n if (result === false) {\n //do nothing\n } else if (typeof result === \"string\") {\n childNode.tagname = result\n currentNode.addChild(childNode, startIndex);\n } else {\n currentNode.addChild(childNode, startIndex);\n }\n}\n\n/**\n * @param {object} val - Entity object with regex and val properties\n * @param {string} tagName - Tag name\n * @param {string|Matcher} jPath - jPath string or Matcher instance based on options.jPath\n */\nfunction replaceEntitiesValue(val, tagName, jPath) {\n const entityConfig = this.options.processEntities;\n\n if (!entityConfig || !entityConfig.enabled) {\n return val;\n }\n\n // Check if tag is allowed to contain entities\n if (entityConfig.allowedTags) {\n const jPathOrMatcher = this.options.jPath ? jPath.toString() : jPath;\n const allowed = Array.isArray(entityConfig.allowedTags)\n ? entityConfig.allowedTags.includes(tagName)\n : entityConfig.allowedTags(tagName, jPathOrMatcher);\n\n if (!allowed) {\n return val;\n }\n }\n\n // Apply custom tag filter if provided\n if (entityConfig.tagFilter) {\n const jPathOrMatcher = this.options.jPath ? jPath.toString() : jPath;\n if (!entityConfig.tagFilter(tagName, jPathOrMatcher)) {\n return val; // Skip based on custom filter\n }\n }\n\n return this.entityReplacer.replace(val);\n}\n\n\nfunction saveTextToParentTag(textData, parentNode, matcher, isLeafNode) {\n if (textData) { //store previously collected data as textNode\n if (isLeafNode === undefined) isLeafNode = parentNode.child.length === 0\n\n textData = this.parseTextData(textData,\n parentNode.tagname,\n matcher,\n false,\n parentNode[\":@\"] ? Object.keys(parentNode[\":@\"]).length !== 0 : false,\n isLeafNode);\n\n if (textData !== undefined && textData !== \"\")\n parentNode.add(this.options.textNodeName, textData);\n textData = \"\";\n }\n return textData;\n}\n\n/**\n * @param {Array} stopNodeExpressions - Array of compiled Expression objects\n * @param {Matcher} matcher - Current path matcher\n */\nfunction isItStopNode() {\n if (this.stopNodeExpressionsSet.size === 0) return false;\n\n return this.matcher.matchesAny(this.stopNodeExpressionsSet);\n}\n\n/**\n * Returns the tag Expression and where it is ending handling single-double quotes situation\n * @param {string} xmlData \n * @param {number} i starting index\n * @returns \n */\nfunction tagExpWithClosingIndex(xmlData, i, closingChar = \">\") {\n let attrBoundary = 0;\n const chars = [];\n const len = xmlData.length;\n const closeCode0 = closingChar.charCodeAt(0);\n const closeCode1 = closingChar.length > 1 ? closingChar.charCodeAt(1) : -1;\n\n for (let index = i; index < len; index++) {\n const code = xmlData.charCodeAt(index);\n\n if (attrBoundary) {\n if (code === attrBoundary) attrBoundary = 0;\n } else if (code === 34 || code === 39) { // \" or '\n attrBoundary = code;\n } else if (code === closeCode0) {\n if (closeCode1 !== -1) {\n if (xmlData.charCodeAt(index + 1) === closeCode1) {\n return { data: String.fromCharCode(...chars), index };\n }\n } else {\n return { data: String.fromCharCode(...chars), index };\n }\n } else if (code === 9) { // \\t\n chars.push(32); // space\n continue;\n }\n\n chars.push(code);\n }\n}\n\nfunction findClosingIndex(xmlData, str, i, errMsg) {\n const closingIndex = xmlData.indexOf(str, i);\n if (closingIndex === -1) {\n throw new Error(errMsg)\n } else {\n return closingIndex + str.length - 1;\n }\n}\n\nfunction findClosingChar(xmlData, char, i, errMsg) {\n const closingIndex = xmlData.indexOf(char, i);\n if (closingIndex === -1) throw new Error(errMsg);\n return closingIndex; // no offset needed\n}\n\nfunction readTagExp(xmlData, i, removeNSPrefix, closingChar = \">\") {\n const result = tagExpWithClosingIndex(xmlData, i + 1, closingChar);\n if (!result) return;\n let tagExp = result.data;\n const closeIndex = result.index;\n const separatorIndex = tagExp.search(/\\s/);\n let tagName = tagExp;\n let attrExpPresent = true;\n if (separatorIndex !== -1) {//separate tag name and attributes expression\n tagName = tagExp.substring(0, separatorIndex);\n tagExp = tagExp.substring(separatorIndex + 1).trimStart();\n }\n\n const rawTagName = tagName;\n if (removeNSPrefix) {\n const colonIndex = tagName.indexOf(\":\");\n if (colonIndex !== -1) {\n tagName = tagName.substr(colonIndex + 1);\n attrExpPresent = tagName !== result.data.substr(colonIndex + 1);\n }\n }\n\n return {\n tagName: tagName,\n tagExp: tagExp,\n closeIndex: closeIndex,\n attrExpPresent: attrExpPresent,\n rawTagName: rawTagName,\n }\n}\n/**\n * find paired tag for a stop node\n * @param {string} xmlData \n * @param {string} tagName \n * @param {number} i \n */\nfunction readStopNodeData(xmlData, tagName, i) {\n const startIndex = i;\n // Starting at 1 since we already have an open tag\n let openTagCount = 1;\n\n const xmllen = xmlData.length;\n for (; i < xmllen; i++) {\n if (xmlData[i] === \"<\") {\n const c1 = xmlData.charCodeAt(i + 1);\n if (c1 === 47) {//close tag '/'\n const closeIndex = findClosingChar(xmlData, \">\", i, `${tagName} is not closed`);\n let closeTagName = xmlData.substring(i + 2, closeIndex).trim();\n if (closeTagName === tagName) {\n openTagCount--;\n if (openTagCount === 0) {\n return {\n tagContent: xmlData.substring(startIndex, i),\n i: closeIndex\n }\n }\n }\n i = closeIndex;\n } else if (c1 === 63) { //?\n const closeIndex = findClosingIndex(xmlData, \"?>\", i + 1, \"StopNode is not closed.\")\n i = closeIndex;\n } else if (c1 === 33\n && xmlData.charCodeAt(i + 2) === 45\n && xmlData.charCodeAt(i + 3) === 45) { // '!--'\n const closeIndex = findClosingIndex(xmlData, \"-->\", i + 3, \"StopNode is not closed.\")\n i = closeIndex;\n } else if (c1 === 33\n && xmlData.charCodeAt(i + 2) === 91) { // '!['\n const closeIndex = findClosingIndex(xmlData, \"]]>\", i, \"StopNode is not closed.\") - 2;\n i = closeIndex;\n } else {\n const tagData = readTagExp(xmlData, i, '>')\n\n if (tagData) {\n const openTagName = tagData && tagData.tagName;\n if (openTagName === tagName && tagData.tagExp[tagData.tagExp.length - 1] !== \"/\") {\n openTagCount++;\n }\n i = tagData.closeIndex;\n }\n }\n }\n }//end for loop\n}\n\nfunction parseValue(val, shouldParse, options) {\n if (shouldParse && typeof val === 'string') {\n //console.log(options)\n const newval = val.trim();\n if (newval === 'true') return true;\n else if (newval === 'false') return false;\n else return toNumber(val, options);\n } else {\n if (isExist(val)) {\n return val;\n } else {\n return '';\n }\n }\n}\n\nfunction fromCodePoint(str, base, prefix) {\n const codePoint = Number.parseInt(str, base);\n\n if (codePoint >= 0 && codePoint <= 0x10FFFF) {\n return String.fromCodePoint(codePoint);\n } else {\n return prefix + str + \";\";\n }\n}\n\nfunction transformTagName(fn, tagName, tagExp, options) {\n if (fn) {\n const newTagName = fn(tagName);\n if (tagExp === tagName) {\n tagExp = newTagName\n }\n tagName = newTagName;\n }\n tagName = sanitizeName(tagName, options);\n return { tagName, tagExp };\n}\n\n\n\nfunction sanitizeName(name, options) {\n if (criticalProperties.includes(name)) {\n throw new Error(`[SECURITY] Invalid name: \"${name}\" is a reserved JavaScript keyword that could cause prototype pollution`);\n } else if (DANGEROUS_PROPERTY_NAMES.includes(name)) {\n return options.onDangerousProperty(name);\n }\n return name;\n}","export default function getIgnoreAttributesFn(ignoreAttributes) {\n if (typeof ignoreAttributes === 'function') {\n return ignoreAttributes\n }\n if (Array.isArray(ignoreAttributes)) {\n return (attrName) => {\n for (const pattern of ignoreAttributes) {\n if (typeof pattern === 'string' && attrName === pattern) {\n return true\n }\n if (pattern instanceof RegExp && pattern.test(attrName)) {\n return true\n }\n }\n }\n }\n return () => false\n}","'use strict';\n\nimport XmlNode from './xmlNode.js';\nimport { Matcher } from 'path-expression-matcher';\n\nconst METADATA_SYMBOL = XmlNode.getMetaDataSymbol();\n\n/**\n * Helper function to strip attribute prefix from attribute map\n * @param {object} attrs - Attributes with prefix (e.g., {\"@_class\": \"code\"})\n * @param {string} prefix - Attribute prefix to remove (e.g., \"@_\")\n * @returns {object} Attributes without prefix (e.g., {\"class\": \"code\"})\n */\nfunction stripAttributePrefix(attrs, prefix) {\n if (!attrs || typeof attrs !== 'object') return {};\n if (!prefix) return attrs;\n\n const rawAttrs = {};\n for (const key in attrs) {\n if (key.startsWith(prefix)) {\n const rawName = key.substring(prefix.length);\n rawAttrs[rawName] = attrs[key];\n } else {\n // Attribute without prefix (shouldn't normally happen, but be safe)\n rawAttrs[key] = attrs[key];\n }\n }\n return rawAttrs;\n}\n\n/**\n * \n * @param {array} node \n * @param {any} options \n * @param {Matcher} matcher - Path matcher instance\n * @returns \n */\nexport default function prettify(node, options, matcher, readonlyMatcher) {\n return compress(node, options, matcher, readonlyMatcher);\n}\n\n/**\n * @param {array} arr \n * @param {object} options \n * @param {Matcher} matcher - Path matcher instance\n * @returns object\n */\nfunction compress(arr, options, matcher, readonlyMatcher) {\n let text;\n const compressedObj = {}; //This is intended to be a plain object\n for (let i = 0; i < arr.length; i++) {\n const tagObj = arr[i];\n const property = propName(tagObj);\n\n // Push current property to matcher WITH RAW ATTRIBUTES (no prefix)\n if (property !== undefined && property !== options.textNodeName) {\n const rawAttrs = stripAttributePrefix(\n tagObj[\":@\"] || {},\n options.attributeNamePrefix\n );\n matcher.push(property, rawAttrs);\n }\n\n if (property === options.textNodeName) {\n if (text === undefined) text = tagObj[property];\n else text += \"\" + tagObj[property];\n } else if (property === undefined) {\n continue;\n } else if (tagObj[property]) {\n\n let val = compress(tagObj[property], options, matcher, readonlyMatcher);\n const isLeaf = isLeafTag(val, options);\n\n if (tagObj[\":@\"]) {\n assignAttributes(val, tagObj[\":@\"], readonlyMatcher, options);\n } else if (Object.keys(val).length === 1 && val[options.textNodeName] !== undefined && !options.alwaysCreateTextNode) {\n val = val[options.textNodeName];\n } else if (Object.keys(val).length === 0) {\n if (options.alwaysCreateTextNode) val[options.textNodeName] = \"\";\n else val = \"\";\n }\n\n if (tagObj[METADATA_SYMBOL] !== undefined && typeof val === \"object\" && val !== null) {\n val[METADATA_SYMBOL] = tagObj[METADATA_SYMBOL]; // copy over metadata\n }\n\n\n if (compressedObj[property] !== undefined && Object.prototype.hasOwnProperty.call(compressedObj, property)) {\n if (!Array.isArray(compressedObj[property])) {\n compressedObj[property] = [compressedObj[property]];\n }\n compressedObj[property].push(val);\n } else {\n //TODO: if a node is not an array, then check if it should be an array\n //also determine if it is a leaf node\n\n // Pass jPath string or readonlyMatcher based on options.jPath setting\n const jPathOrMatcher = options.jPath ? readonlyMatcher.toString() : readonlyMatcher;\n if (options.isArray(property, jPathOrMatcher, isLeaf)) {\n compressedObj[property] = [val];\n } else {\n compressedObj[property] = val;\n }\n }\n\n // Pop property from matcher after processing\n if (property !== undefined && property !== options.textNodeName) {\n matcher.pop();\n }\n }\n\n }\n // if(text && text.length > 0) compressedObj[options.textNodeName] = text;\n if (typeof text === \"string\") {\n if (text.length > 0) compressedObj[options.textNodeName] = text;\n } else if (text !== undefined) compressedObj[options.textNodeName] = text;\n\n\n return compressedObj;\n}\n\nfunction propName(obj) {\n const keys = Object.keys(obj);\n for (let i = 0; i < keys.length; i++) {\n const key = keys[i];\n if (key !== \":@\") return key;\n }\n}\n\nfunction assignAttributes(obj, attrMap, readonlyMatcher, options) {\n if (attrMap) {\n const keys = Object.keys(attrMap);\n const len = keys.length; //don't make it inline\n for (let i = 0; i < len; i++) {\n const atrrName = keys[i]; // This is the PREFIXED name (e.g., \"@_class\")\n\n // Strip prefix for matcher path (for isArray callback)\n const rawAttrName = atrrName.startsWith(options.attributeNamePrefix)\n ? atrrName.substring(options.attributeNamePrefix.length)\n : atrrName;\n\n // For attributes, we need to create a temporary path\n // Pass jPath string or matcher based on options.jPath setting\n const jPathOrMatcher = options.jPath\n ? readonlyMatcher.toString() + \".\" + rawAttrName\n : readonlyMatcher;\n\n if (options.isArray(atrrName, jPathOrMatcher, true, true)) {\n obj[atrrName] = [attrMap[atrrName]];\n } else {\n obj[atrrName] = attrMap[atrrName];\n }\n }\n }\n}\n\nfunction isLeafTag(obj, options) {\n const { textNodeName } = options;\n const propCount = Object.keys(obj).length;\n\n if (propCount === 0) {\n return true;\n }\n\n if (\n propCount === 1 &&\n (obj[textNodeName] || typeof obj[textNodeName] === \"boolean\" || obj[textNodeName] === 0)\n ) {\n return true;\n }\n\n return false;\n}","import { buildOptions } from './OptionsBuilder.js';\nimport OrderedObjParser from './OrderedObjParser.js';\nimport prettify from './node2json.js';\nimport { validate } from \"../validator.js\";\nimport XmlNode from './xmlNode.js';\n\nexport default class XMLParser {\n\n constructor(options) {\n this.externalEntities = {};\n this.options = buildOptions(options);\n\n }\n /**\n * Parse XML dats to JS object \n * @param {string|Uint8Array} xmlData \n * @param {boolean|Object} validationOption \n */\n parse(xmlData, validationOption) {\n if (typeof xmlData !== \"string\" && xmlData.toString) {\n xmlData = xmlData.toString();\n } else if (typeof xmlData !== \"string\") {\n throw new Error(\"XML data is accepted in String or Bytes[] form.\")\n }\n\n if (validationOption) {\n if (validationOption === true) validationOption = {}; //validate with default options\n\n const result = validate(xmlData, validationOption);\n if (result !== true) {\n throw Error(`${result.err.msg}:${result.err.line}:${result.err.col}`)\n }\n }\n const orderedObjParser = new OrderedObjParser(this.options);\n orderedObjParser.entityReplacer.setExternalEntities(this.externalEntities);\n const orderedResult = orderedObjParser.parseXml(xmlData);\n if (this.options.preserveOrder || orderedResult === undefined) return orderedResult;\n else return prettify(orderedResult, this.options, orderedObjParser.matcher, orderedObjParser.readonlyMatcher);\n }\n\n /**\n * Add Entity which is not by default supported by this library\n * @param {string} key \n * @param {string} value \n */\n addEntity(key, value) {\n if (value.indexOf(\"&\") !== -1) {\n throw new Error(\"Entity value can't have '&'\")\n } else if (key.indexOf(\"&\") !== -1 || key.indexOf(\";\") !== -1) {\n throw new Error(\"An entity must be set without '&' and ';'. Eg. use '#xD' for ' '\")\n } else if (value === \"&\") {\n throw new Error(\"An entity with value '&' is not permitted\");\n } else {\n this.externalEntities[key] = value;\n }\n }\n\n /**\n * Returns a Symbol that can be used to access the metadata\n * property on a node.\n * \n * If Symbol is not available in the environment, an ordinary property is used\n * and the name of the property is here returned.\n * \n * The XMLMetaData property is only present when `captureMetaData`\n * is true in the options.\n */\n static getMetaDataSymbol() {\n return XmlNode.getMetaDataSymbol();\n }\n}","import { Expression, Matcher } from 'path-expression-matcher';\n\nconst EOL = \"\\n\";\n\n/**\n * \n * @param {array} jArray \n * @param {any} options \n * @returns \n */\nexport default function toXml(jArray, options) {\n let indentation = \"\";\n if (options.format && options.indentBy.length > 0) {\n indentation = EOL;\n }\n\n // Pre-compile stopNode expressions for pattern matching\n const stopNodeExpressions = [];\n if (options.stopNodes && Array.isArray(options.stopNodes)) {\n for (let i = 0; i < options.stopNodes.length; i++) {\n const node = options.stopNodes[i];\n if (typeof node === 'string') {\n stopNodeExpressions.push(new Expression(node));\n } else if (node instanceof Expression) {\n stopNodeExpressions.push(node);\n }\n }\n }\n\n // Initialize matcher for path tracking\n const matcher = new Matcher();\n\n return arrToStr(jArray, options, indentation, matcher, stopNodeExpressions);\n}\n\nfunction arrToStr(arr, options, indentation, matcher, stopNodeExpressions) {\n let xmlStr = \"\";\n let isPreviousElementTag = false;\n\n if (options.maxNestedTags && matcher.getDepth() > options.maxNestedTags) {\n throw new Error(\"Maximum nested tags exceeded\");\n }\n\n if (!Array.isArray(arr)) {\n // Non-array values (e.g. string tag values) should be treated as text content\n if (arr !== undefined && arr !== null) {\n let text = arr.toString();\n text = replaceEntitiesValue(text, options);\n return text;\n }\n return \"\";\n }\n\n for (let i = 0; i < arr.length; i++) {\n const tagObj = arr[i];\n const tagName = propName(tagObj);\n if (tagName === undefined) continue;\n\n // Extract attributes from \":@\" property\n const attrValues = extractAttributeValues(tagObj[\":@\"], options);\n\n // Push tag to matcher WITH attributes\n matcher.push(tagName, attrValues);\n\n // Check if this is a stop node using Expression matching\n const isStopNode = checkStopNode(matcher, stopNodeExpressions);\n\n if (tagName === options.textNodeName) {\n let tagText = tagObj[tagName];\n if (!isStopNode) {\n tagText = options.tagValueProcessor(tagName, tagText);\n tagText = replaceEntitiesValue(tagText, options);\n }\n if (isPreviousElementTag) {\n xmlStr += indentation;\n }\n xmlStr += tagText;\n isPreviousElementTag = false;\n matcher.pop();\n continue;\n } else if (tagName === options.cdataPropName) {\n if (isPreviousElementTag) {\n xmlStr += indentation;\n }\n xmlStr += ``;\n isPreviousElementTag = false;\n matcher.pop();\n continue;\n } else if (tagName === options.commentPropName) {\n xmlStr += indentation + ``;\n isPreviousElementTag = true;\n matcher.pop();\n continue;\n } else if (tagName[0] === \"?\") {\n const attStr = attr_to_str(tagObj[\":@\"], options, isStopNode);\n const tempInd = tagName === \"?xml\" ? \"\" : indentation;\n let piTextNodeName = tagObj[tagName][0][options.textNodeName];\n piTextNodeName = piTextNodeName.length !== 0 ? \" \" + piTextNodeName : \"\"; //remove extra spacing\n xmlStr += tempInd + `<${tagName}${piTextNodeName}${attStr}?>`;\n isPreviousElementTag = true;\n matcher.pop();\n continue;\n }\n\n let newIdentation = indentation;\n if (newIdentation !== \"\") {\n newIdentation += options.indentBy;\n }\n\n // Pass isStopNode to attr_to_str so attributes are also not processed for stopNodes\n const attStr = attr_to_str(tagObj[\":@\"], options, isStopNode);\n const tagStart = indentation + `<${tagName}${attStr}`;\n\n // If this is a stopNode, get raw content without processing\n let tagValue;\n if (isStopNode) {\n tagValue = getRawContent(tagObj[tagName], options);\n } else {\n\n tagValue = arrToStr(tagObj[tagName], options, newIdentation, matcher, stopNodeExpressions);\n }\n\n if (options.unpairedTags.indexOf(tagName) !== -1) {\n if (options.suppressUnpairedNode) xmlStr += tagStart + \">\";\n else xmlStr += tagStart + \"/>\";\n } else if ((!tagValue || tagValue.length === 0) && options.suppressEmptyNode) {\n xmlStr += tagStart + \"/>\";\n } else if (tagValue && tagValue.endsWith(\">\")) {\n xmlStr += tagStart + `>${tagValue}${indentation}`;\n } else {\n xmlStr += tagStart + \">\";\n if (tagValue && indentation !== \"\" && (tagValue.includes(\"/>\") || tagValue.includes(\"`;\n }\n isPreviousElementTag = true;\n\n // Pop tag from matcher\n matcher.pop();\n }\n\n return xmlStr;\n}\n\n/**\n * Extract attribute values from the \":@\" object and return as plain object\n * for passing to matcher.push()\n */\nfunction extractAttributeValues(attrMap, options) {\n if (!attrMap || options.ignoreAttributes) return null;\n\n const attrValues = {};\n let hasAttrs = false;\n\n for (let attr in attrMap) {\n if (!Object.prototype.hasOwnProperty.call(attrMap, attr)) continue;\n // Remove the attribute prefix to get clean attribute name\n const cleanAttrName = attr.startsWith(options.attributeNamePrefix)\n ? attr.substr(options.attributeNamePrefix.length)\n : attr;\n attrValues[cleanAttrName] = attrMap[attr];\n hasAttrs = true;\n }\n\n return hasAttrs ? attrValues : null;\n}\n\n/**\n * Extract raw content from a stopNode without any processing\n * This preserves the content exactly as-is, including special characters\n */\nfunction getRawContent(arr, options) {\n if (!Array.isArray(arr)) {\n // Non-array values return as-is\n if (arr !== undefined && arr !== null) {\n return arr.toString();\n }\n return \"\";\n }\n\n let content = \"\";\n for (let i = 0; i < arr.length; i++) {\n const item = arr[i];\n const tagName = propName(item);\n\n if (tagName === options.textNodeName) {\n // Raw text content - NO processing, NO entity replacement\n content += item[tagName];\n } else if (tagName === options.cdataPropName) {\n // CDATA content\n content += item[tagName][0][options.textNodeName];\n } else if (tagName === options.commentPropName) {\n // Comment content\n content += item[tagName][0][options.textNodeName];\n } else if (tagName && tagName[0] === \"?\") {\n // Processing instruction - skip for stopNodes\n continue;\n } else if (tagName) {\n // Nested tags within stopNode\n // Recursively get raw content and reconstruct the tag\n // For stopNodes, we don't process attributes either\n const attStr = attr_to_str_raw(item[\":@\"], options);\n const nestedContent = getRawContent(item[tagName], options);\n\n if (!nestedContent || nestedContent.length === 0) {\n content += `<${tagName}${attStr}/>`;\n } else {\n content += `<${tagName}${attStr}>${nestedContent}`;\n }\n }\n }\n return content;\n}\n\n/**\n * Build attribute string for stopNodes - NO entity replacement\n */\nfunction attr_to_str_raw(attrMap, options) {\n let attrStr = \"\";\n if (attrMap && !options.ignoreAttributes) {\n for (let attr in attrMap) {\n if (!Object.prototype.hasOwnProperty.call(attrMap, attr)) continue;\n // For stopNodes, use raw value without processing\n let attrVal = attrMap[attr];\n if (attrVal === true && options.suppressBooleanAttributes) {\n attrStr += ` ${attr.substr(options.attributeNamePrefix.length)}`;\n } else {\n attrStr += ` ${attr.substr(options.attributeNamePrefix.length)}=\"${attrVal}\"`;\n }\n }\n }\n return attrStr;\n}\n\nfunction propName(obj) {\n const keys = Object.keys(obj);\n for (let i = 0; i < keys.length; i++) {\n const key = keys[i];\n if (!Object.prototype.hasOwnProperty.call(obj, key)) continue;\n if (key !== \":@\") return key;\n }\n}\n\nfunction attr_to_str(attrMap, options, isStopNode) {\n let attrStr = \"\";\n if (attrMap && !options.ignoreAttributes) {\n for (let attr in attrMap) {\n if (!Object.prototype.hasOwnProperty.call(attrMap, attr)) continue;\n let attrVal;\n\n if (isStopNode) {\n // For stopNodes, use raw value without any processing\n attrVal = attrMap[attr];\n } else {\n // Normal processing: apply attributeValueProcessor and entity replacement\n attrVal = options.attributeValueProcessor(attr, attrMap[attr]);\n attrVal = replaceEntitiesValue(attrVal, options);\n }\n\n if (attrVal === true && options.suppressBooleanAttributes) {\n attrStr += ` ${attr.substr(options.attributeNamePrefix.length)}`;\n } else {\n attrStr += ` ${attr.substr(options.attributeNamePrefix.length)}=\"${attrVal}\"`;\n }\n }\n }\n return attrStr;\n}\n\nfunction checkStopNode(matcher, stopNodeExpressions) {\n if (!stopNodeExpressions || stopNodeExpressions.length === 0) return false;\n\n for (let i = 0; i < stopNodeExpressions.length; i++) {\n if (matcher.matches(stopNodeExpressions[i])) {\n return true;\n }\n }\n return false;\n}\n\nfunction replaceEntitiesValue(textValue, options) {\n if (textValue && textValue.length > 0 && options.processEntities) {\n for (let i = 0; i < options.entities.length; i++) {\n const entity = options.entities[i];\n textValue = textValue.replace(entity.regex, entity.val);\n }\n }\n return textValue;\n}","'use strict';\n//parse Empty Node as self closing node\nimport buildFromOrderedJs from './orderedJs2Xml.js';\nimport getIgnoreAttributesFn from \"./ignoreAttributes.js\";\nimport { Expression, Matcher } from 'path-expression-matcher';\n\nconst defaultOptions = {\n attributeNamePrefix: '@_',\n attributesGroupName: false,\n textNodeName: '#text',\n ignoreAttributes: true,\n cdataPropName: false,\n format: false,\n indentBy: ' ',\n suppressEmptyNode: false,\n suppressUnpairedNode: true,\n suppressBooleanAttributes: true,\n tagValueProcessor: function (key, a) {\n return a;\n },\n attributeValueProcessor: function (attrName, a) {\n return a;\n },\n preserveOrder: false,\n commentPropName: false,\n unpairedTags: [],\n entities: [\n { regex: new RegExp(\"&\", \"g\"), val: \"&\" },//it must be on top\n { regex: new RegExp(\">\", \"g\"), val: \">\" },\n { regex: new RegExp(\"<\", \"g\"), val: \"<\" },\n { regex: new RegExp(\"\\'\", \"g\"), val: \"'\" },\n { regex: new RegExp(\"\\\"\", \"g\"), val: \""\" }\n ],\n processEntities: true,\n stopNodes: [],\n // transformTagName: false,\n // transformAttributeName: false,\n oneListGroup: false,\n maxNestedTags: 100,\n jPath: true // When true, callbacks receive string jPath; when false, receive Matcher instance\n};\n\nexport default function Builder(options) {\n this.options = Object.assign({}, defaultOptions, options);\n\n // Convert old-style stopNodes for backward compatibility\n // Old syntax: \"*.tag\" meant \"tag anywhere in tree\"\n // New syntax: \"..tag\" means \"tag anywhere in tree\"\n if (this.options.stopNodes && Array.isArray(this.options.stopNodes)) {\n this.options.stopNodes = this.options.stopNodes.map(node => {\n if (typeof node === 'string' && node.startsWith('*.')) {\n // Convert old wildcard syntax to deep wildcard\n return '..' + node.substring(2);\n }\n return node;\n });\n }\n\n // Pre-compile stopNode expressions for pattern matching\n this.stopNodeExpressions = [];\n if (this.options.stopNodes && Array.isArray(this.options.stopNodes)) {\n for (let i = 0; i < this.options.stopNodes.length; i++) {\n const node = this.options.stopNodes[i];\n if (typeof node === 'string') {\n this.stopNodeExpressions.push(new Expression(node));\n } else if (node instanceof Expression) {\n this.stopNodeExpressions.push(node);\n }\n }\n }\n\n if (this.options.ignoreAttributes === true || this.options.attributesGroupName) {\n this.isAttribute = function (/*a*/) {\n return false;\n };\n } else {\n this.ignoreAttributesFn = getIgnoreAttributesFn(this.options.ignoreAttributes)\n this.attrPrefixLen = this.options.attributeNamePrefix.length;\n this.isAttribute = isAttribute;\n }\n\n this.processTextOrObjNode = processTextOrObjNode\n\n if (this.options.format) {\n this.indentate = indentate;\n this.tagEndChar = '>\\n';\n this.newLine = '\\n';\n } else {\n this.indentate = function () {\n return '';\n };\n this.tagEndChar = '>';\n this.newLine = '';\n }\n}\n\nBuilder.prototype.build = function (jObj) {\n if (this.options.preserveOrder) {\n return buildFromOrderedJs(jObj, this.options);\n } else {\n if (Array.isArray(jObj) && this.options.arrayNodeName && this.options.arrayNodeName.length > 1) {\n jObj = {\n [this.options.arrayNodeName]: jObj\n }\n }\n // Initialize matcher for path tracking\n const matcher = new Matcher();\n return this.j2x(jObj, 0, matcher).val;\n }\n};\n\nBuilder.prototype.j2x = function (jObj, level, matcher) {\n let attrStr = '';\n let val = '';\n if (this.options.maxNestedTags && matcher.getDepth() >= this.options.maxNestedTags) {\n throw new Error(\"Maximum nested tags exceeded\");\n }\n // Get jPath based on option: string for backward compatibility, or Matcher for new features\n const jPath = this.options.jPath ? matcher.toString() : matcher;\n\n // Check if current node is a stopNode (will be used for attribute encoding)\n const isCurrentStopNode = this.checkStopNode(matcher);\n\n for (let key in jObj) {\n if (!Object.prototype.hasOwnProperty.call(jObj, key)) continue;\n if (typeof jObj[key] === 'undefined') {\n // supress undefined node only if it is not an attribute\n if (this.isAttribute(key)) {\n val += '';\n }\n } else if (jObj[key] === null) {\n // null attribute should be ignored by the attribute list, but should not cause the tag closing\n if (this.isAttribute(key)) {\n val += '';\n } else if (key === this.options.cdataPropName) {\n val += '';\n } else if (key[0] === '?') {\n val += this.indentate(level) + '<' + key + '?' + this.tagEndChar;\n } else {\n val += this.indentate(level) + '<' + key + '/' + this.tagEndChar;\n }\n // val += this.indentate(level) + '<' + key + '/' + this.tagEndChar;\n } else if (jObj[key] instanceof Date) {\n val += this.buildTextValNode(jObj[key], key, '', level, matcher);\n } else if (typeof jObj[key] !== 'object') {\n //premitive type\n const attr = this.isAttribute(key);\n if (attr && !this.ignoreAttributesFn(attr, jPath)) {\n attrStr += this.buildAttrPairStr(attr, '' + jObj[key], isCurrentStopNode);\n } else if (!attr) {\n //tag value\n if (key === this.options.textNodeName) {\n let newval = this.options.tagValueProcessor(key, '' + jObj[key]);\n val += this.replaceEntitiesValue(newval);\n } else {\n // Check if this is a stopNode before building\n matcher.push(key);\n const isStopNode = this.checkStopNode(matcher);\n matcher.pop();\n\n if (isStopNode) {\n // Build as raw content without encoding\n const textValue = '' + jObj[key];\n if (textValue === '') {\n val += this.indentate(level) + '<' + key + this.closeTag(key) + this.tagEndChar;\n } else {\n val += this.indentate(level) + '<' + key + '>' + textValue + '' + textValue + '${item}`;\n } else if (typeof item === 'object' && item !== null) {\n const nestedContent = this.buildRawContent(item);\n const nestedAttrs = this.buildAttributesForStopNode(item);\n if (nestedContent === '') {\n content += `<${key}${nestedAttrs}/>`;\n } else {\n content += `<${key}${nestedAttrs}>${nestedContent}`;\n }\n }\n }\n } else if (typeof value === 'object' && value !== null) {\n // Nested object\n const nestedContent = this.buildRawContent(value);\n const nestedAttrs = this.buildAttributesForStopNode(value);\n if (nestedContent === '') {\n content += `<${key}${nestedAttrs}/>`;\n } else {\n content += `<${key}${nestedAttrs}>${nestedContent}`;\n }\n } else {\n // Primitive value\n content += `<${key}>${value}`;\n }\n }\n\n return content;\n};\n\n// Build attribute string for stopNode (no entity encoding)\nBuilder.prototype.buildAttributesForStopNode = function (obj) {\n if (!obj || typeof obj !== 'object') return '';\n\n let attrStr = '';\n\n // Check for attributesGroupName (when attributes are grouped)\n if (this.options.attributesGroupName && obj[this.options.attributesGroupName]) {\n const attrGroup = obj[this.options.attributesGroupName];\n for (let attrKey in attrGroup) {\n if (!Object.prototype.hasOwnProperty.call(attrGroup, attrKey)) continue;\n const cleanKey = attrKey.startsWith(this.options.attributeNamePrefix)\n ? attrKey.substring(this.options.attributeNamePrefix.length)\n : attrKey;\n const val = attrGroup[attrKey];\n if (val === true && this.options.suppressBooleanAttributes) {\n attrStr += ' ' + cleanKey;\n } else {\n attrStr += ' ' + cleanKey + '=\"' + val + '\"'; // No encoding for stopNode\n }\n }\n } else {\n // Look for individual attributes\n for (let key in obj) {\n if (!Object.prototype.hasOwnProperty.call(obj, key)) continue;\n const attr = this.isAttribute(key);\n if (attr) {\n const val = obj[key];\n if (val === true && this.options.suppressBooleanAttributes) {\n attrStr += ' ' + attr;\n } else {\n attrStr += ' ' + attr + '=\"' + val + '\"'; // No encoding for stopNode\n }\n }\n }\n }\n\n return attrStr;\n};\n\nBuilder.prototype.buildObjectNode = function (val, key, attrStr, level) {\n if (val === \"\") {\n if (key[0] === \"?\") return this.indentate(level) + '<' + key + attrStr + '?' + this.tagEndChar;\n else {\n return this.indentate(level) + '<' + key + attrStr + this.closeTag(key) + this.tagEndChar;\n }\n } else {\n\n let tagEndExp = '' + val + tagEndExp);\n } else if (this.options.commentPropName !== false && key === this.options.commentPropName && piClosingChar.length === 0) {\n return this.indentate(level) + `` + this.newLine;\n } else {\n return (\n this.indentate(level) + '<' + key + attrStr + piClosingChar + this.tagEndChar +\n val +\n this.indentate(level) + tagEndExp);\n }\n }\n}\n\nBuilder.prototype.closeTag = function (key) {\n let closeTag = \"\";\n if (this.options.unpairedTags.indexOf(key) !== -1) { //unpaired\n if (!this.options.suppressUnpairedNode) closeTag = \"/\"\n } else if (this.options.suppressEmptyNode) { //empty\n closeTag = \"/\";\n } else {\n closeTag = `>` + this.newLine;\n } else if (this.options.commentPropName !== false && key === this.options.commentPropName) {\n return this.indentate(level) + `` + this.newLine;\n } else if (key[0] === \"?\") {//PI tag\n return this.indentate(level) + '<' + key + attrStr + '?' + this.tagEndChar;\n } else {\n // Normal processing: apply tagValueProcessor and entity replacement\n let textValue = this.options.tagValueProcessor(key, val);\n textValue = this.replaceEntitiesValue(textValue);\n\n if (textValue === '') {\n return this.indentate(level) + '<' + key + attrStr + this.closeTag(key) + this.tagEndChar;\n } else {\n return this.indentate(level) + '<' + key + attrStr + '>' +\n textValue +\n ' 0 && this.options.processEntities) {\n for (let i = 0; i < this.options.entities.length; i++) {\n const entity = this.options.entities[i];\n textValue = textValue.replace(entity.regex, entity.val);\n }\n }\n return textValue;\n}\n\nfunction indentate(level) {\n return this.options.indentBy.repeat(level);\n}\n\nfunction isAttribute(name /*, options*/) {\n if (name.startsWith(this.options.attributeNamePrefix) && name !== this.options.textNodeName) {\n return name.substr(this.attrPrefixLen);\n } else {\n return false;\n }\n}","export default function getIgnoreAttributesFn(ignoreAttributes) {\n if (typeof ignoreAttributes === 'function') {\n return ignoreAttributes\n }\n if (Array.isArray(ignoreAttributes)) {\n return (attrName) => {\n for (const pattern of ignoreAttributes) {\n if (typeof pattern === 'string' && attrName === pattern) {\n return true\n }\n if (pattern instanceof RegExp && pattern.test(attrName)) {\n return true\n }\n }\n }\n }\n return () => false\n}","// Re-export from fast-xml-builder for backward compatibility\nimport XMLBuilder from 'fast-xml-builder';\nexport default XMLBuilder;\n\n// If there are any named exports you also want to re-export:\nexport * from 'fast-xml-builder';","'use strict';\n\nimport { validate } from './validator.js';\nimport XMLParser from './xmlparser/XMLParser.js';\nimport XMLBuilder from './xmlbuilder/json2xml.js';\n\nconst XMLValidator = {\n validate: validate\n}\nexport {\n XMLParser,\n XMLValidator,\n XMLBuilder\n};"],"names":["root","factory","exports","module","define","amd","this","__webpack_require__","definition","key","o","Object","defineProperty","enumerable","get","obj","prop","prototype","hasOwnProperty","call","Symbol","toStringTag","value","nameStartChar","regexName","RegExp","getAllMatches","string","regex","matches","match","exec","allmatches","startIndex","lastIndex","length","len","index","push","isName","DANGEROUS_PROPERTY_NAMES","criticalProperties","defaultOptions","allowBooleanAttributes","unpairedTags","validate","xmlData","options","assign","tags","tagFound","reachedRoot","substr","i","readPI","err","isWhiteSpace","getErrorObject","getLineNumberForPosition","tagStartPos","readCommentAndCDATA","closingTag","tagName","trim","substring","validateTagName","result","readAttributeStr","attrStr","attrStrStart","isValid","validateAttributeString","code","msg","line","tagClosed","otg","pop","openPos","col","indexOf","afterAmp","validateAmpersand","JSON","stringify","map","t","replace","char","start","tagname","angleBracketsCount","doubleQuote","singleQuote","startChar","validAttrStrRegxp","attrNames","getPositionFromMatch","undefined","attrName","validateAttrName","re","validateNumberAmpersand","count","message","lineNumber","lines","split","defaultOnDangerousProperty","name","includes","preserveOrder","attributeNamePrefix","attributesGroupName","textNodeName","ignoreAttributes","removeNSPrefix","parseTagValue","parseAttributeValue","trimValues","cdataPropName","numberParseOptions","hex","leadingZeros","eNotation","tagValueProcessor","val","attributeValueProcessor","stopNodes","alwaysCreateTextNode","isArray","commentPropName","processEntities","htmlEntities","ignoreDeclaration","ignorePiTags","transformTagName","transformAttributeName","updateTag","jPath","attrs","captureMetaData","maxNestedTags","strictReservedNames","onDangerousProperty","validatePropertyName","propertyName","optionName","normalized","toLowerCase","some","dangerous","Error","normalizeProcessEntities","enabled","maxEntitySize","maxExpansionDepth","maxTotalExpansions","maxExpandedLength","maxEntityCount","allowedTags","tagFilter","Math","max","_value$maxEntitySize","_value$maxExpansionDe","_value$maxTotalExpans","Infinity","_value$maxExpandedLen","_value$maxEntityCount","_value$allowedTags","_value$tagFilter","METADATA_SYMBOL","buildOptions","built","_i","_propertyNameOptions","_propertyNameOptions$","unpairedTagsSet","Set","Array","node","startsWith","XmlNode","child","create","_proto","add","_this$child$push","addChild","_this$child$push2","_this$child$push3","keys","getMetaDataSymbol","DocTypeReader","suppressValidationErr","readDocType","entities","entityCount","hasBody","comment","hasSeq","entityName","_this$readEntityExp","readEntityExp","escaped","regx","readElementExp","readNotationExp","skipWhitespace","test","validateEntityName","toUpperCase","entityValue","_this$readIdentifierV","readIdentifierVal","notationName","identifierType","publicIdentifier","systemIdentifier","_this$readIdentifierV2","_this$readIdentifierV3","_this$readIdentifierV4","type","identifierVal","elementName","contentModel","readAttlistExp","attributeName","attributeType","allowedNotations","notation","join","defaultValue","_this$readIdentifierV5","data","seq","j","hexRegex","numRegex","consider","decimalPoint","infinity","eNotationRegx","MatcherView","constructor","matcher","_matcher","separator","getCurrentTag","path","tag","getCurrentNamespace","namespace","getAttrValue","values","hasAttr","current","getPosition","position","getCounter","counter","getIndex","getDepth","toString","includeNamespace","toArray","n","expression","matchesAny","exprSet","Matcher","siblingStacks","_pathStringCache","_view","attrValues","currentLevel","Map","siblings","siblingKey","set","updateCurrent","sep","reset","segments","hasDeepWildcard","_matchWithDeepWildcard","_matchSimple","_matchSegment","pathIdx","segIdx","segment","nextSeg","found","isCurrentNode","attrValue","String","positionValue","snapshot","restore","readOnly","Expression","pattern","_parse","_hasDeepWildcard","seg","_hasAttributeCondition","_hasPositionSelector","currentPart","_parseSegment","part","bracketContent","withoutBrackets","bracketMatch","content","slice","tagAndPosition","nsIndex","positionMatch","colonIndex","lastIndexOf","tagPart","posPart","eqIndex","nthMatch","parseInt","hasAttributeCondition","hasPositionSelector","ExpressionSet","_byDepthAndTag","_wildcardByDepth","_deepWildcards","_patterns","_sealed","TypeError","has","depth","lastSeg","addAll","expressions","expr","size","seal","isSealed","findMatch","exactKey","exactBucket","wildcardBucket","DEFAULT_XML_ENTITIES","apos","gt","lt","quot","AMP_ENTITY","SPECIAL_CHARS","ch","escapeForRegex","str","resolveTable","option","builtIn","enabledByDefault","buildEntries","entries","raw","EntityReplacer","spec","_defaultTable","default","_systemTable","system","_ampEnabled","amp","_maxTotalExpansions","_maxExpandedLength","_applyLimitsTo","applyLimitsTo","_postCheck","postCheck","r","_limitExternal","_limitSystem","_limitDefault","_defaultEntries","_systemEntries","_persistentEntries","_inputEntries","_totalExpansions","_expandedLength","setExternalEntities","addExternalEntity","addInputEntities","original","_applyEntries","parse","track","limitExpansions","limitLength","trackAny","entity","args","before","delta","COMMON_HTML","nbsp","copy","reg","trade","mdash","ndash","hellip","laquo","raquo","lsquo","rsquo","ldquo","rdquo","bull","para","sect","deg","frac12","frac14","frac34","inr","CURRENCY_ENTITIES","cent","pound","yen","euro","curren","fnof","NUMERIC_ENTITIES","num_dec","_","s","fromCodePoint","num_hex","base","prefix","codePoint","Number","_extends","bind","e","arguments","apply","extractRawAttributes","prefixedAttrs","rawAttrs","extractNamespace","rawTagName","ns","OrderedObjParser","currentNode","tagsNodeStack","parseXml","parseTextData","resolveNameSpace","buildAttributesMap","isItStopNode","replaceEntitiesValue","readStopNodeData","saveTextToParentTag","ignoreAttributesFn","_step","_iterator","_createForOfIteratorHelperLoose","done","entityExpansionCount","currentExpandedLength","entityReplacer","readonlyMatcher","isCurrentNodeStopNode","stopNodeExpressionsSet","stopNodesOpts","stopNodeExp","dontTrim","hasAttributes","isLeafNode","escapeEntities","jPathOrMatcher","newval","parseValue","charAt","attrsRegx","processedVals","hasRawAttrs","rawAttrsForMatcher","oldVal","jPathStr","hasAttrs","aName","sanitizeName","newVal","attrCollection","xmlObj","xmlNode","textData","docTypeReader","xmlLen","c1","charCodeAt","closeIndex","findClosingIndex","lastTagName","tagData","readTagExp","childNode","tagExp","attrExpPresent","endIndex","_ref","_ref2","context","min","_transformTagName","lastTag","isSelfClosing","tagContent","_transformTagName2","entityConfig","parentNode","errMsg","closingIndex","findClosingChar","closingChar","attrBoundary","chars","closeCode0","closeCode1","fromCharCode","tagExpWithClosingIndex","separatorIndex","search","trimStart","openTagCount","xmllen","shouldParse","trimmedStr","skipLike","numStr","window","parse_int","isFinite","sign","eChar","eAdjacentToLeadingZeros","resolveEnotation","numTrimmedByZeros","decimalAdjacentToLeadingZeros","num","parsedStr","isPositive","handleInfinity","toNumber","fn","newTagName","stripAttributePrefix","prettify","compress","arr","text","compressedObj","tagObj","property","propName","isLeaf","isLeafTag","assignAttributes","attrMap","atrrName","rawAttrName","propCount","XMLParser","externalEntities","validationOption","orderedObjParser","orderedResult","addEntity","toXml","jArray","indentation","format","indentBy","stopNodeExpressions","arrToStr","xmlStr","isPreviousElementTag","extractAttributeValues","isStopNode","checkStopNode","tagText","attStr","attr_to_str","tempInd","piTextNodeName","newIdentation","tagStart","tagValue","getRawContent","suppressUnpairedNode","suppressEmptyNode","endsWith","attr","item","attr_to_str_raw","nestedContent","attrVal","suppressBooleanAttributes","textValue","a","oneListGroup","Builder","isAttribute","attrPrefixLen","processTextOrObjNode","indentate","tagEndChar","newLine","object","level","extractAttributes","rawContent","buildRawContent","buildAttributesForStopNode","buildObjectNode","j2x","buildTextValNode","repeat","build","jObj","buildFromOrderedJs","arrayNodeName","isCurrentStopNode","Date","buildAttrPairStr","closeTag","arrLen","listTagVal","listTagAttr","Ks","L","attrGroup","attrKey","nestedAttrs","cleanKey","tagEndExp","piClosingChar","XMLValidator"],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"./lib/fxp.min.js","mappings":"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","sources":["webpack://fxp/webpack/universalModuleDefinition","webpack://fxp/webpack/bootstrap","webpack://fxp/webpack/runtime/define property getters","webpack://fxp/webpack/runtime/hasOwnProperty shorthand","webpack://fxp/webpack/runtime/make namespace object","webpack://fxp/./src/util.js","webpack://fxp/./src/validator.js","webpack://fxp/./src/xmlparser/OptionsBuilder.js","webpack://fxp/./src/xmlparser/xmlNode.js","webpack://fxp/./src/xmlparser/DocTypeReader.js","webpack://fxp/./node_modules/strnum/strnum.js","webpack://fxp/./node_modules/path-expression-matcher/src/Matcher.js","webpack://fxp/./node_modules/path-expression-matcher/src/Expression.js","webpack://fxp/./node_modules/path-expression-matcher/src/ExpressionSet.js","webpack://fxp/./node_modules/@nodable/entities/src/entities.js","webpack://fxp/./node_modules/@nodable/entities/src/EntityDecoder.js","webpack://fxp/./src/xmlparser/OrderedObjParser.js","webpack://fxp/./src/ignoreAttributes.js","webpack://fxp/./src/xmlparser/node2json.js","webpack://fxp/./src/xmlparser/XMLParser.js","webpack://fxp/./node_modules/fast-xml-builder/src/orderedJs2Xml.js","webpack://fxp/./node_modules/fast-xml-builder/src/fxb.js","webpack://fxp/./node_modules/fast-xml-builder/src/ignoreAttributes.js","webpack://fxp/./src/xmlbuilder/json2xml.js","webpack://fxp/./src/fxp.js"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"fxp\"] = factory();\n\telse\n\t\troot[\"fxp\"] = factory();\n})(this, () => {\nreturn ","// The require scope\nvar __webpack_require__ = {};\n\n","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","'use strict';\n\nconst nameStartChar = ':A-Za-z_\\\\u00C0-\\\\u00D6\\\\u00D8-\\\\u00F6\\\\u00F8-\\\\u02FF\\\\u0370-\\\\u037D\\\\u037F-\\\\u1FFF\\\\u200C-\\\\u200D\\\\u2070-\\\\u218F\\\\u2C00-\\\\u2FEF\\\\u3001-\\\\uD7FF\\\\uF900-\\\\uFDCF\\\\uFDF0-\\\\uFFFD';\nconst nameChar = nameStartChar + '\\\\-.\\\\d\\\\u00B7\\\\u0300-\\\\u036F\\\\u203F-\\\\u2040';\nexport const nameRegexp = '[' + nameStartChar + '][' + nameChar + ']*';\nconst regexName = new RegExp('^' + nameRegexp + '$');\n\nexport function getAllMatches(string, regex) {\n const matches = [];\n let match = regex.exec(string);\n while (match) {\n const allmatches = [];\n allmatches.startIndex = regex.lastIndex - match[0].length;\n const len = match.length;\n for (let index = 0; index < len; index++) {\n allmatches.push(match[index]);\n }\n matches.push(allmatches);\n match = regex.exec(string);\n }\n return matches;\n}\n\nexport const isName = function (string) {\n const match = regexName.exec(string);\n return !(match === null || typeof match === 'undefined');\n}\n\nexport function isExist(v) {\n return typeof v !== 'undefined';\n}\n\nexport function isEmptyObject(obj) {\n return Object.keys(obj).length === 0;\n}\n\nexport function getValue(v) {\n if (exports.isExist(v)) {\n return v;\n } else {\n return '';\n }\n}\n\n/**\n * Dangerous property names that could lead to prototype pollution or security issues\n */\nexport const DANGEROUS_PROPERTY_NAMES = [\n // '__proto__',\n // 'constructor',\n // 'prototype',\n 'hasOwnProperty',\n 'toString',\n 'valueOf',\n '__defineGetter__',\n '__defineSetter__',\n '__lookupGetter__',\n '__lookupSetter__'\n];\n\nexport const criticalProperties = [\"__proto__\", \"constructor\", \"prototype\"];","'use strict';\n\nimport { getAllMatches, isName } from './util.js';\n\nconst defaultOptions = {\n allowBooleanAttributes: false, //A tag can have attributes without any value\n unpairedTags: []\n};\n\n//const tagsPattern = new RegExp(\"<\\\\/?([\\\\w:\\\\-_\\.]+)\\\\s*\\/?>\",\"g\");\nexport function validate(xmlData, options) {\n options = Object.assign({}, defaultOptions, options);\n\n //xmlData = xmlData.replace(/(\\r\\n|\\n|\\r)/gm,\"\");//make it single line\n //xmlData = xmlData.replace(/(^\\s*<\\?xml.*?\\?>)/g,\"\");//Remove XML starting tag\n //xmlData = xmlData.replace(/()/g,\"\");//Remove DOCTYPE\n const tags = [];\n let tagFound = false;\n\n //indicates that the root tag has been closed (aka. depth 0 has been reached)\n let reachedRoot = false;\n\n if (xmlData[0] === '\\ufeff') {\n // check for byte order mark (BOM)\n xmlData = xmlData.substr(1);\n }\n\n for (let i = 0; i < xmlData.length; i++) {\n\n if (xmlData[i] === '<' && xmlData[i + 1] === '?') {\n i += 2;\n i = readPI(xmlData, i);\n if (i.err) return i;\n } else if (xmlData[i] === '<') {\n //starting of tag\n //read until you reach to '>' avoiding any '>' in attribute value\n let tagStartPos = i;\n i++;\n\n if (xmlData[i] === '!') {\n i = readCommentAndCDATA(xmlData, i);\n continue;\n } else {\n let closingTag = false;\n if (xmlData[i] === '/') {\n //closing tag\n closingTag = true;\n i++;\n }\n //read tagname\n let tagName = '';\n for (; i < xmlData.length &&\n xmlData[i] !== '>' &&\n xmlData[i] !== ' ' &&\n xmlData[i] !== '\\t' &&\n xmlData[i] !== '\\n' &&\n xmlData[i] !== '\\r'; i++\n ) {\n tagName += xmlData[i];\n }\n tagName = tagName.trim();\n //console.log(tagName);\n\n if (tagName[tagName.length - 1] === '/') {\n //self closing tag without attributes\n tagName = tagName.substring(0, tagName.length - 1);\n //continue;\n i--;\n }\n if (!validateTagName(tagName)) {\n let msg;\n if (tagName.trim().length === 0) {\n msg = \"Invalid space after '<'.\";\n } else {\n msg = \"Tag '\" + tagName + \"' is an invalid name.\";\n }\n return getErrorObject('InvalidTag', msg, getLineNumberForPosition(xmlData, i));\n }\n\n const result = readAttributeStr(xmlData, i);\n if (result === false) {\n return getErrorObject('InvalidAttr', \"Attributes for '\" + tagName + \"' have open quote.\", getLineNumberForPosition(xmlData, i));\n }\n let attrStr = result.value;\n i = result.index;\n\n if (attrStr[attrStr.length - 1] === '/') {\n //self closing tag\n const attrStrStart = i - attrStr.length;\n attrStr = attrStr.substring(0, attrStr.length - 1);\n const isValid = validateAttributeString(attrStr, options);\n if (isValid === true) {\n tagFound = true;\n //continue; //text may presents after self closing tag\n } else {\n //the result from the nested function returns the position of the error within the attribute\n //in order to get the 'true' error line, we need to calculate the position where the attribute begins (i - attrStr.length) and then add the position within the attribute\n //this gives us the absolute index in the entire xml, which we can use to find the line at last\n return getErrorObject(isValid.err.code, isValid.err.msg, getLineNumberForPosition(xmlData, attrStrStart + isValid.err.line));\n }\n } else if (closingTag) {\n if (!result.tagClosed) {\n return getErrorObject('InvalidTag', \"Closing tag '\" + tagName + \"' doesn't have proper closing.\", getLineNumberForPosition(xmlData, i));\n } else if (attrStr.trim().length > 0) {\n return getErrorObject('InvalidTag', \"Closing tag '\" + tagName + \"' can't have attributes or invalid starting.\", getLineNumberForPosition(xmlData, tagStartPos));\n } else if (tags.length === 0) {\n return getErrorObject('InvalidTag', \"Closing tag '\" + tagName + \"' has not been opened.\", getLineNumberForPosition(xmlData, tagStartPos));\n } else {\n const otg = tags.pop();\n if (tagName !== otg.tagName) {\n let openPos = getLineNumberForPosition(xmlData, otg.tagStartPos);\n return getErrorObject('InvalidTag',\n \"Expected closing tag '\" + otg.tagName + \"' (opened in line \" + openPos.line + \", col \" + openPos.col + \") instead of closing tag '\" + tagName + \"'.\",\n getLineNumberForPosition(xmlData, tagStartPos));\n }\n\n //when there are no more tags, we reached the root level.\n if (tags.length == 0) {\n reachedRoot = true;\n }\n }\n } else {\n const isValid = validateAttributeString(attrStr, options);\n if (isValid !== true) {\n //the result from the nested function returns the position of the error within the attribute\n //in order to get the 'true' error line, we need to calculate the position where the attribute begins (i - attrStr.length) and then add the position within the attribute\n //this gives us the absolute index in the entire xml, which we can use to find the line at last\n return getErrorObject(isValid.err.code, isValid.err.msg, getLineNumberForPosition(xmlData, i - attrStr.length + isValid.err.line));\n }\n\n //if the root level has been reached before ...\n if (reachedRoot === true) {\n return getErrorObject('InvalidXml', 'Multiple possible root nodes found.', getLineNumberForPosition(xmlData, i));\n } else if (options.unpairedTags.indexOf(tagName) !== -1) {\n //don't push into stack\n } else {\n tags.push({ tagName, tagStartPos });\n }\n tagFound = true;\n }\n\n //skip tag text value\n //It may include comments and CDATA value\n for (i++; i < xmlData.length; i++) {\n if (xmlData[i] === '<') {\n if (xmlData[i + 1] === '!') {\n //comment or CADATA\n i++;\n i = readCommentAndCDATA(xmlData, i);\n continue;\n } else if (xmlData[i + 1] === '?') {\n i = readPI(xmlData, ++i);\n if (i.err) return i;\n } else {\n break;\n }\n } else if (xmlData[i] === '&') {\n const afterAmp = validateAmpersand(xmlData, i);\n if (afterAmp == -1)\n return getErrorObject('InvalidChar', \"char '&' is not expected.\", getLineNumberForPosition(xmlData, i));\n i = afterAmp;\n } else {\n if (reachedRoot === true && !isWhiteSpace(xmlData[i])) {\n return getErrorObject('InvalidXml', \"Extra text at the end\", getLineNumberForPosition(xmlData, i));\n }\n }\n } //end of reading tag text value\n if (xmlData[i] === '<') {\n i--;\n }\n }\n } else {\n if (isWhiteSpace(xmlData[i])) {\n continue;\n }\n return getErrorObject('InvalidChar', \"char '\" + xmlData[i] + \"' is not expected.\", getLineNumberForPosition(xmlData, i));\n }\n }\n\n if (!tagFound) {\n return getErrorObject('InvalidXml', 'Start tag expected.', 1);\n } else if (tags.length == 1) {\n return getErrorObject('InvalidTag', \"Unclosed tag '\" + tags[0].tagName + \"'.\", getLineNumberForPosition(xmlData, tags[0].tagStartPos));\n } else if (tags.length > 0) {\n return getErrorObject('InvalidXml', \"Invalid '\" +\n JSON.stringify(tags.map(t => t.tagName), null, 4).replace(/\\r?\\n/g, '') +\n \"' found.\", { line: 1, col: 1 });\n }\n\n return true;\n};\n\nfunction isWhiteSpace(char) {\n return char === ' ' || char === '\\t' || char === '\\n' || char === '\\r';\n}\n/**\n * Read Processing insstructions and skip\n * @param {*} xmlData\n * @param {*} i\n */\nfunction readPI(xmlData, i) {\n const start = i;\n for (; i < xmlData.length; i++) {\n if (xmlData[i] == '?' || xmlData[i] == ' ') {\n //tagname\n const tagname = xmlData.substr(start, i - start);\n if (i > 5 && tagname === 'xml') {\n return getErrorObject('InvalidXml', 'XML declaration allowed only at the start of the document.', getLineNumberForPosition(xmlData, i));\n } else if (xmlData[i] == '?' && xmlData[i + 1] == '>') {\n //check if valid attribut string\n i++;\n break;\n } else {\n continue;\n }\n }\n }\n return i;\n}\n\nfunction readCommentAndCDATA(xmlData, i) {\n if (xmlData.length > i + 5 && xmlData[i + 1] === '-' && xmlData[i + 2] === '-') {\n //comment\n for (i += 3; i < xmlData.length; i++) {\n if (xmlData[i] === '-' && xmlData[i + 1] === '-' && xmlData[i + 2] === '>') {\n i += 2;\n break;\n }\n }\n } else if (\n xmlData.length > i + 8 &&\n xmlData[i + 1] === 'D' &&\n xmlData[i + 2] === 'O' &&\n xmlData[i + 3] === 'C' &&\n xmlData[i + 4] === 'T' &&\n xmlData[i + 5] === 'Y' &&\n xmlData[i + 6] === 'P' &&\n xmlData[i + 7] === 'E'\n ) {\n let angleBracketsCount = 1;\n for (i += 8; i < xmlData.length; i++) {\n if (xmlData[i] === '<') {\n angleBracketsCount++;\n } else if (xmlData[i] === '>') {\n angleBracketsCount--;\n if (angleBracketsCount === 0) {\n break;\n }\n }\n }\n } else if (\n xmlData.length > i + 9 &&\n xmlData[i + 1] === '[' &&\n xmlData[i + 2] === 'C' &&\n xmlData[i + 3] === 'D' &&\n xmlData[i + 4] === 'A' &&\n xmlData[i + 5] === 'T' &&\n xmlData[i + 6] === 'A' &&\n xmlData[i + 7] === '['\n ) {\n for (i += 8; i < xmlData.length; i++) {\n if (xmlData[i] === ']' && xmlData[i + 1] === ']' && xmlData[i + 2] === '>') {\n i += 2;\n break;\n }\n }\n }\n\n return i;\n}\n\nconst doubleQuote = '\"';\nconst singleQuote = \"'\";\n\n/**\n * Keep reading xmlData until '<' is found outside the attribute value.\n * @param {string} xmlData\n * @param {number} i\n */\nfunction readAttributeStr(xmlData, i) {\n let attrStr = '';\n let startChar = '';\n let tagClosed = false;\n for (; i < xmlData.length; i++) {\n if (xmlData[i] === doubleQuote || xmlData[i] === singleQuote) {\n if (startChar === '') {\n startChar = xmlData[i];\n } else if (startChar !== xmlData[i]) {\n //if vaue is enclosed with double quote then single quotes are allowed inside the value and vice versa\n } else {\n startChar = '';\n }\n } else if (xmlData[i] === '>') {\n if (startChar === '') {\n tagClosed = true;\n break;\n }\n }\n attrStr += xmlData[i];\n }\n if (startChar !== '') {\n return false;\n }\n\n return {\n value: attrStr,\n index: i,\n tagClosed: tagClosed\n };\n}\n\n/**\n * Select all the attributes whether valid or invalid.\n */\nconst validAttrStrRegxp = new RegExp('(\\\\s*)([^\\\\s=]+)(\\\\s*=)?(\\\\s*([\\'\"])(([\\\\s\\\\S])*?)\\\\5)?', 'g');\n\n//attr, =\"sd\", a=\"amit's\", a=\"sd\"b=\"saf\", ab cd=\"\"\n\nfunction validateAttributeString(attrStr, options) {\n //console.log(\"start:\"+attrStr+\":end\");\n\n //if(attrStr.trim().length === 0) return true; //empty string\n\n const matches = getAllMatches(attrStr, validAttrStrRegxp);\n const attrNames = {};\n\n for (let i = 0; i < matches.length; i++) {\n if (matches[i][1].length === 0) {\n //nospace before attribute name: a=\"sd\"b=\"saf\"\n return getErrorObject('InvalidAttr', \"Attribute '\" + matches[i][2] + \"' has no space in starting.\", getPositionFromMatch(matches[i]))\n } else if (matches[i][3] !== undefined && matches[i][4] === undefined) {\n return getErrorObject('InvalidAttr', \"Attribute '\" + matches[i][2] + \"' is without value.\", getPositionFromMatch(matches[i]));\n } else if (matches[i][3] === undefined && !options.allowBooleanAttributes) {\n //independent attribute: ab\n return getErrorObject('InvalidAttr', \"boolean attribute '\" + matches[i][2] + \"' is not allowed.\", getPositionFromMatch(matches[i]));\n }\n /* else if(matches[i][6] === undefined){//attribute without value: ab=\n return { err: { code:\"InvalidAttr\",msg:\"attribute \" + matches[i][2] + \" has no value assigned.\"}};\n } */\n const attrName = matches[i][2];\n if (!validateAttrName(attrName)) {\n return getErrorObject('InvalidAttr', \"Attribute '\" + attrName + \"' is an invalid name.\", getPositionFromMatch(matches[i]));\n }\n if (!Object.prototype.hasOwnProperty.call(attrNames, attrName)) {\n //check for duplicate attribute.\n attrNames[attrName] = 1;\n } else {\n return getErrorObject('InvalidAttr', \"Attribute '\" + attrName + \"' is repeated.\", getPositionFromMatch(matches[i]));\n }\n }\n\n return true;\n}\n\nfunction validateNumberAmpersand(xmlData, i) {\n let re = /\\d/;\n if (xmlData[i] === 'x') {\n i++;\n re = /[\\da-fA-F]/;\n }\n for (; i < xmlData.length; i++) {\n if (xmlData[i] === ';')\n return i;\n if (!xmlData[i].match(re))\n break;\n }\n return -1;\n}\n\nfunction validateAmpersand(xmlData, i) {\n // https://www.w3.org/TR/xml/#dt-charref\n i++;\n if (xmlData[i] === ';')\n return -1;\n if (xmlData[i] === '#') {\n i++;\n return validateNumberAmpersand(xmlData, i);\n }\n let count = 0;\n for (; i < xmlData.length; i++, count++) {\n if (xmlData[i].match(/\\w/) && count < 20)\n continue;\n if (xmlData[i] === ';')\n break;\n return -1;\n }\n return i;\n}\n\nfunction getErrorObject(code, message, lineNumber) {\n return {\n err: {\n code: code,\n msg: message,\n line: lineNumber.line || lineNumber,\n col: lineNumber.col,\n },\n };\n}\n\nfunction validateAttrName(attrName) {\n return isName(attrName);\n}\n\n// const startsWithXML = /^xml/i;\n\nfunction validateTagName(tagname) {\n return isName(tagname) /* && !tagname.match(startsWithXML) */;\n}\n\n//this function returns the line number for the character at the given index\nfunction getLineNumberForPosition(xmlData, index) {\n const lines = xmlData.substring(0, index).split(/\\r?\\n/);\n return {\n line: lines.length,\n\n // column number is last line's length + 1, because column numbering starts at 1:\n col: lines[lines.length - 1].length + 1\n };\n}\n\n//this function returns the position of the first character of match within attrStr\nfunction getPositionFromMatch(match) {\n return match.startIndex + match[1].length;\n}\n","import { DANGEROUS_PROPERTY_NAMES, criticalProperties } from \"../util.js\";\nimport { COMMON_HTML, CURRENCY } from '@nodable/entities';\n\nconst defaultOnDangerousProperty = (name) => {\n if (DANGEROUS_PROPERTY_NAMES.includes(name)) {\n return \"__\" + name;\n }\n return name;\n};\n\n\nexport const defaultOptions = {\n preserveOrder: false,\n attributeNamePrefix: '@_',\n attributesGroupName: false,\n textNodeName: '#text',\n ignoreAttributes: true,\n removeNSPrefix: false, // remove NS from tag name or attribute name if true\n allowBooleanAttributes: false, //a tag can have attributes without any value\n //ignoreRootElement : false,\n parseTagValue: true,\n parseAttributeValue: false,\n trimValues: true, //Trim string values of tag and attributes\n cdataPropName: false,\n numberParseOptions: {\n hex: true,\n leadingZeros: true,\n eNotation: true\n },\n tagValueProcessor: function (tagName, val) {\n return val;\n },\n attributeValueProcessor: function (attrName, val) {\n return val;\n },\n stopNodes: [], //nested tags will not be parsed even for errors\n alwaysCreateTextNode: false,\n isArray: () => false,\n commentPropName: false,\n unpairedTags: [],\n processEntities: true,\n htmlEntities: false,\n entityDecoder: null,\n ignoreDeclaration: false,\n ignorePiTags: false,\n transformTagName: false,\n transformAttributeName: false,\n updateTag: function (tagName, jPath, attrs) {\n return tagName\n },\n // skipEmptyListItem: false\n captureMetaData: false,\n maxNestedTags: 100,\n strictReservedNames: true,\n jPath: true, // if true, pass jPath string to callbacks; if false, pass matcher instance\n onDangerousProperty: defaultOnDangerousProperty\n};\n\n\n/**\n * Validates that a property name is safe to use\n * @param {string} propertyName - The property name to validate\n * @param {string} optionName - The option field name (for error message)\n * @throws {Error} If property name is dangerous\n */\nfunction validatePropertyName(propertyName, optionName) {\n if (typeof propertyName !== 'string') {\n return; // Only validate string property names\n }\n\n const normalized = propertyName.toLowerCase();\n if (DANGEROUS_PROPERTY_NAMES.some(dangerous => normalized === dangerous.toLowerCase())) {\n throw new Error(\n `[SECURITY] Invalid ${optionName}: \"${propertyName}\" is a reserved JavaScript keyword that could cause prototype pollution`\n );\n }\n\n if (criticalProperties.some(dangerous => normalized === dangerous.toLowerCase())) {\n throw new Error(\n `[SECURITY] Invalid ${optionName}: \"${propertyName}\" is a reserved JavaScript keyword that could cause prototype pollution`\n );\n }\n}\n\n/**\n * Normalizes processEntities option for backward compatibility\n * @param {boolean|object} value \n * @returns {object} Always returns normalized object\n */\nfunction normalizeProcessEntities(value, htmlEntities) {\n // Boolean backward compatibility\n if (typeof value === 'boolean') {\n return {\n enabled: value, // true or false\n maxEntitySize: 10000,\n maxExpansionDepth: 10000,\n maxTotalExpansions: Infinity,\n maxExpandedLength: 100000,\n maxEntityCount: 1000,\n allowedTags: null,\n tagFilter: null,\n appliesTo: \"all\",\n };\n }\n\n // Object config - merge with defaults\n if (typeof value === 'object' && value !== null) {\n return {\n enabled: value.enabled !== false,\n maxEntitySize: Math.max(1, value.maxEntitySize ?? 10000),\n maxExpansionDepth: Math.max(1, value.maxExpansionDepth ?? 10000),\n maxTotalExpansions: Math.max(1, value.maxTotalExpansions ?? Infinity),\n maxExpandedLength: Math.max(1, value.maxExpandedLength ?? 100000),\n maxEntityCount: Math.max(1, value.maxEntityCount ?? 1000),\n allowedTags: value.allowedTags ?? null,\n tagFilter: value.tagFilter ?? null,\n appliesTo: value.appliesTo ?? \"all\",\n };\n }\n\n // Default to enabled with limits\n return normalizeProcessEntities(true);\n}\n\nexport const buildOptions = function (options) {\n const built = Object.assign({}, defaultOptions, options);\n\n // Validate property names to prevent prototype pollution\n const propertyNameOptions = [\n { value: built.attributeNamePrefix, name: 'attributeNamePrefix' },\n { value: built.attributesGroupName, name: 'attributesGroupName' },\n { value: built.textNodeName, name: 'textNodeName' },\n { value: built.cdataPropName, name: 'cdataPropName' },\n { value: built.commentPropName, name: 'commentPropName' }\n ];\n\n for (const { value, name } of propertyNameOptions) {\n if (value) {\n validatePropertyName(value, name);\n }\n }\n\n if (built.onDangerousProperty === null) {\n built.onDangerousProperty = defaultOnDangerousProperty;\n }\n\n // Always normalize processEntities for backward compatibility and validation\n built.processEntities = normalizeProcessEntities(built.processEntities, built.htmlEntities);\n built.unpairedTagsSet = new Set(built.unpairedTags);\n // Convert old-style stopNodes for backward compatibility\n if (built.stopNodes && Array.isArray(built.stopNodes)) {\n built.stopNodes = built.stopNodes.map(node => {\n if (typeof node === 'string' && node.startsWith('*.')) {\n // Old syntax: *.tagname meant \"tagname anywhere\"\n // Convert to new syntax: ..tagname\n return '..' + node.substring(2);\n }\n return node;\n });\n }\n //console.debug(built.processEntities)\n return built;\n};","'use strict';\n\nlet METADATA_SYMBOL;\n\nif (typeof Symbol !== \"function\") {\n METADATA_SYMBOL = \"@@xmlMetadata\";\n} else {\n METADATA_SYMBOL = Symbol(\"XML Node Metadata\");\n}\n\nexport default class XmlNode {\n constructor(tagname) {\n this.tagname = tagname;\n this.child = []; //nested tags, text, cdata, comments in order\n this[\":@\"] = Object.create(null); //attributes map\n }\n add(key, val) {\n // this.child.push( {name : key, val: val, isCdata: isCdata });\n if (key === \"__proto__\") key = \"#__proto__\";\n this.child.push({ [key]: val });\n }\n addChild(node, startIndex) {\n if (node.tagname === \"__proto__\") node.tagname = \"#__proto__\";\n if (node[\":@\"] && Object.keys(node[\":@\"]).length > 0) {\n this.child.push({ [node.tagname]: node.child, [\":@\"]: node[\":@\"] });\n } else {\n this.child.push({ [node.tagname]: node.child });\n }\n // if requested, add the startIndex\n if (startIndex !== undefined) {\n // Note: for now we just overwrite the metadata. If we had more complex metadata,\n // we might need to do an object append here: metadata = { ...metadata, startIndex }\n this.child[this.child.length - 1][METADATA_SYMBOL] = { startIndex };\n }\n }\n /** symbol used for metadata */\n static getMetaDataSymbol() {\n return METADATA_SYMBOL;\n }\n}\n","import { isName } from '../util.js';\n\nexport default class DocTypeReader {\n constructor(options) {\n this.suppressValidationErr = !options;\n this.options = options;\n }\n\n readDocType(xmlData, i) {\n const entities = Object.create(null);\n let entityCount = 0;\n\n if (xmlData[i + 3] === 'O' &&\n xmlData[i + 4] === 'C' &&\n xmlData[i + 5] === 'T' &&\n xmlData[i + 6] === 'Y' &&\n xmlData[i + 7] === 'P' &&\n xmlData[i + 8] === 'E') {\n i = i + 9;\n let angleBracketsCount = 1;\n let hasBody = false, comment = false;\n let exp = \"\";\n for (; i < xmlData.length; i++) {\n if (xmlData[i] === '<' && !comment) { //Determine the tag type\n if (hasBody && hasSeq(xmlData, \"!ENTITY\", i)) {\n i += 7;\n let entityName, val;\n [entityName, val, i] = this.readEntityExp(xmlData, i + 1, this.suppressValidationErr);\n if (val.indexOf(\"&\") === -1) { //Parameter entities are not supported\n if (this.options.enabled !== false &&\n this.options.maxEntityCount != null &&\n entityCount >= this.options.maxEntityCount) {\n throw new Error(\n `Entity count (${entityCount + 1}) exceeds maximum allowed (${this.options.maxEntityCount})`\n );\n }\n //const escaped = entityName.replace(/[.\\-+*:]/g, '\\\\.');\n //const escaped = entityName.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n entities[entityName] = val;\n entityCount++;\n }\n }\n else if (hasBody && hasSeq(xmlData, \"!ELEMENT\", i)) {\n i += 8;//Not supported\n const { index } = this.readElementExp(xmlData, i + 1);\n i = index;\n } else if (hasBody && hasSeq(xmlData, \"!ATTLIST\", i)) {\n i += 8;//Not supported\n // const {index} = this.readAttlistExp(xmlData,i+1);\n // i = index;\n } else if (hasBody && hasSeq(xmlData, \"!NOTATION\", i)) {\n i += 9;//Not supported\n const { index } = this.readNotationExp(xmlData, i + 1, this.suppressValidationErr);\n i = index;\n } else if (hasSeq(xmlData, \"!--\", i)) comment = true;\n else throw new Error(`Invalid DOCTYPE`);\n\n angleBracketsCount++;\n exp = \"\";\n } else if (xmlData[i] === '>') { //Read tag content\n if (comment) {\n if (xmlData[i - 1] === \"-\" && xmlData[i - 2] === \"-\") {\n comment = false;\n angleBracketsCount--;\n }\n } else {\n angleBracketsCount--;\n }\n if (angleBracketsCount === 0) {\n break;\n }\n } else if (xmlData[i] === '[') {\n hasBody = true;\n } else {\n exp += xmlData[i];\n }\n }\n if (angleBracketsCount !== 0) {\n throw new Error(`Unclosed DOCTYPE`);\n }\n } else {\n throw new Error(`Invalid Tag instead of DOCTYPE`);\n }\n return { entities, i };\n }\n readEntityExp(xmlData, i) {\n //External entities are not supported\n // \n\n //Parameter entities are not supported\n // \n\n //Internal entities are supported\n // \n\n // Skip leading whitespace after this.options.maxEntitySize) {\n throw new Error(\n `Entity \"${entityName}\" size (${entityValue.length}) exceeds maximum allowed size (${this.options.maxEntitySize})`\n );\n }\n\n i--;\n return [entityName, entityValue, i];\n }\n\n readNotationExp(xmlData, i) {\n // Skip leading whitespace after \n // \n // \n // \n // \n\n // Skip leading whitespace after {\n while (index < data.length && /\\s/.test(data[index])) {\n index++;\n }\n return index;\n};\n\n\n\nfunction hasSeq(data, seq, i) {\n for (let j = 0; j < seq.length; j++) {\n if (seq[j] !== data[i + j + 1]) return false;\n }\n return true;\n}\n\nfunction validateEntityName(name) {\n if (isName(name))\n return name;\n else\n throw new Error(`Invalid entity name ${name}`);\n}","const hexRegex = /^[-+]?0x[a-fA-F0-9]+$/;\nconst numRegex = /^([\\-\\+])?(0*)([0-9]*(\\.[0-9]*)?)$/;\n// const octRegex = /^0x[a-z0-9]+/;\n// const binRegex = /0x[a-z0-9]+/;\n\n\nconst consider = {\n hex: true,\n // oct: false,\n leadingZeros: true,\n decimalPoint: \"\\.\",\n eNotation: true,\n //skipLike: /regex/,\n infinity: \"original\", // \"null\", \"infinity\" (Infinity type), \"string\" (\"Infinity\" (the string literal))\n};\n\nexport default function toNumber(str, options = {}) {\n options = Object.assign({}, consider, options);\n if (!str || typeof str !== \"string\") return str;\n\n let trimmedStr = str.trim();\n\n if (trimmedStr.length === 0) return str;\n else if (options.skipLike !== undefined && options.skipLike.test(trimmedStr)) return str;\n else if (trimmedStr === \"0\") return 0;\n else if (options.hex && hexRegex.test(trimmedStr)) {\n return parse_int(trimmedStr, 16);\n // }else if (options.oct && octRegex.test(str)) {\n // return Number.parseInt(val, 8);\n } else if (!isFinite(trimmedStr)) { //Infinity\n return handleInfinity(str, Number(trimmedStr), options);\n } else if (trimmedStr.includes('e') || trimmedStr.includes('E')) { //eNotation\n return resolveEnotation(str, trimmedStr, options);\n // }else if (options.parseBin && binRegex.test(str)) {\n // return Number.parseInt(val, 2);\n } else {\n //separate negative sign, leading zeros, and rest number\n const match = numRegex.exec(trimmedStr);\n // +00.123 => [ , '+', '00', '.123', ..\n if (match) {\n const sign = match[1] || \"\";\n const leadingZeros = match[2];\n let numTrimmedByZeros = trimZeros(match[3]); //complete num without leading zeros\n const decimalAdjacentToLeadingZeros = sign ? // 0., -00., 000.\n str[leadingZeros.length + 1] === \".\"\n : str[leadingZeros.length] === \".\";\n\n //trim ending zeros for floating number\n if (!options.leadingZeros //leading zeros are not allowed\n && (leadingZeros.length > 1\n || (leadingZeros.length === 1 && !decimalAdjacentToLeadingZeros))) {\n // 00, 00.3, +03.24, 03, 03.24\n return str;\n }\n else {//no leading zeros or leading zeros are allowed\n const num = Number(trimmedStr);\n const parsedStr = String(num);\n\n if (num === 0) return num;\n if (parsedStr.search(/[eE]/) !== -1) { //given number is long and parsed to eNotation\n if (options.eNotation) return num;\n else return str;\n } else if (trimmedStr.indexOf(\".\") !== -1) { //floating number\n if (parsedStr === \"0\") return num; //0.0\n else if (parsedStr === numTrimmedByZeros) return num; //0.456. 0.79000\n else if (parsedStr === `${sign}${numTrimmedByZeros}`) return num;\n else return str;\n }\n\n let n = leadingZeros ? numTrimmedByZeros : trimmedStr;\n if (leadingZeros) {\n // -009 => -9\n return (n === parsedStr) || (sign + n === parsedStr) ? num : str\n } else {\n // +9\n return (n === parsedStr) || (n === sign + parsedStr) ? num : str\n }\n }\n } else { //non-numeric string\n return str;\n }\n }\n}\n\nconst eNotationRegx = /^([-+])?(0*)(\\d*(\\.\\d*)?[eE][-\\+]?\\d+)$/;\nfunction resolveEnotation(str, trimmedStr, options) {\n if (!options.eNotation) return str;\n const notation = trimmedStr.match(eNotationRegx);\n if (notation) {\n let sign = notation[1] || \"\";\n const eChar = notation[3].indexOf(\"e\") === -1 ? \"E\" : \"e\";\n const leadingZeros = notation[2];\n const eAdjacentToLeadingZeros = sign ? // 0E.\n str[leadingZeros.length + 1] === eChar\n : str[leadingZeros.length] === eChar;\n\n if (leadingZeros.length > 1 && eAdjacentToLeadingZeros) return str;\n else if (leadingZeros.length === 1\n && (notation[3].startsWith(`.${eChar}`) || notation[3][0] === eChar)) {\n return Number(trimmedStr);\n } else if (leadingZeros.length > 0) {\n // Has leading zeros — only accept if leadingZeros option allows it\n if (options.leadingZeros && !eAdjacentToLeadingZeros) {\n trimmedStr = (notation[1] || \"\") + notation[3];\n return Number(trimmedStr);\n } else return str;\n } else {\n // No leading zeros — always valid e-notation, parse it\n return Number(trimmedStr);\n }\n } else {\n return str;\n }\n}\n\n/**\n * \n * @param {string} numStr without leading zeros\n * @returns \n */\nfunction trimZeros(numStr) {\n if (numStr && numStr.indexOf(\".\") !== -1) {//float\n numStr = numStr.replace(/0+$/, \"\"); //remove ending zeros\n if (numStr === \".\") numStr = \"0\";\n else if (numStr[0] === \".\") numStr = \"0\" + numStr;\n else if (numStr[numStr.length - 1] === \".\") numStr = numStr.substring(0, numStr.length - 1);\n return numStr;\n }\n return numStr;\n}\n\nfunction parse_int(numStr, base) {\n //polyfill\n if (parseInt) return parseInt(numStr, base);\n else if (Number.parseInt) return Number.parseInt(numStr, base);\n else if (window && window.parseInt) return window.parseInt(numStr, base);\n else throw new Error(\"parseInt, Number.parseInt, window.parseInt are not supported\")\n}\n\n/**\n * Handle infinite values based on user option\n * @param {string} str - original input string\n * @param {number} num - parsed number (Infinity or -Infinity)\n * @param {object} options - user options\n * @returns {string|number|null} based on infinity option\n */\nfunction handleInfinity(str, num, options) {\n const isPositive = num === Infinity;\n\n switch (options.infinity.toLowerCase()) {\n case \"null\":\n return null;\n case \"infinity\":\n return num; // Return Infinity or -Infinity\n case \"string\":\n return isPositive ? \"Infinity\" : \"-Infinity\";\n case \"original\":\n default:\n return str; // Return original string like \"1e1000\"\n }\n}","import ExpressionSet from \"./ExpressionSet.js\";\n\n/**\n * MatcherView - A lightweight read-only view over a Matcher's internal state.\n *\n * Created once by Matcher and reused across all callbacks. Holds a direct\n * reference to the parent Matcher so it always reflects current parser state\n * with zero copying or freezing overhead.\n *\n * Users receive this via {@link Matcher#readOnly} or directly from parser\n * callbacks. It exposes all query and matching methods but has no mutation\n * methods — misuse is caught at the TypeScript level rather than at runtime.\n *\n * @example\n * const matcher = new Matcher();\n * const view = matcher.readOnly();\n *\n * matcher.push(\"root\", {});\n * view.getCurrentTag(); // \"root\"\n * view.getDepth(); // 1\n */\nexport class MatcherView {\n /**\n * @param {Matcher} matcher - The parent Matcher instance to read from.\n */\n constructor(matcher) {\n this._matcher = matcher;\n }\n\n /**\n * Get the path separator used by the parent matcher.\n * @returns {string}\n */\n get separator() {\n return this._matcher.separator;\n }\n\n /**\n * Get current tag name.\n * @returns {string|undefined}\n */\n getCurrentTag() {\n const path = this._matcher.path;\n return path.length > 0 ? path[path.length - 1].tag : undefined;\n }\n\n /**\n * Get current namespace.\n * @returns {string|undefined}\n */\n getCurrentNamespace() {\n const path = this._matcher.path;\n return path.length > 0 ? path[path.length - 1].namespace : undefined;\n }\n\n /**\n * Get current node's attribute value.\n * @param {string} attrName\n * @returns {*}\n */\n getAttrValue(attrName) {\n const path = this._matcher.path;\n if (path.length === 0) return undefined;\n return path[path.length - 1].values?.[attrName];\n }\n\n /**\n * Check if current node has an attribute.\n * @param {string} attrName\n * @returns {boolean}\n */\n hasAttr(attrName) {\n const path = this._matcher.path;\n if (path.length === 0) return false;\n const current = path[path.length - 1];\n return current.values !== undefined && attrName in current.values;\n }\n\n /**\n * Get current node's sibling position (child index in parent).\n * @returns {number}\n */\n getPosition() {\n const path = this._matcher.path;\n if (path.length === 0) return -1;\n return path[path.length - 1].position ?? 0;\n }\n\n /**\n * Get current node's repeat counter (occurrence count of this tag name).\n * @returns {number}\n */\n getCounter() {\n const path = this._matcher.path;\n if (path.length === 0) return -1;\n return path[path.length - 1].counter ?? 0;\n }\n\n /**\n * Get current node's sibling index (alias for getPosition).\n * @returns {number}\n * @deprecated Use getPosition() or getCounter() instead\n */\n getIndex() {\n return this.getPosition();\n }\n\n /**\n * Get current path depth.\n * @returns {number}\n */\n getDepth() {\n return this._matcher.path.length;\n }\n\n /**\n * Get path as string.\n * @param {string} [separator] - Optional separator (uses default if not provided)\n * @param {boolean} [includeNamespace=true]\n * @returns {string}\n */\n toString(separator, includeNamespace = true) {\n return this._matcher.toString(separator, includeNamespace);\n }\n\n /**\n * Get path as array of tag names.\n * @returns {string[]}\n */\n toArray() {\n return this._matcher.path.map(n => n.tag);\n }\n\n /**\n * Match current path against an Expression.\n * @param {Expression} expression\n * @returns {boolean}\n */\n matches(expression) {\n return this._matcher.matches(expression);\n }\n\n /**\n * Match any expression in the given set against the current path.\n * @param {ExpressionSet} exprSet\n * @returns {boolean}\n */\n matchesAny(exprSet) {\n return exprSet.matchesAny(this._matcher);\n }\n}\n\n/**\n * Matcher - Tracks current path in XML/JSON tree and matches against Expressions.\n *\n * The matcher maintains a stack of nodes representing the current path from root to\n * current tag. It only stores attribute values for the current (top) node to minimize\n * memory usage. Sibling tracking is used to auto-calculate position and counter.\n *\n * Use {@link Matcher#readOnly} to obtain a {@link MatcherView} safe to pass to\n * user callbacks — it always reflects current state with no Proxy overhead.\n *\n * @example\n * const matcher = new Matcher();\n * matcher.push(\"root\", {});\n * matcher.push(\"users\", {});\n * matcher.push(\"user\", { id: \"123\", type: \"admin\" });\n *\n * const expr = new Expression(\"root.users.user\");\n * matcher.matches(expr); // true\n */\nexport default class Matcher {\n /**\n * Create a new Matcher.\n * @param {Object} [options={}]\n * @param {string} [options.separator='.'] - Default path separator\n */\n constructor(options = {}) {\n this.separator = options.separator || '.';\n this.path = [];\n this.siblingStacks = [];\n // Each path node: { tag, values, position, counter, namespace? }\n // values only present for current (last) node\n // Each siblingStacks entry: Map tracking occurrences at each level\n this._pathStringCache = null;\n this._view = new MatcherView(this);\n }\n\n /**\n * Push a new tag onto the path.\n * @param {string} tagName\n * @param {Object|null} [attrValues=null]\n * @param {string|null} [namespace=null]\n */\n push(tagName, attrValues = null, namespace = null) {\n this._pathStringCache = null;\n\n // Remove values from previous current node (now becoming ancestor)\n if (this.path.length > 0) {\n this.path[this.path.length - 1].values = undefined;\n }\n\n // Get or create sibling tracking for current level\n const currentLevel = this.path.length;\n if (!this.siblingStacks[currentLevel]) {\n this.siblingStacks[currentLevel] = new Map();\n }\n\n const siblings = this.siblingStacks[currentLevel];\n\n // Create a unique key for sibling tracking that includes namespace\n const siblingKey = namespace ? `${namespace}:${tagName}` : tagName;\n\n // Calculate counter (how many times this tag appeared at this level)\n const counter = siblings.get(siblingKey) || 0;\n\n // Calculate position (total children at this level so far)\n let position = 0;\n for (const count of siblings.values()) {\n position += count;\n }\n\n // Update sibling count for this tag\n siblings.set(siblingKey, counter + 1);\n\n // Create new node\n const node = {\n tag: tagName,\n position: position,\n counter: counter\n };\n\n if (namespace !== null && namespace !== undefined) {\n node.namespace = namespace;\n }\n\n if (attrValues !== null && attrValues !== undefined) {\n node.values = attrValues;\n }\n\n this.path.push(node);\n }\n\n /**\n * Pop the last tag from the path.\n * @returns {Object|undefined} The popped node\n */\n pop() {\n if (this.path.length === 0) return undefined;\n this._pathStringCache = null;\n\n const node = this.path.pop();\n\n if (this.siblingStacks.length > this.path.length + 1) {\n this.siblingStacks.length = this.path.length + 1;\n }\n\n return node;\n }\n\n /**\n * Update current node's attribute values.\n * Useful when attributes are parsed after push.\n * @param {Object} attrValues\n */\n updateCurrent(attrValues) {\n if (this.path.length > 0) {\n const current = this.path[this.path.length - 1];\n if (attrValues !== null && attrValues !== undefined) {\n current.values = attrValues;\n }\n }\n }\n\n /**\n * Get current tag name.\n * @returns {string|undefined}\n */\n getCurrentTag() {\n return this.path.length > 0 ? this.path[this.path.length - 1].tag : undefined;\n }\n\n /**\n * Get current namespace.\n * @returns {string|undefined}\n */\n getCurrentNamespace() {\n return this.path.length > 0 ? this.path[this.path.length - 1].namespace : undefined;\n }\n\n /**\n * Get current node's attribute value.\n * @param {string} attrName\n * @returns {*}\n */\n getAttrValue(attrName) {\n if (this.path.length === 0) return undefined;\n return this.path[this.path.length - 1].values?.[attrName];\n }\n\n /**\n * Check if current node has an attribute.\n * @param {string} attrName\n * @returns {boolean}\n */\n hasAttr(attrName) {\n if (this.path.length === 0) return false;\n const current = this.path[this.path.length - 1];\n return current.values !== undefined && attrName in current.values;\n }\n\n /**\n * Get current node's sibling position (child index in parent).\n * @returns {number}\n */\n getPosition() {\n if (this.path.length === 0) return -1;\n return this.path[this.path.length - 1].position ?? 0;\n }\n\n /**\n * Get current node's repeat counter (occurrence count of this tag name).\n * @returns {number}\n */\n getCounter() {\n if (this.path.length === 0) return -1;\n return this.path[this.path.length - 1].counter ?? 0;\n }\n\n /**\n * Get current node's sibling index (alias for getPosition).\n * @returns {number}\n * @deprecated Use getPosition() or getCounter() instead\n */\n getIndex() {\n return this.getPosition();\n }\n\n /**\n * Get current path depth.\n * @returns {number}\n */\n getDepth() {\n return this.path.length;\n }\n\n /**\n * Get path as string.\n * @param {string} [separator] - Optional separator (uses default if not provided)\n * @param {boolean} [includeNamespace=true]\n * @returns {string}\n */\n toString(separator, includeNamespace = true) {\n const sep = separator || this.separator;\n const isDefault = (sep === this.separator && includeNamespace === true);\n\n if (isDefault) {\n if (this._pathStringCache !== null) {\n return this._pathStringCache;\n }\n const result = this.path.map(n =>\n (n.namespace) ? `${n.namespace}:${n.tag}` : n.tag\n ).join(sep);\n this._pathStringCache = result;\n return result;\n }\n\n return this.path.map(n =>\n (includeNamespace && n.namespace) ? `${n.namespace}:${n.tag}` : n.tag\n ).join(sep);\n }\n\n /**\n * Get path as array of tag names.\n * @returns {string[]}\n */\n toArray() {\n return this.path.map(n => n.tag);\n }\n\n /**\n * Reset the path to empty.\n */\n reset() {\n this._pathStringCache = null;\n this.path = [];\n this.siblingStacks = [];\n }\n\n /**\n * Match current path against an Expression.\n * @param {Expression} expression\n * @returns {boolean}\n */\n matches(expression) {\n const segments = expression.segments;\n\n if (segments.length === 0) {\n return false;\n }\n\n if (expression.hasDeepWildcard()) {\n return this._matchWithDeepWildcard(segments);\n }\n\n return this._matchSimple(segments);\n }\n\n /**\n * @private\n */\n _matchSimple(segments) {\n if (this.path.length !== segments.length) {\n return false;\n }\n\n for (let i = 0; i < segments.length; i++) {\n if (!this._matchSegment(segments[i], this.path[i], i === this.path.length - 1)) {\n return false;\n }\n }\n\n return true;\n }\n\n /**\n * @private\n */\n _matchWithDeepWildcard(segments) {\n let pathIdx = this.path.length - 1;\n let segIdx = segments.length - 1;\n\n while (segIdx >= 0 && pathIdx >= 0) {\n const segment = segments[segIdx];\n\n if (segment.type === 'deep-wildcard') {\n segIdx--;\n\n if (segIdx < 0) {\n return true;\n }\n\n const nextSeg = segments[segIdx];\n let found = false;\n\n for (let i = pathIdx; i >= 0; i--) {\n if (this._matchSegment(nextSeg, this.path[i], i === this.path.length - 1)) {\n pathIdx = i - 1;\n segIdx--;\n found = true;\n break;\n }\n }\n\n if (!found) {\n return false;\n }\n } else {\n if (!this._matchSegment(segment, this.path[pathIdx], pathIdx === this.path.length - 1)) {\n return false;\n }\n pathIdx--;\n segIdx--;\n }\n }\n\n return segIdx < 0;\n }\n\n /**\n * @private\n */\n _matchSegment(segment, node, isCurrentNode) {\n if (segment.tag !== '*' && segment.tag !== node.tag) {\n return false;\n }\n\n if (segment.namespace !== undefined) {\n if (segment.namespace !== '*' && segment.namespace !== node.namespace) {\n return false;\n }\n }\n\n if (segment.attrName !== undefined) {\n if (!isCurrentNode) {\n return false;\n }\n\n if (!node.values || !(segment.attrName in node.values)) {\n return false;\n }\n\n if (segment.attrValue !== undefined) {\n if (String(node.values[segment.attrName]) !== String(segment.attrValue)) {\n return false;\n }\n }\n }\n\n if (segment.position !== undefined) {\n if (!isCurrentNode) {\n return false;\n }\n\n const counter = node.counter ?? 0;\n\n if (segment.position === 'first' && counter !== 0) {\n return false;\n } else if (segment.position === 'odd' && counter % 2 !== 1) {\n return false;\n } else if (segment.position === 'even' && counter % 2 !== 0) {\n return false;\n } else if (segment.position === 'nth' && counter !== segment.positionValue) {\n return false;\n }\n }\n\n return true;\n }\n\n /**\n * Match any expression in the given set against the current path.\n * @param {ExpressionSet} exprSet\n * @returns {boolean}\n */\n matchesAny(exprSet) {\n return exprSet.matchesAny(this);\n }\n\n /**\n * Create a snapshot of current state.\n * @returns {Object}\n */\n snapshot() {\n return {\n path: this.path.map(node => ({ ...node })),\n siblingStacks: this.siblingStacks.map(map => new Map(map))\n };\n }\n\n /**\n * Restore state from snapshot.\n * @param {Object} snapshot\n */\n restore(snapshot) {\n this._pathStringCache = null;\n this.path = snapshot.path.map(node => ({ ...node }));\n this.siblingStacks = snapshot.siblingStacks.map(map => new Map(map));\n }\n\n /**\n * Return the read-only {@link MatcherView} for this matcher.\n *\n * The same instance is returned on every call — no allocation occurs.\n * It always reflects the current parser state and is safe to pass to\n * user callbacks without risk of accidental mutation.\n *\n * @returns {MatcherView}\n *\n * @example\n * const view = matcher.readOnly();\n * // pass view to callbacks — it stays in sync automatically\n * view.matches(expr); // ✓\n * view.getCurrentTag(); // ✓\n * // view.push(...) // ✗ method does not exist — caught by TypeScript\n */\n readOnly() {\n return this._view;\n }\n}","/**\n * Expression - Parses and stores a tag pattern expression\n * \n * Patterns are parsed once and stored in an optimized structure for fast matching.\n * \n * @example\n * const expr = new Expression(\"root.users.user\");\n * const expr2 = new Expression(\"..user[id]:first\");\n * const expr3 = new Expression(\"root/users/user\", { separator: '/' });\n */\nexport default class Expression {\n /**\n * Create a new Expression\n * @param {string} pattern - Pattern string (e.g., \"root.users.user\", \"..user[id]\")\n * @param {Object} options - Configuration options\n * @param {string} options.separator - Path separator (default: '.')\n */\n constructor(pattern, options = {}, data) {\n this.pattern = pattern;\n this.separator = options.separator || '.';\n this.segments = this._parse(pattern);\n this.data = data;\n // Cache expensive checks for performance (O(1) instead of O(n))\n this._hasDeepWildcard = this.segments.some(seg => seg.type === 'deep-wildcard');\n this._hasAttributeCondition = this.segments.some(seg => seg.attrName !== undefined);\n this._hasPositionSelector = this.segments.some(seg => seg.position !== undefined);\n }\n\n /**\n * Parse pattern string into segments\n * @private\n * @param {string} pattern - Pattern to parse\n * @returns {Array} Array of segment objects\n */\n _parse(pattern) {\n const segments = [];\n\n // Split by separator but handle \"..\" specially\n let i = 0;\n let currentPart = '';\n\n while (i < pattern.length) {\n if (pattern[i] === this.separator) {\n // Check if next char is also separator (deep wildcard)\n if (i + 1 < pattern.length && pattern[i + 1] === this.separator) {\n // Flush current part if any\n if (currentPart.trim()) {\n segments.push(this._parseSegment(currentPart.trim()));\n currentPart = '';\n }\n // Add deep wildcard\n segments.push({ type: 'deep-wildcard' });\n i += 2; // Skip both separators\n } else {\n // Regular separator\n if (currentPart.trim()) {\n segments.push(this._parseSegment(currentPart.trim()));\n }\n currentPart = '';\n i++;\n }\n } else {\n currentPart += pattern[i];\n i++;\n }\n }\n\n // Flush remaining part\n if (currentPart.trim()) {\n segments.push(this._parseSegment(currentPart.trim()));\n }\n\n return segments;\n }\n\n /**\n * Parse a single segment\n * @private\n * @param {string} part - Segment string (e.g., \"user\", \"ns::user\", \"user[id]\", \"ns::user:first\")\n * @returns {Object} Segment object\n */\n _parseSegment(part) {\n const segment = { type: 'tag' };\n\n // NEW NAMESPACE SYNTAX (v2.0):\n // ============================\n // Namespace uses DOUBLE colon (::)\n // Position uses SINGLE colon (:)\n // \n // Examples:\n // \"user\" → tag\n // \"user:first\" → tag + position\n // \"user[id]\" → tag + attribute\n // \"user[id]:first\" → tag + attribute + position\n // \"ns::user\" → namespace + tag\n // \"ns::user:first\" → namespace + tag + position\n // \"ns::user[id]\" → namespace + tag + attribute\n // \"ns::user[id]:first\" → namespace + tag + attribute + position\n // \"ns::first\" → namespace + tag named \"first\" (NO ambiguity!)\n //\n // This eliminates all ambiguity:\n // :: = namespace separator\n // : = position selector\n // [] = attributes\n\n // Step 1: Extract brackets [attr] or [attr=value]\n let bracketContent = null;\n let withoutBrackets = part;\n\n const bracketMatch = part.match(/^([^\\[]+)(\\[[^\\]]*\\])(.*)$/);\n if (bracketMatch) {\n withoutBrackets = bracketMatch[1] + bracketMatch[3];\n if (bracketMatch[2]) {\n const content = bracketMatch[2].slice(1, -1);\n if (content) {\n bracketContent = content;\n }\n }\n }\n\n // Step 2: Check for namespace (double colon ::)\n let namespace = undefined;\n let tagAndPosition = withoutBrackets;\n\n if (withoutBrackets.includes('::')) {\n const nsIndex = withoutBrackets.indexOf('::');\n namespace = withoutBrackets.substring(0, nsIndex).trim();\n tagAndPosition = withoutBrackets.substring(nsIndex + 2).trim(); // Skip ::\n\n if (!namespace) {\n throw new Error(`Invalid namespace in pattern: ${part}`);\n }\n }\n\n // Step 3: Parse tag and position (single colon :)\n let tag = undefined;\n let positionMatch = null;\n\n if (tagAndPosition.includes(':')) {\n const colonIndex = tagAndPosition.lastIndexOf(':'); // Use last colon for position\n const tagPart = tagAndPosition.substring(0, colonIndex).trim();\n const posPart = tagAndPosition.substring(colonIndex + 1).trim();\n\n // Verify position is a valid keyword\n const isPositionKeyword = ['first', 'last', 'odd', 'even'].includes(posPart) ||\n /^nth\\(\\d+\\)$/.test(posPart);\n\n if (isPositionKeyword) {\n tag = tagPart;\n positionMatch = posPart;\n } else {\n // Not a valid position keyword, treat whole thing as tag\n tag = tagAndPosition;\n }\n } else {\n tag = tagAndPosition;\n }\n\n if (!tag) {\n throw new Error(`Invalid segment pattern: ${part}`);\n }\n\n segment.tag = tag;\n if (namespace) {\n segment.namespace = namespace;\n }\n\n // Step 4: Parse attributes\n if (bracketContent) {\n if (bracketContent.includes('=')) {\n const eqIndex = bracketContent.indexOf('=');\n segment.attrName = bracketContent.substring(0, eqIndex).trim();\n segment.attrValue = bracketContent.substring(eqIndex + 1).trim();\n } else {\n segment.attrName = bracketContent.trim();\n }\n }\n\n // Step 5: Parse position selector\n if (positionMatch) {\n const nthMatch = positionMatch.match(/^nth\\((\\d+)\\)$/);\n if (nthMatch) {\n segment.position = 'nth';\n segment.positionValue = parseInt(nthMatch[1], 10);\n } else {\n segment.position = positionMatch;\n }\n }\n\n return segment;\n }\n\n /**\n * Get the number of segments\n * @returns {number}\n */\n get length() {\n return this.segments.length;\n }\n\n /**\n * Check if expression contains deep wildcard\n * @returns {boolean}\n */\n hasDeepWildcard() {\n return this._hasDeepWildcard;\n }\n\n /**\n * Check if expression has attribute conditions\n * @returns {boolean}\n */\n hasAttributeCondition() {\n return this._hasAttributeCondition;\n }\n\n /**\n * Check if expression has position selectors\n * @returns {boolean}\n */\n hasPositionSelector() {\n return this._hasPositionSelector;\n }\n\n /**\n * Get string representation\n * @returns {string}\n */\n toString() {\n return this.pattern;\n }\n}","/**\n * ExpressionSet - An indexed collection of Expressions for efficient bulk matching\n *\n * Instead of iterating all expressions on every tag, ExpressionSet pre-indexes\n * them at insertion time by depth and terminal tag name. At match time, only\n * the relevant bucket is evaluated — typically reducing checks from O(E) to O(1)\n * lookup plus O(small bucket) matches.\n *\n * Three buckets are maintained:\n * - `_byDepthAndTag` — exact depth + exact tag name (tightest, used first)\n * - `_wildcardByDepth` — exact depth + wildcard tag `*` (depth-matched only)\n * - `_deepWildcards` — expressions containing `..` (cannot be depth-indexed)\n *\n * @example\n * import { Expression, ExpressionSet } from 'fast-xml-tagger';\n *\n * // Build once at config time\n * const stopNodes = new ExpressionSet();\n * stopNodes.add(new Expression('root.users.user'));\n * stopNodes.add(new Expression('root.config.setting'));\n * stopNodes.add(new Expression('..script'));\n *\n * // Query on every tag — hot path\n * if (stopNodes.matchesAny(matcher)) { ... }\n */\nexport default class ExpressionSet {\n constructor() {\n /** @type {Map} depth:tag → expressions */\n this._byDepthAndTag = new Map();\n\n /** @type {Map} depth → wildcard-tag expressions */\n this._wildcardByDepth = new Map();\n\n /** @type {import('./Expression.js').default[]} expressions containing deep wildcard (..) */\n this._deepWildcards = [];\n\n /** @type {Set} pattern strings already added — used for deduplication */\n this._patterns = new Set();\n\n /** @type {boolean} whether the set is sealed against further additions */\n this._sealed = false;\n }\n\n /**\n * Add an Expression to the set.\n * Duplicate patterns (same pattern string) are silently ignored.\n *\n * @param {import('./Expression.js').default} expression - A pre-constructed Expression instance\n * @returns {this} for chaining\n * @throws {TypeError} if called after seal()\n *\n * @example\n * set.add(new Expression('root.users.user'));\n * set.add(new Expression('..script'));\n */\n add(expression) {\n if (this._sealed) {\n throw new TypeError(\n 'ExpressionSet is sealed. Create a new ExpressionSet to add more expressions.'\n );\n }\n\n // Deduplicate by pattern string\n if (this._patterns.has(expression.pattern)) return this;\n this._patterns.add(expression.pattern);\n\n if (expression.hasDeepWildcard()) {\n this._deepWildcards.push(expression);\n return this;\n }\n\n const depth = expression.length;\n const lastSeg = expression.segments[expression.segments.length - 1];\n const tag = lastSeg?.tag;\n\n if (!tag || tag === '*') {\n // Can index by depth but not by tag\n if (!this._wildcardByDepth.has(depth)) this._wildcardByDepth.set(depth, []);\n this._wildcardByDepth.get(depth).push(expression);\n } else {\n // Tightest bucket: depth + tag\n const key = `${depth}:${tag}`;\n if (!this._byDepthAndTag.has(key)) this._byDepthAndTag.set(key, []);\n this._byDepthAndTag.get(key).push(expression);\n }\n\n return this;\n }\n\n /**\n * Add multiple expressions at once.\n *\n * @param {import('./Expression.js').default[]} expressions - Array of Expression instances\n * @returns {this} for chaining\n *\n * @example\n * set.addAll([\n * new Expression('root.users.user'),\n * new Expression('root.config.setting'),\n * ]);\n */\n addAll(expressions) {\n for (const expr of expressions) this.add(expr);\n return this;\n }\n\n /**\n * Check whether a pattern string is already present in the set.\n *\n * @param {import('./Expression.js').default} expression\n * @returns {boolean}\n */\n has(expression) {\n return this._patterns.has(expression.pattern);\n }\n\n /**\n * Number of expressions in the set.\n * @type {number}\n */\n get size() {\n return this._patterns.size;\n }\n\n /**\n * Seal the set against further modifications.\n * Useful to prevent accidental mutations after config is built.\n * Calling add() or addAll() on a sealed set throws a TypeError.\n *\n * @returns {this}\n */\n seal() {\n this._sealed = true;\n return this;\n }\n\n /**\n * Whether the set has been sealed.\n * @type {boolean}\n */\n get isSealed() {\n return this._sealed;\n }\n\n /**\n * Test whether the matcher's current path matches any expression in the set.\n *\n * Evaluation order (cheapest → most expensive):\n * 1. Exact depth + tag bucket — O(1) lookup, typically 0–2 expressions\n * 2. Depth-only wildcard bucket — O(1) lookup, rare\n * 3. Deep-wildcard list — always checked, but usually small\n *\n * @param {import('./Matcher.js').default} matcher - Matcher instance (or readOnly view)\n * @returns {boolean} true if any expression matches the current path\n *\n * @example\n * if (stopNodes.matchesAny(matcher)) {\n * // handle stop node\n * }\n */\n matchesAny(matcher) {\n return this.findMatch(matcher) !== null;\n }\n /**\n * Find and return the first Expression that matches the matcher's current path.\n *\n * Uses the same evaluation order as matchesAny (cheapest → most expensive):\n * 1. Exact depth + tag bucket\n * 2. Depth-only wildcard bucket\n * 3. Deep-wildcard list\n *\n * @param {import('./Matcher.js').default} matcher - Matcher instance (or readOnly view)\n * @returns {import('./Expression.js').default | null} the first matching Expression, or null\n *\n * @example\n * const expr = stopNodes.findMatch(matcher);\n * if (expr) {\n * // access expr.config, expr.pattern, etc.\n * }\n */\n findMatch(matcher) {\n const depth = matcher.getDepth();\n const tag = matcher.getCurrentTag();\n\n // 1. Tightest bucket — most expressions live here\n const exactKey = `${depth}:${tag}`;\n const exactBucket = this._byDepthAndTag.get(exactKey);\n if (exactBucket) {\n for (let i = 0; i < exactBucket.length; i++) {\n if (matcher.matches(exactBucket[i])) return exactBucket[i];\n }\n }\n\n // 2. Depth-matched wildcard-tag expressions\n const wildcardBucket = this._wildcardByDepth.get(depth);\n if (wildcardBucket) {\n for (let i = 0; i < wildcardBucket.length; i++) {\n if (matcher.matches(wildcardBucket[i])) return wildcardBucket[i];\n }\n }\n\n // 3. Deep wildcards — cannot be pre-filtered by depth or tag\n for (let i = 0; i < this._deepWildcards.length; i++) {\n if (matcher.matches(this._deepWildcards[i])) return this._deepWildcards[i];\n }\n\n return null;\n }\n}\n","// ---------------------------------------------------------------------------\n// Complete HTML5 named entity reference\n// Organized by logical categories for easy maintenance and selective importing\n// ---------------------------------------------------------------------------\n\n/**\n * Basic Latin & Special Characters\n * @type {Record}\n */\nexport const BASIC_LATIN = {\n amp: '&',\n AMP: '&',\n lt: '<',\n LT: '<',\n gt: '>',\n GT: '>',\n quot: '\"',\n QUOT: '\"',\n apos: \"'\",\n lsquo: '‘',\n rsquo: '’',\n ldquo: '“',\n rdquo: '”',\n lsquor: '‚',\n rsquor: '’',\n ldquor: '„',\n bdquo: '„',\n comma: ',',\n period: '.',\n colon: ':',\n semi: ';',\n excl: '!',\n quest: '?',\n num: '#',\n dollar: '$',\n percent: '%',\n amp: '&',\n ast: '*',\n commat: '@',\n lowbar: '_',\n verbar: '|',\n vert: '|',\n sol: '/',\n bsol: '\\\\',\n lbrace: '{',\n rbrace: '}',\n lbrack: '[',\n rbrack: ']',\n lpar: '(',\n rpar: ')',\n nbsp: '\\u00a0',\n iexcl: '¡',\n cent: '¢',\n pound: '£',\n curren: '¤',\n yen: '¥',\n brvbar: '¦',\n sect: '§',\n uml: '¨',\n copy: '©',\n COPY: '©',\n ordf: 'ª',\n laquo: '«',\n not: '¬',\n shy: '\\u00ad',\n reg: '®',\n REG: '®',\n macr: '¯',\n deg: '°',\n plusmn: '±',\n sup2: '²',\n sup3: '³',\n acute: '´',\n micro: 'µ',\n para: '¶',\n middot: '·',\n cedil: '¸',\n sup1: '¹',\n ordm: 'º',\n raquo: '»',\n frac14: '¼',\n frac12: '½',\n half: '½',\n frac34: '¾',\n iquest: '¿',\n times: '×',\n div: '÷',\n divide: '÷',\n};\n\n/**\n * Latin Extended & Accented Letters (A-Z)\n * @type {Record}\n */\nexport const LATIN_ACCENTS = {\n Agrave: 'À',\n agrave: 'à',\n Aacute: 'Á',\n aacute: 'á',\n Acirc: 'Â',\n acirc: 'â',\n Atilde: 'Ã',\n atilde: 'ã',\n Auml: 'Ä',\n auml: 'ä',\n Aring: 'Å',\n aring: 'å',\n AElig: 'Æ',\n aelig: 'æ',\n Ccedil: 'Ç',\n ccedil: 'ç',\n Egrave: 'È',\n egrave: 'è',\n Eacute: 'É',\n eacute: 'é',\n Ecirc: 'Ê',\n ecirc: 'ê',\n Euml: 'Ë',\n euml: 'ë',\n Igrave: 'Ì',\n igrave: 'ì',\n Iacute: 'Í',\n iacute: 'í',\n Icirc: 'Î',\n icirc: 'î',\n Iuml: 'Ï',\n iuml: 'ï',\n ETH: 'Ð',\n eth: 'ð',\n Ntilde: 'Ñ',\n ntilde: 'ñ',\n Ograve: 'Ò',\n ograve: 'ò',\n Oacute: 'Ó',\n oacute: 'ó',\n Ocirc: 'Ô',\n ocirc: 'ô',\n Otilde: 'Õ',\n otilde: 'õ',\n Ouml: 'Ö',\n ouml: 'ö',\n Oslash: 'Ø',\n oslash: 'ø',\n Ugrave: 'Ù',\n ugrave: 'ù',\n Uacute: 'Ú',\n uacute: 'ú',\n Ucirc: 'Û',\n ucirc: 'û',\n Uuml: 'Ü',\n uuml: 'ü',\n Yacute: 'Ý',\n yacute: 'ý',\n THORN: 'Þ',\n thorn: 'þ',\n szlig: 'ß',\n yuml: 'ÿ',\n Yuml: 'Ÿ',\n};\n\n/**\n * Latin Extended (Letters with diacritics)\n * @type {Record}\n */\nexport const LATIN_EXTENDED = {\n Amacr: 'Ā',\n amacr: 'ā',\n Abreve: 'Ă',\n abreve: 'ă',\n Aogon: 'Ą',\n aogon: 'ą',\n Cacute: 'Ć',\n cacute: 'ć',\n Ccirc: 'Ĉ',\n ccirc: 'ĉ',\n Cdot: 'Ċ',\n cdot: 'ċ',\n Ccaron: 'Č',\n ccaron: 'č',\n Dcaron: 'Ď',\n dcaron: 'ď',\n Dstrok: 'Đ',\n dstrok: 'đ',\n Emacr: 'Ē',\n emacr: 'ē',\n Ecaron: 'Ě',\n ecaron: 'ě',\n Edot: 'Ė',\n edot: 'ė',\n Eogon: 'Ę',\n eogon: 'ę',\n Gcirc: 'Ĝ',\n gcirc: 'ĝ',\n Gbreve: 'Ğ',\n gbreve: 'ğ',\n Gdot: 'Ġ',\n gdot: 'ġ',\n Gcedil: 'Ģ',\n Hcirc: 'Ĥ',\n hcirc: 'ĥ',\n Hstrok: 'Ħ',\n hstrok: 'ħ',\n Itilde: 'Ĩ',\n itilde: 'ĩ',\n Imacr: 'Ī',\n imacr: 'ī',\n Iogon: 'Į',\n iogon: 'į',\n Idot: 'İ',\n IJlig: 'IJ',\n ijlig: 'ij',\n Jcirc: 'Ĵ',\n jcirc: 'ĵ',\n Kcedil: 'Ķ',\n kcedil: 'ķ',\n kgreen: 'ĸ',\n Lacute: 'Ĺ',\n lacute: 'ĺ',\n Lcedil: 'Ļ',\n lcedil: 'ļ',\n Lcaron: 'Ľ',\n lcaron: 'ľ',\n Lmidot: 'Ŀ',\n lmidot: 'ŀ',\n Lstrok: 'Ł',\n lstrok: 'ł',\n Nacute: 'Ń',\n nacute: 'ń',\n Ncaron: 'Ň',\n ncaron: 'ň',\n Ncedil: 'Ņ',\n ncedil: 'ņ',\n ENG: 'Ŋ',\n eng: 'ŋ',\n Omacr: 'Ō',\n omacr: 'ō',\n Odblac: 'Ő',\n odblac: 'ő',\n OElig: 'Œ',\n oelig: 'œ',\n Racute: 'Ŕ',\n racute: 'ŕ',\n Rcaron: 'Ř',\n rcaron: 'ř',\n Rcedil: 'Ŗ',\n rcedil: 'ŗ',\n Sacute: 'Ś',\n sacute: 'ś',\n Scirc: 'Ŝ',\n scirc: 'ŝ',\n Scedil: 'Ş',\n scedil: 'ş',\n Scaron: 'Š',\n scaron: 'š',\n Tcedil: 'Ţ',\n tcedil: 'ţ',\n Tcaron: 'Ť',\n tcaron: 'ť',\n Tstrok: 'Ŧ',\n tstrok: 'ŧ',\n Utilde: 'Ũ',\n utilde: 'ũ',\n Umacr: 'Ū',\n umacr: 'ū',\n Ubreve: 'Ŭ',\n ubreve: 'ŭ',\n Uring: 'Ů',\n uring: 'ů',\n Udblac: 'Ű',\n udblac: 'ű',\n Uogon: 'Ų',\n uogon: 'ų',\n Wcirc: 'Ŵ',\n wcirc: 'ŵ',\n Ycirc: 'Ŷ',\n ycirc: 'ŷ',\n Zacute: 'Ź',\n zacute: 'ź',\n Zdot: 'Ż',\n zdot: 'ż',\n Zcaron: 'Ž',\n zcaron: 'ž',\n};\n\n/**\n * Greek Letters\n * @type {Record}\n */\nexport const GREEK = {\n Alpha: 'Α',\n alpha: 'α',\n Beta: 'Β',\n beta: 'β',\n Gamma: 'Γ',\n gamma: 'γ',\n Delta: 'Δ',\n delta: 'δ',\n Epsilon: 'Ε',\n epsilon: 'ε',\n epsiv: 'ϵ',\n varepsilon: 'ϵ',\n Zeta: 'Ζ',\n zeta: 'ζ',\n Eta: 'Η',\n eta: 'η',\n Theta: 'Θ',\n theta: 'θ',\n thetasym: 'ϑ',\n vartheta: 'ϑ',\n Iota: 'Ι',\n iota: 'ι',\n Kappa: 'Κ',\n kappa: 'κ',\n kappav: 'ϰ',\n varkappa: 'ϰ',\n Lambda: 'Λ',\n lambda: 'λ',\n Mu: 'Μ',\n mu: 'μ',\n Nu: 'Ν',\n nu: 'ν',\n Xi: 'Ξ',\n xi: 'ξ',\n Omicron: 'Ο',\n omicron: 'ο',\n Pi: 'Π',\n pi: 'π',\n piv: 'ϖ',\n varpi: 'ϖ',\n Rho: 'Ρ',\n rho: 'ρ',\n rhov: 'ϱ',\n varrho: 'ϱ',\n Sigma: 'Σ',\n sigma: 'σ',\n sigmaf: 'ς',\n sigmav: 'ς',\n varsigma: 'ς',\n Tau: 'Τ',\n tau: 'τ',\n Upsilon: 'Υ',\n upsilon: 'υ',\n upsi: 'υ',\n Upsi: 'ϒ',\n upsih: 'ϒ',\n Phi: 'Φ',\n phi: 'φ',\n phiv: 'ϕ',\n varphi: 'ϕ',\n Chi: 'Χ',\n chi: 'χ',\n Psi: 'Ψ',\n psi: 'ψ',\n Omega: 'Ω',\n omega: 'ω',\n ohm: 'Ω',\n Gammad: 'Ϝ',\n gammad: 'ϝ',\n digamma: 'ϝ',\n};\n\n/**\n * Cyrillic Letters\n * @type {Record}\n */\nexport const CYRILLIC = {\n Afr: '𝔄',\n afr: '𝔞',\n Acy: 'А',\n acy: 'а',\n Bcy: 'Б',\n bcy: 'б',\n Vcy: 'В',\n vcy: 'в',\n Gcy: 'Г',\n gcy: 'г',\n Dcy: 'Д',\n dcy: 'д',\n IEcy: 'Е',\n iecy: 'е',\n IOcy: 'Ё',\n iocy: 'ё',\n ZHcy: 'Ж',\n zhcy: 'ж',\n Zcy: 'З',\n zcy: 'з',\n Icy: 'И',\n icy: 'и',\n Jcy: 'Й',\n jcy: 'й',\n Kcy: 'К',\n kcy: 'к',\n Lcy: 'Л',\n lcy: 'л',\n Mcy: 'М',\n mcy: 'м',\n Ncy: 'Н',\n ncy: 'н',\n Ocy: 'О',\n ocy: 'о',\n Pcy: 'П',\n pcy: 'п',\n Rcy: 'Р',\n rcy: 'р',\n Scy: 'С',\n scy: 'с',\n Tcy: 'Т',\n tcy: 'т',\n Ucy: 'У',\n ucy: 'у',\n Fcy: 'Ф',\n fcy: 'ф',\n KHcy: 'Х',\n khcy: 'х',\n TScy: 'Ц',\n tscy: 'ц',\n CHcy: 'Ч',\n chcy: 'ч',\n SHcy: 'Ш',\n shcy: 'ш',\n SHCHcy: 'Щ',\n shchcy: 'щ',\n HARDcy: 'Ъ',\n hardcy: 'ъ',\n Ycy: 'Ы',\n ycy: 'ы',\n SOFTcy: 'Ь',\n softcy: 'ь',\n Ecy: 'Э',\n ecy: 'э',\n YUcy: 'Ю',\n yucy: 'ю',\n YAcy: 'Я',\n yacy: 'я',\n DJcy: 'Ђ',\n djcy: 'ђ',\n GJcy: 'Ѓ',\n gjcy: 'ѓ',\n Jukcy: 'Є',\n jukcy: 'є',\n DScy: 'Ѕ',\n dscy: 'ѕ',\n Iukcy: 'І',\n iukcy: 'і',\n YIcy: 'Ї',\n yicy: 'ї',\n Jsercy: 'Ј',\n jsercy: 'ј',\n LJcy: 'Љ',\n ljcy: 'љ',\n NJcy: 'Њ',\n njcy: 'њ',\n TSHcy: 'Ћ',\n tshcy: 'ћ',\n KJcy: 'Ќ',\n kjcy: 'ќ',\n Ubrcy: 'Ў',\n ubrcy: 'ў',\n DZcy: 'Џ',\n dzcy: 'џ',\n};\n\n/**\n * Mathematical Operators & Relations\n * @type {Record}\n */\nexport const MATH = {\n plus: '+',\n minus: '−',\n mnplus: '∓',\n mp: '∓',\n pm: '±',\n times: '×',\n div: '÷',\n divide: '÷',\n sdot: '⋅',\n star: '☆',\n starf: '★',\n bigstar: '★',\n lowast: '∗',\n ast: '*',\n midast: '*',\n compfn: '∘',\n smallcircle: '∘',\n bullet: '•',\n bull: '•',\n nbsp: '\\u00a0',\n hellip: '…',\n mldr: '…',\n prime: '′',\n Prime: '″',\n tprime: '‴',\n bprime: '‵',\n backprime: '‵',\n minus: '−',\n minusd: '∸',\n dotminus: '∸',\n plusdo: '∔',\n dotplus: '∔',\n plusmn: '±',\n minusplus: '∓',\n mnplus: '∓',\n mp: '∓',\n setminus: '∖',\n smallsetminus: '∖',\n Backslash: '∖',\n setmn: '∖',\n ssetmn: '∖',\n lowbar: '_',\n verbar: '|',\n vert: '|',\n VerticalLine: '|',\n colon: ':',\n Colon: '∷',\n Proportion: '∷',\n ratio: '∶',\n equals: '=',\n ne: '≠',\n nequiv: '≢',\n equiv: '≡',\n Congruent: '≡',\n sim: '∼',\n thicksim: '∼',\n thksim: '∼',\n sime: '≃',\n simeq: '≃',\n TildeEqual: '≃',\n asymp: '≈',\n approx: '≈',\n thickapprox: '≈',\n thkap: '≈',\n TildeTilde: '≈',\n ncong: '≇',\n cong: '≅',\n TildeFullEqual: '≅',\n asympeq: '≍',\n CupCap: '≍',\n bump: '≎',\n Bumpeq: '≎',\n HumpDownHump: '≎',\n bumpe: '≏',\n bumpeq: '≏',\n HumpEqual: '≏',\n dotminus: '∸',\n minusd: '∸',\n plusdo: '∔',\n dotplus: '∔',\n le: '≤',\n LessEqual: '≤',\n ge: '≥',\n GreaterEqual: '≥',\n lesseqgtr: '⋚',\n lesseqqgtr: '⪋',\n greater: '>',\n less: '<',\n};\n\n/**\n * Mathematical Operators (Advanced)\n * @type {Record}\n */\nexport const MATH_ADVANCED = {\n alefsym: 'ℵ',\n aleph: 'ℵ',\n beth: 'ℶ',\n gimel: 'ℷ',\n daleth: 'ℸ',\n forall: '∀',\n ForAll: '∀',\n part: '∂',\n PartialD: '∂',\n exist: '∃',\n Exists: '∃',\n nexist: '∄',\n nexists: '∄',\n empty: '∅',\n emptyset: '∅',\n emptyv: '∅',\n varnothing: '∅',\n nabla: '∇',\n Del: '∇',\n isin: '∈',\n isinv: '∈',\n in: '∈',\n Element: '∈',\n notin: '∉',\n notinva: '∉',\n ni: '∋',\n niv: '∋',\n SuchThat: '∋',\n ReverseElement: '∋',\n notni: '∌',\n notniva: '∌',\n prod: '∏',\n Product: '∏',\n coprod: '∐',\n Coproduct: '∐',\n sum: '∑',\n Sum: '∑',\n minus: '−',\n mp: '∓',\n plusdo: '∔',\n dotplus: '∔',\n setminus: '∖',\n lowast: '∗',\n radic: '√',\n Sqrt: '√',\n prop: '∝',\n propto: '∝',\n Proportional: '∝',\n varpropto: '∝',\n infin: '∞',\n infintie: '⧝',\n ang: '∠',\n angle: '∠',\n angmsd: '∡',\n measuredangle: '∡',\n angsph: '∢',\n mid: '∣',\n VerticalBar: '∣',\n nmid: '∤',\n nsmid: '∤',\n npar: '∦',\n parallel: '∥',\n spar: '∥',\n nparallel: '∦',\n nspar: '∦',\n and: '∧',\n wedge: '∧',\n or: '∨',\n vee: '∨',\n cap: '∩',\n cup: '∪',\n int: '∫',\n Integral: '∫',\n conint: '∮',\n ContourIntegral: '∮',\n Conint: '∯',\n DoubleContourIntegral: '∯',\n Cconint: '∰',\n there4: '∴',\n therefore: '∴',\n Therefore: '∴',\n becaus: '∵',\n because: '∵',\n Because: '∵',\n ratio: '∶',\n Proportion: '∷',\n minusd: '∸',\n dotminus: '∸',\n mDDot: '∺',\n homtht: '∻',\n sim: '∼',\n bsimg: '∽',\n backsim: '∽',\n ac: '∾',\n mstpos: '∾',\n acd: '∿',\n VerticalTilde: '≀',\n wr: '≀',\n wreath: '≀',\n nsime: '≄',\n nsimeq: '≄',\n nsimeq: '≄',\n ncong: '≇',\n simne: '≆',\n ncongdot: '⩭̸',\n ngsim: '≵',\n nsim: '≁',\n napprox: '≉',\n nap: '≉',\n ngeq: '≱',\n nge: '≱',\n nleq: '≰',\n nle: '≰',\n ngtr: '≯',\n ngt: '≯',\n nless: '≮',\n nlt: '≮',\n nprec: '⊀',\n npr: '⊀',\n nsucc: '⊁',\n nsc: '⊁',\n};\n\n/**\n * Arrows\n * @type {Record}\n */\nexport const ARROWS = {\n larr: '←',\n leftarrow: '←',\n LeftArrow: '←',\n uarr: '↑',\n uparrow: '↑',\n UpArrow: '↑',\n rarr: '→',\n rightarrow: '→',\n RightArrow: '→',\n darr: '↓',\n downarrow: '↓',\n DownArrow: '↓',\n harr: '↔',\n leftrightarrow: '↔',\n LeftRightArrow: '↔',\n varr: '↕',\n updownarrow: '↕',\n UpDownArrow: '↕',\n nwarr: '↖',\n nwarrow: '↖',\n UpperLeftArrow: '↖',\n nearr: '↗',\n nearrow: '↗',\n UpperRightArrow: '↗',\n searr: '↘',\n searrow: '↘',\n LowerRightArrow: '↘',\n swarr: '↙',\n swarrow: '↙',\n LowerLeftArrow: '↙',\n lArr: '⇐',\n Leftarrow: '⇐',\n uArr: '⇑',\n Uparrow: '⇑',\n rArr: '⇒',\n Rightarrow: '⇒',\n dArr: '⇓',\n Downarrow: '⇓',\n hArr: '⇔',\n Leftrightarrow: '⇔',\n iff: '⇔',\n vArr: '⇕',\n Updownarrow: '⇕',\n lAarr: '⇚',\n Lleftarrow: '⇚',\n rAarr: '⇛',\n Rrightarrow: '⇛',\n lrarr: '⇆',\n leftrightarrows: '⇆',\n rlarr: '⇄',\n rightleftarrows: '⇄',\n lrhar: '⇋',\n leftrightharpoons: '⇋',\n ReverseEquilibrium: '⇋',\n rlhar: '⇌',\n rightleftharpoons: '⇌',\n Equilibrium: '⇌',\n udarr: '⇅',\n UpArrowDownArrow: '⇅',\n duarr: '⇵',\n DownArrowUpArrow: '⇵',\n llarr: '⇇',\n leftleftarrows: '⇇',\n rrarr: '⇉',\n rightrightarrows: '⇉',\n ddarr: '⇊',\n downdownarrows: '⇊',\n har: '↽',\n lhard: '↽',\n leftharpoondown: '↽',\n lharu: '↼',\n leftharpoonup: '↼',\n rhard: '⇁',\n rightharpoondown: '⇁',\n rharu: '⇀',\n rightharpoonup: '⇀',\n lsh: '↰',\n Lsh: '↰',\n rsh: '↱',\n Rsh: '↱',\n ldsh: '↲',\n rdsh: '↳',\n hookleftarrow: '↩',\n hookrightarrow: '↪',\n mapstoleft: '↤',\n mapstoup: '↥',\n map: '↦',\n mapsto: '↦',\n mapstodown: '↧',\n crarr: '↵',\n nwarrow: '↖',\n nearrow: '↗',\n searrow: '↘',\n swarrow: '↙',\n nleftarrow: '↚',\n nleftrightarrow: '↮',\n nrightarrow: '↛',\n nrarr: '↛',\n larrtl: '↢',\n rarrtl: '↣',\n leftarrowtail: '↢',\n rightarrowtail: '↣',\n twoheadleftarrow: '↞',\n twoheadrightarrow: '↠',\n Larr: '↞',\n Rarr: '↠',\n larrhk: '↩',\n rarrhk: '↪',\n larrlp: '↫',\n looparrowleft: '↫',\n rarrlp: '↬',\n looparrowright: '↬',\n harrw: '↭',\n leftrightsquigarrow: '↭',\n nrarrw: '↝̸',\n rarrw: '↝',\n rightsquigarrow: '↝',\n larrbfs: '⤟',\n rarrbfs: '⤠',\n nvHarr: '⤄',\n nvlArr: '⤂',\n nvrArr: '⤃',\n larrfs: '⤝',\n rarrfs: '⤞',\n Map: '⤅',\n larrsim: '⥳',\n rarrsim: '⥴',\n harrcir: '⥈',\n Uarrocir: '⥉',\n lurdshar: '⥊',\n ldrdhar: '⥧',\n ldrushar: '⥋',\n rdldhar: '⥩',\n lrhard: '⥭',\n rlhar: '⇌',\n uharr: '↾',\n uharl: '↿',\n dharr: '⇂',\n dharl: '⇃',\n Uarr: '↟',\n Darr: '↡',\n zigrarr: '⇝',\n nwArr: '⇖',\n neArr: '⇗',\n seArr: '⇘',\n swArr: '⇙',\n nharr: '↮',\n nhArr: '⇎',\n nlarr: '↚',\n nlArr: '⇍',\n nrarr: '↛',\n nrArr: '⇏',\n larrb: '⇤',\n LeftArrowBar: '⇤',\n rarrb: '⇥',\n RightArrowBar: '⇥',\n};\n\n/**\n * Geometric Shapes\n * @type {Record}\n */\nexport const SHAPES = {\n square: '□',\n Square: '□',\n squ: '□',\n squf: '▪',\n squarf: '▪',\n blacksquar: '▪',\n blacksquare: '▪',\n FilledVerySmallSquare: '▪',\n blk34: '▓',\n blk12: '▒',\n blk14: '░',\n block: '█',\n srect: '▭',\n rect: '▭',\n sdot: '⋅',\n sdotb: '⊡',\n dotsquare: '⊡',\n triangle: '▵',\n tri: '▵',\n trine: '▵',\n utri: '▵',\n triangledown: '▿',\n dtri: '▿',\n tridown: '▿',\n triangleleft: '◃',\n ltri: '◃',\n triangleright: '▹',\n rtri: '▹',\n blacktriangle: '▴',\n utrif: '▴',\n blacktriangledown: '▾',\n dtrif: '▾',\n blacktriangleleft: '◂',\n ltrif: '◂',\n blacktriangleright: '▸',\n rtrif: '▸',\n loz: '◊',\n lozenge: '◊',\n blacklozenge: '⧫',\n lozf: '⧫',\n bigcirc: '◯',\n xcirc: '◯',\n circ: 'ˆ',\n Circle: '○',\n cir: '○',\n o: '○',\n bullet: '•',\n bull: '•',\n hellip: '…',\n mldr: '…',\n nldr: '‥',\n boxh: '─',\n HorizontalLine: '─',\n boxv: '│',\n boxdr: '┌',\n boxdl: '┐',\n boxur: '└',\n boxul: '┘',\n boxvr: '├',\n boxvl: '┤',\n boxhd: '┬',\n boxhu: '┴',\n boxvh: '┼',\n boxH: '═',\n boxV: '║',\n boxdR: '╒',\n boxDr: '╓',\n boxDR: '╔',\n boxDl: '╕',\n boxdL: '╖',\n boxDL: '╗',\n boxuR: '╘',\n boxUr: '╙',\n boxUR: '╚',\n boxUl: '╜',\n boxuL: '╛',\n boxUL: '╝',\n boxvR: '╞',\n boxVr: '╟',\n boxVR: '╠',\n boxVl: '╢',\n boxvL: '╡',\n boxVL: '╣',\n boxHd: '╤',\n boxhD: '╥',\n boxHD: '╦',\n boxHu: '╧',\n boxhU: '╨',\n boxHU: '╩',\n boxvH: '╪',\n boxVh: '╫',\n boxVH: '╬',\n};\n\n/**\n * Punctuation & Diacritics\n * @type {Record}\n */\nexport const PUNCTUATION = {\n excl: '!',\n iexcl: '¡',\n brvbar: '¦',\n sect: '§',\n uml: '¨',\n copy: '©',\n ordf: 'ª',\n laquo: '«',\n not: '¬',\n shy: '\\u00ad',\n reg: '®',\n macr: '¯',\n deg: '°',\n plusmn: '±',\n sup2: '²',\n sup3: '³',\n acute: '´',\n micro: 'µ',\n para: '¶',\n middot: '·',\n cedil: '¸',\n sup1: '¹',\n ordm: 'º',\n raquo: '»',\n frac14: '¼',\n frac12: '½',\n frac34: '¾',\n iquest: '¿',\n nbsp: '\\u00a0',\n comma: ',',\n period: '.',\n colon: ':',\n semi: ';',\n vert: '|',\n Verbar: '‖',\n verbar: '|',\n dblac: '˝',\n circ: 'ˆ',\n caron: 'ˇ',\n breve: '˘',\n dot: '˙',\n ring: '˚',\n ogon: '˛',\n tilde: '˜',\n DiacriticalGrave: '`',\n DiacriticalAcute: '´',\n DiacriticalTilde: '˜',\n DiacriticalDot: '˙',\n DiacriticalDoubleAcute: '˝',\n grave: '`',\n acute: '´',\n};\n\n/**\n * Currency Symbols\n * @type {Record}\n */\nexport const CURRENCY = {\n cent: '¢',\n pound: '£',\n curren: '¤',\n yen: '¥',\n euro: '€',\n dollar: '$',\n euro: '€',\n fnof: 'ƒ',\n inr: '₹',\n af: '؋',\n birr: 'ብር',\n peso: '₱',\n rub: '₽',\n won: '₩',\n yuan: '¥',\n cedil: '¸',\n};\n\n/**\n * Fractions\n * @type {Record}\n */\nexport const FRACTIONS = {\n frac12: '½',\n half: '½',\n frac13: '⅓',\n frac14: '¼',\n frac15: '⅕',\n frac16: '⅙',\n frac18: '⅛',\n frac23: '⅔',\n frac25: '⅖',\n frac34: '¾',\n frac35: '⅗',\n frac38: '⅜',\n frac45: '⅘',\n frac56: '⅚',\n frac58: '⅝',\n frac78: '⅞',\n frasl: '⁄',\n};\n\n/**\n * Miscellaneous Symbols\n * @type {Record}\n */\nexport const MISC_SYMBOLS = {\n trade: '™',\n TRADE: '™',\n telrec: '⌕',\n target: '⌖',\n ulcorn: '⌜',\n ulcorner: '⌜',\n urcorn: '⌝',\n urcorner: '⌝',\n dlcorn: '⌞',\n llcorner: '⌞',\n drcorn: '⌟',\n lrcorner: '⌟',\n intercal: '⊺',\n intcal: '⊺',\n oplus: '⊕',\n CirclePlus: '⊕',\n ominus: '⊖',\n CircleMinus: '⊖',\n otimes: '⊗',\n CircleTimes: '⊗',\n osol: '⊘',\n odot: '⊙',\n CircleDot: '⊙',\n oast: '⊛',\n circledast: '⊛',\n odash: '⊝',\n circleddash: '⊝',\n ocirc: '⊚',\n circledcirc: '⊚',\n boxplus: '⊞',\n plusb: '⊞',\n boxminus: '⊟',\n minusb: '⊟',\n boxtimes: '⊠',\n timesb: '⊠',\n boxdot: '⊡',\n sdotb: '⊡',\n veebar: '⊻',\n vee: '∨',\n barvee: '⊽',\n and: '∧',\n wedge: '∧',\n Cap: '⋒',\n Cup: '⋓',\n Fork: '⋔',\n pitchfork: '⋔',\n epar: '⋕',\n ltlarr: '⥶',\n nvap: '≍⃒',\n nvsim: '∼⃒',\n nvge: '≥⃒',\n nvle: '≤⃒',\n nvlt: '<⃒',\n nvgt: '>⃒',\n nvltrie: '⊴⃒',\n nvrtrie: '⊵⃒',\n Vdash: '⊩',\n dashv: '⊣',\n vDash: '⊨',\n Vdash: '⊩',\n Vvdash: '⊪',\n nvdash: '⊬',\n nvDash: '⊭',\n nVdash: '⊮',\n nVDash: '⊯',\n};\n\n/**\n * All entities combined (if you need everything)\n * @type {Record}\n */\nexport const ALL_ENTITIES = {\n ...BASIC_LATIN,\n ...LATIN_ACCENTS,\n ...LATIN_EXTENDED,\n ...GREEK,\n ...CYRILLIC,\n ...MATH,\n ...MATH_ADVANCED,\n ...ARROWS,\n ...SHAPES,\n ...PUNCTUATION,\n ...CURRENCY,\n ...FRACTIONS,\n ...MISC_SYMBOLS,\n};\n\nexport const XML = {\n amp: \"&\",\n apos: \"'\",\n gt: \">\",\n lt: \"<\",\n quot: \"\\\"\"\n}\nexport const COMMON_HTML = {\n nbsp: '\\u00a0',\n copy: '\\u00a9',\n reg: '\\u00ae',\n trade: '\\u2122',\n mdash: '\\u2014',\n ndash: '\\u2013',\n hellip: '\\u2026',\n laquo: '\\u00ab',\n raquo: '\\u00bb',\n lsquo: '\\u2018',\n rsquo: '\\u2019',\n ldquo: '\\u201c',\n rdquo: '\\u201d',\n bull: '\\u2022',\n para: '\\u00b6',\n sect: '\\u00a7',\n deg: '\\u00b0',\n frac12: '\\u00bd',\n frac14: '\\u00bc',\n frac34: '\\u00be',\n}\n// ---------------------------------------------------------------------------\n// Note: NUMERIC_ENTITIES (&#NNN; / &#xHH;) are handled by the scanner directly\n// via String.fromCodePoint() without any map lookup.\n// ---------------------------------------------------------------------------","// ---------------------------------------------------------------------------\n// Built-in named entity map (name → replacement string)\n// No regex, no {regex,val} objects — just flat key/value pairs.\n// ---------------------------------------------------------------------------\n\nimport { XML as DEFAULT_XML_ENTITIES } from \"./entities.js\"\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nconst SPECIAL_CHARS = new Set('!?\\\\\\\\/[]$%{}^&*()<>|+');\n\n/**\n * Validate that an entity name contains no dangerous characters.\n * @param {string} name\n * @returns {string} the name, unchanged\n * @throws {Error} on invalid characters\n */\nfunction validateEntityName(name) {\n if (name[0] === '#') {\n throw new Error(`[EntityReplacer] Invalid character '#' in entity name: \"${name}\"`);\n }\n for (const ch of name) {\n if (SPECIAL_CHARS.has(ch)) {\n throw new Error(`[EntityReplacer] Invalid character '${ch}' in entity name: \"${name}\"`);\n }\n }\n return name;\n}\n\n/**\n * Merge one or more entity maps into a flat name→string map.\n * Accepts either:\n * - plain string values: { amp: '&' }\n * - legacy {regex,val} / {regx,val}: { lt: { regex: /.../, val: '<' } }\n *\n * Values containing '&' are skipped (recursive expansion risk).\n *\n * @param {...object} maps\n * @returns {Record}\n */\nfunction mergeEntityMaps(...maps) {\n const out = Object.create(null);\n for (const map of maps) {\n if (!map) continue;\n for (const key of Object.keys(map)) {\n const raw = map[key];\n if (typeof raw === 'string') {\n out[key] = raw;\n } else if (raw && typeof raw === 'object' && raw.val !== undefined) {\n // Legacy {regex,val} or {regx,val} — extract the string val only\n const val = raw.val;\n if (typeof val === 'string') {\n out[key] = val;\n }\n // function vals are not supported in the scanner — skip\n }\n }\n }\n return out;\n}\n\n// ---------------------------------------------------------------------------\n// applyLimitsTo helpers\n// ---------------------------------------------------------------------------\n\nconst LIMIT_TIER_EXTERNAL = 'external'; // input/runtime + persistent external maps\nconst LIMIT_TIER_BASE = 'base'; // DEFAULT_XML_ENTITIES + namedEntities (system) maps\nconst LIMIT_TIER_ALL = 'all'; // every entity regardless of tier\n\n/**\n * Resolve `applyLimitsTo` option into a normalised Set of tier strings.\n * Accepted values: 'external' | 'base' | 'all' | string[]\n * Default: 'external' (only untrusted injected entities are counted).\n * @param {string|string[]|undefined} raw\n * @returns {Set}\n */\nfunction parseLimitTiers(raw) {\n if (!raw || raw === LIMIT_TIER_EXTERNAL) return new Set([LIMIT_TIER_EXTERNAL]);\n if (raw === LIMIT_TIER_ALL) return new Set([LIMIT_TIER_ALL]);\n if (raw === LIMIT_TIER_BASE) return new Set([LIMIT_TIER_BASE]);\n if (Array.isArray(raw)) return new Set(raw);\n return new Set([LIMIT_TIER_EXTERNAL]); // safe default for unrecognised values\n}\n\n// ---------------------------------------------------------------------------\n// NCR (Numeric Character Reference) classification\n// ---------------------------------------------------------------------------\n\n// Severity order — higher number = stricter action.\n// Used to enforce minimum action levels for specific codepoint ranges.\nconst NCR_LEVEL = Object.freeze({ allow: 0, leave: 1, remove: 2, throw: 3 });\n\n// XML 1.0 §2.2: allowed chars are #x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF]\n// Restricted C0: U+0001–U+001F excluding U+0009, U+000A, U+000D\nconst XML10_ALLOWED_C0 = new Set([0x09, 0x0A, 0x0D]);\n\n/**\n * Parse the `ncr` constructor option into flat, hot-path-friendly fields.\n * @param {object|undefined} ncr\n * @returns {{ xmlVersion: number, onLevel: number, nullLevel: number }}\n */\nfunction parseNCRConfig(ncr) {\n if (!ncr) {\n return { xmlVersion: 1.0, onLevel: NCR_LEVEL.allow, nullLevel: NCR_LEVEL.remove };\n }\n const xmlVersion = ncr.xmlVersion === 1.1 ? 1.1 : 1.0;\n const onLevel = NCR_LEVEL[ncr.onNCR] ?? NCR_LEVEL.allow;\n const nullLevel = NCR_LEVEL[ncr.nullNCR] ?? NCR_LEVEL.remove;\n // 'allow' is not meaningful for null — clamp to at least 'remove'\n const clampedNull = Math.max(nullLevel, NCR_LEVEL.remove);\n return { xmlVersion, onLevel, nullLevel: clampedNull };\n}\n\n// ---------------------------------------------------------------------------\n// EntityReplacer\n// ---------------------------------------------------------------------------\n\n/**\n * Single-pass, zero-regex entity replacer for XML/HTML content.\n *\n * Algorithm: scan the string once for '&', read to ';', resolve via map\n * or direct codepoint conversion, build output chunks, join once at the end.\n *\n * Entity lookup priority (highest → lowest):\n * 1. input / runtime (DOCTYPE entities for current document)\n * 2. persistent external (survive across documents)\n * 3. base named map (DEFAULT_XML_ENTITIES + user-supplied namedEntities)\n *\n * Both input and external resolve as the 'external' tier for limit purposes.\n * Base map entities resolve as the 'base' tier.\n *\n * Numeric / hex references (&#NNN; / &#xHH;) are resolved directly via\n * String.fromCodePoint() — no map needed. They count as 'base' tier.\n *\n * @example\n * const replacer = new EntityReplacer({ namedEntities: COMMON_HTML });\n * replacer.setExternalEntities({ brand: 'Acme' });\n *\n * const instance = replacer.reset();\n * instance.addInputEntities({ version: '1.0' });\n * instance.encode('&brand; v&version; <'); // 'Acme v1.0 <'\n */\nexport default class EntityDecoder {\n /**\n * @param {object} [options]\n * @param {object|null} [options.namedEntities] — extra named entities merged into base map\n * @param {object} [options.limit] — security limits\n * @param {number} [options.limit.maxTotalExpansions=0] — 0 = unlimited\n * @param {number} [options.limit.maxExpandedLength=0] — 0 = unlimited\n * @param {'external'|'base'|'all'|string[]} [options.limit.applyLimitsTo='external']\n * Which entity tiers count against the security limits:\n * - 'external' (default) — only input/runtime + persistent external entities\n * - 'base' — only DEFAULT_XML_ENTITIES + namedEntities\n * - 'all' — every entity regardless of tier\n * - string[] — explicit combination, e.g. ['external', 'base']\n * @param {((resolved: string, original: string) => string)|null} [options.postCheck=null]\n * @param {string[]} [options.remove=[]] — entity names (e.g. ['nbsp', '#13']) to delete (replace with empty string)\n * @param {string[]} [options.leave=[]] — entity names to keep as literal (unchanged in output)\n * @param {object} [options.ncr] — Numeric Character Reference controls\n * @param {1.0|1.1} [options.ncr.xmlVersion=1.0]\n * XML version governing which codepoint ranges are restricted:\n * - 1.0 — C0 controls U+0001–U+001F (except U+0009/000A/000D) are prohibited\n * - 1.1 — C0 controls are allowed when written as NCRs; C1 (U+007F–U+009F) decoded as-is\n * @param {'allow'|'leave'|'remove'|'throw'} [options.ncr.onNCR='allow']\n * Base action for numeric references. Severity order: allow < leave < remove < throw.\n * For codepoint ranges that carry a minimum level (surrogates → remove, XML 1.0 C0 → remove),\n * the effective action is max(onNCR, rangeMinimum).\n * @param {'remove'|'throw'} [options.ncr.nullNCR='remove']\n * Action for U+0000 (null). 'allow' and 'leave' are clamped to 'remove' since null is never safe.\n */\n constructor(options = {}) {\n this._limit = options.limit || {};\n this._maxTotalExpansions = this._limit.maxTotalExpansions || 0;\n this._maxExpandedLength = this._limit.maxExpandedLength || 0;\n this._postCheck = typeof options.postCheck === 'function' ? options.postCheck : r => r;\n this._limitTiers = parseLimitTiers(this._limit.applyLimitsTo ?? LIMIT_TIER_EXTERNAL);\n this._numericAllowed = options.numericAllowed ?? true;\n // Base map: DEFAULT_XML_ENTITIES + user-supplied extras. Immutable after construction.\n this._baseMap = mergeEntityMaps(DEFAULT_XML_ENTITIES, options.namedEntities || null);\n\n // Persistent external entities — survive across documents.\n // Stored as a separate map so reset() never touches them.\n /** @type {Record} */\n this._externalMap = Object.create(null);\n\n // Input / runtime entities — current document only, wiped on reset().\n /** @type {Record} */\n this._inputMap = Object.create(null);\n\n // Per-document counters\n this._totalExpansions = 0;\n this._expandedLength = 0;\n\n // --- New: remove / leave sets ---\n /** @type {Set} */\n this._removeSet = new Set(options.remove && Array.isArray(options.remove) ? options.remove : []);\n /** @type {Set} */\n this._leaveSet = new Set(options.leave && Array.isArray(options.leave) ? options.leave : []);\n\n // --- NCR config (parsed into flat fields for hot-path speed) ---\n const ncrCfg = parseNCRConfig(options.ncr);\n this._ncrXmlVersion = ncrCfg.xmlVersion;\n this._ncrOnLevel = ncrCfg.onLevel;\n this._ncrNullLevel = ncrCfg.nullLevel;\n }\n\n // -------------------------------------------------------------------------\n // Persistent external entity registration\n // -------------------------------------------------------------------------\n\n /**\n * Replace the full set of persistent external entities.\n * All keys are validated — throws on invalid characters.\n * @param {Record} map\n */\n setExternalEntities(map) {\n if (map) {\n for (const key of Object.keys(map)) {\n validateEntityName(key);\n }\n }\n this._externalMap = mergeEntityMaps(map);\n }\n\n /**\n * Add a single persistent external entity.\n * @param {string} key\n * @param {string} value\n */\n addExternalEntity(key, value) {\n validateEntityName(key);\n if (typeof value === 'string' && value.indexOf('&') === -1) {\n this._externalMap[key] = value;\n }\n }\n\n // -------------------------------------------------------------------------\n // Input / runtime entity registration (per document)\n // -------------------------------------------------------------------------\n\n /**\n * Inject DOCTYPE entities for the current document.\n * Also resets per-document expansion counters.\n * @param {Record} map\n */\n addInputEntities(map) {\n this._totalExpansions = 0;\n this._expandedLength = 0;\n this._inputMap = mergeEntityMaps(map);\n }\n\n // -------------------------------------------------------------------------\n // Per-document reset\n // -------------------------------------------------------------------------\n\n /**\n * Wipe input/runtime entities and reset counters.\n * Call this before processing each new document.\n * @returns {this}\n */\n reset() {\n this._inputMap = Object.create(null);\n this._totalExpansions = 0;\n this._expandedLength = 0;\n return this;\n }\n\n // -------------------------------------------------------------------------\n // XML version (can be set after construction, e.g. once parser reads )\n // -------------------------------------------------------------------------\n\n /**\n * Update the XML version used for NCR classification.\n * Call this as soon as the document's `` declaration is parsed.\n * @param {1.0|1.1|number} version\n */\n setXmlVersion(version) {\n this._ncrXmlVersion = version === 1.1 ? 1.1 : 1.0;\n }\n\n // -------------------------------------------------------------------------\n // Primary API\n // -------------------------------------------------------------------------\n\n /**\n * Replace all entity references in `str` in a single pass.\n *\n * @param {string} str\n * @returns {string}\n */\n decode(str) {\n if (typeof str !== 'string' || str.length === 0) return str;\n //TODO: check if needed\n //if (str.indexOf('&') === -1) return str; // fast path — no entities at all\n\n const original = str;\n const chunks = [];\n const len = str.length;\n let last = 0; // start of next unprocessed literal chunk\n let i = 0;\n\n const limitExpansions = this._maxTotalExpansions > 0;\n const limitLength = this._maxExpandedLength > 0;\n const checkLimits = limitExpansions || limitLength;\n\n while (i < len) {\n // Scan forward to next '&'\n if (str.charCodeAt(i) !== 38 /* '&' */) { i++; continue; }\n\n // --- Found '&' at position i ---\n\n // Scan forward to ';'\n let j = i + 1;\n while (j < len && str.charCodeAt(j) !== 59 /* ';' */ && (j - i) <= 32) j++;\n\n if (j >= len || str.charCodeAt(j) !== 59) {\n // No closing ';' within window — treat '&' as literal\n i++;\n continue;\n }\n\n // Raw token between '&' and ';' (exclusive)\n const token = str.slice(i + 1, j);\n if (token.length === 0) { i++; continue; }\n\n let replacement;\n let tier; // which limit tier this entity belongs to\n\n if (this._removeSet.has(token)) {\n // Remove entity: replace with empty string\n replacement = '';\n // If entity was unknown (replacement undefined), we still need a tier for limits.\n // Treat as external tier because it's user-directed removal of an unknown reference.\n if (tier === undefined) {\n tier = LIMIT_TIER_EXTERNAL;\n }\n } else if (this._leaveSet.has(token)) {\n // Do not replace — keep original &token; as literal\n i++;\n continue;\n } else if (token.charCodeAt(0) === 35 /* '#' */) {\n // ---- Numeric / NCR reference ----\n // NCR classification always runs first — prohibited codepoints must be\n // caught regardless of numericAllowed.\n const ncrResult = this._resolveNCR(token);\n if (ncrResult === undefined) {\n // 'leave' action — keep original &token; as-is\n i++;\n continue;\n }\n replacement = ncrResult; // '' for remove, char string for allow\n tier = LIMIT_TIER_BASE;\n } else {\n // ---- Named reference ----\n const resolved = this._resolveName(token);\n replacement = resolved?.value;\n tier = resolved?.tier;\n }\n\n if (replacement === undefined) {\n // Unknown entity — leave as-is, advance past '&' only\n i++;\n continue;\n }\n\n // Flush literal chunk before this entity\n if (i > last) chunks.push(str.slice(last, i));\n chunks.push(replacement);\n last = j + 1; // skip past ';'\n i = last;\n\n // Apply expansion limits only if this tier is being tracked\n if (checkLimits && this._tierCounts(tier)) {\n if (limitExpansions) {\n this._totalExpansions++;\n if (this._totalExpansions > this._maxTotalExpansions) {\n throw new Error(\n `[EntityReplacer] Entity expansion count limit exceeded: ` +\n `${this._totalExpansions} > ${this._maxTotalExpansions}`\n );\n }\n }\n if (limitLength) {\n // delta: replacement.length minus the raw &token; length (token.length + 2 for '&' and ';')\n const delta = replacement.length - (token.length + 2);\n if (delta > 0) {\n this._expandedLength += delta;\n if (this._expandedLength > this._maxExpandedLength) {\n throw new Error(\n `[EntityReplacer] Expanded content length limit exceeded: ` +\n `${this._expandedLength} > ${this._maxExpandedLength}`\n );\n }\n }\n }\n }\n }\n\n // Flush trailing literal\n if (last < len) chunks.push(str.slice(last));\n\n // If nothing was replaced, chunks is empty — return original\n const result = chunks.length === 0 ? str : chunks.join('');\n\n return this._postCheck(result, original);\n }\n\n // -------------------------------------------------------------------------\n // Private: limit tier check\n // -------------------------------------------------------------------------\n\n /**\n * Returns true if a resolved entity of the given tier should count\n * against the expansion/length limits.\n * @param {string} tier — LIMIT_TIER_EXTERNAL | LIMIT_TIER_BASE\n * @returns {boolean}\n */\n _tierCounts(tier) {\n if (this._limitTiers.has(LIMIT_TIER_ALL)) return true;\n return this._limitTiers.has(tier);\n }\n\n // -------------------------------------------------------------------------\n // Private: entity resolution\n // -------------------------------------------------------------------------\n\n /**\n * Resolve a named entity token (without & and ;).\n * Priority: inputMap > externalMap > baseMap\n * Returns the resolved value tagged with its limit tier.\n *\n * @param {string} name\n * @returns {{ value: string, tier: string }|undefined}\n */\n _resolveName(name) {\n // input and external both count as 'external' tier for limit purposes —\n // they are injected at runtime and are the untrusted surface.\n if (name in this._inputMap) return { value: this._inputMap[name], tier: LIMIT_TIER_EXTERNAL };\n if (name in this._externalMap) return { value: this._externalMap[name], tier: LIMIT_TIER_EXTERNAL };\n if (name in this._baseMap) return { value: this._baseMap[name], tier: LIMIT_TIER_BASE };\n return undefined;\n }\n\n /**\n * Classify a codepoint and return the minimum action level that must be applied.\n * Returns -1 when no minimum is imposed (normal allow path).\n *\n * Ranges checked (in priority order):\n * 1. U+0000 — null, governed by nullNCR (always ≥ remove)\n * 2. U+D800–U+DFFF — surrogates, always prohibited (min: remove)\n * 3. U+0001–U+001F \\ {0x09,0x0A,0x0D} — XML 1.0 restricted C0 (min: remove)\n * (skipped in XML 1.1 — C0 controls are allowed when written as NCRs)\n *\n * @param {number} cp — codepoint\n * @returns {number} — minimum NCR_LEVEL value, or -1 for no restriction\n */\n _classifyNCR(cp) {\n // 1. Null\n if (cp === 0) return this._ncrNullLevel;\n\n // 2. Surrogates — always prohibited, minimum 'remove'\n if (cp >= 0xD800 && cp <= 0xDFFF) return NCR_LEVEL.remove;\n\n // 3. XML 1.0 restricted C0 controls\n if (this._ncrXmlVersion === 1.0) {\n if (cp >= 0x01 && cp <= 0x1F && !XML10_ALLOWED_C0.has(cp)) return NCR_LEVEL.remove;\n }\n\n return -1; // no restriction\n }\n\n /**\n * Execute a resolved NCR action.\n *\n * @param {number} action — NCR_LEVEL value\n * @param {string} token — raw token (e.g. '#38') for error messages\n * @param {number} cp — codepoint, used only for error messages\n * @returns {string|undefined}\n * - decoded character string → 'allow'\n * - '' → 'remove'\n * - undefined → 'leave' (caller must skip past '&' only)\n * - throws Error → 'throw'\n */\n _applyNCRAction(action, token, cp) {\n switch (action) {\n case NCR_LEVEL.allow: return String.fromCodePoint(cp);\n case NCR_LEVEL.remove: return '';\n case NCR_LEVEL.leave: return undefined; // signal: keep literal\n case NCR_LEVEL.throw:\n throw new Error(\n `[EntityDecoder] Prohibited numeric character reference ` +\n `&${token}; (U+${cp.toString(16).toUpperCase().padStart(4, '0')})`\n );\n default: return String.fromCodePoint(cp);\n }\n }\n\n /**\n * Full NCR resolution pipeline for a numeric token.\n *\n * Steps:\n * 1. Parse the codepoint (decimal or hex).\n * 2. Validate the raw codepoint range (NaN, <0, >0x10FFFF).\n * 3. If numericAllowed is false and no minimum restriction applies → leave as-is.\n * 4. Classify the codepoint to find the minimum required action level.\n * 5. Resolve effective action = max(onNCR, minimum).\n * 6. Apply and return.\n *\n * @param {string} token — e.g. '#38', '#x26', '#X26'\n * @returns {string|undefined}\n * - string (incl. '') — replacement ('' = remove)\n * - undefined — leave original &token; as-is\n */\n _resolveNCR(token) {\n // Step 1: parse codepoint\n const second = token.charCodeAt(1);\n let cp;\n if (second === 120 /* x */ || second === 88 /* X */) {\n cp = parseInt(token.slice(2), 16);\n } else {\n cp = parseInt(token.slice(1), 10);\n }\n\n // Step 2: out-of-range → leave as-is unconditionally\n if (Number.isNaN(cp) || cp < 0 || cp > 0x10FFFF) return undefined;\n\n // Step 3: classify to get minimum action level\n const minimum = this._classifyNCR(cp);\n\n // Step 4: if numericAllowed is false and no hard minimum → leave\n if (!this._numericAllowed && minimum < NCR_LEVEL.remove) return undefined;\n\n // Step 5: effective action = max(configured onNCR, range minimum)\n const effective = minimum === -1\n ? this._ncrOnLevel\n : Math.max(this._ncrOnLevel, minimum);\n\n // Step 6: apply\n return this._applyNCRAction(effective, token, cp);\n }\n}","'use strict';\n///@ts-check\n\nimport { getAllMatches, isExist, DANGEROUS_PROPERTY_NAMES, criticalProperties } from '../util.js';\nimport xmlNode from './xmlNode.js';\nimport DocTypeReader from './DocTypeReader.js';\nimport toNumber from \"strnum\";\nimport getIgnoreAttributesFn from \"../ignoreAttributes.js\";\nimport { Expression, Matcher } from 'path-expression-matcher';\nimport { ExpressionSet } from 'path-expression-matcher';\nimport { EntityDecoder, XML, CURRENCY, COMMON_HTML } from '@nodable/entities';\n\n// const regx =\n// '<((!\\\\[CDATA\\\\[([\\\\s\\\\S]*?)(]]>))|((NAME:)?(NAME))([^>]*)>|((\\\\/)(NAME)\\\\s*>))([^<]*)'\n// .replace(/NAME/g, util.nameRegexp);\n\n//const tagsRegx = new RegExp(\"<(\\\\/?[\\\\w:\\\\-\\._]+)([^>]*)>(\\\\s*\"+cdataRegx+\")*([^<]+)?\",\"g\");\n//const tagsRegx = new RegExp(\"<(\\\\/?)((\\\\w*:)?([\\\\w:\\\\-\\._]+))([^>]*)>([^<]*)(\"+cdataRegx+\"([^<]*))*([^<]+)?\",\"g\");\n\n// Helper functions for attribute and namespace handling\n\n/**\n * Extract raw attributes (without prefix) from prefixed attribute map\n * @param {object} prefixedAttrs - Attributes with prefix from buildAttributesMap\n * @param {object} options - Parser options containing attributeNamePrefix\n * @returns {object} Raw attributes for matcher\n */\nfunction extractRawAttributes(prefixedAttrs, options) {\n if (!prefixedAttrs) return {};\n\n // Handle attributesGroupName option\n const attrs = options.attributesGroupName\n ? prefixedAttrs[options.attributesGroupName]\n : prefixedAttrs;\n\n if (!attrs) return {};\n\n const rawAttrs = {};\n for (const key in attrs) {\n // Remove the attribute prefix to get raw name\n if (key.startsWith(options.attributeNamePrefix)) {\n const rawName = key.substring(options.attributeNamePrefix.length);\n rawAttrs[rawName] = attrs[key];\n } else {\n // Attribute without prefix (shouldn't normally happen, but be safe)\n rawAttrs[key] = attrs[key];\n }\n }\n return rawAttrs;\n}\n\n/**\n * Extract namespace from raw tag name\n * @param {string} rawTagName - Tag name possibly with namespace (e.g., \"soap:Envelope\")\n * @returns {string|undefined} Namespace or undefined\n */\nfunction extractNamespace(rawTagName) {\n if (!rawTagName || typeof rawTagName !== 'string') return undefined;\n\n const colonIndex = rawTagName.indexOf(':');\n if (colonIndex !== -1 && colonIndex > 0) {\n const ns = rawTagName.substring(0, colonIndex);\n // Don't treat xmlns as a namespace\n if (ns !== 'xmlns') {\n return ns;\n }\n }\n return undefined;\n}\n\nexport default class OrderedObjParser {\n constructor(options) {\n this.options = options;\n this.currentNode = null;\n this.tagsNodeStack = [];\n this.parseXml = parseXml;\n this.parseTextData = parseTextData;\n this.resolveNameSpace = resolveNameSpace;\n this.buildAttributesMap = buildAttributesMap;\n this.isItStopNode = isItStopNode;\n this.replaceEntitiesValue = replaceEntitiesValue;\n this.readStopNodeData = readStopNodeData;\n this.saveTextToParentTag = saveTextToParentTag;\n this.addChild = addChild;\n this.ignoreAttributesFn = getIgnoreAttributesFn(this.options.ignoreAttributes)\n this.entityExpansionCount = 0;\n this.currentExpandedLength = 0;\n let namedEntities = { ...XML };\n if (this.options.entityDecoder) {\n this.entityDecoder = this.options.entityDecoder\n } else {\n if (typeof this.options.htmlEntities === \"object\") namedEntities = this.options.htmlEntities;\n else if (this.options.htmlEntities === true) namedEntities = { ...COMMON_HTML, ...CURRENCY };\n this.entityDecoder = new EntityDecoder({\n namedEntities: namedEntities,\n numericAllowed: this.options.htmlEntities,\n limit: {\n maxTotalExpansions: this.options.processEntities.maxTotalExpansions,\n maxExpandedLength: this.options.processEntities.maxExpandedLength,\n applyLimitsTo: this.options.processEntities.appliesTo,\n }\n //postCheck: resolved => resolved\n });\n }\n\n // Initialize path matcher for path-expression-matcher\n this.matcher = new Matcher();\n\n // Live read-only proxy of matcher — PEM creates and caches this internally.\n // All user callbacks receive this instead of the mutable matcher.\n this.readonlyMatcher = this.matcher.readOnly();\n\n // Flag to track if current node is a stop node (optimization)\n this.isCurrentNodeStopNode = false;\n\n // Pre-compile stopNodes expressions\n this.stopNodeExpressionsSet = new ExpressionSet();\n const stopNodesOpts = this.options.stopNodes;\n if (stopNodesOpts && stopNodesOpts.length > 0) {\n for (let i = 0; i < stopNodesOpts.length; i++) {\n const stopNodeExp = stopNodesOpts[i];\n if (typeof stopNodeExp === 'string') {\n // Convert string to Expression object\n this.stopNodeExpressionsSet.add(new Expression(stopNodeExp));\n } else if (stopNodeExp instanceof Expression) {\n // Already an Expression object\n this.stopNodeExpressionsSet.add(stopNodeExp);\n }\n }\n this.stopNodeExpressionsSet.seal();\n }\n }\n\n}\n\n\n/**\n * @param {string} val\n * @param {string} tagName\n * @param {string|Matcher} jPath - jPath string or Matcher instance based on options.jPath\n * @param {boolean} dontTrim\n * @param {boolean} hasAttributes\n * @param {boolean} isLeafNode\n * @param {boolean} escapeEntities\n */\nfunction parseTextData(val, tagName, jPath, dontTrim, hasAttributes, isLeafNode, escapeEntities) {\n const options = this.options;\n if (val !== undefined) {\n if (options.trimValues && !dontTrim) {\n val = val.trim();\n }\n if (val.length > 0) {\n if (!escapeEntities) val = this.replaceEntitiesValue(val, tagName, jPath);\n\n // Pass jPath string or matcher based on options.jPath setting\n const jPathOrMatcher = options.jPath ? jPath.toString() : jPath;\n const newval = options.tagValueProcessor(tagName, val, jPathOrMatcher, hasAttributes, isLeafNode);\n if (newval === null || newval === undefined) {\n //don't parse\n return val;\n } else if (typeof newval !== typeof val || newval !== val) {\n //overwrite\n return newval;\n } else if (options.trimValues) {\n return parseValue(val, options.parseTagValue, options.numberParseOptions);\n } else {\n const trimmedVal = val.trim();\n if (trimmedVal === val) {\n return parseValue(val, options.parseTagValue, options.numberParseOptions);\n } else {\n return val;\n }\n }\n }\n }\n}\n\nfunction resolveNameSpace(tagname) {\n if (this.options.removeNSPrefix) {\n const tags = tagname.split(':');\n const prefix = tagname.charAt(0) === '/' ? '/' : '';\n if (tags[0] === 'xmlns') {\n return '';\n }\n if (tags.length === 2) {\n tagname = prefix + tags[1];\n }\n }\n return tagname;\n}\n\n//TODO: change regex to capture NS\n//const attrsRegx = new RegExp(\"([\\\\w\\\\-\\\\.\\\\:]+)\\\\s*=\\\\s*(['\\\"])((.|\\n)*?)\\\\2\",\"gm\");\nconst attrsRegx = new RegExp('([^\\\\s=]+)\\\\s*(=\\\\s*([\\'\"])([\\\\s\\\\S]*?)\\\\3)?', 'gm');\n\nfunction buildAttributesMap(attrStr, jPath, tagName) {\n const options = this.options;\n if (options.ignoreAttributes !== true && typeof attrStr === 'string') {\n // attrStr = attrStr.replace(/\\r?\\n/g, ' ');\n //attrStr = attrStr || attrStr.trim();\n\n const matches = getAllMatches(attrStr, attrsRegx);\n const len = matches.length; //don't make it inline\n const attrs = {};\n\n // Pre-process values once: trim + entity replacement\n // Reused in both matcher update and second pass\n const processedVals = new Array(len);\n let hasRawAttrs = false;\n const rawAttrsForMatcher = {};\n\n for (let i = 0; i < len; i++) {\n const attrName = this.resolveNameSpace(matches[i][1]);\n const oldVal = matches[i][4];\n\n if (attrName.length && oldVal !== undefined) {\n let val = oldVal;\n if (options.trimValues) val = val.trim();\n val = this.replaceEntitiesValue(val, tagName, this.readonlyMatcher);\n processedVals[i] = val;\n\n rawAttrsForMatcher[attrName] = val;\n hasRawAttrs = true;\n }\n }\n\n // Update matcher ONCE before second pass, if applicable\n if (hasRawAttrs && typeof jPath === 'object' && jPath.updateCurrent) {\n jPath.updateCurrent(rawAttrsForMatcher);\n }\n\n // Hoist toString() once — path doesn't change during attribute processing\n const jPathStr = options.jPath ? jPath.toString() : this.readonlyMatcher;\n\n // Second pass: apply processors, build final attrs\n let hasAttrs = false;\n for (let i = 0; i < len; i++) {\n const attrName = this.resolveNameSpace(matches[i][1]);\n\n if (this.ignoreAttributesFn(attrName, jPathStr)) continue;\n\n let aName = options.attributeNamePrefix + attrName;\n\n if (attrName.length) {\n if (options.transformAttributeName) {\n aName = options.transformAttributeName(aName);\n }\n aName = sanitizeName(aName, options);\n\n if (matches[i][4] !== undefined) {\n // Reuse already-processed value — no double entity replacement\n const oldVal = processedVals[i];\n\n const newVal = options.attributeValueProcessor(attrName, oldVal, jPathStr);\n if (newVal === null || newVal === undefined) {\n attrs[aName] = oldVal;\n } else if (typeof newVal !== typeof oldVal || newVal !== oldVal) {\n attrs[aName] = newVal;\n } else {\n attrs[aName] = parseValue(oldVal, options.parseAttributeValue, options.numberParseOptions);\n }\n hasAttrs = true;\n } else if (options.allowBooleanAttributes) {\n attrs[aName] = true;\n hasAttrs = true;\n }\n }\n }\n\n if (!hasAttrs) return;\n\n if (options.attributesGroupName) {\n const attrCollection = {};\n attrCollection[options.attributesGroupName] = attrs;\n return attrCollection;\n }\n return attrs;\n }\n}\nconst parseXml = function (xmlData) {\n xmlData = xmlData.replace(/\\r\\n?/g, \"\\n\"); //TODO: remove this line\n const xmlObj = new xmlNode('!xml');\n let currentNode = xmlObj;\n let textData = \"\";\n\n // Reset matcher for new document\n this.matcher.reset();\n this.entityDecoder.reset();\n\n // Reset entity expansion counters for this document\n this.entityExpansionCount = 0;\n this.currentExpandedLength = 0;\n const options = this.options;\n const docTypeReader = new DocTypeReader(options.processEntities);\n const xmlLen = xmlData.length;\n for (let i = 0; i < xmlLen; i++) {//for each char in XML data\n const ch = xmlData[i];\n if (ch === '<') {\n // const nextIndex = i+1;\n // const _2ndChar = xmlData[nextIndex];\n const c1 = xmlData.charCodeAt(i + 1);\n if (c1 === 47) {//Closing Tag '/'\n const closeIndex = findClosingIndex(xmlData, \">\", i, \"Closing Tag is not closed.\")\n let tagName = xmlData.substring(i + 2, closeIndex).trim();\n\n if (options.removeNSPrefix) {\n const colonIndex = tagName.indexOf(\":\");\n if (colonIndex !== -1) {\n tagName = tagName.substr(colonIndex + 1);\n }\n }\n\n tagName = transformTagName(options.transformTagName, tagName, \"\", options).tagName;\n\n if (currentNode) {\n textData = this.saveTextToParentTag(textData, currentNode, this.readonlyMatcher);\n }\n\n //check if last tag of nested tag was unpaired tag\n const lastTagName = this.matcher.getCurrentTag();\n if (tagName && options.unpairedTagsSet.has(tagName)) {\n throw new Error(`Unpaired tag can not be used as closing tag: `);\n }\n if (lastTagName && options.unpairedTagsSet.has(lastTagName)) {\n // Pop the unpaired tag\n this.matcher.pop();\n this.tagsNodeStack.pop();\n }\n // Pop the closing tag\n this.matcher.pop();\n this.isCurrentNodeStopNode = false; // Reset flag when closing tag\n\n currentNode = this.tagsNodeStack.pop();//avoid recursion, set the parent tag scope\n textData = \"\";\n i = closeIndex;\n } else if (c1 === 63) { //'?'\n\n let tagData = readTagExp(xmlData, i, false, \"?>\");\n if (!tagData) throw new Error(\"Pi Tag is not closed.\");\n\n textData = this.saveTextToParentTag(textData, currentNode, this.readonlyMatcher);\n const attsMap = this.buildAttributesMap(tagData.tagExp, this.matcher, tagData.tagName);\n if (attsMap && attsMap[\"version\"]) {\n this.entityDecoder.setXmlVersion(attsMap[\"version\"]);\n }\n if ((options.ignoreDeclaration && tagData.tagName === \"?xml\") || options.ignorePiTags) {\n //do nothing\n } else {\n\n const childNode = new xmlNode(tagData.tagName);\n childNode.add(options.textNodeName, \"\");\n\n if (tagData.tagName !== tagData.tagExp && tagData.attrExpPresent) {\n childNode[\":@\"] = attsMap\n }\n this.addChild(currentNode, childNode, this.readonlyMatcher, i);\n }\n\n\n i = tagData.closeIndex + 1;\n } else if (c1 === 33\n && xmlData.charCodeAt(i + 2) === 45\n && xmlData.charCodeAt(i + 3) === 45) { //'!--'\n const endIndex = findClosingIndex(xmlData, \"-->\", i + 4, \"Comment is not closed.\")\n if (options.commentPropName) {\n const comment = xmlData.substring(i + 4, endIndex - 2);\n\n textData = this.saveTextToParentTag(textData, currentNode, this.readonlyMatcher);\n\n currentNode.add(options.commentPropName, [{ [options.textNodeName]: comment }]);\n }\n i = endIndex;\n } else if (c1 === 33\n && xmlData.charCodeAt(i + 2) === 68) { //'!D'\n const result = docTypeReader.readDocType(xmlData, i);\n this.entityDecoder.addInputEntities(result.entities);\n i = result.i;\n } else if (c1 === 33\n && xmlData.charCodeAt(i + 2) === 91) { // '!['\n const closeIndex = findClosingIndex(xmlData, \"]]>\", i, \"CDATA is not closed.\") - 2;\n const tagExp = xmlData.substring(i + 9, closeIndex);\n\n textData = this.saveTextToParentTag(textData, currentNode, this.readonlyMatcher);\n\n let val = this.parseTextData(tagExp, currentNode.tagname, this.readonlyMatcher, true, false, true, true);\n if (val == undefined) val = \"\";\n\n //cdata should be set even if it is 0 length string\n if (options.cdataPropName) {\n currentNode.add(options.cdataPropName, [{ [options.textNodeName]: tagExp }]);\n } else {\n currentNode.add(options.textNodeName, val);\n }\n\n i = closeIndex + 2;\n } else {//Opening tag\n let result = readTagExp(xmlData, i, options.removeNSPrefix);\n\n // Safety check: readTagExp can return undefined\n if (!result) {\n // Log context for debugging\n const context = xmlData.substring(Math.max(0, i - 50), Math.min(xmlLen, i + 50));\n throw new Error(`readTagExp returned undefined at position ${i}. Context: \"${context}\"`);\n }\n\n let tagName = result.tagName;\n const rawTagName = result.rawTagName;\n let tagExp = result.tagExp;\n let attrExpPresent = result.attrExpPresent;\n let closeIndex = result.closeIndex;\n\n ({ tagName, tagExp } = transformTagName(options.transformTagName, tagName, tagExp, options));\n\n if (options.strictReservedNames &&\n (tagName === options.commentPropName\n || tagName === options.cdataPropName\n || tagName === options.textNodeName\n || tagName === options.attributesGroupName\n )) {\n throw new Error(`Invalid tag name: ${tagName}`);\n }\n\n //save text as child node\n if (currentNode && textData) {\n if (currentNode.tagname !== '!xml') {\n //when nested tag is found\n textData = this.saveTextToParentTag(textData, currentNode, this.readonlyMatcher, false);\n }\n }\n\n //check if last tag was unpaired tag\n const lastTag = currentNode;\n if (lastTag && options.unpairedTagsSet.has(lastTag.tagname)) {\n currentNode = this.tagsNodeStack.pop();\n this.matcher.pop();\n }\n\n // Clean up self-closing syntax BEFORE processing attributes\n // This is where tagExp gets the trailing / removed\n let isSelfClosing = false;\n if (tagExp.length > 0 && tagExp.lastIndexOf(\"/\") === tagExp.length - 1) {\n isSelfClosing = true;\n if (tagName[tagName.length - 1] === \"/\") {\n tagName = tagName.substr(0, tagName.length - 1);\n tagExp = tagName;\n } else {\n tagExp = tagExp.substr(0, tagExp.length - 1);\n }\n\n // Re-check attrExpPresent after cleaning\n attrExpPresent = (tagName !== tagExp);\n }\n\n // Now process attributes with CLEAN tagExp (no trailing /)\n let prefixedAttrs = null;\n let rawAttrs = {};\n let namespace = undefined;\n\n // Extract namespace from rawTagName\n namespace = extractNamespace(rawTagName);\n\n // Push tag to matcher FIRST (with empty attrs for now) so callbacks see correct path\n if (tagName !== xmlObj.tagname) {\n this.matcher.push(tagName, {}, namespace);\n }\n\n // Now build attributes - callbacks will see correct matcher state\n if (tagName !== tagExp && attrExpPresent) {\n // Build attributes (returns prefixed attributes for the tree)\n // Note: buildAttributesMap now internally updates the matcher with raw attributes\n prefixedAttrs = this.buildAttributesMap(tagExp, this.matcher, tagName);\n\n if (prefixedAttrs) {\n // Extract raw attributes (without prefix) for our use\n rawAttrs = extractRawAttributes(prefixedAttrs, options);\n }\n }\n\n // Now check if this is a stop node (after attributes are set)\n if (tagName !== xmlObj.tagname) {\n this.isCurrentNodeStopNode = this.isItStopNode();\n }\n\n const startIndex = i;\n if (this.isCurrentNodeStopNode) {\n let tagContent = \"\";\n\n // For self-closing tags, content is empty\n if (isSelfClosing) {\n i = result.closeIndex;\n }\n //unpaired tag\n else if (options.unpairedTagsSet.has(tagName)) {\n i = result.closeIndex;\n }\n //normal tag\n else {\n //read until closing tag is found\n const result = this.readStopNodeData(xmlData, rawTagName, closeIndex + 1);\n if (!result) throw new Error(`Unexpected end of ${rawTagName}`);\n i = result.i;\n tagContent = result.tagContent;\n }\n\n const childNode = new xmlNode(tagName);\n\n if (prefixedAttrs) {\n childNode[\":@\"] = prefixedAttrs;\n }\n\n // For stop nodes, store raw content as-is without any processing\n childNode.add(options.textNodeName, tagContent);\n\n this.matcher.pop(); // Pop the stop node tag\n this.isCurrentNodeStopNode = false; // Reset flag\n\n this.addChild(currentNode, childNode, this.readonlyMatcher, startIndex);\n } else {\n //selfClosing tag\n if (isSelfClosing) {\n ({ tagName, tagExp } = transformTagName(options.transformTagName, tagName, tagExp, options));\n\n const childNode = new xmlNode(tagName);\n if (prefixedAttrs) {\n childNode[\":@\"] = prefixedAttrs;\n }\n this.addChild(currentNode, childNode, this.readonlyMatcher, startIndex);\n this.matcher.pop(); // Pop self-closing tag\n this.isCurrentNodeStopNode = false; // Reset flag\n }\n else if (options.unpairedTagsSet.has(tagName)) {//unpaired tag\n const childNode = new xmlNode(tagName);\n if (prefixedAttrs) {\n childNode[\":@\"] = prefixedAttrs;\n }\n this.addChild(currentNode, childNode, this.readonlyMatcher, startIndex);\n this.matcher.pop(); // Pop unpaired tag\n this.isCurrentNodeStopNode = false; // Reset flag\n i = result.closeIndex;\n // Continue to next iteration without changing currentNode\n continue;\n }\n //opening tag\n else {\n const childNode = new xmlNode(tagName);\n if (this.tagsNodeStack.length > options.maxNestedTags) {\n throw new Error(\"Maximum nested tags exceeded\");\n }\n this.tagsNodeStack.push(currentNode);\n\n if (prefixedAttrs) {\n childNode[\":@\"] = prefixedAttrs;\n }\n this.addChild(currentNode, childNode, this.readonlyMatcher, startIndex);\n currentNode = childNode;\n }\n textData = \"\";\n i = closeIndex;\n }\n }\n } else {\n textData += xmlData[i];\n }\n }\n return xmlObj.child;\n}\n\nfunction addChild(currentNode, childNode, matcher, startIndex) {\n // unset startIndex if not requested\n if (!this.options.captureMetaData) startIndex = undefined;\n\n // Pass jPath string or matcher based on options.jPath setting\n const jPathOrMatcher = this.options.jPath ? matcher.toString() : matcher;\n const result = this.options.updateTag(childNode.tagname, jPathOrMatcher, childNode[\":@\"])\n if (result === false) {\n //do nothing\n } else if (typeof result === \"string\") {\n childNode.tagname = result\n currentNode.addChild(childNode, startIndex);\n } else {\n currentNode.addChild(childNode, startIndex);\n }\n}\n\n/**\n * @param {object} val - Entity object with regex and val properties\n * @param {string} tagName - Tag name\n * @param {string|Matcher} jPath - jPath string or Matcher instance based on options.jPath\n */\nfunction replaceEntitiesValue(val, tagName, jPath) {\n const entityConfig = this.options.processEntities;\n\n if (!entityConfig || !entityConfig.enabled) {\n return val;\n }\n\n // Check if tag is allowed to contain entities\n if (entityConfig.allowedTags) {\n const jPathOrMatcher = this.options.jPath ? jPath.toString() : jPath;\n const allowed = Array.isArray(entityConfig.allowedTags)\n ? entityConfig.allowedTags.includes(tagName)\n : entityConfig.allowedTags(tagName, jPathOrMatcher);\n\n if (!allowed) {\n return val;\n }\n }\n\n // Apply custom tag filter if provided\n if (entityConfig.tagFilter) {\n const jPathOrMatcher = this.options.jPath ? jPath.toString() : jPath;\n if (!entityConfig.tagFilter(tagName, jPathOrMatcher)) {\n return val; // Skip based on custom filter\n }\n }\n\n return this.entityDecoder.decode(val);\n}\n\n\nfunction saveTextToParentTag(textData, parentNode, matcher, isLeafNode) {\n if (textData) { //store previously collected data as textNode\n if (isLeafNode === undefined) isLeafNode = parentNode.child.length === 0\n\n textData = this.parseTextData(textData,\n parentNode.tagname,\n matcher,\n false,\n parentNode[\":@\"] ? Object.keys(parentNode[\":@\"]).length !== 0 : false,\n isLeafNode);\n\n if (textData !== undefined && textData !== \"\")\n parentNode.add(this.options.textNodeName, textData);\n textData = \"\";\n }\n return textData;\n}\n\n/**\n * @param {Array} stopNodeExpressions - Array of compiled Expression objects\n * @param {Matcher} matcher - Current path matcher\n */\nfunction isItStopNode() {\n if (this.stopNodeExpressionsSet.size === 0) return false;\n\n return this.matcher.matchesAny(this.stopNodeExpressionsSet);\n}\n\n/**\n * Returns the tag Expression and where it is ending handling single-double quotes situation\n * @param {string} xmlData \n * @param {number} i starting index\n * @returns \n */\nfunction tagExpWithClosingIndex(xmlData, i, closingChar = \">\") {\n let attrBoundary = 0;\n let hasTabInQuote = false;\n const len = xmlData.length;\n const closeCode0 = closingChar.charCodeAt(0);\n const closeCode1 = closingChar.length > 1 ? closingChar.charCodeAt(1) : -1;\n let closeIndex = -1;\n\n // First pass: locate the closing delimiter, tracking quote boundaries so\n // they don't mask the close. Note any \\t seen inside a quoted attribute\n // value — those must be preserved, so we can't bulk-replace tabs.\n for (let index = i; index < len; index++) {\n const code = xmlData.charCodeAt(index);\n\n if (attrBoundary) {\n if (code === attrBoundary) attrBoundary = 0;\n else if (code === 9) hasTabInQuote = true;\n } else if (code === 34 || code === 39) { // \" or '\n attrBoundary = code;\n } else if (code === closeCode0) {\n if (closeCode1 !== -1) {\n if (xmlData.charCodeAt(index + 1) === closeCode1) {\n closeIndex = index;\n break;\n }\n } else {\n closeIndex = index;\n break;\n }\n }\n }\n\n if (closeIndex === -1) return;\n\n const raw = xmlData.substring(i, closeIndex);\n\n // Fast path: any tabs are guaranteed to be outside quoted attr values,\n // so bulk-replace them with spaces.\n if (!hasTabInQuote) {\n return { data: raw.replace(/\\t/g, \" \"), index: closeIndex };\n }\n\n // Rare path: the tag expression has at least one tab inside a quoted\n // attribute value. Walk it and replace only the tabs that fall outside\n // quote boundaries.\n let tagExp = \"\";\n let boundary = 0;\n for (let k = 0; k < raw.length; k++) {\n const code = raw.charCodeAt(k);\n if (boundary) {\n if (code === boundary) boundary = 0;\n tagExp += raw[k];\n } else if (code === 34 || code === 39) {\n boundary = code;\n tagExp += raw[k];\n } else if (code === 9) {\n tagExp += \" \";\n } else {\n tagExp += raw[k];\n }\n }\n return { data: tagExp, index: closeIndex };\n}\n\nfunction findClosingIndex(xmlData, str, i, errMsg) {\n const closingIndex = xmlData.indexOf(str, i);\n if (closingIndex === -1) {\n throw new Error(errMsg)\n } else {\n return closingIndex + str.length - 1;\n }\n}\n\nfunction findClosingChar(xmlData, char, i, errMsg) {\n const closingIndex = xmlData.indexOf(char, i);\n if (closingIndex === -1) throw new Error(errMsg);\n return closingIndex; // no offset needed\n}\n\nfunction readTagExp(xmlData, i, removeNSPrefix, closingChar = \">\") {\n const result = tagExpWithClosingIndex(xmlData, i + 1, closingChar);\n if (!result) return;\n let tagExp = result.data;\n const closeIndex = result.index;\n const separatorIndex = tagExp.search(/\\s/);\n let tagName = tagExp;\n let attrExpPresent = true;\n if (separatorIndex !== -1) {//separate tag name and attributes expression\n tagName = tagExp.substring(0, separatorIndex);\n tagExp = tagExp.substring(separatorIndex + 1).trimStart();\n }\n\n const rawTagName = tagName;\n if (removeNSPrefix) {\n const colonIndex = tagName.indexOf(\":\");\n if (colonIndex !== -1) {\n tagName = tagName.substr(colonIndex + 1);\n attrExpPresent = tagName !== result.data.substr(colonIndex + 1);\n }\n }\n\n return {\n tagName: tagName,\n tagExp: tagExp,\n closeIndex: closeIndex,\n attrExpPresent: attrExpPresent,\n rawTagName: rawTagName,\n }\n}\n/**\n * find paired tag for a stop node\n * @param {string} xmlData \n * @param {string} tagName \n * @param {number} i \n */\nfunction readStopNodeData(xmlData, tagName, i) {\n const startIndex = i;\n // Starting at 1 since we already have an open tag\n let openTagCount = 1;\n\n const xmllen = xmlData.length;\n for (; i < xmllen; i++) {\n if (xmlData[i] === \"<\") {\n const c1 = xmlData.charCodeAt(i + 1);\n if (c1 === 47) {//close tag '/'\n const closeIndex = findClosingChar(xmlData, \">\", i, `${tagName} is not closed`);\n let closeTagName = xmlData.substring(i + 2, closeIndex).trim();\n if (closeTagName === tagName) {\n openTagCount--;\n if (openTagCount === 0) {\n return {\n tagContent: xmlData.substring(startIndex, i),\n i: closeIndex\n }\n }\n }\n i = closeIndex;\n } else if (c1 === 63) { //?\n const closeIndex = findClosingIndex(xmlData, \"?>\", i + 1, \"StopNode is not closed.\")\n i = closeIndex;\n } else if (c1 === 33\n && xmlData.charCodeAt(i + 2) === 45\n && xmlData.charCodeAt(i + 3) === 45) { // '!--'\n const closeIndex = findClosingIndex(xmlData, \"-->\", i + 3, \"StopNode is not closed.\")\n i = closeIndex;\n } else if (c1 === 33\n && xmlData.charCodeAt(i + 2) === 91) { // '!['\n const closeIndex = findClosingIndex(xmlData, \"]]>\", i, \"StopNode is not closed.\") - 2;\n i = closeIndex;\n } else {\n const tagData = readTagExp(xmlData, i, '>')\n\n if (tagData) {\n const openTagName = tagData && tagData.tagName;\n if (openTagName === tagName && tagData.tagExp[tagData.tagExp.length - 1] !== \"/\") {\n openTagCount++;\n }\n i = tagData.closeIndex;\n }\n }\n }\n }//end for loop\n}\n\nfunction parseValue(val, shouldParse, options) {\n if (shouldParse && typeof val === 'string') {\n //console.log(options)\n const newval = val.trim();\n if (newval === 'true') return true;\n else if (newval === 'false') return false;\n else return toNumber(val, options);\n } else {\n if (isExist(val)) {\n return val;\n } else {\n return '';\n }\n }\n}\n\nfunction fromCodePoint(str, base, prefix) {\n const codePoint = Number.parseInt(str, base);\n\n if (codePoint >= 0 && codePoint <= 0x10FFFF) {\n return String.fromCodePoint(codePoint);\n } else {\n return prefix + str + \";\";\n }\n}\n\nfunction transformTagName(fn, tagName, tagExp, options) {\n if (fn) {\n const newTagName = fn(tagName);\n if (tagExp === tagName) {\n tagExp = newTagName\n }\n tagName = newTagName;\n }\n tagName = sanitizeName(tagName, options);\n return { tagName, tagExp };\n}\n\n\n\nfunction sanitizeName(name, options) {\n if (criticalProperties.includes(name)) {\n throw new Error(`[SECURITY] Invalid name: \"${name}\" is a reserved JavaScript keyword that could cause prototype pollution`);\n } else if (DANGEROUS_PROPERTY_NAMES.includes(name)) {\n return options.onDangerousProperty(name);\n }\n return name;\n}","export default function getIgnoreAttributesFn(ignoreAttributes) {\n if (typeof ignoreAttributes === 'function') {\n return ignoreAttributes\n }\n if (Array.isArray(ignoreAttributes)) {\n return (attrName) => {\n for (const pattern of ignoreAttributes) {\n if (typeof pattern === 'string' && attrName === pattern) {\n return true\n }\n if (pattern instanceof RegExp && pattern.test(attrName)) {\n return true\n }\n }\n }\n }\n return () => false\n}","'use strict';\n\nimport XmlNode from './xmlNode.js';\nimport { Matcher } from 'path-expression-matcher';\n\nconst METADATA_SYMBOL = XmlNode.getMetaDataSymbol();\n\n/**\n * Helper function to strip attribute prefix from attribute map\n * @param {object} attrs - Attributes with prefix (e.g., {\"@_class\": \"code\"})\n * @param {string} prefix - Attribute prefix to remove (e.g., \"@_\")\n * @returns {object} Attributes without prefix (e.g., {\"class\": \"code\"})\n */\nfunction stripAttributePrefix(attrs, prefix) {\n if (!attrs || typeof attrs !== 'object') return {};\n if (!prefix) return attrs;\n\n const rawAttrs = {};\n for (const key in attrs) {\n if (key.startsWith(prefix)) {\n const rawName = key.substring(prefix.length);\n rawAttrs[rawName] = attrs[key];\n } else {\n // Attribute without prefix (shouldn't normally happen, but be safe)\n rawAttrs[key] = attrs[key];\n }\n }\n return rawAttrs;\n}\n\n/**\n * \n * @param {array} node \n * @param {any} options \n * @param {Matcher} matcher - Path matcher instance\n * @returns \n */\nexport default function prettify(node, options, matcher, readonlyMatcher) {\n return compress(node, options, matcher, readonlyMatcher);\n}\n\n/**\n * @param {array} arr \n * @param {object} options \n * @param {Matcher} matcher - Path matcher instance\n * @returns object\n */\nfunction compress(arr, options, matcher, readonlyMatcher) {\n let text;\n const compressedObj = {}; //This is intended to be a plain object\n for (let i = 0; i < arr.length; i++) {\n const tagObj = arr[i];\n const property = propName(tagObj);\n\n // Push current property to matcher WITH RAW ATTRIBUTES (no prefix)\n if (property !== undefined && property !== options.textNodeName) {\n const rawAttrs = stripAttributePrefix(\n tagObj[\":@\"] || {},\n options.attributeNamePrefix\n );\n matcher.push(property, rawAttrs);\n }\n\n if (property === options.textNodeName) {\n if (text === undefined) text = tagObj[property];\n else text += \"\" + tagObj[property];\n } else if (property === undefined) {\n continue;\n } else if (tagObj[property]) {\n\n let val = compress(tagObj[property], options, matcher, readonlyMatcher);\n const isLeaf = isLeafTag(val, options);\n\n if (tagObj[\":@\"]) {\n assignAttributes(val, tagObj[\":@\"], readonlyMatcher, options);\n } else if (Object.keys(val).length === 1 && val[options.textNodeName] !== undefined && !options.alwaysCreateTextNode) {\n val = val[options.textNodeName];\n } else if (Object.keys(val).length === 0) {\n if (options.alwaysCreateTextNode) val[options.textNodeName] = \"\";\n else val = \"\";\n }\n\n if (tagObj[METADATA_SYMBOL] !== undefined && typeof val === \"object\" && val !== null) {\n val[METADATA_SYMBOL] = tagObj[METADATA_SYMBOL]; // copy over metadata\n }\n\n\n if (compressedObj[property] !== undefined && Object.prototype.hasOwnProperty.call(compressedObj, property)) {\n if (!Array.isArray(compressedObj[property])) {\n compressedObj[property] = [compressedObj[property]];\n }\n compressedObj[property].push(val);\n } else {\n //TODO: if a node is not an array, then check if it should be an array\n //also determine if it is a leaf node\n\n // Pass jPath string or readonlyMatcher based on options.jPath setting\n const jPathOrMatcher = options.jPath ? readonlyMatcher.toString() : readonlyMatcher;\n if (options.isArray(property, jPathOrMatcher, isLeaf)) {\n compressedObj[property] = [val];\n } else {\n compressedObj[property] = val;\n }\n }\n\n // Pop property from matcher after processing\n if (property !== undefined && property !== options.textNodeName) {\n matcher.pop();\n }\n }\n\n }\n // if(text && text.length > 0) compressedObj[options.textNodeName] = text;\n if (typeof text === \"string\") {\n if (text.length > 0) compressedObj[options.textNodeName] = text;\n } else if (text !== undefined) compressedObj[options.textNodeName] = text;\n\n\n return compressedObj;\n}\n\nfunction propName(obj) {\n const keys = Object.keys(obj);\n for (let i = 0; i < keys.length; i++) {\n const key = keys[i];\n if (key !== \":@\") return key;\n }\n}\n\nfunction assignAttributes(obj, attrMap, readonlyMatcher, options) {\n if (attrMap) {\n const keys = Object.keys(attrMap);\n const len = keys.length; //don't make it inline\n for (let i = 0; i < len; i++) {\n const atrrName = keys[i]; // This is the PREFIXED name (e.g., \"@_class\")\n\n // Strip prefix for matcher path (for isArray callback)\n const rawAttrName = atrrName.startsWith(options.attributeNamePrefix)\n ? atrrName.substring(options.attributeNamePrefix.length)\n : atrrName;\n\n // For attributes, we need to create a temporary path\n // Pass jPath string or matcher based on options.jPath setting\n const jPathOrMatcher = options.jPath\n ? readonlyMatcher.toString() + \".\" + rawAttrName\n : readonlyMatcher;\n\n if (options.isArray(atrrName, jPathOrMatcher, true, true)) {\n obj[atrrName] = [attrMap[atrrName]];\n } else {\n obj[atrrName] = attrMap[atrrName];\n }\n }\n }\n}\n\nfunction isLeafTag(obj, options) {\n const { textNodeName } = options;\n const propCount = Object.keys(obj).length;\n\n if (propCount === 0) {\n return true;\n }\n\n if (\n propCount === 1 &&\n (obj[textNodeName] || typeof obj[textNodeName] === \"boolean\" || obj[textNodeName] === 0)\n ) {\n return true;\n }\n\n return false;\n}","import { buildOptions } from './OptionsBuilder.js';\nimport OrderedObjParser from './OrderedObjParser.js';\nimport prettify from './node2json.js';\nimport { validate } from \"../validator.js\";\nimport XmlNode from './xmlNode.js';\n\nexport default class XMLParser {\n\n constructor(options) {\n this.externalEntities = {};\n this.options = buildOptions(options);\n\n }\n /**\n * Parse XML dats to JS object \n * @param {string|Uint8Array} xmlData \n * @param {boolean|Object} validationOption \n */\n parse(xmlData, validationOption) {\n if (typeof xmlData !== \"string\" && xmlData.toString) {\n xmlData = xmlData.toString();\n } else if (typeof xmlData !== \"string\") {\n throw new Error(\"XML data is accepted in String or Bytes[] form.\")\n }\n\n if (validationOption) {\n if (validationOption === true) validationOption = {}; //validate with default options\n\n const result = validate(xmlData, validationOption);\n if (result !== true) {\n throw Error(`${result.err.msg}:${result.err.line}:${result.err.col}`)\n }\n }\n const orderedObjParser = new OrderedObjParser(this.options);\n orderedObjParser.entityDecoder.setExternalEntities(this.externalEntities);\n const orderedResult = orderedObjParser.parseXml(xmlData);\n if (this.options.preserveOrder || orderedResult === undefined) return orderedResult;\n else return prettify(orderedResult, this.options, orderedObjParser.matcher, orderedObjParser.readonlyMatcher);\n }\n\n /**\n * Add Entity which is not by default supported by this library\n * @param {string} key \n * @param {string} value \n */\n addEntity(key, value) {\n if (value.indexOf(\"&\") !== -1) {\n throw new Error(\"Entity value can't have '&'\")\n } else if (key.indexOf(\"&\") !== -1 || key.indexOf(\";\") !== -1) {\n throw new Error(\"An entity must be set without '&' and ';'. Eg. use '#xD' for ' '\")\n } else if (value === \"&\") {\n throw new Error(\"An entity with value '&' is not permitted\");\n } else {\n this.externalEntities[key] = value;\n }\n }\n\n /**\n * Returns a Symbol that can be used to access the metadata\n * property on a node.\n * \n * If Symbol is not available in the environment, an ordinary property is used\n * and the name of the property is here returned.\n * \n * The XMLMetaData property is only present when `captureMetaData`\n * is true in the options.\n */\n static getMetaDataSymbol() {\n return XmlNode.getMetaDataSymbol();\n }\n}","import { Expression, Matcher } from 'path-expression-matcher';\n\nconst EOL = \"\\n\";\n\n/**\n * \n * @param {array} jArray \n * @param {any} options \n * @returns \n */\nexport default function toXml(jArray, options) {\n let indentation = \"\";\n if (options.format && options.indentBy.length > 0) {\n indentation = EOL;\n }\n\n // Pre-compile stopNode expressions for pattern matching\n const stopNodeExpressions = [];\n if (options.stopNodes && Array.isArray(options.stopNodes)) {\n for (let i = 0; i < options.stopNodes.length; i++) {\n const node = options.stopNodes[i];\n if (typeof node === 'string') {\n stopNodeExpressions.push(new Expression(node));\n } else if (node instanceof Expression) {\n stopNodeExpressions.push(node);\n }\n }\n }\n\n // Initialize matcher for path tracking\n const matcher = new Matcher();\n\n return arrToStr(jArray, options, indentation, matcher, stopNodeExpressions);\n}\n\nfunction arrToStr(arr, options, indentation, matcher, stopNodeExpressions) {\n let xmlStr = \"\";\n let isPreviousElementTag = false;\n\n if (options.maxNestedTags && matcher.getDepth() > options.maxNestedTags) {\n throw new Error(\"Maximum nested tags exceeded\");\n }\n\n if (!Array.isArray(arr)) {\n // Non-array values (e.g. string tag values) should be treated as text content\n if (arr !== undefined && arr !== null) {\n let text = arr.toString();\n text = replaceEntitiesValue(text, options);\n return text;\n }\n return \"\";\n }\n\n for (let i = 0; i < arr.length; i++) {\n const tagObj = arr[i];\n const tagName = propName(tagObj);\n if (tagName === undefined) continue;\n\n // Extract attributes from \":@\" property\n const attrValues = extractAttributeValues(tagObj[\":@\"], options);\n\n // Push tag to matcher WITH attributes\n matcher.push(tagName, attrValues);\n\n // Check if this is a stop node using Expression matching\n const isStopNode = checkStopNode(matcher, stopNodeExpressions);\n\n if (tagName === options.textNodeName) {\n let tagText = tagObj[tagName];\n if (!isStopNode) {\n tagText = options.tagValueProcessor(tagName, tagText);\n tagText = replaceEntitiesValue(tagText, options);\n }\n if (isPreviousElementTag) {\n xmlStr += indentation;\n }\n xmlStr += tagText;\n isPreviousElementTag = false;\n matcher.pop();\n continue;\n } else if (tagName === options.cdataPropName) {\n if (isPreviousElementTag) {\n xmlStr += indentation;\n }\n xmlStr += ``;\n isPreviousElementTag = false;\n matcher.pop();\n continue;\n } else if (tagName === options.commentPropName) {\n xmlStr += indentation + ``;\n isPreviousElementTag = true;\n matcher.pop();\n continue;\n } else if (tagName[0] === \"?\") {\n const attStr = attr_to_str(tagObj[\":@\"], options, isStopNode);\n const tempInd = tagName === \"?xml\" ? \"\" : indentation;\n let piTextNodeName = tagObj[tagName][0][options.textNodeName];\n piTextNodeName = piTextNodeName.length !== 0 ? \" \" + piTextNodeName : \"\"; //remove extra spacing\n xmlStr += tempInd + `<${tagName}${piTextNodeName}${attStr}?>`;\n isPreviousElementTag = true;\n matcher.pop();\n continue;\n }\n\n let newIdentation = indentation;\n if (newIdentation !== \"\") {\n newIdentation += options.indentBy;\n }\n\n // Pass isStopNode to attr_to_str so attributes are also not processed for stopNodes\n const attStr = attr_to_str(tagObj[\":@\"], options, isStopNode);\n const tagStart = indentation + `<${tagName}${attStr}`;\n\n // If this is a stopNode, get raw content without processing\n let tagValue;\n if (isStopNode) {\n tagValue = getRawContent(tagObj[tagName], options);\n } else {\n\n tagValue = arrToStr(tagObj[tagName], options, newIdentation, matcher, stopNodeExpressions);\n }\n\n if (options.unpairedTags.indexOf(tagName) !== -1) {\n if (options.suppressUnpairedNode) xmlStr += tagStart + \">\";\n else xmlStr += tagStart + \"/>\";\n } else if ((!tagValue || tagValue.length === 0) && options.suppressEmptyNode) {\n xmlStr += tagStart + \"/>\";\n } else if (tagValue && tagValue.endsWith(\">\")) {\n xmlStr += tagStart + `>${tagValue}${indentation}`;\n } else {\n xmlStr += tagStart + \">\";\n if (tagValue && indentation !== \"\" && (tagValue.includes(\"/>\") || tagValue.includes(\"`;\n }\n isPreviousElementTag = true;\n\n // Pop tag from matcher\n matcher.pop();\n }\n\n return xmlStr;\n}\n\n/**\n * Extract attribute values from the \":@\" object and return as plain object\n * for passing to matcher.push()\n */\nfunction extractAttributeValues(attrMap, options) {\n if (!attrMap || options.ignoreAttributes) return null;\n\n const attrValues = {};\n let hasAttrs = false;\n\n for (let attr in attrMap) {\n if (!Object.prototype.hasOwnProperty.call(attrMap, attr)) continue;\n // Remove the attribute prefix to get clean attribute name\n const cleanAttrName = attr.startsWith(options.attributeNamePrefix)\n ? attr.substr(options.attributeNamePrefix.length)\n : attr;\n attrValues[cleanAttrName] = attrMap[attr];\n hasAttrs = true;\n }\n\n return hasAttrs ? attrValues : null;\n}\n\n/**\n * Extract raw content from a stopNode without any processing\n * This preserves the content exactly as-is, including special characters\n */\nfunction getRawContent(arr, options) {\n if (!Array.isArray(arr)) {\n // Non-array values return as-is\n if (arr !== undefined && arr !== null) {\n return arr.toString();\n }\n return \"\";\n }\n\n let content = \"\";\n for (let i = 0; i < arr.length; i++) {\n const item = arr[i];\n const tagName = propName(item);\n\n if (tagName === options.textNodeName) {\n // Raw text content - NO processing, NO entity replacement\n content += item[tagName];\n } else if (tagName === options.cdataPropName) {\n // CDATA content\n content += item[tagName][0][options.textNodeName];\n } else if (tagName === options.commentPropName) {\n // Comment content\n content += item[tagName][0][options.textNodeName];\n } else if (tagName && tagName[0] === \"?\") {\n // Processing instruction - skip for stopNodes\n continue;\n } else if (tagName) {\n // Nested tags within stopNode\n // Recursively get raw content and reconstruct the tag\n // For stopNodes, we don't process attributes either\n const attStr = attr_to_str_raw(item[\":@\"], options);\n const nestedContent = getRawContent(item[tagName], options);\n\n if (!nestedContent || nestedContent.length === 0) {\n content += `<${tagName}${attStr}/>`;\n } else {\n content += `<${tagName}${attStr}>${nestedContent}`;\n }\n }\n }\n return content;\n}\n\n/**\n * Build attribute string for stopNodes - NO entity replacement\n */\nfunction attr_to_str_raw(attrMap, options) {\n let attrStr = \"\";\n if (attrMap && !options.ignoreAttributes) {\n for (let attr in attrMap) {\n if (!Object.prototype.hasOwnProperty.call(attrMap, attr)) continue;\n // For stopNodes, use raw value without processing\n let attrVal = attrMap[attr];\n if (attrVal === true && options.suppressBooleanAttributes) {\n attrStr += ` ${attr.substr(options.attributeNamePrefix.length)}`;\n } else {\n attrStr += ` ${attr.substr(options.attributeNamePrefix.length)}=\"${attrVal}\"`;\n }\n }\n }\n return attrStr;\n}\n\nfunction propName(obj) {\n const keys = Object.keys(obj);\n for (let i = 0; i < keys.length; i++) {\n const key = keys[i];\n if (!Object.prototype.hasOwnProperty.call(obj, key)) continue;\n if (key !== \":@\") return key;\n }\n}\n\nfunction attr_to_str(attrMap, options, isStopNode) {\n let attrStr = \"\";\n if (attrMap && !options.ignoreAttributes) {\n for (let attr in attrMap) {\n if (!Object.prototype.hasOwnProperty.call(attrMap, attr)) continue;\n let attrVal;\n\n if (isStopNode) {\n // For stopNodes, use raw value without any processing\n attrVal = attrMap[attr];\n } else {\n // Normal processing: apply attributeValueProcessor and entity replacement\n attrVal = options.attributeValueProcessor(attr, attrMap[attr]);\n attrVal = replaceEntitiesValue(attrVal, options);\n }\n\n if (attrVal === true && options.suppressBooleanAttributes) {\n attrStr += ` ${attr.substr(options.attributeNamePrefix.length)}`;\n } else {\n attrStr += ` ${attr.substr(options.attributeNamePrefix.length)}=\"${attrVal}\"`;\n }\n }\n }\n return attrStr;\n}\n\nfunction checkStopNode(matcher, stopNodeExpressions) {\n if (!stopNodeExpressions || stopNodeExpressions.length === 0) return false;\n\n for (let i = 0; i < stopNodeExpressions.length; i++) {\n if (matcher.matches(stopNodeExpressions[i])) {\n return true;\n }\n }\n return false;\n}\n\nfunction replaceEntitiesValue(textValue, options) {\n if (textValue && textValue.length > 0 && options.processEntities) {\n for (let i = 0; i < options.entities.length; i++) {\n const entity = options.entities[i];\n textValue = textValue.replace(entity.regex, entity.val);\n }\n }\n return textValue;\n}","'use strict';\n//parse Empty Node as self closing node\nimport buildFromOrderedJs from './orderedJs2Xml.js';\nimport getIgnoreAttributesFn from \"./ignoreAttributes.js\";\nimport { Expression, Matcher } from 'path-expression-matcher';\n\nconst defaultOptions = {\n attributeNamePrefix: '@_',\n attributesGroupName: false,\n textNodeName: '#text',\n ignoreAttributes: true,\n cdataPropName: false,\n format: false,\n indentBy: ' ',\n suppressEmptyNode: false,\n suppressUnpairedNode: true,\n suppressBooleanAttributes: true,\n tagValueProcessor: function (key, a) {\n return a;\n },\n attributeValueProcessor: function (attrName, a) {\n return a;\n },\n preserveOrder: false,\n commentPropName: false,\n unpairedTags: [],\n entities: [\n { regex: new RegExp(\"&\", \"g\"), val: \"&\" },//it must be on top\n { regex: new RegExp(\">\", \"g\"), val: \">\" },\n { regex: new RegExp(\"<\", \"g\"), val: \"<\" },\n { regex: new RegExp(\"\\'\", \"g\"), val: \"'\" },\n { regex: new RegExp(\"\\\"\", \"g\"), val: \""\" }\n ],\n processEntities: true,\n stopNodes: [],\n // transformTagName: false,\n // transformAttributeName: false,\n oneListGroup: false,\n maxNestedTags: 100,\n jPath: true // When true, callbacks receive string jPath; when false, receive Matcher instance\n};\n\nexport default function Builder(options) {\n this.options = Object.assign({}, defaultOptions, options);\n\n // Convert old-style stopNodes for backward compatibility\n // Old syntax: \"*.tag\" meant \"tag anywhere in tree\"\n // New syntax: \"..tag\" means \"tag anywhere in tree\"\n if (this.options.stopNodes && Array.isArray(this.options.stopNodes)) {\n this.options.stopNodes = this.options.stopNodes.map(node => {\n if (typeof node === 'string' && node.startsWith('*.')) {\n // Convert old wildcard syntax to deep wildcard\n return '..' + node.substring(2);\n }\n return node;\n });\n }\n\n // Pre-compile stopNode expressions for pattern matching\n this.stopNodeExpressions = [];\n if (this.options.stopNodes && Array.isArray(this.options.stopNodes)) {\n for (let i = 0; i < this.options.stopNodes.length; i++) {\n const node = this.options.stopNodes[i];\n if (typeof node === 'string') {\n this.stopNodeExpressions.push(new Expression(node));\n } else if (node instanceof Expression) {\n this.stopNodeExpressions.push(node);\n }\n }\n }\n\n if (this.options.ignoreAttributes === true || this.options.attributesGroupName) {\n this.isAttribute = function (/*a*/) {\n return false;\n };\n } else {\n this.ignoreAttributesFn = getIgnoreAttributesFn(this.options.ignoreAttributes)\n this.attrPrefixLen = this.options.attributeNamePrefix.length;\n this.isAttribute = isAttribute;\n }\n\n this.processTextOrObjNode = processTextOrObjNode\n\n if (this.options.format) {\n this.indentate = indentate;\n this.tagEndChar = '>\\n';\n this.newLine = '\\n';\n } else {\n this.indentate = function () {\n return '';\n };\n this.tagEndChar = '>';\n this.newLine = '';\n }\n}\n\nBuilder.prototype.build = function (jObj) {\n if (this.options.preserveOrder) {\n return buildFromOrderedJs(jObj, this.options);\n } else {\n if (Array.isArray(jObj) && this.options.arrayNodeName && this.options.arrayNodeName.length > 1) {\n jObj = {\n [this.options.arrayNodeName]: jObj\n }\n }\n // Initialize matcher for path tracking\n const matcher = new Matcher();\n return this.j2x(jObj, 0, matcher).val;\n }\n};\n\nBuilder.prototype.j2x = function (jObj, level, matcher) {\n let attrStr = '';\n let val = '';\n if (this.options.maxNestedTags && matcher.getDepth() >= this.options.maxNestedTags) {\n throw new Error(\"Maximum nested tags exceeded\");\n }\n // Get jPath based on option: string for backward compatibility, or Matcher for new features\n const jPath = this.options.jPath ? matcher.toString() : matcher;\n\n // Check if current node is a stopNode (will be used for attribute encoding)\n const isCurrentStopNode = this.checkStopNode(matcher);\n\n for (let key in jObj) {\n if (!Object.prototype.hasOwnProperty.call(jObj, key)) continue;\n if (typeof jObj[key] === 'undefined') {\n // supress undefined node only if it is not an attribute\n if (this.isAttribute(key)) {\n val += '';\n }\n } else if (jObj[key] === null) {\n // null attribute should be ignored by the attribute list, but should not cause the tag closing\n if (this.isAttribute(key)) {\n val += '';\n } else if (key === this.options.cdataPropName) {\n val += '';\n } else if (key[0] === '?') {\n val += this.indentate(level) + '<' + key + '?' + this.tagEndChar;\n } else {\n val += this.indentate(level) + '<' + key + '/' + this.tagEndChar;\n }\n // val += this.indentate(level) + '<' + key + '/' + this.tagEndChar;\n } else if (jObj[key] instanceof Date) {\n val += this.buildTextValNode(jObj[key], key, '', level, matcher);\n } else if (typeof jObj[key] !== 'object') {\n //premitive type\n const attr = this.isAttribute(key);\n if (attr && !this.ignoreAttributesFn(attr, jPath)) {\n attrStr += this.buildAttrPairStr(attr, '' + jObj[key], isCurrentStopNode);\n } else if (!attr) {\n //tag value\n if (key === this.options.textNodeName) {\n let newval = this.options.tagValueProcessor(key, '' + jObj[key]);\n val += this.replaceEntitiesValue(newval);\n } else {\n // Check if this is a stopNode before building\n matcher.push(key);\n const isStopNode = this.checkStopNode(matcher);\n matcher.pop();\n\n if (isStopNode) {\n // Build as raw content without encoding\n const textValue = '' + jObj[key];\n if (textValue === '') {\n val += this.indentate(level) + '<' + key + this.closeTag(key) + this.tagEndChar;\n } else {\n val += this.indentate(level) + '<' + key + '>' + textValue + '' + textValue + '${item}`;\n } else if (typeof item === 'object' && item !== null) {\n const nestedContent = this.buildRawContent(item);\n const nestedAttrs = this.buildAttributesForStopNode(item);\n if (nestedContent === '') {\n content += `<${key}${nestedAttrs}/>`;\n } else {\n content += `<${key}${nestedAttrs}>${nestedContent}`;\n }\n }\n }\n } else if (typeof value === 'object' && value !== null) {\n // Nested object\n const nestedContent = this.buildRawContent(value);\n const nestedAttrs = this.buildAttributesForStopNode(value);\n if (nestedContent === '') {\n content += `<${key}${nestedAttrs}/>`;\n } else {\n content += `<${key}${nestedAttrs}>${nestedContent}`;\n }\n } else {\n // Primitive value\n content += `<${key}>${value}`;\n }\n }\n\n return content;\n};\n\n// Build attribute string for stopNode (no entity encoding)\nBuilder.prototype.buildAttributesForStopNode = function (obj) {\n if (!obj || typeof obj !== 'object') return '';\n\n let attrStr = '';\n\n // Check for attributesGroupName (when attributes are grouped)\n if (this.options.attributesGroupName && obj[this.options.attributesGroupName]) {\n const attrGroup = obj[this.options.attributesGroupName];\n for (let attrKey in attrGroup) {\n if (!Object.prototype.hasOwnProperty.call(attrGroup, attrKey)) continue;\n const cleanKey = attrKey.startsWith(this.options.attributeNamePrefix)\n ? attrKey.substring(this.options.attributeNamePrefix.length)\n : attrKey;\n const val = attrGroup[attrKey];\n if (val === true && this.options.suppressBooleanAttributes) {\n attrStr += ' ' + cleanKey;\n } else {\n attrStr += ' ' + cleanKey + '=\"' + val + '\"'; // No encoding for stopNode\n }\n }\n } else {\n // Look for individual attributes\n for (let key in obj) {\n if (!Object.prototype.hasOwnProperty.call(obj, key)) continue;\n const attr = this.isAttribute(key);\n if (attr) {\n const val = obj[key];\n if (val === true && this.options.suppressBooleanAttributes) {\n attrStr += ' ' + attr;\n } else {\n attrStr += ' ' + attr + '=\"' + val + '\"'; // No encoding for stopNode\n }\n }\n }\n }\n\n return attrStr;\n};\n\nBuilder.prototype.buildObjectNode = function (val, key, attrStr, level) {\n if (val === \"\") {\n if (key[0] === \"?\") return this.indentate(level) + '<' + key + attrStr + '?' + this.tagEndChar;\n else {\n return this.indentate(level) + '<' + key + attrStr + this.closeTag(key) + this.tagEndChar;\n }\n } else {\n\n let tagEndExp = '' + val + tagEndExp);\n } else if (this.options.commentPropName !== false && key === this.options.commentPropName && piClosingChar.length === 0) {\n return this.indentate(level) + `` + this.newLine;\n } else {\n return (\n this.indentate(level) + '<' + key + attrStr + piClosingChar + this.tagEndChar +\n val +\n this.indentate(level) + tagEndExp);\n }\n }\n}\n\nBuilder.prototype.closeTag = function (key) {\n let closeTag = \"\";\n if (this.options.unpairedTags.indexOf(key) !== -1) { //unpaired\n if (!this.options.suppressUnpairedNode) closeTag = \"/\"\n } else if (this.options.suppressEmptyNode) { //empty\n closeTag = \"/\";\n } else {\n closeTag = `>` + this.newLine;\n } else if (this.options.commentPropName !== false && key === this.options.commentPropName) {\n return this.indentate(level) + `` + this.newLine;\n } else if (key[0] === \"?\") {//PI tag\n return this.indentate(level) + '<' + key + attrStr + '?' + this.tagEndChar;\n } else {\n // Normal processing: apply tagValueProcessor and entity replacement\n let textValue = this.options.tagValueProcessor(key, val);\n textValue = this.replaceEntitiesValue(textValue);\n\n if (textValue === '') {\n return this.indentate(level) + '<' + key + attrStr + this.closeTag(key) + this.tagEndChar;\n } else {\n return this.indentate(level) + '<' + key + attrStr + '>' +\n textValue +\n ' 0 && this.options.processEntities) {\n for (let i = 0; i < this.options.entities.length; i++) {\n const entity = this.options.entities[i];\n textValue = textValue.replace(entity.regex, entity.val);\n }\n }\n return textValue;\n}\n\nfunction indentate(level) {\n return this.options.indentBy.repeat(level);\n}\n\nfunction isAttribute(name /*, options*/) {\n if (name.startsWith(this.options.attributeNamePrefix) && name !== this.options.textNodeName) {\n return name.substr(this.attrPrefixLen);\n } else {\n return false;\n }\n}","export default function getIgnoreAttributesFn(ignoreAttributes) {\n if (typeof ignoreAttributes === 'function') {\n return ignoreAttributes\n }\n if (Array.isArray(ignoreAttributes)) {\n return (attrName) => {\n for (const pattern of ignoreAttributes) {\n if (typeof pattern === 'string' && attrName === pattern) {\n return true\n }\n if (pattern instanceof RegExp && pattern.test(attrName)) {\n return true\n }\n }\n }\n }\n return () => false\n}","// Re-export from fast-xml-builder for backward compatibility\nimport XMLBuilder from 'fast-xml-builder';\nexport default XMLBuilder;\n\n// If there are any named exports you also want to re-export:\nexport * from 'fast-xml-builder';","'use strict';\n\nimport { validate } from './validator.js';\nimport XMLParser from './xmlparser/XMLParser.js';\nimport XMLBuilder from './xmlbuilder/json2xml.js';\n\nconst XMLValidator = {\n validate: validate\n}\nexport {\n XMLParser,\n XMLValidator,\n XMLBuilder\n};"],"names":["root","factory","exports","module","define","amd","this","__webpack_require__","definition","key","o","Object","defineProperty","enumerable","get","obj","prop","prototype","hasOwnProperty","call","Symbol","toStringTag","value","nameStartChar","regexName","RegExp","getAllMatches","string","regex","matches","match","exec","allmatches","startIndex","lastIndex","length","len","index","push","isName","DANGEROUS_PROPERTY_NAMES","criticalProperties","defaultOptions","allowBooleanAttributes","unpairedTags","validate","xmlData","options","assign","tags","tagFound","reachedRoot","substr","i","readPI","err","isWhiteSpace","getErrorObject","getLineNumberForPosition","tagStartPos","readCommentAndCDATA","closingTag","tagName","trim","substring","validateTagName","result","readAttributeStr","attrStr","attrStrStart","isValid","validateAttributeString","code","msg","line","tagClosed","otg","pop","openPos","col","indexOf","afterAmp","validateAmpersand","JSON","stringify","map","t","replace","char","start","tagname","angleBracketsCount","doubleQuote","singleQuote","startChar","validAttrStrRegxp","attrNames","getPositionFromMatch","undefined","attrName","validateAttrName","re","validateNumberAmpersand","count","message","lineNumber","lines","split","defaultOnDangerousProperty","name","includes","preserveOrder","attributeNamePrefix","attributesGroupName","textNodeName","ignoreAttributes","removeNSPrefix","parseTagValue","parseAttributeValue","trimValues","cdataPropName","numberParseOptions","hex","leadingZeros","eNotation","tagValueProcessor","val","attributeValueProcessor","stopNodes","alwaysCreateTextNode","isArray","commentPropName","processEntities","htmlEntities","entityDecoder","ignoreDeclaration","ignorePiTags","transformTagName","transformAttributeName","updateTag","jPath","attrs","captureMetaData","maxNestedTags","strictReservedNames","onDangerousProperty","validatePropertyName","propertyName","optionName","normalized","toLowerCase","some","dangerous","Error","normalizeProcessEntities","enabled","maxEntitySize","maxExpansionDepth","maxTotalExpansions","Infinity","maxExpandedLength","maxEntityCount","allowedTags","tagFilter","appliesTo","Math","max","_value$maxEntitySize","_value$maxExpansionDe","_value$maxTotalExpans","_value$maxExpandedLen","_value$maxEntityCount","_value$allowedTags","_value$tagFilter","_value$appliesTo","METADATA_SYMBOL","buildOptions","built","_i","_propertyNameOptions","_propertyNameOptions$","unpairedTagsSet","Set","Array","node","startsWith","XmlNode","child","create","_proto","add","_this$child$push","addChild","_this$child$push2","_this$child$push3","keys","getMetaDataSymbol","DocTypeReader","suppressValidationErr","readDocType","entities","entityCount","hasBody","comment","hasSeq","entityName","_this$readEntityExp","readEntityExp","readElementExp","readNotationExp","skipWhitespace","test","validateEntityName","toUpperCase","entityValue","_this$readIdentifierV","readIdentifierVal","notationName","identifierType","publicIdentifier","systemIdentifier","_this$readIdentifierV2","_this$readIdentifierV3","_this$readIdentifierV4","type","identifierVal","elementName","contentModel","readAttlistExp","attributeName","attributeType","allowedNotations","notation","join","defaultValue","_this$readIdentifierV5","data","seq","j","hexRegex","numRegex","consider","decimalPoint","infinity","eNotationRegx","MatcherView","constructor","matcher","_matcher","separator","getCurrentTag","path","tag","getCurrentNamespace","namespace","getAttrValue","values","hasAttr","current","getPosition","position","getCounter","counter","getIndex","getDepth","toString","includeNamespace","toArray","n","expression","matchesAny","exprSet","Matcher","siblingStacks","_pathStringCache","_view","attrValues","currentLevel","Map","siblings","siblingKey","set","updateCurrent","sep","reset","segments","hasDeepWildcard","_matchWithDeepWildcard","_matchSimple","_matchSegment","pathIdx","segIdx","segment","nextSeg","found","isCurrentNode","attrValue","String","positionValue","snapshot","restore","readOnly","Expression","pattern","_parse","_hasDeepWildcard","seg","_hasAttributeCondition","_hasPositionSelector","currentPart","_parseSegment","part","bracketContent","withoutBrackets","bracketMatch","content","slice","tagAndPosition","nsIndex","positionMatch","colonIndex","lastIndexOf","tagPart","posPart","eqIndex","nthMatch","parseInt","hasAttributeCondition","hasPositionSelector","ExpressionSet","_byDepthAndTag","_wildcardByDepth","_deepWildcards","_patterns","_sealed","TypeError","has","depth","lastSeg","addAll","expressions","expr","size","seal","isSealed","findMatch","exactKey","exactBucket","wildcardBucket","CURRENCY","cent","pound","curren","yen","euro","dollar","fnof","inr","af","birr","peso","rub","won","yuan","cedil","XML","amp","apos","gt","lt","quot","COMMON_HTML","nbsp","copy","reg","trade","mdash","ndash","hellip","laquo","raquo","lsquo","rsquo","ldquo","rdquo","bull","para","sect","deg","frac12","frac14","frac34","SPECIAL_CHARS","ch","mergeEntityMaps","maps","out","raw","LIMIT_TIER_EXTERNAL","LIMIT_TIER_BASE","LIMIT_TIER_ALL","NCR_LEVEL","freeze","allow","leave","remove","throw","XML10_ALLOWED_C0","EntityDecoder","_limit","limit","_maxTotalExpansions","_maxExpandedLength","_postCheck","postCheck","r","_limitTiers","applyLimitsTo","_numericAllowed","numericAllowed","_baseMap","DEFAULT_XML_ENTITIES","namedEntities","_externalMap","_inputMap","_totalExpansions","_expandedLength","_removeSet","_leaveSet","ncrCfg","ncr","xmlVersion","onLevel","nullLevel","onNCR","nullNCR","parseNCRConfig","_ncrXmlVersion","_ncrOnLevel","_ncrNullLevel","setExternalEntities","addExternalEntity","addInputEntities","setXmlVersion","version","decode","str","original","chunks","last","limitExpansions","limitLength","checkLimits","charCodeAt","token","replacement","tier","ncrResult","_resolveNCR","resolved","_resolveName","_tierCounts","delta","_classifyNCR","cp","_applyNCRAction","action","fromCodePoint","padStart","second","Number","isNaN","minimum","effective","_extends","bind","e","arguments","apply","extractRawAttributes","prefixedAttrs","rawAttrs","extractNamespace","rawTagName","ns","OrderedObjParser","currentNode","tagsNodeStack","parseXml","parseTextData","resolveNameSpace","buildAttributesMap","isItStopNode","replaceEntitiesValue","readStopNodeData","saveTextToParentTag","ignoreAttributesFn","_step","_iterator","_createForOfIteratorHelperLoose","done","entityExpansionCount","currentExpandedLength","readonlyMatcher","isCurrentNodeStopNode","stopNodeExpressionsSet","stopNodesOpts","stopNodeExp","dontTrim","hasAttributes","isLeafNode","escapeEntities","jPathOrMatcher","newval","parseValue","prefix","charAt","attrsRegx","processedVals","hasRawAttrs","rawAttrsForMatcher","oldVal","jPathStr","hasAttrs","aName","sanitizeName","newVal","attrCollection","xmlObj","xmlNode","textData","docTypeReader","xmlLen","c1","closeIndex","findClosingIndex","lastTagName","tagData","readTagExp","attsMap","tagExp","childNode","attrExpPresent","endIndex","_ref","_ref2","context","min","_transformTagName","lastTag","isSelfClosing","tagContent","_transformTagName2","entityConfig","parentNode","errMsg","closingIndex","findClosingChar","closingChar","attrBoundary","hasTabInQuote","closeCode0","closeCode1","boundary","k","tagExpWithClosingIndex","separatorIndex","search","trimStart","openTagCount","xmllen","shouldParse","trimmedStr","skipLike","numStr","window","parse_int","isFinite","sign","eChar","eAdjacentToLeadingZeros","resolveEnotation","numTrimmedByZeros","decimalAdjacentToLeadingZeros","num","parsedStr","isPositive","handleInfinity","toNumber","fn","newTagName","stripAttributePrefix","prettify","compress","arr","text","compressedObj","tagObj","property","propName","isLeaf","isLeafTag","assignAttributes","attrMap","atrrName","rawAttrName","propCount","XMLParser","externalEntities","parse","validationOption","orderedObjParser","orderedResult","addEntity","toXml","jArray","indentation","format","indentBy","stopNodeExpressions","arrToStr","xmlStr","isPreviousElementTag","extractAttributeValues","isStopNode","checkStopNode","tagText","attStr","attr_to_str","tempInd","piTextNodeName","newIdentation","tagStart","tagValue","getRawContent","suppressUnpairedNode","suppressEmptyNode","endsWith","attr","item","attr_to_str_raw","nestedContent","attrVal","suppressBooleanAttributes","textValue","entity","a","oneListGroup","Builder","isAttribute","attrPrefixLen","processTextOrObjNode","indentate","tagEndChar","newLine","object","level","extractAttributes","rawContent","buildRawContent","buildAttributesForStopNode","buildObjectNode","j2x","buildTextValNode","repeat","build","jObj","buildFromOrderedJs","arrayNodeName","isCurrentStopNode","Date","buildAttrPairStr","closeTag","arrLen","listTagVal","listTagAttr","Ks","L","attrGroup","attrKey","nestedAttrs","cleanKey","tagEndExp","piClosingChar","XMLValidator"],"sourceRoot":""} \ No newline at end of file diff --git a/lib/fxparser.min.js b/lib/fxparser.min.js index c2f2abdc..d1169fa2 100644 --- a/lib/fxparser.min.js +++ b/lib/fxparser.min.js @@ -1,2 +1,2 @@ -!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.XMLParser=e():t.XMLParser=e()}(this,()=>(()=>{"use strict";var t={d:(e,r)=>{for(var n in r)t.o(r,n)&&!t.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:r[n]})},o:(t,e)=>Object.prototype.hasOwnProperty.call(t,e),r:t=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})}},e={};t.r(e),t.d(e,{default:()=>Tt});var r=":A-Za-z_\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD",n=new RegExp("^["+r+"]["+r+"\\-.\\d\\u00B7\\u0300-\\u036F\\u203F-\\u2040]*$");function i(t,e){for(var r=[],n=e.exec(t);n;){var i=[];i.startIndex=e.lastIndex-n[0].length;for(var a=n.length,s=0;s0?this.child.push(((r={})[t.tagname]=t.child,r[":@"]=t[":@"],r)):this.child.push(((n={})[t.tagname]=t.child,n)),void 0!==e&&(this.child[this.child.length-1][d]={startIndex:e})},t.getMetaDataSymbol=function(){return d},t}(),f=function(){function t(t){this.suppressValidationErr=!t,this.options=t}var e=t.prototype;return e.readDocType=function(t,e){var r=Object.create(null),n=0;if("O"!==t[e+3]||"C"!==t[e+4]||"T"!==t[e+5]||"Y"!==t[e+6]||"P"!==t[e+7]||"E"!==t[e+8])throw new Error("Invalid Tag instead of DOCTYPE");e+=9;for(var i=1,a=!1,s=!1;e"===t[e]){if(s?"-"===t[e-1]&&"-"===t[e-2]&&(s=!1,i--):i--,0===i)break}else"["===t[e]?a=!0:t[e];else{if(a&&x(t,"!ENTITY",e)){e+=7;var o=void 0,l=void 0,h=this.readEntityExp(t,e+1,this.suppressValidationErr);if(o=h[0],l=h[1],e=h[2],-1===l.indexOf("&")){if(!1!==this.options.enabled&&null!=this.options.maxEntityCount&&n>=this.options.maxEntityCount)throw new Error("Entity count ("+(n+1)+") exceeds maximum allowed ("+this.options.maxEntityCount+")");var u=o.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");r[o]={regx:RegExp("&"+u+";","g"),val:l},n++}}else if(a&&x(t,"!ELEMENT",e))e+=8,e=this.readElementExp(t,e+1).index;else if(a&&x(t,"!ATTLIST",e))e+=8;else if(a&&x(t,"!NOTATION",e))e+=9,e=this.readNotationExp(t,e+1,this.suppressValidationErr).index;else{if(!x(t,"!--",e))throw new Error("Invalid DOCTYPE");s=!0}i++}if(0!==i)throw new Error("Unclosed DOCTYPE");return{entities:r,i:e}},e.readEntityExp=function(t,e){for(var r=e=m(t,e);ethis.options.maxEntitySize)throw new Error('Entity "'+n+'" size ('+i.length+") exceeds maximum allowed size ("+this.options.maxEntitySize+")");return[n,i,--e]},e.readNotationExp=function(t,e){for(var r=e=m(t,e);et.length)&&(e=t.length);for(var r=0,n=Array(e);r0?t[t.length-1].tag:void 0}getCurrentNamespace(){const t=this._matcher.path;return t.length>0?t[t.length-1].namespace:void 0}getAttrValue(t){const e=this._matcher.path;if(0!==e.length)return e[e.length-1].values?.[t]}hasAttr(t){const e=this._matcher.path;if(0===e.length)return!1;const r=e[e.length-1];return void 0!==r.values&&t in r.values}getPosition(){const t=this._matcher.path;return 0===t.length?-1:t[t.length-1].position??0}getCounter(){const t=this._matcher.path;return 0===t.length?-1:t[t.length-1].counter??0}getIndex(){return this.getPosition()}getDepth(){return this._matcher.path.length}toString(t,e=!0){return this._matcher.toString(t,e)}toArray(){return this._matcher.path.map(t=>t.tag)}matches(t){return this._matcher.matches(t)}matchesAny(t){return t.matchesAny(this._matcher)}}class S{constructor(t={}){this.separator=t.separator||".",this.path=[],this.siblingStacks=[],this._pathStringCache=null,this._view=new w(this)}push(t,e=null,r=null){this._pathStringCache=null,this.path.length>0&&(this.path[this.path.length-1].values=void 0);const n=this.path.length;this.siblingStacks[n]||(this.siblingStacks[n]=new Map);const i=this.siblingStacks[n],a=r?`${r}:${t}`:t,s=i.get(a)||0;let o=0;for(const t of i.values())o+=t;i.set(a,s+1);const l={tag:t,position:o,counter:s};null!=r&&(l.namespace=r),null!=e&&(l.values=e),this.path.push(l)}pop(){if(0===this.path.length)return;this._pathStringCache=null;const t=this.path.pop();return this.siblingStacks.length>this.path.length+1&&(this.siblingStacks.length=this.path.length+1),t}updateCurrent(t){if(this.path.length>0){const e=this.path[this.path.length-1];null!=t&&(e.values=t)}}getCurrentTag(){return this.path.length>0?this.path[this.path.length-1].tag:void 0}getCurrentNamespace(){return this.path.length>0?this.path[this.path.length-1].namespace:void 0}getAttrValue(t){if(0!==this.path.length)return this.path[this.path.length-1].values?.[t]}hasAttr(t){if(0===this.path.length)return!1;const e=this.path[this.path.length-1];return void 0!==e.values&&t in e.values}getPosition(){return 0===this.path.length?-1:this.path[this.path.length-1].position??0}getCounter(){return 0===this.path.length?-1:this.path[this.path.length-1].counter??0}getIndex(){return this.getPosition()}getDepth(){return this.path.length}toString(t,e=!0){const r=t||this.separator;if(r===this.separator&&!0===e){if(null!==this._pathStringCache)return this._pathStringCache;const t=this.path.map(t=>t.namespace?`${t.namespace}:${t.tag}`:t.tag).join(r);return this._pathStringCache=t,t}return this.path.map(t=>e&&t.namespace?`${t.namespace}:${t.tag}`:t.tag).join(r)}toArray(){return this.path.map(t=>t.tag)}reset(){this._pathStringCache=null,this.path=[],this.siblingStacks=[]}matches(t){const e=t.segments;return 0!==e.length&&(t.hasDeepWildcard()?this._matchWithDeepWildcard(e):this._matchSimple(e))}_matchSimple(t){if(this.path.length!==t.length)return!1;for(let e=0;e=0&&e>=0;){const n=t[r];if("deep-wildcard"===n.type){if(r--,r<0)return!0;const n=t[r];let i=!1;for(let t=e;t>=0;t--)if(this._matchSegment(n,this.path[t],t===this.path.length-1)){e=t-1,r--,i=!0;break}if(!i)return!1}else{if(!this._matchSegment(n,this.path[e],e===this.path.length-1))return!1;e--,r--}}return r<0}_matchSegment(t,e,r){if("*"!==t.tag&&t.tag!==e.tag)return!1;if(void 0!==t.namespace&&"*"!==t.namespace&&t.namespace!==e.namespace)return!1;if(void 0!==t.attrName){if(!r)return!1;if(!e.values||!(t.attrName in e.values))return!1;if(void 0!==t.attrValue&&String(e.values[t.attrName])!==String(t.attrValue))return!1}if(void 0!==t.position){if(!r)return!1;const n=e.counter??0;if("first"===t.position&&0!==n)return!1;if("odd"===t.position&&n%2!=1)return!1;if("even"===t.position&&n%2!=0)return!1;if("nth"===t.position&&n!==t.positionValue)return!1}return!0}matchesAny(t){return t.matchesAny(this)}snapshot(){return{path:this.path.map(t=>({...t})),siblingStacks:this.siblingStacks.map(t=>new Map(t))}}restore(t){this._pathStringCache=null,this.path=t.path.map(t=>({...t})),this.siblingStacks=t.siblingStacks.map(t=>new Map(t))}readOnly(){return this._view}}class T{constructor(t,e={},r){this.pattern=t,this.separator=e.separator||".",this.segments=this._parse(t),this.data=r,this._hasDeepWildcard=this.segments.some(t=>"deep-wildcard"===t.type),this._hasAttributeCondition=this.segments.some(t=>void 0!==t.attrName),this._hasPositionSelector=this.segments.some(t=>void 0!==t.position)}_parse(t){const e=[];let r=0,n="";for(;r"},lt:{regex:/&(lt|#0*60|#x0*3[Cc]);/g,val:"<"},quot:{regex:/&(quot|#0*34|#x0*22);/g,val:'"'}},I=/&(amp|#0*38|#x0*26);/g,P=new Set("!?\\\\/[]$%{}^&*()<>|+");function O(t){for(const e of t)if(P.has(e))throw new Error(`[EntityReplacer] Invalid character '${e}' in entity name: "${t}"`);return t}function D(t){return t.replace(/[.\-+*:]/g,"\\$&")}function M(t,e,r=!1){return!1===t||null===t?null:!0===t?e:void 0===t?r?e:null:"object"==typeof t?t:null}function L(t){const e=[];for(const r of Object.keys(t)){const n=t[r];if("object"==typeof n&&null!==n&&void 0!==n.val)e.push([r,{regex:n.regex??n.regx,val:n.val}]);else if("string"==typeof n){if(-1!==n.indexOf("&"))continue;O(r),e.push([r,{regex:new RegExp("&"+D(r)+";","g"),val:n}])}}return e}class k{constructor(t={}){var e;this._defaultTable=M(t.default,A,!0),this._systemTable=M(t.system,null,!1),this._ampEnabled=!1!==t.amp&&null!==t.amp,this._maxTotalExpansions=t.maxTotalExpansions||0,this._maxExpandedLength=t.maxExpandedLength||0,this._applyLimitsTo="all"===(e=t.applyLimitsTo??"external")?"all":"string"==typeof e?new Set([e]):Array.isArray(e)?new Set(e):new Set(["external"]),this._postCheck="function"==typeof t.postCheck?t.postCheck:t=>t,this._limitExternal="all"===this._applyLimitsTo||this._applyLimitsTo instanceof Set&&this._applyLimitsTo.has("external"),this._limitSystem="all"===this._applyLimitsTo||this._applyLimitsTo instanceof Set&&this._applyLimitsTo.has("system"),this._limitDefault="all"===this._applyLimitsTo||this._applyLimitsTo instanceof Set&&this._applyLimitsTo.has("default"),this._defaultEntries=this._defaultTable?Object.entries(this._defaultTable):[],this._systemEntries=this._systemTable?Object.entries(this._systemTable):[],this._persistentEntries=[],this._inputEntries=[],this._totalExpansions=0,this._expandedLength=0}setExternalEntities(t){this._persistentEntries=L(t)}addExternalEntity(t,e){O(t),"string"==typeof e&&-1===e.indexOf("&")&&this._persistentEntries.push([t,{regex:new RegExp("&"+D(t)+";","g"),val:e}])}addInputEntities(t){this._totalExpansions=0,this._expandedLength=0,this._inputEntries=L(t)}reset(){this._inputEntries=[],this._totalExpansions=0,this._expandedLength=0}replace(t){if("string"!=typeof t||0===t.length)return t;if(-1===t.indexOf("&"))return t;const e=t;return this._persistentEntries.length>0&&(t=this._applyEntries(t,this._persistentEntries,this._limitExternal)),this._inputEntries.length>0&&-1!==t.indexOf("&")&&(t=this._applyEntries(t,this._inputEntries,this._limitExternal)),this._defaultEntries.length>0&&-1!==t.indexOf("&")&&(t=this._applyEntries(t,this._defaultEntries,this._limitDefault)),this._systemEntries.length>0&&-1!==t.indexOf("&")&&(t=this._applyEntries(t,this._systemEntries,this._limitSystem)),this._ampEnabled&&-1!==t.indexOf("&")&&(t=t.replace(I,"&")),this._postCheck(t,e)}parse(t){return this.replace(t)}_applyEntries(t,e,r){const n=r&&this._maxTotalExpansions>0,i=r&&this._maxExpandedLength>0,a=n||i;for(let r=0;r(e++,"function"==typeof s.val?s.val(...t):s.val)),e>0&&(this._totalExpansions+=e,this._totalExpansions>this._maxTotalExpansions))throw new Error(`[EntityReplacer] Entity expansion count limit exceeded: ${this._totalExpansions} > ${this._maxTotalExpansions}`)}else if(i&&!n){const e=t.length,r=(t=t.replace(s.regex,s.val)).length-e;if(r>0&&(this._expandedLength+=r,this._expandedLength>this._maxExpandedLength))throw new Error(`[EntityReplacer] Expanded content length limit exceeded: ${this._expandedLength} > ${this._maxExpandedLength}`)}else{const e=t.length;let r=0;if(t=t.replace(s.regex,(...t)=>(r++,"function"==typeof s.val?s.val(...t):s.val)),r>0&&(this._totalExpansions+=r,this._totalExpansions>this._maxTotalExpansions))throw new Error(`[EntityReplacer] Entity expansion count limit exceeded: ${this._totalExpansions} > ${this._maxTotalExpansions}`);const n=t.length-e;if(n>0&&(this._expandedLength+=n,this._expandedLength>this._maxExpandedLength))throw new Error(`[EntityReplacer] Expanded content length limit exceeded: ${this._expandedLength} > ${this._maxExpandedLength}`)}else t=t.replace(s.regex,s.val)}return t}}const j={nbsp:{regex:/&(nbsp|#0*160|#x0*[Aa]0);/g,val:" "},copy:{regex:/&(copy|#0*169|#x0*[Aa]9);/g,val:"©"},reg:{regex:/&(reg|#0*174|#x0*[Aa][Ee]);/g,val:"®"},trade:{regex:/&(trade|#0*8482|#x0*2122);/g,val:"™"},mdash:{regex:/&(mdash|#0*8212|#x0*2014);/g,val:"—"},ndash:{regex:/&(ndash|#0*8211|#x0*2013);/g,val:"–"},hellip:{regex:/&(hellip|#0*8230|#x0*2026);/g,val:"…"},laquo:{regex:/&(laquo|#0*171|#x0*[Aa][Bb]);/g,val:"«"},raquo:{regex:/&(raquo|#0*187|#x0*[Bb][Bb]);/g,val:"»"},lsquo:{regex:/&(lsquo|#0*8216|#x0*2018);/g,val:"‘"},rsquo:{regex:/&(rsquo|#0*8217|#x0*2019);/g,val:"’"},ldquo:{regex:/&(ldquo|#0*8220|#x0*201[Cc]);/g,val:"“"},rdquo:{regex:/&(rdquo|#0*8221|#x0*201[Dd]);/g,val:"”"},bull:{regex:/&(bull|#0*8226|#x0*2022);/g,val:"•"},para:{regex:/&(para|#0*182|#x0*[Bb]6);/g,val:"¶"},sect:{regex:/&(sect|#0*167|#x0*[Aa]7);/g,val:"§"},deg:{regex:/&(deg|#0*176|#x0*[Bb]0);/g,val:"°"},frac12:{regex:/&(frac12|#0*189|#x0*[Bb][Dd]);/g,val:"½"},frac14:{regex:/&(frac14|#0*188|#x0*[Bb][Cc]);/g,val:"¼"},frac34:{regex:/&(frac34|#0*190|#x0*[Bb][Ee]);/g,val:"¾"},inr:{regex:/&(inr|#0*8377);/g,val:"₹"}},V={cent:{regex:/&(cent|#0*162|#x0*[Aa]2);/g,val:"¢"},pound:{regex:/&(pound|#0*163|#x0*[Aa]3);/g,val:"£"},yen:{regex:/&(yen|#0*165|#x0*[Aa]5);/g,val:"¥"},euro:{regex:/&(euro|#0*8364|#x0*20[Aa][Cc]);/g,val:"€"},inr:{regex:/&(inr|#0*8377|#x0*20[Bb]9);/g,val:"₹"},curren:{regex:/&(curren|#0*164|#x0*[Aa]4);/g,val:"¤"},fnof:{regex:/&(fnof|#0*402|#x0*192);/g,val:"ƒ"}},$={num_dec:{regex:/�*([0-9]{1,7});/g,val:(t,e)=>F(e,10,"&#")},num_hex:{regex:/�*([0-9a-fA-F]{1,6});/g,val:(t,e)=>F(e,16,"&#x")}};function F(t,e,r){const n=Number.parseInt(t,e);return n>=0&&n<=1114111?String.fromCodePoint(n):r+t+";"}function R(){return R=Object.assign?Object.assign.bind():function(t){for(var e=1;e0){var r=t.substring(0,e);if("xmlns"!==r)return r}}}var W=function(t){var e;this.options=t,this.currentNode=null,this.tagsNodeStack=[],this.parseXml=G,this.parseTextData=Y,this.resolveNameSpace=q,this.buildAttributesMap=X,this.isItStopNode=Q,this.replaceEntitiesValue=J,this.readStopNodeData=rt,this.saveTextToParentTag=K,this.addChild=Z,this.ignoreAttributesFn="function"==typeof(e=this.options.ignoreAttributes)?e:Array.isArray(e)?function(t){for(var r,n=function(t,e){var r="undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(r)return(r=r.call(t)).next.bind(r);if(Array.isArray(t)||(r=function(t,e){if(t){if("string"==typeof t)return _(t,e);var r={}.toString.call(t).slice(8,-1);return"Object"===r&&t.constructor&&(r=t.constructor.name),"Map"===r||"Set"===r?Array.from(t):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?_(t,e):void 0}}(t))||e&&t&&"number"==typeof t.length){r&&(t=r);var n=0;return function(){return n>=t.length?{done:!0}:{done:!1,value:t[n++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}(e);!(r=n()).done;){var i=r.value;if("string"==typeof i&&t===i)return!0;if(i instanceof RegExp&&i.test(t))return!0}}:function(){return!1},this.entityExpansionCount=0,this.currentExpandedLength=0,this.entityReplacer=new k({default:!0,system:this.options.htmlEntities?R({},j,$,V):{},maxTotalExpansions:this.options.processEntities.maxTotalExpansions,maxExpandedLength:this.options.processEntities.maxExpandedLength,applyLimitsTo:"all"}),this.matcher=new S,this.readonlyMatcher=this.matcher.readOnly(),this.isCurrentNodeStopNode=!1,this.stopNodeExpressionsSet=new C;var r=this.options.stopNodes;if(r&&r.length>0){for(var n=0;n0)){s||(t=this.replaceEntitiesValue(t,e,r));var l=o.jPath?r.toString():r,h=o.tagValueProcessor(e,t,l,i,a);return null==h?t:typeof h!=typeof t||h!==t?h:o.trimValues||t.trim()===t?nt(t,o.parseTagValue,o.numberParseOptions):t}}function q(t){if(this.options.removeNSPrefix){var e=t.split(":"),r="/"===t.charAt(0)?"/":"";if("xmlns"===e[0])return"";2===e.length&&(t=r+e[1])}return t}var z=new RegExp("([^\\s=]+)\\s*(=\\s*(['\"])([\\s\\S]*?)\\3)?","gm");function X(t,e,r){var n=this.options;if(!0!==n.ignoreAttributes&&"string"==typeof t){for(var a=i(t,z),s=a.length,o={},l=new Array(s),h=!1,u={},p=0;p",o,"Closing Tag is not closed."),u=t.substring(o+2,h).trim();if(i.removeNSPrefix){var p=u.indexOf(":");-1!==p&&(u=u.substr(p+1))}u=it(i.transformTagName,u,"",i).tagName,r&&(n=this.saveTextToParentTag(n,r,this.readonlyMatcher));var d=this.matcher.getCurrentTag();if(u&&i.unpairedTagsSet.has(u))throw new Error("Unpaired tag can not be used as closing tag: ");d&&i.unpairedTagsSet.has(d)&&(this.matcher.pop(),this.tagsNodeStack.pop()),this.matcher.pop(),this.isCurrentNodeStopNode=!1,r=this.tagsNodeStack.pop(),n="",o=h}else if(63===l){var g=et(t,o,!1,"?>");if(!g)throw new Error("Pi Tag is not closed.");if(n=this.saveTextToParentTag(n,r,this.readonlyMatcher),i.ignoreDeclaration&&"?xml"===g.tagName||i.ignorePiTags);else{var m=new c(g.tagName);m.add(i.textNodeName,""),g.tagName!==g.tagExp&&g.attrExpPresent&&(m[":@"]=this.buildAttributesMap(g.tagExp,this.matcher,g.tagName)),this.addChild(r,m,this.readonlyMatcher,o)}o=g.closeIndex+1}else if(33===l&&45===t.charCodeAt(o+2)&&45===t.charCodeAt(o+3)){var x=H(t,"--\x3e",o+4,"Comment is not closed.");if(i.commentPropName){var v,E=t.substring(o+4,x-2);n=this.saveTextToParentTag(n,r,this.readonlyMatcher),r.add(i.commentPropName,[(v={},v[i.textNodeName]=E,v)])}o=x}else if(33===l&&68===t.charCodeAt(o+2)){var y=a.readDocType(t,o);this.entityReplacer.addInputEntities(y.entities),o=y.i}else if(33===l&&91===t.charCodeAt(o+2)){var b=H(t,"]]>",o,"CDATA is not closed.")-2,N=t.substring(o+9,b);n=this.saveTextToParentTag(n,r,this.readonlyMatcher);var _,w=this.parseTextData(N,r.tagname,this.readonlyMatcher,!0,!1,!0,!0);null==w&&(w=""),i.cdataPropName?r.add(i.cdataPropName,[(_={},_[i.textNodeName]=N,_)]):r.add(i.textNodeName,w),o=b+2}else{var S=et(t,o,i.removeNSPrefix);if(!S){var T=t.substring(Math.max(0,o-50),Math.min(s,o+50));throw new Error("readTagExp returned undefined at position "+o+'. Context: "'+T+'"')}var C=S.tagName,A=S.rawTagName,I=S.tagExp,P=S.attrExpPresent,O=S.closeIndex,D=it(i.transformTagName,C,I,i);if(C=D.tagName,I=D.tagExp,i.strictReservedNames&&(C===i.commentPropName||C===i.cdataPropName||C===i.textNodeName||C===i.attributesGroupName))throw new Error("Invalid tag name: "+C);r&&n&&"!xml"!==r.tagname&&(n=this.saveTextToParentTag(n,r,this.readonlyMatcher,!1));var M=r;M&&i.unpairedTagsSet.has(M.tagname)&&(r=this.tagsNodeStack.pop(),this.matcher.pop());var L=!1;I.length>0&&I.lastIndexOf("/")===I.length-1&&(L=!0,I="/"===C[C.length-1]?C=C.substr(0,C.length-1):I.substr(0,I.length-1),P=C!==I);var k,j=null;k=U(A),C!==e.tagname&&this.matcher.push(C,{},k),C!==I&&P&&(j=this.buildAttributesMap(I,this.matcher,C))&&B(j,i),C!==e.tagname&&(this.isCurrentNodeStopNode=this.isItStopNode());var V=o;if(this.isCurrentNodeStopNode){var $="";if(L)o=S.closeIndex;else if(i.unpairedTagsSet.has(C))o=S.closeIndex;else{var F=this.readStopNodeData(t,A,O+1);if(!F)throw new Error("Unexpected end of "+A);o=F.i,$=F.tagContent}var R=new c(C);j&&(R[":@"]=j),R.add(i.textNodeName,$),this.matcher.pop(),this.isCurrentNodeStopNode=!1,this.addChild(r,R,this.readonlyMatcher,V)}else{if(L){var W=it(i.transformTagName,C,I,i);C=W.tagName,I=W.tagExp;var Y=new c(C);j&&(Y[":@"]=j),this.addChild(r,Y,this.readonlyMatcher,V),this.matcher.pop(),this.isCurrentNodeStopNode=!1}else{if(i.unpairedTagsSet.has(C)){var q=new c(C);j&&(q[":@"]=j),this.addChild(r,q,this.readonlyMatcher,V),this.matcher.pop(),this.isCurrentNodeStopNode=!1,o=S.closeIndex;continue}var z=new c(C);if(this.tagsNodeStack.length>i.maxNestedTags)throw new Error("Maximum nested tags exceeded");this.tagsNodeStack.push(r),j&&(z[":@"]=j),this.addChild(r,z,this.readonlyMatcher,V),r=z}n="",o=O}}}else n+=t[o];return e.child};function Z(t,e,r,n){this.options.captureMetaData||(n=void 0);var i=this.options.jPath?r.toString():r,a=this.options.updateTag(e.tagname,i,e[":@"]);!1===a||("string"==typeof a?(e.tagname=a,t.addChild(e,n)):t.addChild(e,n))}function J(t,e,r){var n=this.options.processEntities;if(!n||!n.enabled)return t;if(n.allowedTags){var i=this.options.jPath?r.toString():r;if(!(Array.isArray(n.allowedTags)?n.allowedTags.includes(e):n.allowedTags(e,i)))return t}if(n.tagFilter){var a=this.options.jPath?r.toString():r;if(!n.tagFilter(e,a))return t}return this.entityReplacer.replace(t)}function K(t,e,r,n){return t&&(void 0===n&&(n=0===e.child.length),void 0!==(t=this.parseTextData(t,e.tagname,r,!1,!!e[":@"]&&0!==Object.keys(e[":@"]).length,n))&&""!==t&&e.add(this.options.textNodeName,t),t=""),t}function Q(){return 0!==this.stopNodeExpressionsSet.size&&this.matcher.matchesAny(this.stopNodeExpressionsSet)}function H(t,e,r,n){var i=t.indexOf(e,r);if(-1===i)throw new Error(n);return i+e.length-1}function tt(t,e,r,n){var i=t.indexOf(e,r);if(-1===i)throw new Error(n);return i}function et(t,e,r,n){void 0===n&&(n=">");var i=function(t,e,r){void 0===r&&(r=">");for(var n=0,i=[],a=t.length,s=r.charCodeAt(0),o=r.length>1?r.charCodeAt(1):-1,l=e;l",r,e+" is not closed");if(t.substring(r+2,o).trim()===e&&0===--i)return{tagContent:t.substring(n,r),i:o};r=o}else if(63===s)r=H(t,"?>",r+1,"StopNode is not closed.");else if(33===s&&45===t.charCodeAt(r+2)&&45===t.charCodeAt(r+3))r=H(t,"--\x3e",r+3,"StopNode is not closed.");else if(33===s&&91===t.charCodeAt(r+2))r=H(t,"]]>",r,"StopNode is not closed.")-2;else{var l=et(t,r,">");l&&((l&&l.tagName)===e&&"/"!==l.tagExp[l.tagExp.length-1]&&i++,r=l.closeIndex)}}}function nt(t,e,r){if(e&&"string"==typeof t){var n=t.trim();return"true"===n||"false"!==n&&function(t,e={}){if(e=Object.assign({},b,e),!t||"string"!=typeof t)return t;let r=t.trim();if(0===r.length)return t;if(void 0!==e.skipLike&&e.skipLike.test(r))return t;if("0"===r)return 0;if(e.hex&&E.test(r))return function(t){if(parseInt)return parseInt(t,16);if(Number.parseInt)return Number.parseInt(t,16);if(window&&window.parseInt)return window.parseInt(t,16);throw new Error("parseInt, Number.parseInt, window.parseInt are not supported")}(r);if(isFinite(r)){if(r.includes("e")||r.includes("E"))return function(t,e,r){if(!r.eNotation)return t;const n=e.match(N);if(n){let i=n[1]||"";const a=-1===n[3].indexOf("e")?"E":"e",s=n[2],o=i?t[s.length+1]===a:t[s.length]===a;return s.length>1&&o?t:(1!==s.length||!n[3].startsWith(`.${a}`)&&n[3][0]!==a)&&s.length>0?r.leadingZeros&&!o?(e=(n[1]||"")+n[3],Number(e)):t:Number(e)}return t}(t,r,e);{const i=y.exec(r);if(i){const a=i[1]||"",s=i[2];let o=(n=i[3])&&-1!==n.indexOf(".")?("."===(n=n.replace(/0+$/,""))?n="0":"."===n[0]?n="0"+n:"."===n[n.length-1]&&(n=n.substring(0,n.length-1)),n):n;const l=a?"."===t[s.length+1]:"."===t[s.length];if(!e.leadingZeros&&(s.length>1||1===s.length&&!l))return t;{const n=Number(r),i=String(n);if(0===n)return n;if(-1!==i.search(/[eE]/))return e.eNotation?n:t;if(-1!==r.indexOf("."))return"0"===i||i===o||i===`${a}${o}`?n:t;let l=s?o:r;return s?l===i||a+l===i?n:t:l===i||l===a+i?n:t}}return t}}var n;return function(t,e,r){const n=e===1/0;switch(r.infinity.toLowerCase()){case"null":return null;case"infinity":return e;case"string":return n?"Infinity":"-Infinity";default:return t}}(t,Number(r),e)}(t,r)}return void 0!==t?t:""}function it(t,e,r,n){if(t){var i=t(e);r===e&&(r=i),e=i}return{tagName:e=at(e,n),tagExp:r}}function at(t,e){if(o.includes(t))throw new Error('[SECURITY] Invalid name: "'+t+'" is a reserved JavaScript keyword that could cause prototype pollution');return s.includes(t)?e.onDangerousProperty(t):t}var st=c.getMetaDataSymbol();function ot(t,e){if(!t||"object"!=typeof t)return{};if(!e)return t;var r={};for(var n in t)n.startsWith(e)?r[n.substring(e.length)]=t[n]:r[n]=t[n];return r}function lt(t,e,r,n){return ht(t,e,r,n)}function ht(t,e,r,n){for(var i,a={},s=0;s0&&(a[e.textNodeName]=i):void 0!==i&&(a[e.textNodeName]=i),a}function ut(t){for(var e=Object.keys(t),r=0;r5&&"xml"===n)return bt("InvalidXml","XML declaration allowed only at the start of the document.",wt(t,e));if("?"==t[e]&&">"==t[e+1]){e++;break}}return e}function mt(t,e){if(t.length>e+5&&"-"===t[e+1]&&"-"===t[e+2]){for(e+=3;e"===t[e+2]){e+=2;break}}else if(t.length>e+8&&"D"===t[e+1]&&"O"===t[e+2]&&"C"===t[e+3]&&"T"===t[e+4]&&"Y"===t[e+5]&&"P"===t[e+6]&&"E"===t[e+7]){var r=1;for(e+=8;e"===t[e]&&0===--r)break}else if(t.length>e+9&&"["===t[e+1]&&"C"===t[e+2]&&"D"===t[e+3]&&"A"===t[e+4]&&"T"===t[e+5]&&"A"===t[e+6]&&"["===t[e+7])for(e+=8;e"===t[e+2]){e+=2;break}return e}function xt(t,e){for(var r="",n="",i=!1;e"===t[e]&&""===n){i=!0;break}r+=t[e]}return""===n&&{value:r,index:e,tagClosed:i}}var vt=new RegExp("(\\s*)([^\\s=]+)(\\s*=)?(\\s*(['\"])(([\\s\\S])*?)\\5)?","g");function Et(t,e){for(var r=i(t,vt),n={},a=0;a"!==t[a]&&" "!==t[a]&&"\t"!==t[a]&&"\n"!==t[a]&&"\r"!==t[a];a++)l+=t[a];if("/"===(l=l.trim())[l.length-1]&&(l=l.substring(0,l.length-1),a--),!_t(l))return bt("InvalidTag",0===l.trim().length?"Invalid space after '<'.":"Tag '"+l+"' is an invalid name.",wt(t,a));var h=xt(t,a);if(!1===h)return bt("InvalidAttr","Attributes for '"+l+"' have open quote.",wt(t,a));var u=h.value;if(a=h.index,"/"===u[u.length-1]){var p=a-u.length,d=Et(u=u.substring(0,u.length-1),e);if(!0!==d)return bt(d.err.code,d.err.msg,wt(t,p+d.err.line));n=!0}else if(o){if(!h.tagClosed)return bt("InvalidTag","Closing tag '"+l+"' doesn't have proper closing.",wt(t,a));if(u.trim().length>0)return bt("InvalidTag","Closing tag '"+l+"' can't have attributes or invalid starting.",wt(t,s));if(0===r.length)return bt("InvalidTag","Closing tag '"+l+"' has not been opened.",wt(t,s));var g=r.pop();if(l!==g.tagName){var c=wt(t,g.tagStartPos);return bt("InvalidTag","Expected closing tag '"+g.tagName+"' (opened in line "+c.line+", col "+c.col+") instead of closing tag '"+l+"'.",wt(t,s))}0==r.length&&(i=!0)}else{var f=Et(u,e);if(!0!==f)return bt(f.err.code,f.err.msg,wt(t,a-u.length+f.err.line));if(!0===i)return bt("InvalidXml","Multiple possible root nodes found.",wt(t,a));-1!==e.unpairedTags.indexOf(l)||r.push({tagName:l,tagStartPos:s}),n=!0}for(a++;a0)||bt("InvalidXml","Invalid '"+JSON.stringify(r.map(function(t){return t.tagName}),null,4).replace(/\r?\n/g,"")+"' found.",{line:1,col:1}):bt("InvalidXml","Start tag expected.",1)}(t,e);if(!0!==r)throw Error(r.err.msg+":"+r.err.line+":"+r.err.col)}var n=new W(this.options);n.entityReplacer.setExternalEntities(this.externalEntities);var i=n.parseXml(t);return this.options.preserveOrder||void 0===i?i:lt(i,this.options,n.matcher,n.readonlyMatcher)},e.addEntity=function(t,e){if(-1!==e.indexOf("&"))throw new Error("Entity value can't have '&'");if(-1!==t.indexOf("&")||-1!==t.indexOf(";"))throw new Error("An entity must be set without '&' and ';'. Eg. use '#xD' for ' '");if("&"===e)throw new Error("An entity with value '&' is not permitted");this.externalEntities[t]=e},t.getMetaDataSymbol=function(){return c.getMetaDataSymbol()},t}();return e})()); +!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.XMLParser=e():t.XMLParser=e()}(this,()=>(()=>{"use strict";var t={d:(e,r)=>{for(var n in r)t.o(r,n)&&!t.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:r[n]})},o:(t,e)=>Object.prototype.hasOwnProperty.call(t,e),r:t=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})}},e={};t.r(e),t.d(e,{default:()=>Tt});var r=":A-Za-z_\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD",n=new RegExp("^["+r+"]["+r+"\\-.\\d\\u00B7\\u0300-\\u036F\\u203F-\\u2040]*$");function i(t,e){for(var r=[],n=e.exec(t);n;){var i=[];i.startIndex=e.lastIndex-n[0].length;for(var a=n.length,s=0;s0?this.child.push(((r={})[t.tagname]=t.child,r[":@"]=t[":@"],r)):this.child.push(((n={})[t.tagname]=t.child,n)),void 0!==e&&(this.child[this.child.length-1][p]={startIndex:e})},t.getMetaDataSymbol=function(){return p},t}(),g=function(){function t(t){this.suppressValidationErr=!t,this.options=t}var e=t.prototype;return e.readDocType=function(t,e){var r=Object.create(null),n=0;if("O"!==t[e+3]||"C"!==t[e+4]||"T"!==t[e+5]||"Y"!==t[e+6]||"P"!==t[e+7]||"E"!==t[e+8])throw new Error("Invalid Tag instead of DOCTYPE");e+=9;for(var i=1,a=!1,s=!1;e"===t[e]){if(s?"-"===t[e-1]&&"-"===t[e-2]&&(s=!1,i--):i--,0===i)break}else"["===t[e]?a=!0:t[e];else{if(a&&v(t,"!ENTITY",e)){e+=7;var o,h=void 0,l=this.readEntityExp(t,e+1,this.suppressValidationErr);if(o=l[0],h=l[1],e=l[2],-1===h.indexOf("&")){if(!1!==this.options.enabled&&null!=this.options.maxEntityCount&&n>=this.options.maxEntityCount)throw new Error("Entity count ("+(n+1)+") exceeds maximum allowed ("+this.options.maxEntityCount+")");r[o]=h,n++}}else if(a&&v(t,"!ELEMENT",e))e+=8,e=this.readElementExp(t,e+1).index;else if(a&&v(t,"!ATTLIST",e))e+=8;else if(a&&v(t,"!NOTATION",e))e+=9,e=this.readNotationExp(t,e+1,this.suppressValidationErr).index;else{if(!v(t,"!--",e))throw new Error("Invalid DOCTYPE");s=!0}i++}if(0!==i)throw new Error("Unclosed DOCTYPE");return{entities:r,i:e}},e.readEntityExp=function(t,e){for(var r=e=m(t,e);ethis.options.maxEntitySize)throw new Error('Entity "'+n+'" size ('+i.length+") exceeds maximum allowed size ("+this.options.maxEntitySize+")");return[n,i,--e]},e.readNotationExp=function(t,e){for(var r=e=m(t,e);et.length)&&(e=t.length);for(var r=0,n=Array(e);r0?t[t.length-1].tag:void 0}getCurrentNamespace(){const t=this._matcher.path;return t.length>0?t[t.length-1].namespace:void 0}getAttrValue(t){const e=this._matcher.path;if(0!==e.length)return e[e.length-1].values?.[t]}hasAttr(t){const e=this._matcher.path;if(0===e.length)return!1;const r=e[e.length-1];return void 0!==r.values&&t in r.values}getPosition(){const t=this._matcher.path;return 0===t.length?-1:t[t.length-1].position??0}getCounter(){const t=this._matcher.path;return 0===t.length?-1:t[t.length-1].counter??0}getIndex(){return this.getPosition()}getDepth(){return this._matcher.path.length}toString(t,e=!0){return this._matcher.toString(t,e)}toArray(){return this._matcher.path.map(t=>t.tag)}matches(t){return this._matcher.matches(t)}matchesAny(t){return t.matchesAny(this._matcher)}}class S{constructor(t={}){this.separator=t.separator||".",this.path=[],this.siblingStacks=[],this._pathStringCache=null,this._view=new _(this)}push(t,e=null,r=null){this._pathStringCache=null,this.path.length>0&&(this.path[this.path.length-1].values=void 0);const n=this.path.length;this.siblingStacks[n]||(this.siblingStacks[n]=new Map);const i=this.siblingStacks[n],a=r?`${r}:${t}`:t,s=i.get(a)||0;let o=0;for(const t of i.values())o+=t;i.set(a,s+1);const h={tag:t,position:o,counter:s};null!=r&&(h.namespace=r),null!=e&&(h.values=e),this.path.push(h)}pop(){if(0===this.path.length)return;this._pathStringCache=null;const t=this.path.pop();return this.siblingStacks.length>this.path.length+1&&(this.siblingStacks.length=this.path.length+1),t}updateCurrent(t){if(this.path.length>0){const e=this.path[this.path.length-1];null!=t&&(e.values=t)}}getCurrentTag(){return this.path.length>0?this.path[this.path.length-1].tag:void 0}getCurrentNamespace(){return this.path.length>0?this.path[this.path.length-1].namespace:void 0}getAttrValue(t){if(0!==this.path.length)return this.path[this.path.length-1].values?.[t]}hasAttr(t){if(0===this.path.length)return!1;const e=this.path[this.path.length-1];return void 0!==e.values&&t in e.values}getPosition(){return 0===this.path.length?-1:this.path[this.path.length-1].position??0}getCounter(){return 0===this.path.length?-1:this.path[this.path.length-1].counter??0}getIndex(){return this.getPosition()}getDepth(){return this.path.length}toString(t,e=!0){const r=t||this.separator;if(r===this.separator&&!0===e){if(null!==this._pathStringCache)return this._pathStringCache;const t=this.path.map(t=>t.namespace?`${t.namespace}:${t.tag}`:t.tag).join(r);return this._pathStringCache=t,t}return this.path.map(t=>e&&t.namespace?`${t.namespace}:${t.tag}`:t.tag).join(r)}toArray(){return this.path.map(t=>t.tag)}reset(){this._pathStringCache=null,this.path=[],this.siblingStacks=[]}matches(t){const e=t.segments;return 0!==e.length&&(t.hasDeepWildcard()?this._matchWithDeepWildcard(e):this._matchSimple(e))}_matchSimple(t){if(this.path.length!==t.length)return!1;for(let e=0;e=0&&e>=0;){const n=t[r];if("deep-wildcard"===n.type){if(r--,r<0)return!0;const n=t[r];let i=!1;for(let t=e;t>=0;t--)if(this._matchSegment(n,this.path[t],t===this.path.length-1)){e=t-1,r--,i=!0;break}if(!i)return!1}else{if(!this._matchSegment(n,this.path[e],e===this.path.length-1))return!1;e--,r--}}return r<0}_matchSegment(t,e,r){if("*"!==t.tag&&t.tag!==e.tag)return!1;if(void 0!==t.namespace&&"*"!==t.namespace&&t.namespace!==e.namespace)return!1;if(void 0!==t.attrName){if(!r)return!1;if(!e.values||!(t.attrName in e.values))return!1;if(void 0!==t.attrValue&&String(e.values[t.attrName])!==String(t.attrValue))return!1}if(void 0!==t.position){if(!r)return!1;const n=e.counter??0;if("first"===t.position&&0!==n)return!1;if("odd"===t.position&&n%2!=1)return!1;if("even"===t.position&&n%2!=0)return!1;if("nth"===t.position&&n!==t.positionValue)return!1}return!0}matchesAny(t){return t.matchesAny(this)}snapshot(){return{path:this.path.map(t=>({...t})),siblingStacks:this.siblingStacks.map(t=>new Map(t))}}restore(t){this._pathStringCache=null,this.path=t.path.map(t=>({...t})),this.siblingStacks=t.siblingStacks.map(t=>new Map(t))}readOnly(){return this._view}}class T{constructor(t,e={},r){this.pattern=t,this.separator=e.separator||".",this.segments=this._parse(t),this.data=r,this._hasDeepWildcard=this.segments.some(t=>"deep-wildcard"===t.type),this._hasAttributeCondition=this.segments.some(t=>void 0!==t.attrName),this._hasPositionSelector=this.segments.some(t=>void 0!==t.position)}_parse(t){const e=[];let r=0,n="";for(;r",lt:"<",quot:'"'},P={nbsp:" ",copy:"©",reg:"®",trade:"™",mdash:"—",ndash:"–",hellip:"…",laquo:"«",raquo:"»",lsquo:"‘",rsquo:"’",ldquo:"“",rdquo:"”",bull:"•",para:"¶",sect:"§",deg:"°",frac12:"½",frac14:"¼",frac34:"¾"},M=new Set("!?\\\\/[]$%{}^&*()<>|+");function D(t){if("#"===t[0])throw new Error(`[EntityReplacer] Invalid character '#' in entity name: "${t}"`);for(const e of t)if(M.has(e))throw new Error(`[EntityReplacer] Invalid character '${e}' in entity name: "${t}"`);return t}function O(...t){const e=Object.create(null);for(const r of t)if(r)for(const t of Object.keys(r)){const n=r[t];if("string"==typeof n)e[t]=n;else if(n&&"object"==typeof n&&void 0!==n.val){const r=n.val;"string"==typeof r&&(e[t]=r)}}return e}const k="external",j="base",L="all",V=Object.freeze({allow:0,leave:1,remove:2,throw:3}),F=new Set([9,10,13]);class ${constructor(t={}){var e;this._limit=t.limit||{},this._maxTotalExpansions=this._limit.maxTotalExpansions||0,this._maxExpandedLength=this._limit.maxExpandedLength||0,this._postCheck="function"==typeof t.postCheck?t.postCheck:t=>t,this._limitTiers=(e=this._limit.applyLimitsTo??k)&&e!==k?e===L?new Set([L]):e===j?new Set([j]):Array.isArray(e)?new Set(e):new Set([k]):new Set([k]),this._numericAllowed=t.numericAllowed??!0,this._baseMap=O(I,t.namedEntities||null),this._externalMap=Object.create(null),this._inputMap=Object.create(null),this._totalExpansions=0,this._expandedLength=0,this._removeSet=new Set(t.remove&&Array.isArray(t.remove)?t.remove:[]),this._leaveSet=new Set(t.leave&&Array.isArray(t.leave)?t.leave:[]);const r=function(t){if(!t)return{xmlVersion:1,onLevel:V.allow,nullLevel:V.remove};const e=1.1===t.xmlVersion?1.1:1,r=V[t.onNCR]??V.allow,n=V[t.nullNCR]??V.remove;return{xmlVersion:e,onLevel:r,nullLevel:Math.max(n,V.remove)}}(t.ncr);this._ncrXmlVersion=r.xmlVersion,this._ncrOnLevel=r.onLevel,this._ncrNullLevel=r.nullLevel}setExternalEntities(t){if(t)for(const e of Object.keys(t))D(e);this._externalMap=O(t)}addExternalEntity(t,e){D(t),"string"==typeof e&&-1===e.indexOf("&")&&(this._externalMap[t]=e)}addInputEntities(t){this._totalExpansions=0,this._expandedLength=0,this._inputMap=O(t)}reset(){return this._inputMap=Object.create(null),this._totalExpansions=0,this._expandedLength=0,this}setXmlVersion(t){this._ncrXmlVersion=1.1===t?1.1:1}decode(t){if("string"!=typeof t||0===t.length)return t;const e=t,r=[],n=t.length;let i=0,a=0;const s=this._maxTotalExpansions>0,o=this._maxExpandedLength>0,h=s||o;for(;a=n||59!==t.charCodeAt(e)){a++;continue}const l=t.slice(a+1,e);if(0===l.length){a++;continue}let u,d;if(this._removeSet.has(l))u="",void 0===d&&(d=k);else{if(this._leaveSet.has(l)){a++;continue}if(35===l.charCodeAt(0)){const t=this._resolveNCR(l);if(void 0===t){a++;continue}u=t,d=j}else{const t=this._resolveName(l);u=t?.value,d=t?.tier}}if(void 0!==u){if(a>i&&r.push(t.slice(i,a)),r.push(u),i=e+1,a=i,h&&this._tierCounts(d)){if(s&&(this._totalExpansions++,this._totalExpansions>this._maxTotalExpansions))throw new Error(`[EntityReplacer] Entity expansion count limit exceeded: ${this._totalExpansions} > ${this._maxTotalExpansions}`);if(o){const t=u.length-(l.length+2);if(t>0&&(this._expandedLength+=t,this._expandedLength>this._maxExpandedLength))throw new Error(`[EntityReplacer] Expanded content length limit exceeded: ${this._expandedLength} > ${this._maxExpandedLength}`)}}}else a++}i=55296&&t<=57343||1===this._ncrXmlVersion&&t>=1&&t<=31&&!F.has(t)?V.remove:-1}_applyNCRAction(t,e,r){switch(t){case V.allow:return String.fromCodePoint(r);case V.remove:return"";case V.leave:return;case V.throw:throw new Error(`[EntityDecoder] Prohibited numeric character reference &${e}; (U+${r.toString(16).toUpperCase().padStart(4,"0")})`);default:return String.fromCodePoint(r)}}_resolveNCR(t){const e=t.charCodeAt(1);let r;if(r=120===e||88===e?parseInt(t.slice(2),16):parseInt(t.slice(1),10),Number.isNaN(r)||r<0||r>1114111)return;const n=this._classifyNCR(r);if(!this._numericAllowed&&n0){var r=t.substring(0,e);if("xmlns"!==r)return r}}}var X=function(t){var e;this.options=t,this.currentNode=null,this.tagsNodeStack=[],this.parseXml=q,this.parseTextData=Y,this.resolveNameSpace=B,this.buildAttributesMap=G,this.isItStopNode=Q,this.replaceEntitiesValue=J,this.readStopNodeData=rt,this.saveTextToParentTag=K,this.addChild=Z,this.ignoreAttributesFn="function"==typeof(e=this.options.ignoreAttributes)?e:Array.isArray(e)?function(t){for(var r,n=function(t,e){var r="undefined"!=typeof Symbol&&t[Symbol.iterator]||t["@@iterator"];if(r)return(r=r.call(t)).next.bind(r);if(Array.isArray(t)||(r=function(t,e){if(t){if("string"==typeof t)return w(t,e);var r={}.toString.call(t).slice(8,-1);return"Object"===r&&t.constructor&&(r=t.constructor.name),"Map"===r||"Set"===r?Array.from(t):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?w(t,e):void 0}}(t))||e&&t&&"number"==typeof t.length){r&&(t=r);var n=0;return function(){return n>=t.length?{done:!0}:{done:!1,value:t[n++]}}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}(e);!(r=n()).done;){var i=r.value;if("string"==typeof i&&t===i)return!0;if(i instanceof RegExp&&i.test(t))return!0}}:function(){return!1},this.entityExpansionCount=0,this.currentExpandedLength=0;var r=R({},I);this.options.entityDecoder?this.entityDecoder=this.options.entityDecoder:("object"==typeof this.options.htmlEntities?r=this.options.htmlEntities:!0===this.options.htmlEntities&&(r=R({},P,A)),this.entityDecoder=new $({namedEntities:r,numericAllowed:this.options.htmlEntities,limit:{maxTotalExpansions:this.options.processEntities.maxTotalExpansions,maxExpandedLength:this.options.processEntities.maxExpandedLength,applyLimitsTo:this.options.processEntities.appliesTo}})),this.matcher=new S,this.readonlyMatcher=this.matcher.readOnly(),this.isCurrentNodeStopNode=!1,this.stopNodeExpressionsSet=new C;var n=this.options.stopNodes;if(n&&n.length>0){for(var i=0;i0)){s||(t=this.replaceEntitiesValue(t,e,r));var h=o.jPath?r.toString():r,l=o.tagValueProcessor(e,t,h,i,a);return null==l?t:typeof l!=typeof t||l!==t?l:o.trimValues||t.trim()===t?nt(t,o.parseTagValue,o.numberParseOptions):t}}function B(t){if(this.options.removeNSPrefix){var e=t.split(":"),r="/"===t.charAt(0)?"/":"";if("xmlns"===e[0])return"";2===e.length&&(t=r+e[1])}return t}var z=new RegExp("([^\\s=]+)\\s*(=\\s*(['\"])([\\s\\S]*?)\\3)?","gm");function G(t,e,r){var n=this.options;if(!0!==n.ignoreAttributes&&"string"==typeof t){for(var a=i(t,z),s=a.length,o={},h=new Array(s),l=!1,u={},d=0;d",o,"Closing Tag is not closed."),u=t.substring(o+2,l).trim();if(i.removeNSPrefix){var d=u.indexOf(":");-1!==d&&(u=u.substr(d+1))}u=it(i.transformTagName,u,"",i).tagName,r&&(n=this.saveTextToParentTag(n,r,this.readonlyMatcher));var p=this.matcher.getCurrentTag();if(u&&i.unpairedTagsSet.has(u))throw new Error("Unpaired tag can not be used as closing tag: ");p&&i.unpairedTagsSet.has(p)&&(this.matcher.pop(),this.tagsNodeStack.pop()),this.matcher.pop(),this.isCurrentNodeStopNode=!1,r=this.tagsNodeStack.pop(),n="",o=l}else if(63===h){var c=et(t,o,!1,"?>");if(!c)throw new Error("Pi Tag is not closed.");n=this.saveTextToParentTag(n,r,this.readonlyMatcher);var m=this.buildAttributesMap(c.tagExp,this.matcher,c.tagName);if(m&&m.version&&this.entityDecoder.setXmlVersion(m.version),i.ignoreDeclaration&&"?xml"===c.tagName||i.ignorePiTags);else{var v=new f(c.tagName);v.add(i.textNodeName,""),c.tagName!==c.tagExp&&c.attrExpPresent&&(v[":@"]=m),this.addChild(r,v,this.readonlyMatcher,o)}o=c.closeIndex+1}else if(33===h&&45===t.charCodeAt(o+2)&&45===t.charCodeAt(o+3)){var x=H(t,"--\x3e",o+4,"Comment is not closed.");if(i.commentPropName){var y,E=t.substring(o+4,x-2);n=this.saveTextToParentTag(n,r,this.readonlyMatcher),r.add(i.commentPropName,[(y={},y[i.textNodeName]=E,y)])}o=x}else if(33===h&&68===t.charCodeAt(o+2)){var b=a.readDocType(t,o);this.entityDecoder.addInputEntities(b.entities),o=b.i}else if(33===h&&91===t.charCodeAt(o+2)){var N=H(t,"]]>",o,"CDATA is not closed.")-2,w=t.substring(o+9,N);n=this.saveTextToParentTag(n,r,this.readonlyMatcher);var _,S=this.parseTextData(w,r.tagname,this.readonlyMatcher,!0,!1,!0,!0);null==S&&(S=""),i.cdataPropName?r.add(i.cdataPropName,[(_={},_[i.textNodeName]=w,_)]):r.add(i.textNodeName,S),o=N+2}else{var T=et(t,o,i.removeNSPrefix);if(!T){var C=t.substring(Math.max(0,o-50),Math.min(s,o+50));throw new Error("readTagExp returned undefined at position "+o+'. Context: "'+C+'"')}var A=T.tagName,I=T.rawTagName,P=T.tagExp,M=T.attrExpPresent,D=T.closeIndex,O=it(i.transformTagName,A,P,i);if(A=O.tagName,P=O.tagExp,i.strictReservedNames&&(A===i.commentPropName||A===i.cdataPropName||A===i.textNodeName||A===i.attributesGroupName))throw new Error("Invalid tag name: "+A);r&&n&&"!xml"!==r.tagname&&(n=this.saveTextToParentTag(n,r,this.readonlyMatcher,!1));var k=r;k&&i.unpairedTagsSet.has(k.tagname)&&(r=this.tagsNodeStack.pop(),this.matcher.pop());var j=!1;P.length>0&&P.lastIndexOf("/")===P.length-1&&(j=!0,P="/"===A[A.length-1]?A=A.substr(0,A.length-1):P.substr(0,P.length-1),M=A!==P);var L,V=null;L=W(I),A!==e.tagname&&this.matcher.push(A,{},L),A!==P&&M&&(V=this.buildAttributesMap(P,this.matcher,A))&&U(V,i),A!==e.tagname&&(this.isCurrentNodeStopNode=this.isItStopNode());var F=o;if(this.isCurrentNodeStopNode){var $="";if(j)o=T.closeIndex;else if(i.unpairedTagsSet.has(A))o=T.closeIndex;else{var R=this.readStopNodeData(t,I,D+1);if(!R)throw new Error("Unexpected end of "+I);o=R.i,$=R.tagContent}var X=new f(A);V&&(X[":@"]=V),X.add(i.textNodeName,$),this.matcher.pop(),this.isCurrentNodeStopNode=!1,this.addChild(r,X,this.readonlyMatcher,F)}else{if(j){var Y=it(i.transformTagName,A,P,i);A=Y.tagName,P=Y.tagExp;var B=new f(A);V&&(B[":@"]=V),this.addChild(r,B,this.readonlyMatcher,F),this.matcher.pop(),this.isCurrentNodeStopNode=!1}else{if(i.unpairedTagsSet.has(A)){var z=new f(A);V&&(z[":@"]=V),this.addChild(r,z,this.readonlyMatcher,F),this.matcher.pop(),this.isCurrentNodeStopNode=!1,o=T.closeIndex;continue}var G=new f(A);if(this.tagsNodeStack.length>i.maxNestedTags)throw new Error("Maximum nested tags exceeded");this.tagsNodeStack.push(r),V&&(G[":@"]=V),this.addChild(r,G,this.readonlyMatcher,F),r=G}n="",o=D}}}else n+=t[o];return e.child};function Z(t,e,r,n){this.options.captureMetaData||(n=void 0);var i=this.options.jPath?r.toString():r,a=this.options.updateTag(e.tagname,i,e[":@"]);!1===a||("string"==typeof a?(e.tagname=a,t.addChild(e,n)):t.addChild(e,n))}function J(t,e,r){var n=this.options.processEntities;if(!n||!n.enabled)return t;if(n.allowedTags){var i=this.options.jPath?r.toString():r;if(!(Array.isArray(n.allowedTags)?n.allowedTags.includes(e):n.allowedTags(e,i)))return t}if(n.tagFilter){var a=this.options.jPath?r.toString():r;if(!n.tagFilter(e,a))return t}return this.entityDecoder.decode(t)}function K(t,e,r,n){return t&&(void 0===n&&(n=0===e.child.length),void 0!==(t=this.parseTextData(t,e.tagname,r,!1,!!e[":@"]&&0!==Object.keys(e[":@"]).length,n))&&""!==t&&e.add(this.options.textNodeName,t),t=""),t}function Q(){return 0!==this.stopNodeExpressionsSet.size&&this.matcher.matchesAny(this.stopNodeExpressionsSet)}function H(t,e,r,n){var i=t.indexOf(e,r);if(-1===i)throw new Error(n);return i+e.length-1}function tt(t,e,r,n){var i=t.indexOf(e,r);if(-1===i)throw new Error(n);return i}function et(t,e,r,n){void 0===n&&(n=">");var i=function(t,e,r){void 0===r&&(r=">");for(var n=0,i=!1,a=t.length,s=r.charCodeAt(0),o=r.length>1?r.charCodeAt(1):-1,h=-1,l=e;l",r,e+" is not closed");if(t.substring(r+2,o).trim()===e&&0===--i)return{tagContent:t.substring(n,r),i:o};r=o}else if(63===s)r=H(t,"?>",r+1,"StopNode is not closed.");else if(33===s&&45===t.charCodeAt(r+2)&&45===t.charCodeAt(r+3))r=H(t,"--\x3e",r+3,"StopNode is not closed.");else if(33===s&&91===t.charCodeAt(r+2))r=H(t,"]]>",r,"StopNode is not closed.")-2;else{var h=et(t,r,">");h&&((h&&h.tagName)===e&&"/"!==h.tagExp[h.tagExp.length-1]&&i++,r=h.closeIndex)}}}function nt(t,e,r){if(e&&"string"==typeof t){var n=t.trim();return"true"===n||"false"!==n&&function(t,e={}){if(e=Object.assign({},b,e),!t||"string"!=typeof t)return t;let r=t.trim();if(0===r.length)return t;if(void 0!==e.skipLike&&e.skipLike.test(r))return t;if("0"===r)return 0;if(e.hex&&y.test(r))return function(t){if(parseInt)return parseInt(t,16);if(Number.parseInt)return Number.parseInt(t,16);if(window&&window.parseInt)return window.parseInt(t,16);throw new Error("parseInt, Number.parseInt, window.parseInt are not supported")}(r);if(isFinite(r)){if(r.includes("e")||r.includes("E"))return function(t,e,r){if(!r.eNotation)return t;const n=e.match(N);if(n){let i=n[1]||"";const a=-1===n[3].indexOf("e")?"E":"e",s=n[2],o=i?t[s.length+1]===a:t[s.length]===a;return s.length>1&&o?t:(1!==s.length||!n[3].startsWith(`.${a}`)&&n[3][0]!==a)&&s.length>0?r.leadingZeros&&!o?(e=(n[1]||"")+n[3],Number(e)):t:Number(e)}return t}(t,r,e);{const i=E.exec(r);if(i){const a=i[1]||"",s=i[2];let o=(n=i[3])&&-1!==n.indexOf(".")?("."===(n=n.replace(/0+$/,""))?n="0":"."===n[0]?n="0"+n:"."===n[n.length-1]&&(n=n.substring(0,n.length-1)),n):n;const h=a?"."===t[s.length+1]:"."===t[s.length];if(!e.leadingZeros&&(s.length>1||1===s.length&&!h))return t;{const n=Number(r),i=String(n);if(0===n)return n;if(-1!==i.search(/[eE]/))return e.eNotation?n:t;if(-1!==r.indexOf("."))return"0"===i||i===o||i===`${a}${o}`?n:t;let h=s?o:r;return s?h===i||a+h===i?n:t:h===i||h===a+i?n:t}}return t}}var n;return function(t,e,r){const n=e===1/0;switch(r.infinity.toLowerCase()){case"null":return null;case"infinity":return e;case"string":return n?"Infinity":"-Infinity";default:return t}}(t,Number(r),e)}(t,r)}return void 0!==t?t:""}function it(t,e,r,n){if(t){var i=t(e);r===e&&(r=i),e=i}return{tagName:e=at(e,n),tagExp:r}}function at(t,e){if(o.includes(t))throw new Error('[SECURITY] Invalid name: "'+t+'" is a reserved JavaScript keyword that could cause prototype pollution');return s.includes(t)?e.onDangerousProperty(t):t}var st=f.getMetaDataSymbol();function ot(t,e){if(!t||"object"!=typeof t)return{};if(!e)return t;var r={};for(var n in t)n.startsWith(e)?r[n.substring(e.length)]=t[n]:r[n]=t[n];return r}function ht(t,e,r,n){return lt(t,e,r,n)}function lt(t,e,r,n){for(var i,a={},s=0;s0&&(a[e.textNodeName]=i):void 0!==i&&(a[e.textNodeName]=i),a}function ut(t){for(var e=Object.keys(t),r=0;r5&&"xml"===n)return bt("InvalidXml","XML declaration allowed only at the start of the document.",_t(t,e));if("?"==t[e]&&">"==t[e+1]){e++;break}}return e}function mt(t,e){if(t.length>e+5&&"-"===t[e+1]&&"-"===t[e+2]){for(e+=3;e"===t[e+2]){e+=2;break}}else if(t.length>e+8&&"D"===t[e+1]&&"O"===t[e+2]&&"C"===t[e+3]&&"T"===t[e+4]&&"Y"===t[e+5]&&"P"===t[e+6]&&"E"===t[e+7]){var r=1;for(e+=8;e"===t[e]&&0===--r)break}else if(t.length>e+9&&"["===t[e+1]&&"C"===t[e+2]&&"D"===t[e+3]&&"A"===t[e+4]&&"T"===t[e+5]&&"A"===t[e+6]&&"["===t[e+7])for(e+=8;e"===t[e+2]){e+=2;break}return e}function vt(t,e){for(var r="",n="",i=!1;e"===t[e]&&""===n){i=!0;break}r+=t[e]}return""===n&&{value:r,index:e,tagClosed:i}}var xt=new RegExp("(\\s*)([^\\s=]+)(\\s*=)?(\\s*(['\"])(([\\s\\S])*?)\\5)?","g");function yt(t,e){for(var r=i(t,xt),n={},a=0;a"!==t[a]&&" "!==t[a]&&"\t"!==t[a]&&"\n"!==t[a]&&"\r"!==t[a];a++)h+=t[a];if("/"===(h=h.trim())[h.length-1]&&(h=h.substring(0,h.length-1),a--),!wt(h))return bt("InvalidTag",0===h.trim().length?"Invalid space after '<'.":"Tag '"+h+"' is an invalid name.",_t(t,a));var l=vt(t,a);if(!1===l)return bt("InvalidAttr","Attributes for '"+h+"' have open quote.",_t(t,a));var u=l.value;if(a=l.index,"/"===u[u.length-1]){var d=a-u.length,p=yt(u=u.substring(0,u.length-1),e);if(!0!==p)return bt(p.err.code,p.err.msg,_t(t,d+p.err.line));n=!0}else if(o){if(!l.tagClosed)return bt("InvalidTag","Closing tag '"+h+"' doesn't have proper closing.",_t(t,a));if(u.trim().length>0)return bt("InvalidTag","Closing tag '"+h+"' can't have attributes or invalid starting.",_t(t,s));if(0===r.length)return bt("InvalidTag","Closing tag '"+h+"' has not been opened.",_t(t,s));var c=r.pop();if(h!==c.tagName){var f=_t(t,c.tagStartPos);return bt("InvalidTag","Expected closing tag '"+c.tagName+"' (opened in line "+f.line+", col "+f.col+") instead of closing tag '"+h+"'.",_t(t,s))}0==r.length&&(i=!0)}else{var g=yt(u,e);if(!0!==g)return bt(g.err.code,g.err.msg,_t(t,a-u.length+g.err.line));if(!0===i)return bt("InvalidXml","Multiple possible root nodes found.",_t(t,a));-1!==e.unpairedTags.indexOf(h)||r.push({tagName:h,tagStartPos:s}),n=!0}for(a++;a0)||bt("InvalidXml","Invalid '"+JSON.stringify(r.map(function(t){return t.tagName}),null,4).replace(/\r?\n/g,"")+"' found.",{line:1,col:1}):bt("InvalidXml","Start tag expected.",1)}(t,e);if(!0!==r)throw Error(r.err.msg+":"+r.err.line+":"+r.err.col)}var n=new X(this.options);n.entityDecoder.setExternalEntities(this.externalEntities);var i=n.parseXml(t);return this.options.preserveOrder||void 0===i?i:ht(i,this.options,n.matcher,n.readonlyMatcher)},e.addEntity=function(t,e){if(-1!==e.indexOf("&"))throw new Error("Entity value can't have '&'");if(-1!==t.indexOf("&")||-1!==t.indexOf(";"))throw new Error("An entity must be set without '&' and ';'. Eg. use '#xD' for ' '");if("&"===e)throw new Error("An entity with value '&' is not permitted");this.externalEntities[t]=e},t.getMetaDataSymbol=function(){return f.getMetaDataSymbol()},t}();return e})()); //# sourceMappingURL=fxparser.min.js.map \ No newline at end of file diff --git a/lib/fxparser.min.js.map b/lib/fxparser.min.js.map index 784ce5a4..b1c843a2 100644 --- a/lib/fxparser.min.js.map +++ b/lib/fxparser.min.js.map @@ -1 +1 @@ -{"version":3,"file":"./lib/fxparser.min.js","mappings":"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","sources":["webpack://XMLParser/webpack/universalModuleDefinition","webpack://XMLParser/webpack/bootstrap","webpack://XMLParser/webpack/runtime/define property getters","webpack://XMLParser/webpack/runtime/hasOwnProperty shorthand","webpack://XMLParser/webpack/runtime/make namespace object","webpack://XMLParser/./src/util.js","webpack://XMLParser/./src/xmlparser/OptionsBuilder.js","webpack://XMLParser/./src/xmlparser/xmlNode.js","webpack://XMLParser/./src/xmlparser/DocTypeReader.js","webpack://XMLParser/./node_modules/strnum/strnum.js","webpack://XMLParser/./node_modules/path-expression-matcher/src/Matcher.js","webpack://XMLParser/./node_modules/path-expression-matcher/src/Expression.js","webpack://XMLParser/./node_modules/path-expression-matcher/src/ExpressionSet.js","webpack://XMLParser/./node_modules/@nodable/entities/src/EntityReplacer.js","webpack://XMLParser/./node_modules/@nodable/entities/src/groups.js","webpack://XMLParser/./src/xmlparser/OrderedObjParser.js","webpack://XMLParser/./src/ignoreAttributes.js","webpack://XMLParser/./src/xmlparser/node2json.js","webpack://XMLParser/./src/validator.js","webpack://XMLParser/./src/xmlparser/XMLParser.js"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"XMLParser\"] = factory();\n\telse\n\t\troot[\"XMLParser\"] = factory();\n})(this, () => {\nreturn ","// The require scope\nvar __webpack_require__ = {};\n\n","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","'use strict';\n\nconst nameStartChar = ':A-Za-z_\\\\u00C0-\\\\u00D6\\\\u00D8-\\\\u00F6\\\\u00F8-\\\\u02FF\\\\u0370-\\\\u037D\\\\u037F-\\\\u1FFF\\\\u200C-\\\\u200D\\\\u2070-\\\\u218F\\\\u2C00-\\\\u2FEF\\\\u3001-\\\\uD7FF\\\\uF900-\\\\uFDCF\\\\uFDF0-\\\\uFFFD';\nconst nameChar = nameStartChar + '\\\\-.\\\\d\\\\u00B7\\\\u0300-\\\\u036F\\\\u203F-\\\\u2040';\nexport const nameRegexp = '[' + nameStartChar + '][' + nameChar + ']*';\nconst regexName = new RegExp('^' + nameRegexp + '$');\n\nexport function getAllMatches(string, regex) {\n const matches = [];\n let match = regex.exec(string);\n while (match) {\n const allmatches = [];\n allmatches.startIndex = regex.lastIndex - match[0].length;\n const len = match.length;\n for (let index = 0; index < len; index++) {\n allmatches.push(match[index]);\n }\n matches.push(allmatches);\n match = regex.exec(string);\n }\n return matches;\n}\n\nexport const isName = function (string) {\n const match = regexName.exec(string);\n return !(match === null || typeof match === 'undefined');\n}\n\nexport function isExist(v) {\n return typeof v !== 'undefined';\n}\n\nexport function isEmptyObject(obj) {\n return Object.keys(obj).length === 0;\n}\n\nexport function getValue(v) {\n if (exports.isExist(v)) {\n return v;\n } else {\n return '';\n }\n}\n\n/**\n * Dangerous property names that could lead to prototype pollution or security issues\n */\nexport const DANGEROUS_PROPERTY_NAMES = [\n // '__proto__',\n // 'constructor',\n // 'prototype',\n 'hasOwnProperty',\n 'toString',\n 'valueOf',\n '__defineGetter__',\n '__defineSetter__',\n '__lookupGetter__',\n '__lookupSetter__'\n];\n\nexport const criticalProperties = [\"__proto__\", \"constructor\", \"prototype\"];","import { DANGEROUS_PROPERTY_NAMES, criticalProperties } from \"../util.js\";\n\nconst defaultOnDangerousProperty = (name) => {\n if (DANGEROUS_PROPERTY_NAMES.includes(name)) {\n return \"__\" + name;\n }\n return name;\n};\n\n\nexport const defaultOptions = {\n preserveOrder: false,\n attributeNamePrefix: '@_',\n attributesGroupName: false,\n textNodeName: '#text',\n ignoreAttributes: true,\n removeNSPrefix: false, // remove NS from tag name or attribute name if true\n allowBooleanAttributes: false, //a tag can have attributes without any value\n //ignoreRootElement : false,\n parseTagValue: true,\n parseAttributeValue: false,\n trimValues: true, //Trim string values of tag and attributes\n cdataPropName: false,\n numberParseOptions: {\n hex: true,\n leadingZeros: true,\n eNotation: true\n },\n tagValueProcessor: function (tagName, val) {\n return val;\n },\n attributeValueProcessor: function (attrName, val) {\n return val;\n },\n stopNodes: [], //nested tags will not be parsed even for errors\n alwaysCreateTextNode: false,\n isArray: () => false,\n commentPropName: false,\n unpairedTags: [],\n processEntities: true,\n htmlEntities: false,\n ignoreDeclaration: false,\n ignorePiTags: false,\n transformTagName: false,\n transformAttributeName: false,\n updateTag: function (tagName, jPath, attrs) {\n return tagName\n },\n // skipEmptyListItem: false\n captureMetaData: false,\n maxNestedTags: 100,\n strictReservedNames: true,\n jPath: true, // if true, pass jPath string to callbacks; if false, pass matcher instance\n onDangerousProperty: defaultOnDangerousProperty\n};\n\n\n/**\n * Validates that a property name is safe to use\n * @param {string} propertyName - The property name to validate\n * @param {string} optionName - The option field name (for error message)\n * @throws {Error} If property name is dangerous\n */\nfunction validatePropertyName(propertyName, optionName) {\n if (typeof propertyName !== 'string') {\n return; // Only validate string property names\n }\n\n const normalized = propertyName.toLowerCase();\n if (DANGEROUS_PROPERTY_NAMES.some(dangerous => normalized === dangerous.toLowerCase())) {\n throw new Error(\n `[SECURITY] Invalid ${optionName}: \"${propertyName}\" is a reserved JavaScript keyword that could cause prototype pollution`\n );\n }\n\n if (criticalProperties.some(dangerous => normalized === dangerous.toLowerCase())) {\n throw new Error(\n `[SECURITY] Invalid ${optionName}: \"${propertyName}\" is a reserved JavaScript keyword that could cause prototype pollution`\n );\n }\n}\n\n/**\n * Normalizes processEntities option for backward compatibility\n * @param {boolean|object} value \n * @returns {object} Always returns normalized object\n */\nfunction normalizeProcessEntities(value) {\n // Boolean backward compatibility\n if (typeof value === 'boolean') {\n return {\n enabled: value, // true or false\n maxEntitySize: 10000,\n maxExpansionDepth: 10,\n maxTotalExpansions: 1000,\n maxExpandedLength: 100000,\n maxEntityCount: 100,\n allowedTags: null,\n tagFilter: null\n };\n }\n\n // Object config - merge with defaults\n if (typeof value === 'object' && value !== null) {\n return {\n enabled: value.enabled !== false,\n maxEntitySize: Math.max(1, value.maxEntitySize ?? 10000),\n maxExpansionDepth: Math.max(1, value.maxExpansionDepth ?? 10000),\n maxTotalExpansions: Math.max(1, value.maxTotalExpansions ?? Infinity),\n maxExpandedLength: Math.max(1, value.maxExpandedLength ?? 100000),\n maxEntityCount: Math.max(1, value.maxEntityCount ?? 1000),\n allowedTags: value.allowedTags ?? null,\n tagFilter: value.tagFilter ?? null\n };\n }\n\n // Default to enabled with limits\n return normalizeProcessEntities(true);\n}\n\nexport const buildOptions = function (options) {\n const built = Object.assign({}, defaultOptions, options);\n\n // Validate property names to prevent prototype pollution\n const propertyNameOptions = [\n { value: built.attributeNamePrefix, name: 'attributeNamePrefix' },\n { value: built.attributesGroupName, name: 'attributesGroupName' },\n { value: built.textNodeName, name: 'textNodeName' },\n { value: built.cdataPropName, name: 'cdataPropName' },\n { value: built.commentPropName, name: 'commentPropName' }\n ];\n\n for (const { value, name } of propertyNameOptions) {\n if (value) {\n validatePropertyName(value, name);\n }\n }\n\n if (built.onDangerousProperty === null) {\n built.onDangerousProperty = defaultOnDangerousProperty;\n }\n\n // Always normalize processEntities for backward compatibility and validation\n built.processEntities = normalizeProcessEntities(built.processEntities);\n built.unpairedTagsSet = new Set(built.unpairedTags);\n // Convert old-style stopNodes for backward compatibility\n if (built.stopNodes && Array.isArray(built.stopNodes)) {\n built.stopNodes = built.stopNodes.map(node => {\n if (typeof node === 'string' && node.startsWith('*.')) {\n // Old syntax: *.tagname meant \"tagname anywhere\"\n // Convert to new syntax: ..tagname\n return '..' + node.substring(2);\n }\n return node;\n });\n }\n //console.debug(built.processEntities)\n return built;\n};","'use strict';\n\nlet METADATA_SYMBOL;\n\nif (typeof Symbol !== \"function\") {\n METADATA_SYMBOL = \"@@xmlMetadata\";\n} else {\n METADATA_SYMBOL = Symbol(\"XML Node Metadata\");\n}\n\nexport default class XmlNode {\n constructor(tagname) {\n this.tagname = tagname;\n this.child = []; //nested tags, text, cdata, comments in order\n this[\":@\"] = Object.create(null); //attributes map\n }\n add(key, val) {\n // this.child.push( {name : key, val: val, isCdata: isCdata });\n if (key === \"__proto__\") key = \"#__proto__\";\n this.child.push({ [key]: val });\n }\n addChild(node, startIndex) {\n if (node.tagname === \"__proto__\") node.tagname = \"#__proto__\";\n if (node[\":@\"] && Object.keys(node[\":@\"]).length > 0) {\n this.child.push({ [node.tagname]: node.child, [\":@\"]: node[\":@\"] });\n } else {\n this.child.push({ [node.tagname]: node.child });\n }\n // if requested, add the startIndex\n if (startIndex !== undefined) {\n // Note: for now we just overwrite the metadata. If we had more complex metadata,\n // we might need to do an object append here: metadata = { ...metadata, startIndex }\n this.child[this.child.length - 1][METADATA_SYMBOL] = { startIndex };\n }\n }\n /** symbol used for metadata */\n static getMetaDataSymbol() {\n return METADATA_SYMBOL;\n }\n}\n","import { isName } from '../util.js';\n\nexport default class DocTypeReader {\n constructor(options) {\n this.suppressValidationErr = !options;\n this.options = options;\n }\n\n readDocType(xmlData, i) {\n const entities = Object.create(null);\n let entityCount = 0;\n\n if (xmlData[i + 3] === 'O' &&\n xmlData[i + 4] === 'C' &&\n xmlData[i + 5] === 'T' &&\n xmlData[i + 6] === 'Y' &&\n xmlData[i + 7] === 'P' &&\n xmlData[i + 8] === 'E') {\n i = i + 9;\n let angleBracketsCount = 1;\n let hasBody = false, comment = false;\n let exp = \"\";\n for (; i < xmlData.length; i++) {\n if (xmlData[i] === '<' && !comment) { //Determine the tag type\n if (hasBody && hasSeq(xmlData, \"!ENTITY\", i)) {\n i += 7;\n let entityName, val;\n [entityName, val, i] = this.readEntityExp(xmlData, i + 1, this.suppressValidationErr);\n if (val.indexOf(\"&\") === -1) { //Parameter entities are not supported\n if (this.options.enabled !== false &&\n this.options.maxEntityCount != null &&\n entityCount >= this.options.maxEntityCount) {\n throw new Error(\n `Entity count (${entityCount + 1}) exceeds maximum allowed (${this.options.maxEntityCount})`\n );\n }\n //const escaped = entityName.replace(/[.\\-+*:]/g, '\\\\.');\n const escaped = entityName.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n entities[entityName] = {\n regx: RegExp(`&${escaped};`, \"g\"),\n val: val\n };\n entityCount++;\n }\n }\n else if (hasBody && hasSeq(xmlData, \"!ELEMENT\", i)) {\n i += 8;//Not supported\n const { index } = this.readElementExp(xmlData, i + 1);\n i = index;\n } else if (hasBody && hasSeq(xmlData, \"!ATTLIST\", i)) {\n i += 8;//Not supported\n // const {index} = this.readAttlistExp(xmlData,i+1);\n // i = index;\n } else if (hasBody && hasSeq(xmlData, \"!NOTATION\", i)) {\n i += 9;//Not supported\n const { index } = this.readNotationExp(xmlData, i + 1, this.suppressValidationErr);\n i = index;\n } else if (hasSeq(xmlData, \"!--\", i)) comment = true;\n else throw new Error(`Invalid DOCTYPE`);\n\n angleBracketsCount++;\n exp = \"\";\n } else if (xmlData[i] === '>') { //Read tag content\n if (comment) {\n if (xmlData[i - 1] === \"-\" && xmlData[i - 2] === \"-\") {\n comment = false;\n angleBracketsCount--;\n }\n } else {\n angleBracketsCount--;\n }\n if (angleBracketsCount === 0) {\n break;\n }\n } else if (xmlData[i] === '[') {\n hasBody = true;\n } else {\n exp += xmlData[i];\n }\n }\n if (angleBracketsCount !== 0) {\n throw new Error(`Unclosed DOCTYPE`);\n }\n } else {\n throw new Error(`Invalid Tag instead of DOCTYPE`);\n }\n return { entities, i };\n }\n readEntityExp(xmlData, i) {\n //External entities are not supported\n // \n\n //Parameter entities are not supported\n // \n\n //Internal entities are supported\n // \n\n // Skip leading whitespace after this.options.maxEntitySize) {\n throw new Error(\n `Entity \"${entityName}\" size (${entityValue.length}) exceeds maximum allowed size (${this.options.maxEntitySize})`\n );\n }\n\n i--;\n return [entityName, entityValue, i];\n }\n\n readNotationExp(xmlData, i) {\n // Skip leading whitespace after \n // \n // \n // \n // \n\n // Skip leading whitespace after {\n while (index < data.length && /\\s/.test(data[index])) {\n index++;\n }\n return index;\n};\n\n\n\nfunction hasSeq(data, seq, i) {\n for (let j = 0; j < seq.length; j++) {\n if (seq[j] !== data[i + j + 1]) return false;\n }\n return true;\n}\n\nfunction validateEntityName(name) {\n if (isName(name))\n return name;\n else\n throw new Error(`Invalid entity name ${name}`);\n}","const hexRegex = /^[-+]?0x[a-fA-F0-9]+$/;\nconst numRegex = /^([\\-\\+])?(0*)([0-9]*(\\.[0-9]*)?)$/;\n// const octRegex = /^0x[a-z0-9]+/;\n// const binRegex = /0x[a-z0-9]+/;\n\n\nconst consider = {\n hex: true,\n // oct: false,\n leadingZeros: true,\n decimalPoint: \"\\.\",\n eNotation: true,\n //skipLike: /regex/,\n infinity: \"original\", // \"null\", \"infinity\" (Infinity type), \"string\" (\"Infinity\" (the string literal))\n};\n\nexport default function toNumber(str, options = {}) {\n options = Object.assign({}, consider, options);\n if (!str || typeof str !== \"string\") return str;\n\n let trimmedStr = str.trim();\n\n if (trimmedStr.length === 0) return str;\n else if (options.skipLike !== undefined && options.skipLike.test(trimmedStr)) return str;\n else if (trimmedStr === \"0\") return 0;\n else if (options.hex && hexRegex.test(trimmedStr)) {\n return parse_int(trimmedStr, 16);\n // }else if (options.oct && octRegex.test(str)) {\n // return Number.parseInt(val, 8);\n } else if (!isFinite(trimmedStr)) { //Infinity\n return handleInfinity(str, Number(trimmedStr), options);\n } else if (trimmedStr.includes('e') || trimmedStr.includes('E')) { //eNotation\n return resolveEnotation(str, trimmedStr, options);\n // }else if (options.parseBin && binRegex.test(str)) {\n // return Number.parseInt(val, 2);\n } else {\n //separate negative sign, leading zeros, and rest number\n const match = numRegex.exec(trimmedStr);\n // +00.123 => [ , '+', '00', '.123', ..\n if (match) {\n const sign = match[1] || \"\";\n const leadingZeros = match[2];\n let numTrimmedByZeros = trimZeros(match[3]); //complete num without leading zeros\n const decimalAdjacentToLeadingZeros = sign ? // 0., -00., 000.\n str[leadingZeros.length + 1] === \".\"\n : str[leadingZeros.length] === \".\";\n\n //trim ending zeros for floating number\n if (!options.leadingZeros //leading zeros are not allowed\n && (leadingZeros.length > 1\n || (leadingZeros.length === 1 && !decimalAdjacentToLeadingZeros))) {\n // 00, 00.3, +03.24, 03, 03.24\n return str;\n }\n else {//no leading zeros or leading zeros are allowed\n const num = Number(trimmedStr);\n const parsedStr = String(num);\n\n if (num === 0) return num;\n if (parsedStr.search(/[eE]/) !== -1) { //given number is long and parsed to eNotation\n if (options.eNotation) return num;\n else return str;\n } else if (trimmedStr.indexOf(\".\") !== -1) { //floating number\n if (parsedStr === \"0\") return num; //0.0\n else if (parsedStr === numTrimmedByZeros) return num; //0.456. 0.79000\n else if (parsedStr === `${sign}${numTrimmedByZeros}`) return num;\n else return str;\n }\n\n let n = leadingZeros ? numTrimmedByZeros : trimmedStr;\n if (leadingZeros) {\n // -009 => -9\n return (n === parsedStr) || (sign + n === parsedStr) ? num : str\n } else {\n // +9\n return (n === parsedStr) || (n === sign + parsedStr) ? num : str\n }\n }\n } else { //non-numeric string\n return str;\n }\n }\n}\n\nconst eNotationRegx = /^([-+])?(0*)(\\d*(\\.\\d*)?[eE][-\\+]?\\d+)$/;\nfunction resolveEnotation(str, trimmedStr, options) {\n if (!options.eNotation) return str;\n const notation = trimmedStr.match(eNotationRegx);\n if (notation) {\n let sign = notation[1] || \"\";\n const eChar = notation[3].indexOf(\"e\") === -1 ? \"E\" : \"e\";\n const leadingZeros = notation[2];\n const eAdjacentToLeadingZeros = sign ? // 0E.\n str[leadingZeros.length + 1] === eChar\n : str[leadingZeros.length] === eChar;\n\n if (leadingZeros.length > 1 && eAdjacentToLeadingZeros) return str;\n else if (leadingZeros.length === 1\n && (notation[3].startsWith(`.${eChar}`) || notation[3][0] === eChar)) {\n return Number(trimmedStr);\n } else if (leadingZeros.length > 0) {\n // Has leading zeros — only accept if leadingZeros option allows it\n if (options.leadingZeros && !eAdjacentToLeadingZeros) {\n trimmedStr = (notation[1] || \"\") + notation[3];\n return Number(trimmedStr);\n } else return str;\n } else {\n // No leading zeros — always valid e-notation, parse it\n return Number(trimmedStr);\n }\n } else {\n return str;\n }\n}\n\n/**\n * \n * @param {string} numStr without leading zeros\n * @returns \n */\nfunction trimZeros(numStr) {\n if (numStr && numStr.indexOf(\".\") !== -1) {//float\n numStr = numStr.replace(/0+$/, \"\"); //remove ending zeros\n if (numStr === \".\") numStr = \"0\";\n else if (numStr[0] === \".\") numStr = \"0\" + numStr;\n else if (numStr[numStr.length - 1] === \".\") numStr = numStr.substring(0, numStr.length - 1);\n return numStr;\n }\n return numStr;\n}\n\nfunction parse_int(numStr, base) {\n //polyfill\n if (parseInt) return parseInt(numStr, base);\n else if (Number.parseInt) return Number.parseInt(numStr, base);\n else if (window && window.parseInt) return window.parseInt(numStr, base);\n else throw new Error(\"parseInt, Number.parseInt, window.parseInt are not supported\")\n}\n\n/**\n * Handle infinite values based on user option\n * @param {string} str - original input string\n * @param {number} num - parsed number (Infinity or -Infinity)\n * @param {object} options - user options\n * @returns {string|number|null} based on infinity option\n */\nfunction handleInfinity(str, num, options) {\n const isPositive = num === Infinity;\n\n switch (options.infinity.toLowerCase()) {\n case \"null\":\n return null;\n case \"infinity\":\n return num; // Return Infinity or -Infinity\n case \"string\":\n return isPositive ? \"Infinity\" : \"-Infinity\";\n case \"original\":\n default:\n return str; // Return original string like \"1e1000\"\n }\n}","import ExpressionSet from \"./ExpressionSet.js\";\n\n/**\n * MatcherView - A lightweight read-only view over a Matcher's internal state.\n *\n * Created once by Matcher and reused across all callbacks. Holds a direct\n * reference to the parent Matcher so it always reflects current parser state\n * with zero copying or freezing overhead.\n *\n * Users receive this via {@link Matcher#readOnly} or directly from parser\n * callbacks. It exposes all query and matching methods but has no mutation\n * methods — misuse is caught at the TypeScript level rather than at runtime.\n *\n * @example\n * const matcher = new Matcher();\n * const view = matcher.readOnly();\n *\n * matcher.push(\"root\", {});\n * view.getCurrentTag(); // \"root\"\n * view.getDepth(); // 1\n */\nexport class MatcherView {\n /**\n * @param {Matcher} matcher - The parent Matcher instance to read from.\n */\n constructor(matcher) {\n this._matcher = matcher;\n }\n\n /**\n * Get the path separator used by the parent matcher.\n * @returns {string}\n */\n get separator() {\n return this._matcher.separator;\n }\n\n /**\n * Get current tag name.\n * @returns {string|undefined}\n */\n getCurrentTag() {\n const path = this._matcher.path;\n return path.length > 0 ? path[path.length - 1].tag : undefined;\n }\n\n /**\n * Get current namespace.\n * @returns {string|undefined}\n */\n getCurrentNamespace() {\n const path = this._matcher.path;\n return path.length > 0 ? path[path.length - 1].namespace : undefined;\n }\n\n /**\n * Get current node's attribute value.\n * @param {string} attrName\n * @returns {*}\n */\n getAttrValue(attrName) {\n const path = this._matcher.path;\n if (path.length === 0) return undefined;\n return path[path.length - 1].values?.[attrName];\n }\n\n /**\n * Check if current node has an attribute.\n * @param {string} attrName\n * @returns {boolean}\n */\n hasAttr(attrName) {\n const path = this._matcher.path;\n if (path.length === 0) return false;\n const current = path[path.length - 1];\n return current.values !== undefined && attrName in current.values;\n }\n\n /**\n * Get current node's sibling position (child index in parent).\n * @returns {number}\n */\n getPosition() {\n const path = this._matcher.path;\n if (path.length === 0) return -1;\n return path[path.length - 1].position ?? 0;\n }\n\n /**\n * Get current node's repeat counter (occurrence count of this tag name).\n * @returns {number}\n */\n getCounter() {\n const path = this._matcher.path;\n if (path.length === 0) return -1;\n return path[path.length - 1].counter ?? 0;\n }\n\n /**\n * Get current node's sibling index (alias for getPosition).\n * @returns {number}\n * @deprecated Use getPosition() or getCounter() instead\n */\n getIndex() {\n return this.getPosition();\n }\n\n /**\n * Get current path depth.\n * @returns {number}\n */\n getDepth() {\n return this._matcher.path.length;\n }\n\n /**\n * Get path as string.\n * @param {string} [separator] - Optional separator (uses default if not provided)\n * @param {boolean} [includeNamespace=true]\n * @returns {string}\n */\n toString(separator, includeNamespace = true) {\n return this._matcher.toString(separator, includeNamespace);\n }\n\n /**\n * Get path as array of tag names.\n * @returns {string[]}\n */\n toArray() {\n return this._matcher.path.map(n => n.tag);\n }\n\n /**\n * Match current path against an Expression.\n * @param {Expression} expression\n * @returns {boolean}\n */\n matches(expression) {\n return this._matcher.matches(expression);\n }\n\n /**\n * Match any expression in the given set against the current path.\n * @param {ExpressionSet} exprSet\n * @returns {boolean}\n */\n matchesAny(exprSet) {\n return exprSet.matchesAny(this._matcher);\n }\n}\n\n/**\n * Matcher - Tracks current path in XML/JSON tree and matches against Expressions.\n *\n * The matcher maintains a stack of nodes representing the current path from root to\n * current tag. It only stores attribute values for the current (top) node to minimize\n * memory usage. Sibling tracking is used to auto-calculate position and counter.\n *\n * Use {@link Matcher#readOnly} to obtain a {@link MatcherView} safe to pass to\n * user callbacks — it always reflects current state with no Proxy overhead.\n *\n * @example\n * const matcher = new Matcher();\n * matcher.push(\"root\", {});\n * matcher.push(\"users\", {});\n * matcher.push(\"user\", { id: \"123\", type: \"admin\" });\n *\n * const expr = new Expression(\"root.users.user\");\n * matcher.matches(expr); // true\n */\nexport default class Matcher {\n /**\n * Create a new Matcher.\n * @param {Object} [options={}]\n * @param {string} [options.separator='.'] - Default path separator\n */\n constructor(options = {}) {\n this.separator = options.separator || '.';\n this.path = [];\n this.siblingStacks = [];\n // Each path node: { tag, values, position, counter, namespace? }\n // values only present for current (last) node\n // Each siblingStacks entry: Map tracking occurrences at each level\n this._pathStringCache = null;\n this._view = new MatcherView(this);\n }\n\n /**\n * Push a new tag onto the path.\n * @param {string} tagName\n * @param {Object|null} [attrValues=null]\n * @param {string|null} [namespace=null]\n */\n push(tagName, attrValues = null, namespace = null) {\n this._pathStringCache = null;\n\n // Remove values from previous current node (now becoming ancestor)\n if (this.path.length > 0) {\n this.path[this.path.length - 1].values = undefined;\n }\n\n // Get or create sibling tracking for current level\n const currentLevel = this.path.length;\n if (!this.siblingStacks[currentLevel]) {\n this.siblingStacks[currentLevel] = new Map();\n }\n\n const siblings = this.siblingStacks[currentLevel];\n\n // Create a unique key for sibling tracking that includes namespace\n const siblingKey = namespace ? `${namespace}:${tagName}` : tagName;\n\n // Calculate counter (how many times this tag appeared at this level)\n const counter = siblings.get(siblingKey) || 0;\n\n // Calculate position (total children at this level so far)\n let position = 0;\n for (const count of siblings.values()) {\n position += count;\n }\n\n // Update sibling count for this tag\n siblings.set(siblingKey, counter + 1);\n\n // Create new node\n const node = {\n tag: tagName,\n position: position,\n counter: counter\n };\n\n if (namespace !== null && namespace !== undefined) {\n node.namespace = namespace;\n }\n\n if (attrValues !== null && attrValues !== undefined) {\n node.values = attrValues;\n }\n\n this.path.push(node);\n }\n\n /**\n * Pop the last tag from the path.\n * @returns {Object|undefined} The popped node\n */\n pop() {\n if (this.path.length === 0) return undefined;\n this._pathStringCache = null;\n\n const node = this.path.pop();\n\n if (this.siblingStacks.length > this.path.length + 1) {\n this.siblingStacks.length = this.path.length + 1;\n }\n\n return node;\n }\n\n /**\n * Update current node's attribute values.\n * Useful when attributes are parsed after push.\n * @param {Object} attrValues\n */\n updateCurrent(attrValues) {\n if (this.path.length > 0) {\n const current = this.path[this.path.length - 1];\n if (attrValues !== null && attrValues !== undefined) {\n current.values = attrValues;\n }\n }\n }\n\n /**\n * Get current tag name.\n * @returns {string|undefined}\n */\n getCurrentTag() {\n return this.path.length > 0 ? this.path[this.path.length - 1].tag : undefined;\n }\n\n /**\n * Get current namespace.\n * @returns {string|undefined}\n */\n getCurrentNamespace() {\n return this.path.length > 0 ? this.path[this.path.length - 1].namespace : undefined;\n }\n\n /**\n * Get current node's attribute value.\n * @param {string} attrName\n * @returns {*}\n */\n getAttrValue(attrName) {\n if (this.path.length === 0) return undefined;\n return this.path[this.path.length - 1].values?.[attrName];\n }\n\n /**\n * Check if current node has an attribute.\n * @param {string} attrName\n * @returns {boolean}\n */\n hasAttr(attrName) {\n if (this.path.length === 0) return false;\n const current = this.path[this.path.length - 1];\n return current.values !== undefined && attrName in current.values;\n }\n\n /**\n * Get current node's sibling position (child index in parent).\n * @returns {number}\n */\n getPosition() {\n if (this.path.length === 0) return -1;\n return this.path[this.path.length - 1].position ?? 0;\n }\n\n /**\n * Get current node's repeat counter (occurrence count of this tag name).\n * @returns {number}\n */\n getCounter() {\n if (this.path.length === 0) return -1;\n return this.path[this.path.length - 1].counter ?? 0;\n }\n\n /**\n * Get current node's sibling index (alias for getPosition).\n * @returns {number}\n * @deprecated Use getPosition() or getCounter() instead\n */\n getIndex() {\n return this.getPosition();\n }\n\n /**\n * Get current path depth.\n * @returns {number}\n */\n getDepth() {\n return this.path.length;\n }\n\n /**\n * Get path as string.\n * @param {string} [separator] - Optional separator (uses default if not provided)\n * @param {boolean} [includeNamespace=true]\n * @returns {string}\n */\n toString(separator, includeNamespace = true) {\n const sep = separator || this.separator;\n const isDefault = (sep === this.separator && includeNamespace === true);\n\n if (isDefault) {\n if (this._pathStringCache !== null) {\n return this._pathStringCache;\n }\n const result = this.path.map(n =>\n (n.namespace) ? `${n.namespace}:${n.tag}` : n.tag\n ).join(sep);\n this._pathStringCache = result;\n return result;\n }\n\n return this.path.map(n =>\n (includeNamespace && n.namespace) ? `${n.namespace}:${n.tag}` : n.tag\n ).join(sep);\n }\n\n /**\n * Get path as array of tag names.\n * @returns {string[]}\n */\n toArray() {\n return this.path.map(n => n.tag);\n }\n\n /**\n * Reset the path to empty.\n */\n reset() {\n this._pathStringCache = null;\n this.path = [];\n this.siblingStacks = [];\n }\n\n /**\n * Match current path against an Expression.\n * @param {Expression} expression\n * @returns {boolean}\n */\n matches(expression) {\n const segments = expression.segments;\n\n if (segments.length === 0) {\n return false;\n }\n\n if (expression.hasDeepWildcard()) {\n return this._matchWithDeepWildcard(segments);\n }\n\n return this._matchSimple(segments);\n }\n\n /**\n * @private\n */\n _matchSimple(segments) {\n if (this.path.length !== segments.length) {\n return false;\n }\n\n for (let i = 0; i < segments.length; i++) {\n if (!this._matchSegment(segments[i], this.path[i], i === this.path.length - 1)) {\n return false;\n }\n }\n\n return true;\n }\n\n /**\n * @private\n */\n _matchWithDeepWildcard(segments) {\n let pathIdx = this.path.length - 1;\n let segIdx = segments.length - 1;\n\n while (segIdx >= 0 && pathIdx >= 0) {\n const segment = segments[segIdx];\n\n if (segment.type === 'deep-wildcard') {\n segIdx--;\n\n if (segIdx < 0) {\n return true;\n }\n\n const nextSeg = segments[segIdx];\n let found = false;\n\n for (let i = pathIdx; i >= 0; i--) {\n if (this._matchSegment(nextSeg, this.path[i], i === this.path.length - 1)) {\n pathIdx = i - 1;\n segIdx--;\n found = true;\n break;\n }\n }\n\n if (!found) {\n return false;\n }\n } else {\n if (!this._matchSegment(segment, this.path[pathIdx], pathIdx === this.path.length - 1)) {\n return false;\n }\n pathIdx--;\n segIdx--;\n }\n }\n\n return segIdx < 0;\n }\n\n /**\n * @private\n */\n _matchSegment(segment, node, isCurrentNode) {\n if (segment.tag !== '*' && segment.tag !== node.tag) {\n return false;\n }\n\n if (segment.namespace !== undefined) {\n if (segment.namespace !== '*' && segment.namespace !== node.namespace) {\n return false;\n }\n }\n\n if (segment.attrName !== undefined) {\n if (!isCurrentNode) {\n return false;\n }\n\n if (!node.values || !(segment.attrName in node.values)) {\n return false;\n }\n\n if (segment.attrValue !== undefined) {\n if (String(node.values[segment.attrName]) !== String(segment.attrValue)) {\n return false;\n }\n }\n }\n\n if (segment.position !== undefined) {\n if (!isCurrentNode) {\n return false;\n }\n\n const counter = node.counter ?? 0;\n\n if (segment.position === 'first' && counter !== 0) {\n return false;\n } else if (segment.position === 'odd' && counter % 2 !== 1) {\n return false;\n } else if (segment.position === 'even' && counter % 2 !== 0) {\n return false;\n } else if (segment.position === 'nth' && counter !== segment.positionValue) {\n return false;\n }\n }\n\n return true;\n }\n\n /**\n * Match any expression in the given set against the current path.\n * @param {ExpressionSet} exprSet\n * @returns {boolean}\n */\n matchesAny(exprSet) {\n return exprSet.matchesAny(this);\n }\n\n /**\n * Create a snapshot of current state.\n * @returns {Object}\n */\n snapshot() {\n return {\n path: this.path.map(node => ({ ...node })),\n siblingStacks: this.siblingStacks.map(map => new Map(map))\n };\n }\n\n /**\n * Restore state from snapshot.\n * @param {Object} snapshot\n */\n restore(snapshot) {\n this._pathStringCache = null;\n this.path = snapshot.path.map(node => ({ ...node }));\n this.siblingStacks = snapshot.siblingStacks.map(map => new Map(map));\n }\n\n /**\n * Return the read-only {@link MatcherView} for this matcher.\n *\n * The same instance is returned on every call — no allocation occurs.\n * It always reflects the current parser state and is safe to pass to\n * user callbacks without risk of accidental mutation.\n *\n * @returns {MatcherView}\n *\n * @example\n * const view = matcher.readOnly();\n * // pass view to callbacks — it stays in sync automatically\n * view.matches(expr); // ✓\n * view.getCurrentTag(); // ✓\n * // view.push(...) // ✗ method does not exist — caught by TypeScript\n */\n readOnly() {\n return this._view;\n }\n}","/**\n * Expression - Parses and stores a tag pattern expression\n * \n * Patterns are parsed once and stored in an optimized structure for fast matching.\n * \n * @example\n * const expr = new Expression(\"root.users.user\");\n * const expr2 = new Expression(\"..user[id]:first\");\n * const expr3 = new Expression(\"root/users/user\", { separator: '/' });\n */\nexport default class Expression {\n /**\n * Create a new Expression\n * @param {string} pattern - Pattern string (e.g., \"root.users.user\", \"..user[id]\")\n * @param {Object} options - Configuration options\n * @param {string} options.separator - Path separator (default: '.')\n */\n constructor(pattern, options = {}, data) {\n this.pattern = pattern;\n this.separator = options.separator || '.';\n this.segments = this._parse(pattern);\n this.data = data;\n // Cache expensive checks for performance (O(1) instead of O(n))\n this._hasDeepWildcard = this.segments.some(seg => seg.type === 'deep-wildcard');\n this._hasAttributeCondition = this.segments.some(seg => seg.attrName !== undefined);\n this._hasPositionSelector = this.segments.some(seg => seg.position !== undefined);\n }\n\n /**\n * Parse pattern string into segments\n * @private\n * @param {string} pattern - Pattern to parse\n * @returns {Array} Array of segment objects\n */\n _parse(pattern) {\n const segments = [];\n\n // Split by separator but handle \"..\" specially\n let i = 0;\n let currentPart = '';\n\n while (i < pattern.length) {\n if (pattern[i] === this.separator) {\n // Check if next char is also separator (deep wildcard)\n if (i + 1 < pattern.length && pattern[i + 1] === this.separator) {\n // Flush current part if any\n if (currentPart.trim()) {\n segments.push(this._parseSegment(currentPart.trim()));\n currentPart = '';\n }\n // Add deep wildcard\n segments.push({ type: 'deep-wildcard' });\n i += 2; // Skip both separators\n } else {\n // Regular separator\n if (currentPart.trim()) {\n segments.push(this._parseSegment(currentPart.trim()));\n }\n currentPart = '';\n i++;\n }\n } else {\n currentPart += pattern[i];\n i++;\n }\n }\n\n // Flush remaining part\n if (currentPart.trim()) {\n segments.push(this._parseSegment(currentPart.trim()));\n }\n\n return segments;\n }\n\n /**\n * Parse a single segment\n * @private\n * @param {string} part - Segment string (e.g., \"user\", \"ns::user\", \"user[id]\", \"ns::user:first\")\n * @returns {Object} Segment object\n */\n _parseSegment(part) {\n const segment = { type: 'tag' };\n\n // NEW NAMESPACE SYNTAX (v2.0):\n // ============================\n // Namespace uses DOUBLE colon (::)\n // Position uses SINGLE colon (:)\n // \n // Examples:\n // \"user\" → tag\n // \"user:first\" → tag + position\n // \"user[id]\" → tag + attribute\n // \"user[id]:first\" → tag + attribute + position\n // \"ns::user\" → namespace + tag\n // \"ns::user:first\" → namespace + tag + position\n // \"ns::user[id]\" → namespace + tag + attribute\n // \"ns::user[id]:first\" → namespace + tag + attribute + position\n // \"ns::first\" → namespace + tag named \"first\" (NO ambiguity!)\n //\n // This eliminates all ambiguity:\n // :: = namespace separator\n // : = position selector\n // [] = attributes\n\n // Step 1: Extract brackets [attr] or [attr=value]\n let bracketContent = null;\n let withoutBrackets = part;\n\n const bracketMatch = part.match(/^([^\\[]+)(\\[[^\\]]*\\])(.*)$/);\n if (bracketMatch) {\n withoutBrackets = bracketMatch[1] + bracketMatch[3];\n if (bracketMatch[2]) {\n const content = bracketMatch[2].slice(1, -1);\n if (content) {\n bracketContent = content;\n }\n }\n }\n\n // Step 2: Check for namespace (double colon ::)\n let namespace = undefined;\n let tagAndPosition = withoutBrackets;\n\n if (withoutBrackets.includes('::')) {\n const nsIndex = withoutBrackets.indexOf('::');\n namespace = withoutBrackets.substring(0, nsIndex).trim();\n tagAndPosition = withoutBrackets.substring(nsIndex + 2).trim(); // Skip ::\n\n if (!namespace) {\n throw new Error(`Invalid namespace in pattern: ${part}`);\n }\n }\n\n // Step 3: Parse tag and position (single colon :)\n let tag = undefined;\n let positionMatch = null;\n\n if (tagAndPosition.includes(':')) {\n const colonIndex = tagAndPosition.lastIndexOf(':'); // Use last colon for position\n const tagPart = tagAndPosition.substring(0, colonIndex).trim();\n const posPart = tagAndPosition.substring(colonIndex + 1).trim();\n\n // Verify position is a valid keyword\n const isPositionKeyword = ['first', 'last', 'odd', 'even'].includes(posPart) ||\n /^nth\\(\\d+\\)$/.test(posPart);\n\n if (isPositionKeyword) {\n tag = tagPart;\n positionMatch = posPart;\n } else {\n // Not a valid position keyword, treat whole thing as tag\n tag = tagAndPosition;\n }\n } else {\n tag = tagAndPosition;\n }\n\n if (!tag) {\n throw new Error(`Invalid segment pattern: ${part}`);\n }\n\n segment.tag = tag;\n if (namespace) {\n segment.namespace = namespace;\n }\n\n // Step 4: Parse attributes\n if (bracketContent) {\n if (bracketContent.includes('=')) {\n const eqIndex = bracketContent.indexOf('=');\n segment.attrName = bracketContent.substring(0, eqIndex).trim();\n segment.attrValue = bracketContent.substring(eqIndex + 1).trim();\n } else {\n segment.attrName = bracketContent.trim();\n }\n }\n\n // Step 5: Parse position selector\n if (positionMatch) {\n const nthMatch = positionMatch.match(/^nth\\((\\d+)\\)$/);\n if (nthMatch) {\n segment.position = 'nth';\n segment.positionValue = parseInt(nthMatch[1], 10);\n } else {\n segment.position = positionMatch;\n }\n }\n\n return segment;\n }\n\n /**\n * Get the number of segments\n * @returns {number}\n */\n get length() {\n return this.segments.length;\n }\n\n /**\n * Check if expression contains deep wildcard\n * @returns {boolean}\n */\n hasDeepWildcard() {\n return this._hasDeepWildcard;\n }\n\n /**\n * Check if expression has attribute conditions\n * @returns {boolean}\n */\n hasAttributeCondition() {\n return this._hasAttributeCondition;\n }\n\n /**\n * Check if expression has position selectors\n * @returns {boolean}\n */\n hasPositionSelector() {\n return this._hasPositionSelector;\n }\n\n /**\n * Get string representation\n * @returns {string}\n */\n toString() {\n return this.pattern;\n }\n}","/**\n * ExpressionSet - An indexed collection of Expressions for efficient bulk matching\n *\n * Instead of iterating all expressions on every tag, ExpressionSet pre-indexes\n * them at insertion time by depth and terminal tag name. At match time, only\n * the relevant bucket is evaluated — typically reducing checks from O(E) to O(1)\n * lookup plus O(small bucket) matches.\n *\n * Three buckets are maintained:\n * - `_byDepthAndTag` — exact depth + exact tag name (tightest, used first)\n * - `_wildcardByDepth` — exact depth + wildcard tag `*` (depth-matched only)\n * - `_deepWildcards` — expressions containing `..` (cannot be depth-indexed)\n *\n * @example\n * import { Expression, ExpressionSet } from 'fast-xml-tagger';\n *\n * // Build once at config time\n * const stopNodes = new ExpressionSet();\n * stopNodes.add(new Expression('root.users.user'));\n * stopNodes.add(new Expression('root.config.setting'));\n * stopNodes.add(new Expression('..script'));\n *\n * // Query on every tag — hot path\n * if (stopNodes.matchesAny(matcher)) { ... }\n */\nexport default class ExpressionSet {\n constructor() {\n /** @type {Map} depth:tag → expressions */\n this._byDepthAndTag = new Map();\n\n /** @type {Map} depth → wildcard-tag expressions */\n this._wildcardByDepth = new Map();\n\n /** @type {import('./Expression.js').default[]} expressions containing deep wildcard (..) */\n this._deepWildcards = [];\n\n /** @type {Set} pattern strings already added — used for deduplication */\n this._patterns = new Set();\n\n /** @type {boolean} whether the set is sealed against further additions */\n this._sealed = false;\n }\n\n /**\n * Add an Expression to the set.\n * Duplicate patterns (same pattern string) are silently ignored.\n *\n * @param {import('./Expression.js').default} expression - A pre-constructed Expression instance\n * @returns {this} for chaining\n * @throws {TypeError} if called after seal()\n *\n * @example\n * set.add(new Expression('root.users.user'));\n * set.add(new Expression('..script'));\n */\n add(expression) {\n if (this._sealed) {\n throw new TypeError(\n 'ExpressionSet is sealed. Create a new ExpressionSet to add more expressions.'\n );\n }\n\n // Deduplicate by pattern string\n if (this._patterns.has(expression.pattern)) return this;\n this._patterns.add(expression.pattern);\n\n if (expression.hasDeepWildcard()) {\n this._deepWildcards.push(expression);\n return this;\n }\n\n const depth = expression.length;\n const lastSeg = expression.segments[expression.segments.length - 1];\n const tag = lastSeg?.tag;\n\n if (!tag || tag === '*') {\n // Can index by depth but not by tag\n if (!this._wildcardByDepth.has(depth)) this._wildcardByDepth.set(depth, []);\n this._wildcardByDepth.get(depth).push(expression);\n } else {\n // Tightest bucket: depth + tag\n const key = `${depth}:${tag}`;\n if (!this._byDepthAndTag.has(key)) this._byDepthAndTag.set(key, []);\n this._byDepthAndTag.get(key).push(expression);\n }\n\n return this;\n }\n\n /**\n * Add multiple expressions at once.\n *\n * @param {import('./Expression.js').default[]} expressions - Array of Expression instances\n * @returns {this} for chaining\n *\n * @example\n * set.addAll([\n * new Expression('root.users.user'),\n * new Expression('root.config.setting'),\n * ]);\n */\n addAll(expressions) {\n for (const expr of expressions) this.add(expr);\n return this;\n }\n\n /**\n * Check whether a pattern string is already present in the set.\n *\n * @param {import('./Expression.js').default} expression\n * @returns {boolean}\n */\n has(expression) {\n return this._patterns.has(expression.pattern);\n }\n\n /**\n * Number of expressions in the set.\n * @type {number}\n */\n get size() {\n return this._patterns.size;\n }\n\n /**\n * Seal the set against further modifications.\n * Useful to prevent accidental mutations after config is built.\n * Calling add() or addAll() on a sealed set throws a TypeError.\n *\n * @returns {this}\n */\n seal() {\n this._sealed = true;\n return this;\n }\n\n /**\n * Whether the set has been sealed.\n * @type {boolean}\n */\n get isSealed() {\n return this._sealed;\n }\n\n /**\n * Test whether the matcher's current path matches any expression in the set.\n *\n * Evaluation order (cheapest → most expensive):\n * 1. Exact depth + tag bucket — O(1) lookup, typically 0–2 expressions\n * 2. Depth-only wildcard bucket — O(1) lookup, rare\n * 3. Deep-wildcard list — always checked, but usually small\n *\n * @param {import('./Matcher.js').default} matcher - Matcher instance (or readOnly view)\n * @returns {boolean} true if any expression matches the current path\n *\n * @example\n * if (stopNodes.matchesAny(matcher)) {\n * // handle stop node\n * }\n */\n matchesAny(matcher) {\n return this.findMatch(matcher) !== null;\n }\n /**\n * Find and return the first Expression that matches the matcher's current path.\n *\n * Uses the same evaluation order as matchesAny (cheapest → most expensive):\n * 1. Exact depth + tag bucket\n * 2. Depth-only wildcard bucket\n * 3. Deep-wildcard list\n *\n * @param {import('./Matcher.js').default} matcher - Matcher instance (or readOnly view)\n * @returns {import('./Expression.js').default | null} the first matching Expression, or null\n *\n * @example\n * const expr = stopNodes.findMatch(matcher);\n * if (expr) {\n * // access expr.config, expr.pattern, etc.\n * }\n */\n findMatch(matcher) {\n const depth = matcher.getDepth();\n const tag = matcher.getCurrentTag();\n\n // 1. Tightest bucket — most expressions live here\n const exactKey = `${depth}:${tag}`;\n const exactBucket = this._byDepthAndTag.get(exactKey);\n if (exactBucket) {\n for (let i = 0; i < exactBucket.length; i++) {\n if (matcher.matches(exactBucket[i])) return exactBucket[i];\n }\n }\n\n // 2. Depth-matched wildcard-tag expressions\n const wildcardBucket = this._wildcardByDepth.get(depth);\n if (wildcardBucket) {\n for (let i = 0; i < wildcardBucket.length; i++) {\n if (matcher.matches(wildcardBucket[i])) return wildcardBucket[i];\n }\n }\n\n // 3. Deep wildcards — cannot be pre-filtered by depth or tag\n for (let i = 0; i < this._deepWildcards.length; i++) {\n if (matcher.matches(this._deepWildcards[i])) return this._deepWildcards[i];\n }\n\n return null;\n }\n}\n","// ---------------------------------------------------------------------------\n// Built-in entity tables\n// ---------------------------------------------------------------------------\n\n/**\n * Standard XML entities — always processed after external/system so they\n * cannot be overridden by DOCTYPE, and & is deferred to its own final pass.\n *\n * Each entry: { regex: RegExp, val: string }\n */\nconst DEFAULT_XML_ENTITIES = {\n apos: { regex: /&(apos|#0*39|#x0*27);/g, val: \"'\" },\n gt: { regex: /&(gt|#0*62|#x0*3[Ee]);/g, val: '>' },\n lt: { regex: /&(lt|#0*60|#x0*3[Cc]);/g, val: '<' },\n quot: { regex: /&(quot|#0*34|#x0*22);/g, val: '\"' },\n};\n\n/** & — always expanded last to avoid double-expansion. */\nconst AMP_ENTITY = { regex: /&(amp|#0*38|#x0*26);/g, val: '&' };\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nconst SPECIAL_CHARS = new Set('!?\\\\\\\\/[]$%{}^&*()<>|+');\n\n/**\n * Validate that an entity name contains no regex-special or otherwise\n * dangerous characters.\n * @param {string} name\n * @returns {string} the name, unchanged\n * @throws {Error} on invalid characters\n */\nfunction validateEntityName(name) {\n for (const ch of name) {\n if (SPECIAL_CHARS.has(ch)) {\n throw new Error(`[EntityReplacer] Invalid character '${ch}' in entity name: \"${name}\"`);\n }\n }\n return name;\n}\n\n/**\n * Escape a string for use inside a RegExp character class / alternation.\n */\nfunction escapeForRegex(str) {\n return str.replace(/[.\\-+*:]/g, '\\\\$&');\n}\n\n/**\n * Resolve a constructor option to an entity table (plain object) or null.\n */\nfunction resolveTable(option, builtIn, enabledByDefault = false) {\n if (option === false || option === null) return null;\n if (option === true) return builtIn;\n if (option === undefined) return enabledByDefault ? builtIn : null;\n if (typeof option === 'object') return option;\n return null;\n}\n\n/**\n * Convert a category name or array of names into a Set.\n */\nfunction resolveApplyLimitsTo(spec) {\n if (spec === 'all') return 'all';\n if (typeof spec === 'string') return new Set([spec]);\n if (Array.isArray(spec)) return new Set(spec);\n return new Set(['external']);\n}\n\n/**\n * Build an entries array from a raw map of name → string|{regex,val}.\n * Skips string values that contain '&' (recursive expansion risk).\n * Normalises DocTypeReader's `regx` spelling to `regex`.\n *\n * @param {object} map\n * @returns {Array<[string, {regex: RegExp, val: string}]>}\n */\nfunction buildEntries(map) {\n const entries = [];\n for (const key of Object.keys(map)) {\n const raw = map[key];\n if (typeof raw === 'object' && raw !== null && (raw.val !== undefined)) {\n // Accept pre-built { regex, val } or DocTypeReader's { regx, val }\n entries.push([key, { regex: raw.regex ?? raw.regx, val: raw.val }]);\n } else if (typeof raw === 'string') {\n if (raw.indexOf('&') !== -1) continue; // skip — would cause recursive expansion\n validateEntityName(key);\n entries.push([key, {\n regex: new RegExp('&' + escapeForRegex(key) + ';', 'g'),\n val: raw,\n }]);\n }\n }\n return entries;\n}\n\n// ---------------------------------------------------------------------------\n// EntityReplacer\n// ---------------------------------------------------------------------------\n\n/**\n * Standalone, zero-dependency entity replacer for XML/HTML content.\n *\n * Entity categories:\n * - **persistent external** — configured once, survive across documents.\n * Set via `setExternalEntities()` or built up via `addExternalEntity()`.\n * - **input / runtime** — DOCTYPE entities for the *current* document only.\n * Injected via `addInputEntities()`. Wiped on every `getInstance()` call\n * so they never leak between documents.\n *\n * Replacement order (fixed):\n * 1. persistent external\n * 2. input / runtime (DOCTYPE)\n * 3. system (named entity groups)\n * 4. default (lt / gt / apos / quot)\n * 5. amp (& final pass)\n *\n * @example\n * const replacer = new EntityReplacer({ default: true, system: COMMON_HTML });\n * replacer.setExternalEntities({ brand: 'Acme' });\n *\n * // Builder factory calls getInstance() before each document:\n * const instance = replacer.getInstance();\n * // Builder calls addInputEntities() if DOCTYPE entities are present:\n * instance.addInputEntities({ version: '1.0' });\n * instance.replace('&brand; v&version; <'); // 'Acme v1.0 <'\n */\nexport default class EntityReplacer {\n /**\n * @param {object} [options]\n * @param {boolean|object|null} [options.default=true]\n * @param {boolean|object|null} [options.amp=true]\n * @param {boolean|object|null} [options.system=false]\n * @param {number} [options.maxTotalExpansions=0]\n * @param {number} [options.maxExpandedLength=0]\n * @param {'external'|'all'|string[]} [options.applyLimitsTo='external']\n * @param {((resolved: string, original: string) => string)|null} [options.postCheck=null]\n */\n constructor(options = {}) {\n // Immutable config resolved at construction\n this._defaultTable = resolveTable(options.default, DEFAULT_XML_ENTITIES, true);\n this._systemTable = resolveTable(options.system, null, false);\n this._ampEnabled = options.amp !== false && options.amp !== null;\n\n this._maxTotalExpansions = options.maxTotalExpansions || 0;\n this._maxExpandedLength = options.maxExpandedLength || 0;\n this._applyLimitsTo = resolveApplyLimitsTo(options.applyLimitsTo ?? 'external');\n this._postCheck = typeof options.postCheck === 'function' ? options.postCheck : r => r;\n\n // Pre-computed category limit flags\n this._limitExternal = this._applyLimitsTo === 'all' || (this._applyLimitsTo instanceof Set && this._applyLimitsTo.has('external'));\n this._limitSystem = this._applyLimitsTo === 'all' || (this._applyLimitsTo instanceof Set && this._applyLimitsTo.has('system'));\n this._limitDefault = this._applyLimitsTo === 'all' || (this._applyLimitsTo instanceof Set && this._applyLimitsTo.has('default'));\n\n // Frozen immutable entry arrays\n this._defaultEntries = this._defaultTable ? Object.entries(this._defaultTable) : [];\n this._systemEntries = this._systemTable ? Object.entries(this._systemTable) : [];\n\n // Persistent external entities — survive across documents\n /** @type {Array<[string, {regex: RegExp, val: string}]>} */\n this._persistentEntries = [];\n\n // Input / runtime entities — current document only, reset per getInstance()\n /** @type {Array<[string, {regex: RegExp, val: string}]>} */\n this._inputEntries = [];\n\n // Per-document counters — reset in getInstance()\n this._totalExpansions = 0;\n this._expandedLength = 0;\n }\n\n // -------------------------------------------------------------------------\n // Persistent external entity registration (survives across documents)\n // -------------------------------------------------------------------------\n\n /**\n * Replace the full set of persistent external entities.\n * These are never wiped between documents.\n *\n * @param {Record} map\n */\n setExternalEntities(map) {\n this._persistentEntries = buildEntries(map);\n }\n\n /**\n * Add a single persistent external entity without disturbing existing ones.\n *\n * @param {string} key — bare entity name, e.g. `'copy'`\n * @param {string} value — replacement string, e.g. `'©'`\n */\n addExternalEntity(key, value) {\n validateEntityName(key);\n if (typeof value === 'string' && value.indexOf('&') === -1) {\n this._persistentEntries.push([key, {\n regex: new RegExp('&' + escapeForRegex(key) + ';', 'g'),\n val: value,\n }]);\n }\n }\n\n // -------------------------------------------------------------------------\n // Input / runtime entity registration (per document)\n // -------------------------------------------------------------------------\n\n /**\n * Inject DOCTYPE (input/runtime) entities for the current document.\n * These are stored separately from persistent entities and wiped on the\n * next `getInstance()` call so they never leak into subsequent documents.\n *\n * Also resets per-document expansion counters.\n *\n * @param {Record} map\n */\n addInputEntities(map) {\n this._totalExpansions = 0;\n this._expandedLength = 0;\n this._inputEntries = buildEntries(map);\n }\n\n // -------------------------------------------------------------------------\n // getInstance — builder factory integration point\n // -------------------------------------------------------------------------\n\n /**\n * Reset all per-document state (input entities + expansion counters) and\n * return `this`.\n *\n * The builder factory calls this each time it creates a new builder instance\n * so DOCTYPE entities from a previous document are never carried over.\n *\n */\n reset() {\n this._inputEntries = [];\n this._totalExpansions = 0;\n this._expandedLength = 0;\n }\n\n // -------------------------------------------------------------------------\n // Primary API\n // -------------------------------------------------------------------------\n\n /**\n * Replace all entity references in `str`.\n *\n * Processing order:\n * 1. persistent external\n * 2. input / runtime (DOCTYPE)\n * 3. system\n * 4. default (lt/gt/apos/quot)\n * 5. amp\n * 6. postCheck hook\n *\n * @param {string} str\n * @returns {string}\n */\n replace(str) {\n if (typeof str !== 'string' || str.length === 0) return str;\n if (str.indexOf('&') === -1) return str; // fast path\n\n const original = str;\n\n\n // 1. Persistent external entities\n if (this._persistentEntries.length > 0) {\n str = this._applyEntries(str, this._persistentEntries, this._limitExternal);\n }\n\n // 2. Input / runtime entities (DOCTYPE)\n if (this._inputEntries.length > 0 && str.indexOf('&') !== -1) {\n str = this._applyEntries(str, this._inputEntries, this._limitExternal);\n }\n\n // 3. Default XML entities (lt / gt / apos / quot)\n if (this._defaultEntries.length > 0 && str.indexOf('&') !== -1) {\n str = this._applyEntries(str, this._defaultEntries, this._limitDefault);\n }\n\n // 4. System (named groups)\n if (this._systemEntries.length > 0 && str.indexOf('&') !== -1) {\n str = this._applyEntries(str, this._systemEntries, this._limitSystem);\n }\n\n // 5. & — always last\n if (this._ampEnabled && str.indexOf('&') !== -1) {\n str = str.replace(AMP_ENTITY.regex, AMP_ENTITY.val);\n }\n\n // 6. postCheck\n str = this._postCheck(str, original);\n\n return str;\n }\n\n\n /**\n * \n * @param {string} val \n * @returns \n */\n parse(val) {\n return this.replace(val);\n }\n // -------------------------------------------------------------------------\n // Private helpers\n // -------------------------------------------------------------------------\n\n _applyEntries(str, entries, track) {\n const limitExpansions = track && this._maxTotalExpansions > 0;\n const limitLength = track && this._maxExpandedLength > 0;\n const trackAny = limitExpansions || limitLength;\n\n for (let i = 0; i < entries.length; i++) {\n if (str.indexOf('&') === -1) break;\n\n const entity = entries[i][1];\n\n if (!trackAny) {\n str = str.replace(entity.regex, entity.val);\n continue;\n }\n\n if (limitExpansions && !limitLength) {\n let count = 0;\n str = str.replace(entity.regex, (...args) => {\n count++;\n return typeof entity.val === 'function' ? entity.val(...args) : entity.val;\n });\n if (count > 0) {\n this._totalExpansions += count;\n if (this._totalExpansions > this._maxTotalExpansions) {\n throw new Error(\n `[EntityReplacer] Entity expansion count limit exceeded: ` +\n `${this._totalExpansions} > ${this._maxTotalExpansions}`\n );\n }\n }\n } else if (limitLength && !limitExpansions) {\n const before = str.length;\n str = str.replace(entity.regex, entity.val);\n const delta = str.length - before;\n if (delta > 0) {\n this._expandedLength += delta;\n if (this._expandedLength > this._maxExpandedLength) {\n throw new Error(\n `[EntityReplacer] Expanded content length limit exceeded: ` +\n `${this._expandedLength} > ${this._maxExpandedLength}`\n );\n }\n }\n } else {\n const before = str.length;\n let count = 0;\n str = str.replace(entity.regex, (...args) => {\n count++;\n return typeof entity.val === 'function' ? entity.val(...args) : entity.val;\n });\n if (count > 0) {\n this._totalExpansions += count;\n if (this._totalExpansions > this._maxTotalExpansions) {\n throw new Error(\n `[EntityReplacer] Entity expansion count limit exceeded: ` +\n `${this._totalExpansions} > ${this._maxTotalExpansions}`\n );\n }\n }\n const delta = str.length - before;\n if (delta > 0) {\n this._expandedLength += delta;\n if (this._expandedLength > this._maxExpandedLength) {\n throw new Error(\n `[EntityReplacer] Expanded content length limit exceeded: ` +\n `${this._expandedLength} > ${this._maxExpandedLength}`\n );\n }\n }\n }\n }\n return str;\n }\n}\n\n// Re-export the built-in tables for advanced users who want to extend them\nexport { DEFAULT_XML_ENTITIES, AMP_ENTITY };\n","// ---------------------------------------------------------------------------\n// Named entity groups — importable separately and freely composable.\n// All groups are plain objects; no magic, no classes.\n// ---------------------------------------------------------------------------\n\n/**\n * ~20 most commonly needed HTML named entities.\n * @type {Record string) }>}\n */\nexport const COMMON_HTML = {\n nbsp: { regex: /&(nbsp|#0*160|#x0*[Aa]0);/g, val: '\\u00a0' },\n copy: { regex: /&(copy|#0*169|#x0*[Aa]9);/g, val: '\\u00a9' },\n reg: { regex: /&(reg|#0*174|#x0*[Aa][Ee]);/g, val: '\\u00ae' },\n trade: { regex: /&(trade|#0*8482|#x0*2122);/g, val: '\\u2122' },\n mdash: { regex: /&(mdash|#0*8212|#x0*2014);/g, val: '\\u2014' },\n ndash: { regex: /&(ndash|#0*8211|#x0*2013);/g, val: '\\u2013' },\n hellip: { regex: /&(hellip|#0*8230|#x0*2026);/g, val: '\\u2026' },\n laquo: { regex: /&(laquo|#0*171|#x0*[Aa][Bb]);/g, val: '\\u00ab' },\n raquo: { regex: /&(raquo|#0*187|#x0*[Bb][Bb]);/g, val: '\\u00bb' },\n lsquo: { regex: /&(lsquo|#0*8216|#x0*2018);/g, val: '\\u2018' },\n rsquo: { regex: /&(rsquo|#0*8217|#x0*2019);/g, val: '\\u2019' },\n ldquo: { regex: /&(ldquo|#0*8220|#x0*201[Cc]);/g, val: '\\u201c' },\n rdquo: { regex: /&(rdquo|#0*8221|#x0*201[Dd]);/g, val: '\\u201d' },\n bull: { regex: /&(bull|#0*8226|#x0*2022);/g, val: '\\u2022' },\n para: { regex: /&(para|#0*182|#x0*[Bb]6);/g, val: '\\u00b6' },\n sect: { regex: /&(sect|#0*167|#x0*[Aa]7);/g, val: '\\u00a7' },\n deg: { regex: /&(deg|#0*176|#x0*[Bb]0);/g, val: '\\u00b0' },\n frac12: { regex: /&(frac12|#0*189|#x0*[Bb][Dd]);/g, val: '\\u00bd' },\n frac14: { regex: /&(frac14|#0*188|#x0*[Bb][Cc]);/g, val: '\\u00bc' },\n frac34: { regex: /&(frac34|#0*190|#x0*[Bb][Ee]);/g, val: '\\u00be' },\n inr: { regex: /&(inr|#0*8377);/g, val: \"₹\" },\n};\n\n/**\n * Currency symbol entities.\n */\nexport const CURRENCY_ENTITIES = {\n cent: { regex: /&(cent|#0*162|#x0*[Aa]2);/g, val: '\\u00a2' },\n pound: { regex: /&(pound|#0*163|#x0*[Aa]3);/g, val: '\\u00a3' },\n yen: { regex: /&(yen|#0*165|#x0*[Aa]5);/g, val: '\\u00a5' },\n euro: { regex: /&(euro|#0*8364|#x0*20[Aa][Cc]);/g, val: '\\u20ac' },\n inr: { regex: /&(inr|#0*8377|#x0*20[Bb]9);/g, val: '\\u20b9' },\n curren: { regex: /&(curren|#0*164|#x0*[Aa]4);/g, val: '\\u00a4' },\n fnof: { regex: /&(fnof|#0*402|#x0*192);/g, val: '\\u0192' },\n};\n\n/**\n * Mathematical operator entities.\n */\nexport const MATH_ENTITIES = {\n times: { regex: /&(times|#0*215|#x0*[Dd]7);/g, val: '\\u00d7' },\n divide: { regex: /&(divide|#0*247|#x0*[Ff]7);/g, val: '\\u00f7' },\n plusmn: { regex: /&(plusmn|#0*177|#x0*[Bb]1);/g, val: '\\u00b1' },\n minus: { regex: /&(minus|#0*8722|#x0*2212);/g, val: '\\u2212' },\n sup2: { regex: /&(sup2|#0*178|#x0*[Bb]2);/g, val: '\\u00b2' },\n sup3: { regex: /&(sup3|#0*179|#x0*[Bb]3);/g, val: '\\u00b3' },\n sup1: { regex: /&(sup1|#0*185|#x0*[Bb]9);/g, val: '\\u00b9' },\n frac12: { regex: /&(frac12|#0*189|#x0*[Bb][Dd]);/g, val: '\\u00bd' },\n frac14: { regex: /&(frac14|#0*188|#x0*[Bb][Cc]);/g, val: '\\u00bc' },\n frac34: { regex: /&(frac34|#0*190|#x0*[Bb][Ee]);/g, val: '\\u00be' },\n permil: { regex: /&(permil|#0*8240|#x0*2030);/g, val: '\\u2030' },\n infin: { regex: /&(infin|#0*8734|#x0*221[Ee]);/g, val: '\\u221e' },\n sum: { regex: /&(sum|#0*8721|#x0*2211);/g, val: '\\u2211' },\n prod: { regex: /&(prod|#0*8719|#x0*220[Ff]);/g, val: '\\u220f' },\n radic: { regex: /&(radic|#0*8730|#x0*221[Aa]);/g, val: '\\u221a' },\n ne: { regex: /&(ne|#0*8800|#x0*2260);/g, val: '\\u2260' },\n le: { regex: /&(le|#0*8804|#x0*2264);/g, val: '\\u2264' },\n ge: { regex: /&(ge|#0*8805|#x0*2265);/g, val: '\\u2265' },\n};\n\n/**\n * Arrow entities.\n */\nexport const ARROW_ENTITIES = {\n larr: { regex: /&(larr|#0*8592|#x0*2190);/g, val: '\\u2190' },\n uarr: { regex: /&(uarr|#0*8593|#x0*2191);/g, val: '\\u2191' },\n rarr: { regex: /&(rarr|#0*8594|#x0*2192);/g, val: '\\u2192' },\n darr: { regex: /&(darr|#0*8595|#x0*2193);/g, val: '\\u2193' },\n harr: { regex: /&(harr|#0*8596|#x0*2194);/g, val: '\\u2194' },\n lArr: { regex: /&(lArr|#0*8656|#x0*21[Dd]0);/g, val: '\\u21d0' },\n uArr: { regex: /&(uArr|#0*8657|#x0*21[Dd]1);/g, val: '\\u21d1' },\n rArr: { regex: /&(rArr|#0*8658|#x0*21[Dd]2);/g, val: '\\u21d2' },\n dArr: { regex: /&(dArr|#0*8659|#x0*21[Dd]3);/g, val: '\\u21d3' },\n hArr: { regex: /&(hArr|#0*8660|#x0*21[Dd]4);/g, val: '\\u21d4' },\n};\n\n/**\n * Numeric character references — decimal &#NNN; and hex &#xHH;\n * These are function-replacers; they expand any valid code point.\n */\nexport const NUMERIC_ENTITIES = {\n num_dec: {\n regex: /�*([0-9]{1,7});/g,\n val: (_, s) => fromCodePoint(s, 10, \"&#\"),\n },\n num_hex: {\n regex: /�*([0-9a-fA-F]{1,6});/g,\n val: (_, s) => fromCodePoint(s, 16, \"&#x\"),\n },\n};\n\nfunction fromCodePoint(str, base, prefix) {\n const codePoint = Number.parseInt(str, base);\n\n if (codePoint >= 0 && codePoint <= 0x10FFFF) {\n return String.fromCodePoint(codePoint);\n } else {\n return prefix + str + \";\";\n }\n}","'use strict';\n///@ts-check\n\nimport { getAllMatches, isExist, DANGEROUS_PROPERTY_NAMES, criticalProperties } from '../util.js';\nimport xmlNode from './xmlNode.js';\nimport DocTypeReader from './DocTypeReader.js';\nimport toNumber from \"strnum\";\nimport getIgnoreAttributesFn from \"../ignoreAttributes.js\";\nimport { Expression, Matcher } from 'path-expression-matcher';\nimport { ExpressionSet } from 'path-expression-matcher';\nimport EntityReplacer, { COMMON_HTML, NUMERIC_ENTITIES, CURRENCY_ENTITIES } from '@nodable/entities';\n\n// const regx =\n// '<((!\\\\[CDATA\\\\[([\\\\s\\\\S]*?)(]]>))|((NAME:)?(NAME))([^>]*)>|((\\\\/)(NAME)\\\\s*>))([^<]*)'\n// .replace(/NAME/g, util.nameRegexp);\n\n//const tagsRegx = new RegExp(\"<(\\\\/?[\\\\w:\\\\-\\._]+)([^>]*)>(\\\\s*\"+cdataRegx+\")*([^<]+)?\",\"g\");\n//const tagsRegx = new RegExp(\"<(\\\\/?)((\\\\w*:)?([\\\\w:\\\\-\\._]+))([^>]*)>([^<]*)(\"+cdataRegx+\"([^<]*))*([^<]+)?\",\"g\");\n\n// Helper functions for attribute and namespace handling\n\n/**\n * Extract raw attributes (without prefix) from prefixed attribute map\n * @param {object} prefixedAttrs - Attributes with prefix from buildAttributesMap\n * @param {object} options - Parser options containing attributeNamePrefix\n * @returns {object} Raw attributes for matcher\n */\nfunction extractRawAttributes(prefixedAttrs, options) {\n if (!prefixedAttrs) return {};\n\n // Handle attributesGroupName option\n const attrs = options.attributesGroupName\n ? prefixedAttrs[options.attributesGroupName]\n : prefixedAttrs;\n\n if (!attrs) return {};\n\n const rawAttrs = {};\n for (const key in attrs) {\n // Remove the attribute prefix to get raw name\n if (key.startsWith(options.attributeNamePrefix)) {\n const rawName = key.substring(options.attributeNamePrefix.length);\n rawAttrs[rawName] = attrs[key];\n } else {\n // Attribute without prefix (shouldn't normally happen, but be safe)\n rawAttrs[key] = attrs[key];\n }\n }\n return rawAttrs;\n}\n\n/**\n * Extract namespace from raw tag name\n * @param {string} rawTagName - Tag name possibly with namespace (e.g., \"soap:Envelope\")\n * @returns {string|undefined} Namespace or undefined\n */\nfunction extractNamespace(rawTagName) {\n if (!rawTagName || typeof rawTagName !== 'string') return undefined;\n\n const colonIndex = rawTagName.indexOf(':');\n if (colonIndex !== -1 && colonIndex > 0) {\n const ns = rawTagName.substring(0, colonIndex);\n // Don't treat xmlns as a namespace\n if (ns !== 'xmlns') {\n return ns;\n }\n }\n return undefined;\n}\n\nexport default class OrderedObjParser {\n constructor(options) {\n this.options = options;\n this.currentNode = null;\n this.tagsNodeStack = [];\n this.parseXml = parseXml;\n this.parseTextData = parseTextData;\n this.resolveNameSpace = resolveNameSpace;\n this.buildAttributesMap = buildAttributesMap;\n this.isItStopNode = isItStopNode;\n this.replaceEntitiesValue = replaceEntitiesValue;\n this.readStopNodeData = readStopNodeData;\n this.saveTextToParentTag = saveTextToParentTag;\n this.addChild = addChild;\n this.ignoreAttributesFn = getIgnoreAttributesFn(this.options.ignoreAttributes)\n this.entityExpansionCount = 0;\n this.currentExpandedLength = 0;\n\n this.entityReplacer = new EntityReplacer({\n default: true,\n // amp: true,\n system: this.options.htmlEntities ? { ...COMMON_HTML, ...NUMERIC_ENTITIES, ...CURRENCY_ENTITIES } : {},\n maxTotalExpansions: this.options.processEntities.maxTotalExpansions,\n maxExpandedLength: this.options.processEntities.maxExpandedLength,\n applyLimitsTo: \"all\",\n //postCheck: resolved => resolved\n });\n\n // Initialize path matcher for path-expression-matcher\n this.matcher = new Matcher();\n\n // Live read-only proxy of matcher — PEM creates and caches this internally.\n // All user callbacks receive this instead of the mutable matcher.\n this.readonlyMatcher = this.matcher.readOnly();\n\n // Flag to track if current node is a stop node (optimization)\n this.isCurrentNodeStopNode = false;\n\n // Pre-compile stopNodes expressions\n this.stopNodeExpressionsSet = new ExpressionSet();\n const stopNodesOpts = this.options.stopNodes;\n if (stopNodesOpts && stopNodesOpts.length > 0) {\n for (let i = 0; i < stopNodesOpts.length; i++) {\n const stopNodeExp = stopNodesOpts[i];\n if (typeof stopNodeExp === 'string') {\n // Convert string to Expression object\n this.stopNodeExpressionsSet.add(new Expression(stopNodeExp));\n } else if (stopNodeExp instanceof Expression) {\n // Already an Expression object\n this.stopNodeExpressionsSet.add(stopNodeExp);\n }\n }\n this.stopNodeExpressionsSet.seal();\n }\n }\n\n}\n\n\n/**\n * @param {string} val\n * @param {string} tagName\n * @param {string|Matcher} jPath - jPath string or Matcher instance based on options.jPath\n * @param {boolean} dontTrim\n * @param {boolean} hasAttributes\n * @param {boolean} isLeafNode\n * @param {boolean} escapeEntities\n */\nfunction parseTextData(val, tagName, jPath, dontTrim, hasAttributes, isLeafNode, escapeEntities) {\n const options = this.options;\n if (val !== undefined) {\n if (options.trimValues && !dontTrim) {\n val = val.trim();\n }\n if (val.length > 0) {\n if (!escapeEntities) val = this.replaceEntitiesValue(val, tagName, jPath);\n\n // Pass jPath string or matcher based on options.jPath setting\n const jPathOrMatcher = options.jPath ? jPath.toString() : jPath;\n const newval = options.tagValueProcessor(tagName, val, jPathOrMatcher, hasAttributes, isLeafNode);\n if (newval === null || newval === undefined) {\n //don't parse\n return val;\n } else if (typeof newval !== typeof val || newval !== val) {\n //overwrite\n return newval;\n } else if (options.trimValues) {\n return parseValue(val, options.parseTagValue, options.numberParseOptions);\n } else {\n const trimmedVal = val.trim();\n if (trimmedVal === val) {\n return parseValue(val, options.parseTagValue, options.numberParseOptions);\n } else {\n return val;\n }\n }\n }\n }\n}\n\nfunction resolveNameSpace(tagname) {\n if (this.options.removeNSPrefix) {\n const tags = tagname.split(':');\n const prefix = tagname.charAt(0) === '/' ? '/' : '';\n if (tags[0] === 'xmlns') {\n return '';\n }\n if (tags.length === 2) {\n tagname = prefix + tags[1];\n }\n }\n return tagname;\n}\n\n//TODO: change regex to capture NS\n//const attrsRegx = new RegExp(\"([\\\\w\\\\-\\\\.\\\\:]+)\\\\s*=\\\\s*(['\\\"])((.|\\n)*?)\\\\2\",\"gm\");\nconst attrsRegx = new RegExp('([^\\\\s=]+)\\\\s*(=\\\\s*([\\'\"])([\\\\s\\\\S]*?)\\\\3)?', 'gm');\n\nfunction buildAttributesMap(attrStr, jPath, tagName) {\n const options = this.options;\n if (options.ignoreAttributes !== true && typeof attrStr === 'string') {\n // attrStr = attrStr.replace(/\\r?\\n/g, ' ');\n //attrStr = attrStr || attrStr.trim();\n\n const matches = getAllMatches(attrStr, attrsRegx);\n const len = matches.length; //don't make it inline\n const attrs = {};\n\n // Pre-process values once: trim + entity replacement\n // Reused in both matcher update and second pass\n const processedVals = new Array(len);\n let hasRawAttrs = false;\n const rawAttrsForMatcher = {};\n\n for (let i = 0; i < len; i++) {\n const attrName = this.resolveNameSpace(matches[i][1]);\n const oldVal = matches[i][4];\n\n if (attrName.length && oldVal !== undefined) {\n let val = oldVal;\n if (options.trimValues) val = val.trim();\n val = this.replaceEntitiesValue(val, tagName, this.readonlyMatcher);\n processedVals[i] = val;\n\n rawAttrsForMatcher[attrName] = val;\n hasRawAttrs = true;\n }\n }\n\n // Update matcher ONCE before second pass, if applicable\n if (hasRawAttrs && typeof jPath === 'object' && jPath.updateCurrent) {\n jPath.updateCurrent(rawAttrsForMatcher);\n }\n\n // Hoist toString() once — path doesn't change during attribute processing\n const jPathStr = options.jPath ? jPath.toString() : this.readonlyMatcher;\n\n // Second pass: apply processors, build final attrs\n let hasAttrs = false;\n for (let i = 0; i < len; i++) {\n const attrName = this.resolveNameSpace(matches[i][1]);\n\n if (this.ignoreAttributesFn(attrName, jPathStr)) continue;\n\n let aName = options.attributeNamePrefix + attrName;\n\n if (attrName.length) {\n if (options.transformAttributeName) {\n aName = options.transformAttributeName(aName);\n }\n aName = sanitizeName(aName, options);\n\n if (matches[i][4] !== undefined) {\n // Reuse already-processed value — no double entity replacement\n const oldVal = processedVals[i];\n\n const newVal = options.attributeValueProcessor(attrName, oldVal, jPathStr);\n if (newVal === null || newVal === undefined) {\n attrs[aName] = oldVal;\n } else if (typeof newVal !== typeof oldVal || newVal !== oldVal) {\n attrs[aName] = newVal;\n } else {\n attrs[aName] = parseValue(oldVal, options.parseAttributeValue, options.numberParseOptions);\n }\n hasAttrs = true;\n } else if (options.allowBooleanAttributes) {\n attrs[aName] = true;\n hasAttrs = true;\n }\n }\n }\n\n if (!hasAttrs) return;\n\n if (options.attributesGroupName) {\n const attrCollection = {};\n attrCollection[options.attributesGroupName] = attrs;\n return attrCollection;\n }\n return attrs;\n }\n}\nconst parseXml = function (xmlData) {\n xmlData = xmlData.replace(/\\r\\n?/g, \"\\n\"); //TODO: remove this line\n const xmlObj = new xmlNode('!xml');\n let currentNode = xmlObj;\n let textData = \"\";\n\n // Reset matcher for new document\n this.matcher.reset();\n\n // Reset entity expansion counters for this document\n this.entityExpansionCount = 0;\n this.currentExpandedLength = 0;\n const options = this.options;\n const docTypeReader = new DocTypeReader(options.processEntities);\n const xmlLen = xmlData.length;\n for (let i = 0; i < xmlLen; i++) {//for each char in XML data\n const ch = xmlData[i];\n if (ch === '<') {\n // const nextIndex = i+1;\n // const _2ndChar = xmlData[nextIndex];\n const c1 = xmlData.charCodeAt(i + 1);\n if (c1 === 47) {//Closing Tag '/'\n const closeIndex = findClosingIndex(xmlData, \">\", i, \"Closing Tag is not closed.\")\n let tagName = xmlData.substring(i + 2, closeIndex).trim();\n\n if (options.removeNSPrefix) {\n const colonIndex = tagName.indexOf(\":\");\n if (colonIndex !== -1) {\n tagName = tagName.substr(colonIndex + 1);\n }\n }\n\n tagName = transformTagName(options.transformTagName, tagName, \"\", options).tagName;\n\n if (currentNode) {\n textData = this.saveTextToParentTag(textData, currentNode, this.readonlyMatcher);\n }\n\n //check if last tag of nested tag was unpaired tag\n const lastTagName = this.matcher.getCurrentTag();\n if (tagName && options.unpairedTagsSet.has(tagName)) {\n throw new Error(`Unpaired tag can not be used as closing tag: `);\n }\n if (lastTagName && options.unpairedTagsSet.has(lastTagName)) {\n // Pop the unpaired tag\n this.matcher.pop();\n this.tagsNodeStack.pop();\n }\n // Pop the closing tag\n this.matcher.pop();\n this.isCurrentNodeStopNode = false; // Reset flag when closing tag\n\n currentNode = this.tagsNodeStack.pop();//avoid recursion, set the parent tag scope\n textData = \"\";\n i = closeIndex;\n } else if (c1 === 63) { //'?'\n\n let tagData = readTagExp(xmlData, i, false, \"?>\");\n if (!tagData) throw new Error(\"Pi Tag is not closed.\");\n\n textData = this.saveTextToParentTag(textData, currentNode, this.readonlyMatcher);\n if ((options.ignoreDeclaration && tagData.tagName === \"?xml\") || options.ignorePiTags) {\n //do nothing\n } else {\n\n const childNode = new xmlNode(tagData.tagName);\n childNode.add(options.textNodeName, \"\");\n\n if (tagData.tagName !== tagData.tagExp && tagData.attrExpPresent) {\n childNode[\":@\"] = this.buildAttributesMap(tagData.tagExp, this.matcher, tagData.tagName);\n }\n this.addChild(currentNode, childNode, this.readonlyMatcher, i);\n }\n\n\n i = tagData.closeIndex + 1;\n } else if (c1 === 33\n && xmlData.charCodeAt(i + 2) === 45\n && xmlData.charCodeAt(i + 3) === 45) { //'!--'\n const endIndex = findClosingIndex(xmlData, \"-->\", i + 4, \"Comment is not closed.\")\n if (options.commentPropName) {\n const comment = xmlData.substring(i + 4, endIndex - 2);\n\n textData = this.saveTextToParentTag(textData, currentNode, this.readonlyMatcher);\n\n currentNode.add(options.commentPropName, [{ [options.textNodeName]: comment }]);\n }\n i = endIndex;\n } else if (c1 === 33\n && xmlData.charCodeAt(i + 2) === 68) { //'!D'\n const result = docTypeReader.readDocType(xmlData, i);\n this.entityReplacer.addInputEntities(result.entities);\n i = result.i;\n } else if (c1 === 33\n && xmlData.charCodeAt(i + 2) === 91) { // '!['\n const closeIndex = findClosingIndex(xmlData, \"]]>\", i, \"CDATA is not closed.\") - 2;\n const tagExp = xmlData.substring(i + 9, closeIndex);\n\n textData = this.saveTextToParentTag(textData, currentNode, this.readonlyMatcher);\n\n let val = this.parseTextData(tagExp, currentNode.tagname, this.readonlyMatcher, true, false, true, true);\n if (val == undefined) val = \"\";\n\n //cdata should be set even if it is 0 length string\n if (options.cdataPropName) {\n currentNode.add(options.cdataPropName, [{ [options.textNodeName]: tagExp }]);\n } else {\n currentNode.add(options.textNodeName, val);\n }\n\n i = closeIndex + 2;\n } else {//Opening tag\n let result = readTagExp(xmlData, i, options.removeNSPrefix);\n\n // Safety check: readTagExp can return undefined\n if (!result) {\n // Log context for debugging\n const context = xmlData.substring(Math.max(0, i - 50), Math.min(xmlLen, i + 50));\n throw new Error(`readTagExp returned undefined at position ${i}. Context: \"${context}\"`);\n }\n\n let tagName = result.tagName;\n const rawTagName = result.rawTagName;\n let tagExp = result.tagExp;\n let attrExpPresent = result.attrExpPresent;\n let closeIndex = result.closeIndex;\n\n ({ tagName, tagExp } = transformTagName(options.transformTagName, tagName, tagExp, options));\n\n if (options.strictReservedNames &&\n (tagName === options.commentPropName\n || tagName === options.cdataPropName\n || tagName === options.textNodeName\n || tagName === options.attributesGroupName\n )) {\n throw new Error(`Invalid tag name: ${tagName}`);\n }\n\n //save text as child node\n if (currentNode && textData) {\n if (currentNode.tagname !== '!xml') {\n //when nested tag is found\n textData = this.saveTextToParentTag(textData, currentNode, this.readonlyMatcher, false);\n }\n }\n\n //check if last tag was unpaired tag\n const lastTag = currentNode;\n if (lastTag && options.unpairedTagsSet.has(lastTag.tagname)) {\n currentNode = this.tagsNodeStack.pop();\n this.matcher.pop();\n }\n\n // Clean up self-closing syntax BEFORE processing attributes\n // This is where tagExp gets the trailing / removed\n let isSelfClosing = false;\n if (tagExp.length > 0 && tagExp.lastIndexOf(\"/\") === tagExp.length - 1) {\n isSelfClosing = true;\n if (tagName[tagName.length - 1] === \"/\") {\n tagName = tagName.substr(0, tagName.length - 1);\n tagExp = tagName;\n } else {\n tagExp = tagExp.substr(0, tagExp.length - 1);\n }\n\n // Re-check attrExpPresent after cleaning\n attrExpPresent = (tagName !== tagExp);\n }\n\n // Now process attributes with CLEAN tagExp (no trailing /)\n let prefixedAttrs = null;\n let rawAttrs = {};\n let namespace = undefined;\n\n // Extract namespace from rawTagName\n namespace = extractNamespace(rawTagName);\n\n // Push tag to matcher FIRST (with empty attrs for now) so callbacks see correct path\n if (tagName !== xmlObj.tagname) {\n this.matcher.push(tagName, {}, namespace);\n }\n\n // Now build attributes - callbacks will see correct matcher state\n if (tagName !== tagExp && attrExpPresent) {\n // Build attributes (returns prefixed attributes for the tree)\n // Note: buildAttributesMap now internally updates the matcher with raw attributes\n prefixedAttrs = this.buildAttributesMap(tagExp, this.matcher, tagName);\n\n if (prefixedAttrs) {\n // Extract raw attributes (without prefix) for our use\n rawAttrs = extractRawAttributes(prefixedAttrs, options);\n }\n }\n\n // Now check if this is a stop node (after attributes are set)\n if (tagName !== xmlObj.tagname) {\n this.isCurrentNodeStopNode = this.isItStopNode();\n }\n\n const startIndex = i;\n if (this.isCurrentNodeStopNode) {\n let tagContent = \"\";\n\n // For self-closing tags, content is empty\n if (isSelfClosing) {\n i = result.closeIndex;\n }\n //unpaired tag\n else if (options.unpairedTagsSet.has(tagName)) {\n i = result.closeIndex;\n }\n //normal tag\n else {\n //read until closing tag is found\n const result = this.readStopNodeData(xmlData, rawTagName, closeIndex + 1);\n if (!result) throw new Error(`Unexpected end of ${rawTagName}`);\n i = result.i;\n tagContent = result.tagContent;\n }\n\n const childNode = new xmlNode(tagName);\n\n if (prefixedAttrs) {\n childNode[\":@\"] = prefixedAttrs;\n }\n\n // For stop nodes, store raw content as-is without any processing\n childNode.add(options.textNodeName, tagContent);\n\n this.matcher.pop(); // Pop the stop node tag\n this.isCurrentNodeStopNode = false; // Reset flag\n\n this.addChild(currentNode, childNode, this.readonlyMatcher, startIndex);\n } else {\n //selfClosing tag\n if (isSelfClosing) {\n ({ tagName, tagExp } = transformTagName(options.transformTagName, tagName, tagExp, options));\n\n const childNode = new xmlNode(tagName);\n if (prefixedAttrs) {\n childNode[\":@\"] = prefixedAttrs;\n }\n this.addChild(currentNode, childNode, this.readonlyMatcher, startIndex);\n this.matcher.pop(); // Pop self-closing tag\n this.isCurrentNodeStopNode = false; // Reset flag\n }\n else if (options.unpairedTagsSet.has(tagName)) {//unpaired tag\n const childNode = new xmlNode(tagName);\n if (prefixedAttrs) {\n childNode[\":@\"] = prefixedAttrs;\n }\n this.addChild(currentNode, childNode, this.readonlyMatcher, startIndex);\n this.matcher.pop(); // Pop unpaired tag\n this.isCurrentNodeStopNode = false; // Reset flag\n i = result.closeIndex;\n // Continue to next iteration without changing currentNode\n continue;\n }\n //opening tag\n else {\n const childNode = new xmlNode(tagName);\n if (this.tagsNodeStack.length > options.maxNestedTags) {\n throw new Error(\"Maximum nested tags exceeded\");\n }\n this.tagsNodeStack.push(currentNode);\n\n if (prefixedAttrs) {\n childNode[\":@\"] = prefixedAttrs;\n }\n this.addChild(currentNode, childNode, this.readonlyMatcher, startIndex);\n currentNode = childNode;\n }\n textData = \"\";\n i = closeIndex;\n }\n }\n } else {\n textData += xmlData[i];\n }\n }\n return xmlObj.child;\n}\n\nfunction addChild(currentNode, childNode, matcher, startIndex) {\n // unset startIndex if not requested\n if (!this.options.captureMetaData) startIndex = undefined;\n\n // Pass jPath string or matcher based on options.jPath setting\n const jPathOrMatcher = this.options.jPath ? matcher.toString() : matcher;\n const result = this.options.updateTag(childNode.tagname, jPathOrMatcher, childNode[\":@\"])\n if (result === false) {\n //do nothing\n } else if (typeof result === \"string\") {\n childNode.tagname = result\n currentNode.addChild(childNode, startIndex);\n } else {\n currentNode.addChild(childNode, startIndex);\n }\n}\n\n/**\n * @param {object} val - Entity object with regex and val properties\n * @param {string} tagName - Tag name\n * @param {string|Matcher} jPath - jPath string or Matcher instance based on options.jPath\n */\nfunction replaceEntitiesValue(val, tagName, jPath) {\n const entityConfig = this.options.processEntities;\n\n if (!entityConfig || !entityConfig.enabled) {\n return val;\n }\n\n // Check if tag is allowed to contain entities\n if (entityConfig.allowedTags) {\n const jPathOrMatcher = this.options.jPath ? jPath.toString() : jPath;\n const allowed = Array.isArray(entityConfig.allowedTags)\n ? entityConfig.allowedTags.includes(tagName)\n : entityConfig.allowedTags(tagName, jPathOrMatcher);\n\n if (!allowed) {\n return val;\n }\n }\n\n // Apply custom tag filter if provided\n if (entityConfig.tagFilter) {\n const jPathOrMatcher = this.options.jPath ? jPath.toString() : jPath;\n if (!entityConfig.tagFilter(tagName, jPathOrMatcher)) {\n return val; // Skip based on custom filter\n }\n }\n\n return this.entityReplacer.replace(val);\n}\n\n\nfunction saveTextToParentTag(textData, parentNode, matcher, isLeafNode) {\n if (textData) { //store previously collected data as textNode\n if (isLeafNode === undefined) isLeafNode = parentNode.child.length === 0\n\n textData = this.parseTextData(textData,\n parentNode.tagname,\n matcher,\n false,\n parentNode[\":@\"] ? Object.keys(parentNode[\":@\"]).length !== 0 : false,\n isLeafNode);\n\n if (textData !== undefined && textData !== \"\")\n parentNode.add(this.options.textNodeName, textData);\n textData = \"\";\n }\n return textData;\n}\n\n/**\n * @param {Array} stopNodeExpressions - Array of compiled Expression objects\n * @param {Matcher} matcher - Current path matcher\n */\nfunction isItStopNode() {\n if (this.stopNodeExpressionsSet.size === 0) return false;\n\n return this.matcher.matchesAny(this.stopNodeExpressionsSet);\n}\n\n/**\n * Returns the tag Expression and where it is ending handling single-double quotes situation\n * @param {string} xmlData \n * @param {number} i starting index\n * @returns \n */\nfunction tagExpWithClosingIndex(xmlData, i, closingChar = \">\") {\n let attrBoundary = 0;\n const chars = [];\n const len = xmlData.length;\n const closeCode0 = closingChar.charCodeAt(0);\n const closeCode1 = closingChar.length > 1 ? closingChar.charCodeAt(1) : -1;\n\n for (let index = i; index < len; index++) {\n const code = xmlData.charCodeAt(index);\n\n if (attrBoundary) {\n if (code === attrBoundary) attrBoundary = 0;\n } else if (code === 34 || code === 39) { // \" or '\n attrBoundary = code;\n } else if (code === closeCode0) {\n if (closeCode1 !== -1) {\n if (xmlData.charCodeAt(index + 1) === closeCode1) {\n return { data: String.fromCharCode(...chars), index };\n }\n } else {\n return { data: String.fromCharCode(...chars), index };\n }\n } else if (code === 9) { // \\t\n chars.push(32); // space\n continue;\n }\n\n chars.push(code);\n }\n}\n\nfunction findClosingIndex(xmlData, str, i, errMsg) {\n const closingIndex = xmlData.indexOf(str, i);\n if (closingIndex === -1) {\n throw new Error(errMsg)\n } else {\n return closingIndex + str.length - 1;\n }\n}\n\nfunction findClosingChar(xmlData, char, i, errMsg) {\n const closingIndex = xmlData.indexOf(char, i);\n if (closingIndex === -1) throw new Error(errMsg);\n return closingIndex; // no offset needed\n}\n\nfunction readTagExp(xmlData, i, removeNSPrefix, closingChar = \">\") {\n const result = tagExpWithClosingIndex(xmlData, i + 1, closingChar);\n if (!result) return;\n let tagExp = result.data;\n const closeIndex = result.index;\n const separatorIndex = tagExp.search(/\\s/);\n let tagName = tagExp;\n let attrExpPresent = true;\n if (separatorIndex !== -1) {//separate tag name and attributes expression\n tagName = tagExp.substring(0, separatorIndex);\n tagExp = tagExp.substring(separatorIndex + 1).trimStart();\n }\n\n const rawTagName = tagName;\n if (removeNSPrefix) {\n const colonIndex = tagName.indexOf(\":\");\n if (colonIndex !== -1) {\n tagName = tagName.substr(colonIndex + 1);\n attrExpPresent = tagName !== result.data.substr(colonIndex + 1);\n }\n }\n\n return {\n tagName: tagName,\n tagExp: tagExp,\n closeIndex: closeIndex,\n attrExpPresent: attrExpPresent,\n rawTagName: rawTagName,\n }\n}\n/**\n * find paired tag for a stop node\n * @param {string} xmlData \n * @param {string} tagName \n * @param {number} i \n */\nfunction readStopNodeData(xmlData, tagName, i) {\n const startIndex = i;\n // Starting at 1 since we already have an open tag\n let openTagCount = 1;\n\n const xmllen = xmlData.length;\n for (; i < xmllen; i++) {\n if (xmlData[i] === \"<\") {\n const c1 = xmlData.charCodeAt(i + 1);\n if (c1 === 47) {//close tag '/'\n const closeIndex = findClosingChar(xmlData, \">\", i, `${tagName} is not closed`);\n let closeTagName = xmlData.substring(i + 2, closeIndex).trim();\n if (closeTagName === tagName) {\n openTagCount--;\n if (openTagCount === 0) {\n return {\n tagContent: xmlData.substring(startIndex, i),\n i: closeIndex\n }\n }\n }\n i = closeIndex;\n } else if (c1 === 63) { //?\n const closeIndex = findClosingIndex(xmlData, \"?>\", i + 1, \"StopNode is not closed.\")\n i = closeIndex;\n } else if (c1 === 33\n && xmlData.charCodeAt(i + 2) === 45\n && xmlData.charCodeAt(i + 3) === 45) { // '!--'\n const closeIndex = findClosingIndex(xmlData, \"-->\", i + 3, \"StopNode is not closed.\")\n i = closeIndex;\n } else if (c1 === 33\n && xmlData.charCodeAt(i + 2) === 91) { // '!['\n const closeIndex = findClosingIndex(xmlData, \"]]>\", i, \"StopNode is not closed.\") - 2;\n i = closeIndex;\n } else {\n const tagData = readTagExp(xmlData, i, '>')\n\n if (tagData) {\n const openTagName = tagData && tagData.tagName;\n if (openTagName === tagName && tagData.tagExp[tagData.tagExp.length - 1] !== \"/\") {\n openTagCount++;\n }\n i = tagData.closeIndex;\n }\n }\n }\n }//end for loop\n}\n\nfunction parseValue(val, shouldParse, options) {\n if (shouldParse && typeof val === 'string') {\n //console.log(options)\n const newval = val.trim();\n if (newval === 'true') return true;\n else if (newval === 'false') return false;\n else return toNumber(val, options);\n } else {\n if (isExist(val)) {\n return val;\n } else {\n return '';\n }\n }\n}\n\nfunction fromCodePoint(str, base, prefix) {\n const codePoint = Number.parseInt(str, base);\n\n if (codePoint >= 0 && codePoint <= 0x10FFFF) {\n return String.fromCodePoint(codePoint);\n } else {\n return prefix + str + \";\";\n }\n}\n\nfunction transformTagName(fn, tagName, tagExp, options) {\n if (fn) {\n const newTagName = fn(tagName);\n if (tagExp === tagName) {\n tagExp = newTagName\n }\n tagName = newTagName;\n }\n tagName = sanitizeName(tagName, options);\n return { tagName, tagExp };\n}\n\n\n\nfunction sanitizeName(name, options) {\n if (criticalProperties.includes(name)) {\n throw new Error(`[SECURITY] Invalid name: \"${name}\" is a reserved JavaScript keyword that could cause prototype pollution`);\n } else if (DANGEROUS_PROPERTY_NAMES.includes(name)) {\n return options.onDangerousProperty(name);\n }\n return name;\n}","export default function getIgnoreAttributesFn(ignoreAttributes) {\n if (typeof ignoreAttributes === 'function') {\n return ignoreAttributes\n }\n if (Array.isArray(ignoreAttributes)) {\n return (attrName) => {\n for (const pattern of ignoreAttributes) {\n if (typeof pattern === 'string' && attrName === pattern) {\n return true\n }\n if (pattern instanceof RegExp && pattern.test(attrName)) {\n return true\n }\n }\n }\n }\n return () => false\n}","'use strict';\n\nimport XmlNode from './xmlNode.js';\nimport { Matcher } from 'path-expression-matcher';\n\nconst METADATA_SYMBOL = XmlNode.getMetaDataSymbol();\n\n/**\n * Helper function to strip attribute prefix from attribute map\n * @param {object} attrs - Attributes with prefix (e.g., {\"@_class\": \"code\"})\n * @param {string} prefix - Attribute prefix to remove (e.g., \"@_\")\n * @returns {object} Attributes without prefix (e.g., {\"class\": \"code\"})\n */\nfunction stripAttributePrefix(attrs, prefix) {\n if (!attrs || typeof attrs !== 'object') return {};\n if (!prefix) return attrs;\n\n const rawAttrs = {};\n for (const key in attrs) {\n if (key.startsWith(prefix)) {\n const rawName = key.substring(prefix.length);\n rawAttrs[rawName] = attrs[key];\n } else {\n // Attribute without prefix (shouldn't normally happen, but be safe)\n rawAttrs[key] = attrs[key];\n }\n }\n return rawAttrs;\n}\n\n/**\n * \n * @param {array} node \n * @param {any} options \n * @param {Matcher} matcher - Path matcher instance\n * @returns \n */\nexport default function prettify(node, options, matcher, readonlyMatcher) {\n return compress(node, options, matcher, readonlyMatcher);\n}\n\n/**\n * @param {array} arr \n * @param {object} options \n * @param {Matcher} matcher - Path matcher instance\n * @returns object\n */\nfunction compress(arr, options, matcher, readonlyMatcher) {\n let text;\n const compressedObj = {}; //This is intended to be a plain object\n for (let i = 0; i < arr.length; i++) {\n const tagObj = arr[i];\n const property = propName(tagObj);\n\n // Push current property to matcher WITH RAW ATTRIBUTES (no prefix)\n if (property !== undefined && property !== options.textNodeName) {\n const rawAttrs = stripAttributePrefix(\n tagObj[\":@\"] || {},\n options.attributeNamePrefix\n );\n matcher.push(property, rawAttrs);\n }\n\n if (property === options.textNodeName) {\n if (text === undefined) text = tagObj[property];\n else text += \"\" + tagObj[property];\n } else if (property === undefined) {\n continue;\n } else if (tagObj[property]) {\n\n let val = compress(tagObj[property], options, matcher, readonlyMatcher);\n const isLeaf = isLeafTag(val, options);\n\n if (tagObj[\":@\"]) {\n assignAttributes(val, tagObj[\":@\"], readonlyMatcher, options);\n } else if (Object.keys(val).length === 1 && val[options.textNodeName] !== undefined && !options.alwaysCreateTextNode) {\n val = val[options.textNodeName];\n } else if (Object.keys(val).length === 0) {\n if (options.alwaysCreateTextNode) val[options.textNodeName] = \"\";\n else val = \"\";\n }\n\n if (tagObj[METADATA_SYMBOL] !== undefined && typeof val === \"object\" && val !== null) {\n val[METADATA_SYMBOL] = tagObj[METADATA_SYMBOL]; // copy over metadata\n }\n\n\n if (compressedObj[property] !== undefined && Object.prototype.hasOwnProperty.call(compressedObj, property)) {\n if (!Array.isArray(compressedObj[property])) {\n compressedObj[property] = [compressedObj[property]];\n }\n compressedObj[property].push(val);\n } else {\n //TODO: if a node is not an array, then check if it should be an array\n //also determine if it is a leaf node\n\n // Pass jPath string or readonlyMatcher based on options.jPath setting\n const jPathOrMatcher = options.jPath ? readonlyMatcher.toString() : readonlyMatcher;\n if (options.isArray(property, jPathOrMatcher, isLeaf)) {\n compressedObj[property] = [val];\n } else {\n compressedObj[property] = val;\n }\n }\n\n // Pop property from matcher after processing\n if (property !== undefined && property !== options.textNodeName) {\n matcher.pop();\n }\n }\n\n }\n // if(text && text.length > 0) compressedObj[options.textNodeName] = text;\n if (typeof text === \"string\") {\n if (text.length > 0) compressedObj[options.textNodeName] = text;\n } else if (text !== undefined) compressedObj[options.textNodeName] = text;\n\n\n return compressedObj;\n}\n\nfunction propName(obj) {\n const keys = Object.keys(obj);\n for (let i = 0; i < keys.length; i++) {\n const key = keys[i];\n if (key !== \":@\") return key;\n }\n}\n\nfunction assignAttributes(obj, attrMap, readonlyMatcher, options) {\n if (attrMap) {\n const keys = Object.keys(attrMap);\n const len = keys.length; //don't make it inline\n for (let i = 0; i < len; i++) {\n const atrrName = keys[i]; // This is the PREFIXED name (e.g., \"@_class\")\n\n // Strip prefix for matcher path (for isArray callback)\n const rawAttrName = atrrName.startsWith(options.attributeNamePrefix)\n ? atrrName.substring(options.attributeNamePrefix.length)\n : atrrName;\n\n // For attributes, we need to create a temporary path\n // Pass jPath string or matcher based on options.jPath setting\n const jPathOrMatcher = options.jPath\n ? readonlyMatcher.toString() + \".\" + rawAttrName\n : readonlyMatcher;\n\n if (options.isArray(atrrName, jPathOrMatcher, true, true)) {\n obj[atrrName] = [attrMap[atrrName]];\n } else {\n obj[atrrName] = attrMap[atrrName];\n }\n }\n }\n}\n\nfunction isLeafTag(obj, options) {\n const { textNodeName } = options;\n const propCount = Object.keys(obj).length;\n\n if (propCount === 0) {\n return true;\n }\n\n if (\n propCount === 1 &&\n (obj[textNodeName] || typeof obj[textNodeName] === \"boolean\" || obj[textNodeName] === 0)\n ) {\n return true;\n }\n\n return false;\n}","'use strict';\n\nimport { getAllMatches, isName } from './util.js';\n\nconst defaultOptions = {\n allowBooleanAttributes: false, //A tag can have attributes without any value\n unpairedTags: []\n};\n\n//const tagsPattern = new RegExp(\"<\\\\/?([\\\\w:\\\\-_\\.]+)\\\\s*\\/?>\",\"g\");\nexport function validate(xmlData, options) {\n options = Object.assign({}, defaultOptions, options);\n\n //xmlData = xmlData.replace(/(\\r\\n|\\n|\\r)/gm,\"\");//make it single line\n //xmlData = xmlData.replace(/(^\\s*<\\?xml.*?\\?>)/g,\"\");//Remove XML starting tag\n //xmlData = xmlData.replace(/()/g,\"\");//Remove DOCTYPE\n const tags = [];\n let tagFound = false;\n\n //indicates that the root tag has been closed (aka. depth 0 has been reached)\n let reachedRoot = false;\n\n if (xmlData[0] === '\\ufeff') {\n // check for byte order mark (BOM)\n xmlData = xmlData.substr(1);\n }\n\n for (let i = 0; i < xmlData.length; i++) {\n\n if (xmlData[i] === '<' && xmlData[i + 1] === '?') {\n i += 2;\n i = readPI(xmlData, i);\n if (i.err) return i;\n } else if (xmlData[i] === '<') {\n //starting of tag\n //read until you reach to '>' avoiding any '>' in attribute value\n let tagStartPos = i;\n i++;\n\n if (xmlData[i] === '!') {\n i = readCommentAndCDATA(xmlData, i);\n continue;\n } else {\n let closingTag = false;\n if (xmlData[i] === '/') {\n //closing tag\n closingTag = true;\n i++;\n }\n //read tagname\n let tagName = '';\n for (; i < xmlData.length &&\n xmlData[i] !== '>' &&\n xmlData[i] !== ' ' &&\n xmlData[i] !== '\\t' &&\n xmlData[i] !== '\\n' &&\n xmlData[i] !== '\\r'; i++\n ) {\n tagName += xmlData[i];\n }\n tagName = tagName.trim();\n //console.log(tagName);\n\n if (tagName[tagName.length - 1] === '/') {\n //self closing tag without attributes\n tagName = tagName.substring(0, tagName.length - 1);\n //continue;\n i--;\n }\n if (!validateTagName(tagName)) {\n let msg;\n if (tagName.trim().length === 0) {\n msg = \"Invalid space after '<'.\";\n } else {\n msg = \"Tag '\" + tagName + \"' is an invalid name.\";\n }\n return getErrorObject('InvalidTag', msg, getLineNumberForPosition(xmlData, i));\n }\n\n const result = readAttributeStr(xmlData, i);\n if (result === false) {\n return getErrorObject('InvalidAttr', \"Attributes for '\" + tagName + \"' have open quote.\", getLineNumberForPosition(xmlData, i));\n }\n let attrStr = result.value;\n i = result.index;\n\n if (attrStr[attrStr.length - 1] === '/') {\n //self closing tag\n const attrStrStart = i - attrStr.length;\n attrStr = attrStr.substring(0, attrStr.length - 1);\n const isValid = validateAttributeString(attrStr, options);\n if (isValid === true) {\n tagFound = true;\n //continue; //text may presents after self closing tag\n } else {\n //the result from the nested function returns the position of the error within the attribute\n //in order to get the 'true' error line, we need to calculate the position where the attribute begins (i - attrStr.length) and then add the position within the attribute\n //this gives us the absolute index in the entire xml, which we can use to find the line at last\n return getErrorObject(isValid.err.code, isValid.err.msg, getLineNumberForPosition(xmlData, attrStrStart + isValid.err.line));\n }\n } else if (closingTag) {\n if (!result.tagClosed) {\n return getErrorObject('InvalidTag', \"Closing tag '\" + tagName + \"' doesn't have proper closing.\", getLineNumberForPosition(xmlData, i));\n } else if (attrStr.trim().length > 0) {\n return getErrorObject('InvalidTag', \"Closing tag '\" + tagName + \"' can't have attributes or invalid starting.\", getLineNumberForPosition(xmlData, tagStartPos));\n } else if (tags.length === 0) {\n return getErrorObject('InvalidTag', \"Closing tag '\" + tagName + \"' has not been opened.\", getLineNumberForPosition(xmlData, tagStartPos));\n } else {\n const otg = tags.pop();\n if (tagName !== otg.tagName) {\n let openPos = getLineNumberForPosition(xmlData, otg.tagStartPos);\n return getErrorObject('InvalidTag',\n \"Expected closing tag '\" + otg.tagName + \"' (opened in line \" + openPos.line + \", col \" + openPos.col + \") instead of closing tag '\" + tagName + \"'.\",\n getLineNumberForPosition(xmlData, tagStartPos));\n }\n\n //when there are no more tags, we reached the root level.\n if (tags.length == 0) {\n reachedRoot = true;\n }\n }\n } else {\n const isValid = validateAttributeString(attrStr, options);\n if (isValid !== true) {\n //the result from the nested function returns the position of the error within the attribute\n //in order to get the 'true' error line, we need to calculate the position where the attribute begins (i - attrStr.length) and then add the position within the attribute\n //this gives us the absolute index in the entire xml, which we can use to find the line at last\n return getErrorObject(isValid.err.code, isValid.err.msg, getLineNumberForPosition(xmlData, i - attrStr.length + isValid.err.line));\n }\n\n //if the root level has been reached before ...\n if (reachedRoot === true) {\n return getErrorObject('InvalidXml', 'Multiple possible root nodes found.', getLineNumberForPosition(xmlData, i));\n } else if (options.unpairedTags.indexOf(tagName) !== -1) {\n //don't push into stack\n } else {\n tags.push({ tagName, tagStartPos });\n }\n tagFound = true;\n }\n\n //skip tag text value\n //It may include comments and CDATA value\n for (i++; i < xmlData.length; i++) {\n if (xmlData[i] === '<') {\n if (xmlData[i + 1] === '!') {\n //comment or CADATA\n i++;\n i = readCommentAndCDATA(xmlData, i);\n continue;\n } else if (xmlData[i + 1] === '?') {\n i = readPI(xmlData, ++i);\n if (i.err) return i;\n } else {\n break;\n }\n } else if (xmlData[i] === '&') {\n const afterAmp = validateAmpersand(xmlData, i);\n if (afterAmp == -1)\n return getErrorObject('InvalidChar', \"char '&' is not expected.\", getLineNumberForPosition(xmlData, i));\n i = afterAmp;\n } else {\n if (reachedRoot === true && !isWhiteSpace(xmlData[i])) {\n return getErrorObject('InvalidXml', \"Extra text at the end\", getLineNumberForPosition(xmlData, i));\n }\n }\n } //end of reading tag text value\n if (xmlData[i] === '<') {\n i--;\n }\n }\n } else {\n if (isWhiteSpace(xmlData[i])) {\n continue;\n }\n return getErrorObject('InvalidChar', \"char '\" + xmlData[i] + \"' is not expected.\", getLineNumberForPosition(xmlData, i));\n }\n }\n\n if (!tagFound) {\n return getErrorObject('InvalidXml', 'Start tag expected.', 1);\n } else if (tags.length == 1) {\n return getErrorObject('InvalidTag', \"Unclosed tag '\" + tags[0].tagName + \"'.\", getLineNumberForPosition(xmlData, tags[0].tagStartPos));\n } else if (tags.length > 0) {\n return getErrorObject('InvalidXml', \"Invalid '\" +\n JSON.stringify(tags.map(t => t.tagName), null, 4).replace(/\\r?\\n/g, '') +\n \"' found.\", { line: 1, col: 1 });\n }\n\n return true;\n};\n\nfunction isWhiteSpace(char) {\n return char === ' ' || char === '\\t' || char === '\\n' || char === '\\r';\n}\n/**\n * Read Processing insstructions and skip\n * @param {*} xmlData\n * @param {*} i\n */\nfunction readPI(xmlData, i) {\n const start = i;\n for (; i < xmlData.length; i++) {\n if (xmlData[i] == '?' || xmlData[i] == ' ') {\n //tagname\n const tagname = xmlData.substr(start, i - start);\n if (i > 5 && tagname === 'xml') {\n return getErrorObject('InvalidXml', 'XML declaration allowed only at the start of the document.', getLineNumberForPosition(xmlData, i));\n } else if (xmlData[i] == '?' && xmlData[i + 1] == '>') {\n //check if valid attribut string\n i++;\n break;\n } else {\n continue;\n }\n }\n }\n return i;\n}\n\nfunction readCommentAndCDATA(xmlData, i) {\n if (xmlData.length > i + 5 && xmlData[i + 1] === '-' && xmlData[i + 2] === '-') {\n //comment\n for (i += 3; i < xmlData.length; i++) {\n if (xmlData[i] === '-' && xmlData[i + 1] === '-' && xmlData[i + 2] === '>') {\n i += 2;\n break;\n }\n }\n } else if (\n xmlData.length > i + 8 &&\n xmlData[i + 1] === 'D' &&\n xmlData[i + 2] === 'O' &&\n xmlData[i + 3] === 'C' &&\n xmlData[i + 4] === 'T' &&\n xmlData[i + 5] === 'Y' &&\n xmlData[i + 6] === 'P' &&\n xmlData[i + 7] === 'E'\n ) {\n let angleBracketsCount = 1;\n for (i += 8; i < xmlData.length; i++) {\n if (xmlData[i] === '<') {\n angleBracketsCount++;\n } else if (xmlData[i] === '>') {\n angleBracketsCount--;\n if (angleBracketsCount === 0) {\n break;\n }\n }\n }\n } else if (\n xmlData.length > i + 9 &&\n xmlData[i + 1] === '[' &&\n xmlData[i + 2] === 'C' &&\n xmlData[i + 3] === 'D' &&\n xmlData[i + 4] === 'A' &&\n xmlData[i + 5] === 'T' &&\n xmlData[i + 6] === 'A' &&\n xmlData[i + 7] === '['\n ) {\n for (i += 8; i < xmlData.length; i++) {\n if (xmlData[i] === ']' && xmlData[i + 1] === ']' && xmlData[i + 2] === '>') {\n i += 2;\n break;\n }\n }\n }\n\n return i;\n}\n\nconst doubleQuote = '\"';\nconst singleQuote = \"'\";\n\n/**\n * Keep reading xmlData until '<' is found outside the attribute value.\n * @param {string} xmlData\n * @param {number} i\n */\nfunction readAttributeStr(xmlData, i) {\n let attrStr = '';\n let startChar = '';\n let tagClosed = false;\n for (; i < xmlData.length; i++) {\n if (xmlData[i] === doubleQuote || xmlData[i] === singleQuote) {\n if (startChar === '') {\n startChar = xmlData[i];\n } else if (startChar !== xmlData[i]) {\n //if vaue is enclosed with double quote then single quotes are allowed inside the value and vice versa\n } else {\n startChar = '';\n }\n } else if (xmlData[i] === '>') {\n if (startChar === '') {\n tagClosed = true;\n break;\n }\n }\n attrStr += xmlData[i];\n }\n if (startChar !== '') {\n return false;\n }\n\n return {\n value: attrStr,\n index: i,\n tagClosed: tagClosed\n };\n}\n\n/**\n * Select all the attributes whether valid or invalid.\n */\nconst validAttrStrRegxp = new RegExp('(\\\\s*)([^\\\\s=]+)(\\\\s*=)?(\\\\s*([\\'\"])(([\\\\s\\\\S])*?)\\\\5)?', 'g');\n\n//attr, =\"sd\", a=\"amit's\", a=\"sd\"b=\"saf\", ab cd=\"\"\n\nfunction validateAttributeString(attrStr, options) {\n //console.log(\"start:\"+attrStr+\":end\");\n\n //if(attrStr.trim().length === 0) return true; //empty string\n\n const matches = getAllMatches(attrStr, validAttrStrRegxp);\n const attrNames = {};\n\n for (let i = 0; i < matches.length; i++) {\n if (matches[i][1].length === 0) {\n //nospace before attribute name: a=\"sd\"b=\"saf\"\n return getErrorObject('InvalidAttr', \"Attribute '\" + matches[i][2] + \"' has no space in starting.\", getPositionFromMatch(matches[i]))\n } else if (matches[i][3] !== undefined && matches[i][4] === undefined) {\n return getErrorObject('InvalidAttr', \"Attribute '\" + matches[i][2] + \"' is without value.\", getPositionFromMatch(matches[i]));\n } else if (matches[i][3] === undefined && !options.allowBooleanAttributes) {\n //independent attribute: ab\n return getErrorObject('InvalidAttr', \"boolean attribute '\" + matches[i][2] + \"' is not allowed.\", getPositionFromMatch(matches[i]));\n }\n /* else if(matches[i][6] === undefined){//attribute without value: ab=\n return { err: { code:\"InvalidAttr\",msg:\"attribute \" + matches[i][2] + \" has no value assigned.\"}};\n } */\n const attrName = matches[i][2];\n if (!validateAttrName(attrName)) {\n return getErrorObject('InvalidAttr', \"Attribute '\" + attrName + \"' is an invalid name.\", getPositionFromMatch(matches[i]));\n }\n if (!Object.prototype.hasOwnProperty.call(attrNames, attrName)) {\n //check for duplicate attribute.\n attrNames[attrName] = 1;\n } else {\n return getErrorObject('InvalidAttr', \"Attribute '\" + attrName + \"' is repeated.\", getPositionFromMatch(matches[i]));\n }\n }\n\n return true;\n}\n\nfunction validateNumberAmpersand(xmlData, i) {\n let re = /\\d/;\n if (xmlData[i] === 'x') {\n i++;\n re = /[\\da-fA-F]/;\n }\n for (; i < xmlData.length; i++) {\n if (xmlData[i] === ';')\n return i;\n if (!xmlData[i].match(re))\n break;\n }\n return -1;\n}\n\nfunction validateAmpersand(xmlData, i) {\n // https://www.w3.org/TR/xml/#dt-charref\n i++;\n if (xmlData[i] === ';')\n return -1;\n if (xmlData[i] === '#') {\n i++;\n return validateNumberAmpersand(xmlData, i);\n }\n let count = 0;\n for (; i < xmlData.length; i++, count++) {\n if (xmlData[i].match(/\\w/) && count < 20)\n continue;\n if (xmlData[i] === ';')\n break;\n return -1;\n }\n return i;\n}\n\nfunction getErrorObject(code, message, lineNumber) {\n return {\n err: {\n code: code,\n msg: message,\n line: lineNumber.line || lineNumber,\n col: lineNumber.col,\n },\n };\n}\n\nfunction validateAttrName(attrName) {\n return isName(attrName);\n}\n\n// const startsWithXML = /^xml/i;\n\nfunction validateTagName(tagname) {\n return isName(tagname) /* && !tagname.match(startsWithXML) */;\n}\n\n//this function returns the line number for the character at the given index\nfunction getLineNumberForPosition(xmlData, index) {\n const lines = xmlData.substring(0, index).split(/\\r?\\n/);\n return {\n line: lines.length,\n\n // column number is last line's length + 1, because column numbering starts at 1:\n col: lines[lines.length - 1].length + 1\n };\n}\n\n//this function returns the position of the first character of match within attrStr\nfunction getPositionFromMatch(match) {\n return match.startIndex + match[1].length;\n}\n","import { buildOptions } from './OptionsBuilder.js';\nimport OrderedObjParser from './OrderedObjParser.js';\nimport prettify from './node2json.js';\nimport { validate } from \"../validator.js\";\nimport XmlNode from './xmlNode.js';\n\nexport default class XMLParser {\n\n constructor(options) {\n this.externalEntities = {};\n this.options = buildOptions(options);\n\n }\n /**\n * Parse XML dats to JS object \n * @param {string|Uint8Array} xmlData \n * @param {boolean|Object} validationOption \n */\n parse(xmlData, validationOption) {\n if (typeof xmlData !== \"string\" && xmlData.toString) {\n xmlData = xmlData.toString();\n } else if (typeof xmlData !== \"string\") {\n throw new Error(\"XML data is accepted in String or Bytes[] form.\")\n }\n\n if (validationOption) {\n if (validationOption === true) validationOption = {}; //validate with default options\n\n const result = validate(xmlData, validationOption);\n if (result !== true) {\n throw Error(`${result.err.msg}:${result.err.line}:${result.err.col}`)\n }\n }\n const orderedObjParser = new OrderedObjParser(this.options);\n orderedObjParser.entityReplacer.setExternalEntities(this.externalEntities);\n const orderedResult = orderedObjParser.parseXml(xmlData);\n if (this.options.preserveOrder || orderedResult === undefined) return orderedResult;\n else return prettify(orderedResult, this.options, orderedObjParser.matcher, orderedObjParser.readonlyMatcher);\n }\n\n /**\n * Add Entity which is not by default supported by this library\n * @param {string} key \n * @param {string} value \n */\n addEntity(key, value) {\n if (value.indexOf(\"&\") !== -1) {\n throw new Error(\"Entity value can't have '&'\")\n } else if (key.indexOf(\"&\") !== -1 || key.indexOf(\";\") !== -1) {\n throw new Error(\"An entity must be set without '&' and ';'. Eg. use '#xD' for ' '\")\n } else if (value === \"&\") {\n throw new Error(\"An entity with value '&' is not permitted\");\n } else {\n this.externalEntities[key] = value;\n }\n }\n\n /**\n * Returns a Symbol that can be used to access the metadata\n * property on a node.\n * \n * If Symbol is not available in the environment, an ordinary property is used\n * and the name of the property is here returned.\n * \n * The XMLMetaData property is only present when `captureMetaData`\n * is true in the options.\n */\n static getMetaDataSymbol() {\n return XmlNode.getMetaDataSymbol();\n }\n}"],"names":["root","factory","exports","module","define","amd","this","__webpack_require__","definition","key","o","Object","defineProperty","enumerable","get","obj","prop","prototype","hasOwnProperty","call","Symbol","toStringTag","value","nameStartChar","regexName","RegExp","getAllMatches","string","regex","matches","match","exec","allmatches","startIndex","lastIndex","length","len","index","push","isName","DANGEROUS_PROPERTY_NAMES","criticalProperties","defaultOnDangerousProperty","name","includes","defaultOptions","preserveOrder","attributeNamePrefix","attributesGroupName","textNodeName","ignoreAttributes","removeNSPrefix","allowBooleanAttributes","parseTagValue","parseAttributeValue","trimValues","cdataPropName","numberParseOptions","hex","leadingZeros","eNotation","tagValueProcessor","tagName","val","attributeValueProcessor","attrName","stopNodes","alwaysCreateTextNode","isArray","commentPropName","unpairedTags","processEntities","htmlEntities","ignoreDeclaration","ignorePiTags","transformTagName","transformAttributeName","updateTag","jPath","attrs","captureMetaData","maxNestedTags","strictReservedNames","onDangerousProperty","validatePropertyName","propertyName","optionName","normalized","toLowerCase","some","dangerous","Error","normalizeProcessEntities","enabled","maxEntitySize","maxExpansionDepth","maxTotalExpansions","maxExpandedLength","maxEntityCount","allowedTags","tagFilter","Math","max","_value$maxEntitySize","_value$maxExpansionDe","_value$maxTotalExpans","Infinity","_value$maxExpandedLen","_value$maxEntityCount","_value$allowedTags","_value$tagFilter","METADATA_SYMBOL","buildOptions","options","built","assign","_i","_propertyNameOptions","_propertyNameOptions$","unpairedTagsSet","Set","Array","map","node","startsWith","substring","XmlNode","tagname","child","create","_proto","add","_this$child$push","addChild","_this$child$push2","_this$child$push3","keys","undefined","getMetaDataSymbol","DocTypeReader","suppressValidationErr","readDocType","xmlData","i","entities","entityCount","angleBracketsCount","hasBody","comment","hasSeq","entityName","_this$readEntityExp","readEntityExp","indexOf","escaped","replace","regx","readElementExp","readNotationExp","skipWhitespace","test","validateEntityName","toUpperCase","entityValue","_this$readIdentifierV","readIdentifierVal","notationName","identifierType","publicIdentifier","systemIdentifier","_this$readIdentifierV2","_this$readIdentifierV3","_this$readIdentifierV4","type","identifierVal","startChar","elementName","contentModel","trim","readAttlistExp","attributeName","attributeType","allowedNotations","notation","join","defaultValue","_this$readIdentifierV5","data","seq","j","hexRegex","numRegex","consider","decimalPoint","infinity","eNotationRegx","MatcherView","constructor","matcher","_matcher","separator","getCurrentTag","path","tag","getCurrentNamespace","namespace","getAttrValue","values","hasAttr","current","getPosition","position","getCounter","counter","getIndex","getDepth","toString","includeNamespace","toArray","n","expression","matchesAny","exprSet","Matcher","siblingStacks","_pathStringCache","_view","attrValues","currentLevel","Map","siblings","siblingKey","count","set","pop","updateCurrent","sep","result","reset","segments","hasDeepWildcard","_matchWithDeepWildcard","_matchSimple","_matchSegment","pathIdx","segIdx","segment","nextSeg","found","isCurrentNode","attrValue","String","positionValue","snapshot","restore","readOnly","Expression","pattern","_parse","_hasDeepWildcard","seg","_hasAttributeCondition","_hasPositionSelector","currentPart","_parseSegment","part","bracketContent","withoutBrackets","bracketMatch","content","slice","tagAndPosition","nsIndex","positionMatch","colonIndex","lastIndexOf","tagPart","posPart","eqIndex","nthMatch","parseInt","hasAttributeCondition","hasPositionSelector","ExpressionSet","_byDepthAndTag","_wildcardByDepth","_deepWildcards","_patterns","_sealed","TypeError","has","depth","lastSeg","addAll","expressions","expr","size","seal","isSealed","findMatch","exactKey","exactBucket","wildcardBucket","DEFAULT_XML_ENTITIES","apos","gt","lt","quot","AMP_ENTITY","SPECIAL_CHARS","ch","escapeForRegex","str","resolveTable","option","builtIn","enabledByDefault","buildEntries","entries","raw","EntityReplacer","spec","_defaultTable","default","_systemTable","system","_ampEnabled","amp","_maxTotalExpansions","_maxExpandedLength","_applyLimitsTo","applyLimitsTo","_postCheck","postCheck","r","_limitExternal","_limitSystem","_limitDefault","_defaultEntries","_systemEntries","_persistentEntries","_inputEntries","_totalExpansions","_expandedLength","setExternalEntities","addExternalEntity","addInputEntities","original","_applyEntries","parse","track","limitExpansions","limitLength","trackAny","entity","args","before","delta","COMMON_HTML","nbsp","copy","reg","trade","mdash","ndash","hellip","laquo","raquo","lsquo","rsquo","ldquo","rdquo","bull","para","sect","deg","frac12","frac14","frac34","inr","CURRENCY_ENTITIES","cent","pound","yen","euro","curren","fnof","NUMERIC_ENTITIES","num_dec","_","s","fromCodePoint","num_hex","base","prefix","codePoint","Number","_extends","bind","e","arguments","t","apply","extractRawAttributes","prefixedAttrs","rawAttrs","extractNamespace","rawTagName","ns","OrderedObjParser","currentNode","tagsNodeStack","parseXml","parseTextData","resolveNameSpace","buildAttributesMap","isItStopNode","replaceEntitiesValue","readStopNodeData","saveTextToParentTag","ignoreAttributesFn","_step","_iterator","_createForOfIteratorHelperLoose","done","entityExpansionCount","currentExpandedLength","entityReplacer","readonlyMatcher","isCurrentNodeStopNode","stopNodeExpressionsSet","stopNodesOpts","stopNodeExp","dontTrim","hasAttributes","isLeafNode","escapeEntities","jPathOrMatcher","newval","parseValue","tags","split","charAt","attrsRegx","attrStr","processedVals","hasRawAttrs","rawAttrsForMatcher","oldVal","jPathStr","hasAttrs","aName","sanitizeName","newVal","attrCollection","xmlObj","xmlNode","textData","docTypeReader","xmlLen","c1","charCodeAt","closeIndex","findClosingIndex","substr","lastTagName","tagData","readTagExp","childNode","tagExp","attrExpPresent","endIndex","_ref","_ref2","context","min","_transformTagName","lastTag","isSelfClosing","tagContent","_transformTagName2","entityConfig","parentNode","errMsg","closingIndex","findClosingChar","char","closingChar","attrBoundary","chars","closeCode0","closeCode1","code","fromCharCode","tagExpWithClosingIndex","separatorIndex","search","trimStart","openTagCount","xmllen","shouldParse","trimmedStr","skipLike","numStr","window","parse_int","isFinite","sign","eChar","eAdjacentToLeadingZeros","resolveEnotation","numTrimmedByZeros","decimalAdjacentToLeadingZeros","num","parsedStr","isPositive","handleInfinity","toNumber","fn","newTagName","stripAttributePrefix","prettify","compress","arr","text","compressedObj","tagObj","property","propName","isLeaf","isLeafTag","assignAttributes","attrMap","atrrName","rawAttrName","propCount","isWhiteSpace","readPI","start","getErrorObject","getLineNumberForPosition","readCommentAndCDATA","readAttributeStr","tagClosed","validAttrStrRegxp","validateAttributeString","attrNames","getPositionFromMatch","validateAttrName","validateAmpersand","re","validateNumberAmpersand","message","lineNumber","err","msg","line","col","validateTagName","lines","XMLParser","externalEntities","validationOption","tagFound","reachedRoot","tagStartPos","closingTag","attrStrStart","isValid","otg","openPos","afterAmp","JSON","stringify","validate","orderedObjParser","orderedResult","addEntity"],"sourceRoot":""} \ No newline at end of file +{"version":3,"file":"./lib/fxparser.min.js","mappings":"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","sources":["webpack://XMLParser/webpack/universalModuleDefinition","webpack://XMLParser/webpack/bootstrap","webpack://XMLParser/webpack/runtime/define property getters","webpack://XMLParser/webpack/runtime/hasOwnProperty shorthand","webpack://XMLParser/webpack/runtime/make namespace object","webpack://XMLParser/./src/util.js","webpack://XMLParser/./src/xmlparser/OptionsBuilder.js","webpack://XMLParser/./src/xmlparser/xmlNode.js","webpack://XMLParser/./src/xmlparser/DocTypeReader.js","webpack://XMLParser/./node_modules/strnum/strnum.js","webpack://XMLParser/./node_modules/path-expression-matcher/src/Matcher.js","webpack://XMLParser/./node_modules/path-expression-matcher/src/Expression.js","webpack://XMLParser/./node_modules/path-expression-matcher/src/ExpressionSet.js","webpack://XMLParser/./node_modules/@nodable/entities/src/entities.js","webpack://XMLParser/./node_modules/@nodable/entities/src/EntityDecoder.js","webpack://XMLParser/./src/xmlparser/OrderedObjParser.js","webpack://XMLParser/./src/ignoreAttributes.js","webpack://XMLParser/./src/xmlparser/node2json.js","webpack://XMLParser/./src/validator.js","webpack://XMLParser/./src/xmlparser/XMLParser.js"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"XMLParser\"] = factory();\n\telse\n\t\troot[\"XMLParser\"] = factory();\n})(this, () => {\nreturn ","// The require scope\nvar __webpack_require__ = {};\n\n","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","'use strict';\n\nconst nameStartChar = ':A-Za-z_\\\\u00C0-\\\\u00D6\\\\u00D8-\\\\u00F6\\\\u00F8-\\\\u02FF\\\\u0370-\\\\u037D\\\\u037F-\\\\u1FFF\\\\u200C-\\\\u200D\\\\u2070-\\\\u218F\\\\u2C00-\\\\u2FEF\\\\u3001-\\\\uD7FF\\\\uF900-\\\\uFDCF\\\\uFDF0-\\\\uFFFD';\nconst nameChar = nameStartChar + '\\\\-.\\\\d\\\\u00B7\\\\u0300-\\\\u036F\\\\u203F-\\\\u2040';\nexport const nameRegexp = '[' + nameStartChar + '][' + nameChar + ']*';\nconst regexName = new RegExp('^' + nameRegexp + '$');\n\nexport function getAllMatches(string, regex) {\n const matches = [];\n let match = regex.exec(string);\n while (match) {\n const allmatches = [];\n allmatches.startIndex = regex.lastIndex - match[0].length;\n const len = match.length;\n for (let index = 0; index < len; index++) {\n allmatches.push(match[index]);\n }\n matches.push(allmatches);\n match = regex.exec(string);\n }\n return matches;\n}\n\nexport const isName = function (string) {\n const match = regexName.exec(string);\n return !(match === null || typeof match === 'undefined');\n}\n\nexport function isExist(v) {\n return typeof v !== 'undefined';\n}\n\nexport function isEmptyObject(obj) {\n return Object.keys(obj).length === 0;\n}\n\nexport function getValue(v) {\n if (exports.isExist(v)) {\n return v;\n } else {\n return '';\n }\n}\n\n/**\n * Dangerous property names that could lead to prototype pollution or security issues\n */\nexport const DANGEROUS_PROPERTY_NAMES = [\n // '__proto__',\n // 'constructor',\n // 'prototype',\n 'hasOwnProperty',\n 'toString',\n 'valueOf',\n '__defineGetter__',\n '__defineSetter__',\n '__lookupGetter__',\n '__lookupSetter__'\n];\n\nexport const criticalProperties = [\"__proto__\", \"constructor\", \"prototype\"];","import { DANGEROUS_PROPERTY_NAMES, criticalProperties } from \"../util.js\";\nimport { COMMON_HTML, CURRENCY } from '@nodable/entities';\n\nconst defaultOnDangerousProperty = (name) => {\n if (DANGEROUS_PROPERTY_NAMES.includes(name)) {\n return \"__\" + name;\n }\n return name;\n};\n\n\nexport const defaultOptions = {\n preserveOrder: false,\n attributeNamePrefix: '@_',\n attributesGroupName: false,\n textNodeName: '#text',\n ignoreAttributes: true,\n removeNSPrefix: false, // remove NS from tag name or attribute name if true\n allowBooleanAttributes: false, //a tag can have attributes without any value\n //ignoreRootElement : false,\n parseTagValue: true,\n parseAttributeValue: false,\n trimValues: true, //Trim string values of tag and attributes\n cdataPropName: false,\n numberParseOptions: {\n hex: true,\n leadingZeros: true,\n eNotation: true\n },\n tagValueProcessor: function (tagName, val) {\n return val;\n },\n attributeValueProcessor: function (attrName, val) {\n return val;\n },\n stopNodes: [], //nested tags will not be parsed even for errors\n alwaysCreateTextNode: false,\n isArray: () => false,\n commentPropName: false,\n unpairedTags: [],\n processEntities: true,\n htmlEntities: false,\n entityDecoder: null,\n ignoreDeclaration: false,\n ignorePiTags: false,\n transformTagName: false,\n transformAttributeName: false,\n updateTag: function (tagName, jPath, attrs) {\n return tagName\n },\n // skipEmptyListItem: false\n captureMetaData: false,\n maxNestedTags: 100,\n strictReservedNames: true,\n jPath: true, // if true, pass jPath string to callbacks; if false, pass matcher instance\n onDangerousProperty: defaultOnDangerousProperty\n};\n\n\n/**\n * Validates that a property name is safe to use\n * @param {string} propertyName - The property name to validate\n * @param {string} optionName - The option field name (for error message)\n * @throws {Error} If property name is dangerous\n */\nfunction validatePropertyName(propertyName, optionName) {\n if (typeof propertyName !== 'string') {\n return; // Only validate string property names\n }\n\n const normalized = propertyName.toLowerCase();\n if (DANGEROUS_PROPERTY_NAMES.some(dangerous => normalized === dangerous.toLowerCase())) {\n throw new Error(\n `[SECURITY] Invalid ${optionName}: \"${propertyName}\" is a reserved JavaScript keyword that could cause prototype pollution`\n );\n }\n\n if (criticalProperties.some(dangerous => normalized === dangerous.toLowerCase())) {\n throw new Error(\n `[SECURITY] Invalid ${optionName}: \"${propertyName}\" is a reserved JavaScript keyword that could cause prototype pollution`\n );\n }\n}\n\n/**\n * Normalizes processEntities option for backward compatibility\n * @param {boolean|object} value \n * @returns {object} Always returns normalized object\n */\nfunction normalizeProcessEntities(value, htmlEntities) {\n // Boolean backward compatibility\n if (typeof value === 'boolean') {\n return {\n enabled: value, // true or false\n maxEntitySize: 10000,\n maxExpansionDepth: 10000,\n maxTotalExpansions: Infinity,\n maxExpandedLength: 100000,\n maxEntityCount: 1000,\n allowedTags: null,\n tagFilter: null,\n appliesTo: \"all\",\n };\n }\n\n // Object config - merge with defaults\n if (typeof value === 'object' && value !== null) {\n return {\n enabled: value.enabled !== false,\n maxEntitySize: Math.max(1, value.maxEntitySize ?? 10000),\n maxExpansionDepth: Math.max(1, value.maxExpansionDepth ?? 10000),\n maxTotalExpansions: Math.max(1, value.maxTotalExpansions ?? Infinity),\n maxExpandedLength: Math.max(1, value.maxExpandedLength ?? 100000),\n maxEntityCount: Math.max(1, value.maxEntityCount ?? 1000),\n allowedTags: value.allowedTags ?? null,\n tagFilter: value.tagFilter ?? null,\n appliesTo: value.appliesTo ?? \"all\",\n };\n }\n\n // Default to enabled with limits\n return normalizeProcessEntities(true);\n}\n\nexport const buildOptions = function (options) {\n const built = Object.assign({}, defaultOptions, options);\n\n // Validate property names to prevent prototype pollution\n const propertyNameOptions = [\n { value: built.attributeNamePrefix, name: 'attributeNamePrefix' },\n { value: built.attributesGroupName, name: 'attributesGroupName' },\n { value: built.textNodeName, name: 'textNodeName' },\n { value: built.cdataPropName, name: 'cdataPropName' },\n { value: built.commentPropName, name: 'commentPropName' }\n ];\n\n for (const { value, name } of propertyNameOptions) {\n if (value) {\n validatePropertyName(value, name);\n }\n }\n\n if (built.onDangerousProperty === null) {\n built.onDangerousProperty = defaultOnDangerousProperty;\n }\n\n // Always normalize processEntities for backward compatibility and validation\n built.processEntities = normalizeProcessEntities(built.processEntities, built.htmlEntities);\n built.unpairedTagsSet = new Set(built.unpairedTags);\n // Convert old-style stopNodes for backward compatibility\n if (built.stopNodes && Array.isArray(built.stopNodes)) {\n built.stopNodes = built.stopNodes.map(node => {\n if (typeof node === 'string' && node.startsWith('*.')) {\n // Old syntax: *.tagname meant \"tagname anywhere\"\n // Convert to new syntax: ..tagname\n return '..' + node.substring(2);\n }\n return node;\n });\n }\n //console.debug(built.processEntities)\n return built;\n};","'use strict';\n\nlet METADATA_SYMBOL;\n\nif (typeof Symbol !== \"function\") {\n METADATA_SYMBOL = \"@@xmlMetadata\";\n} else {\n METADATA_SYMBOL = Symbol(\"XML Node Metadata\");\n}\n\nexport default class XmlNode {\n constructor(tagname) {\n this.tagname = tagname;\n this.child = []; //nested tags, text, cdata, comments in order\n this[\":@\"] = Object.create(null); //attributes map\n }\n add(key, val) {\n // this.child.push( {name : key, val: val, isCdata: isCdata });\n if (key === \"__proto__\") key = \"#__proto__\";\n this.child.push({ [key]: val });\n }\n addChild(node, startIndex) {\n if (node.tagname === \"__proto__\") node.tagname = \"#__proto__\";\n if (node[\":@\"] && Object.keys(node[\":@\"]).length > 0) {\n this.child.push({ [node.tagname]: node.child, [\":@\"]: node[\":@\"] });\n } else {\n this.child.push({ [node.tagname]: node.child });\n }\n // if requested, add the startIndex\n if (startIndex !== undefined) {\n // Note: for now we just overwrite the metadata. If we had more complex metadata,\n // we might need to do an object append here: metadata = { ...metadata, startIndex }\n this.child[this.child.length - 1][METADATA_SYMBOL] = { startIndex };\n }\n }\n /** symbol used for metadata */\n static getMetaDataSymbol() {\n return METADATA_SYMBOL;\n }\n}\n","import { isName } from '../util.js';\n\nexport default class DocTypeReader {\n constructor(options) {\n this.suppressValidationErr = !options;\n this.options = options;\n }\n\n readDocType(xmlData, i) {\n const entities = Object.create(null);\n let entityCount = 0;\n\n if (xmlData[i + 3] === 'O' &&\n xmlData[i + 4] === 'C' &&\n xmlData[i + 5] === 'T' &&\n xmlData[i + 6] === 'Y' &&\n xmlData[i + 7] === 'P' &&\n xmlData[i + 8] === 'E') {\n i = i + 9;\n let angleBracketsCount = 1;\n let hasBody = false, comment = false;\n let exp = \"\";\n for (; i < xmlData.length; i++) {\n if (xmlData[i] === '<' && !comment) { //Determine the tag type\n if (hasBody && hasSeq(xmlData, \"!ENTITY\", i)) {\n i += 7;\n let entityName, val;\n [entityName, val, i] = this.readEntityExp(xmlData, i + 1, this.suppressValidationErr);\n if (val.indexOf(\"&\") === -1) { //Parameter entities are not supported\n if (this.options.enabled !== false &&\n this.options.maxEntityCount != null &&\n entityCount >= this.options.maxEntityCount) {\n throw new Error(\n `Entity count (${entityCount + 1}) exceeds maximum allowed (${this.options.maxEntityCount})`\n );\n }\n //const escaped = entityName.replace(/[.\\-+*:]/g, '\\\\.');\n //const escaped = entityName.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n entities[entityName] = val;\n entityCount++;\n }\n }\n else if (hasBody && hasSeq(xmlData, \"!ELEMENT\", i)) {\n i += 8;//Not supported\n const { index } = this.readElementExp(xmlData, i + 1);\n i = index;\n } else if (hasBody && hasSeq(xmlData, \"!ATTLIST\", i)) {\n i += 8;//Not supported\n // const {index} = this.readAttlistExp(xmlData,i+1);\n // i = index;\n } else if (hasBody && hasSeq(xmlData, \"!NOTATION\", i)) {\n i += 9;//Not supported\n const { index } = this.readNotationExp(xmlData, i + 1, this.suppressValidationErr);\n i = index;\n } else if (hasSeq(xmlData, \"!--\", i)) comment = true;\n else throw new Error(`Invalid DOCTYPE`);\n\n angleBracketsCount++;\n exp = \"\";\n } else if (xmlData[i] === '>') { //Read tag content\n if (comment) {\n if (xmlData[i - 1] === \"-\" && xmlData[i - 2] === \"-\") {\n comment = false;\n angleBracketsCount--;\n }\n } else {\n angleBracketsCount--;\n }\n if (angleBracketsCount === 0) {\n break;\n }\n } else if (xmlData[i] === '[') {\n hasBody = true;\n } else {\n exp += xmlData[i];\n }\n }\n if (angleBracketsCount !== 0) {\n throw new Error(`Unclosed DOCTYPE`);\n }\n } else {\n throw new Error(`Invalid Tag instead of DOCTYPE`);\n }\n return { entities, i };\n }\n readEntityExp(xmlData, i) {\n //External entities are not supported\n // \n\n //Parameter entities are not supported\n // \n\n //Internal entities are supported\n // \n\n // Skip leading whitespace after this.options.maxEntitySize) {\n throw new Error(\n `Entity \"${entityName}\" size (${entityValue.length}) exceeds maximum allowed size (${this.options.maxEntitySize})`\n );\n }\n\n i--;\n return [entityName, entityValue, i];\n }\n\n readNotationExp(xmlData, i) {\n // Skip leading whitespace after \n // \n // \n // \n // \n\n // Skip leading whitespace after {\n while (index < data.length && /\\s/.test(data[index])) {\n index++;\n }\n return index;\n};\n\n\n\nfunction hasSeq(data, seq, i) {\n for (let j = 0; j < seq.length; j++) {\n if (seq[j] !== data[i + j + 1]) return false;\n }\n return true;\n}\n\nfunction validateEntityName(name) {\n if (isName(name))\n return name;\n else\n throw new Error(`Invalid entity name ${name}`);\n}","const hexRegex = /^[-+]?0x[a-fA-F0-9]+$/;\nconst numRegex = /^([\\-\\+])?(0*)([0-9]*(\\.[0-9]*)?)$/;\n// const octRegex = /^0x[a-z0-9]+/;\n// const binRegex = /0x[a-z0-9]+/;\n\n\nconst consider = {\n hex: true,\n // oct: false,\n leadingZeros: true,\n decimalPoint: \"\\.\",\n eNotation: true,\n //skipLike: /regex/,\n infinity: \"original\", // \"null\", \"infinity\" (Infinity type), \"string\" (\"Infinity\" (the string literal))\n};\n\nexport default function toNumber(str, options = {}) {\n options = Object.assign({}, consider, options);\n if (!str || typeof str !== \"string\") return str;\n\n let trimmedStr = str.trim();\n\n if (trimmedStr.length === 0) return str;\n else if (options.skipLike !== undefined && options.skipLike.test(trimmedStr)) return str;\n else if (trimmedStr === \"0\") return 0;\n else if (options.hex && hexRegex.test(trimmedStr)) {\n return parse_int(trimmedStr, 16);\n // }else if (options.oct && octRegex.test(str)) {\n // return Number.parseInt(val, 8);\n } else if (!isFinite(trimmedStr)) { //Infinity\n return handleInfinity(str, Number(trimmedStr), options);\n } else if (trimmedStr.includes('e') || trimmedStr.includes('E')) { //eNotation\n return resolveEnotation(str, trimmedStr, options);\n // }else if (options.parseBin && binRegex.test(str)) {\n // return Number.parseInt(val, 2);\n } else {\n //separate negative sign, leading zeros, and rest number\n const match = numRegex.exec(trimmedStr);\n // +00.123 => [ , '+', '00', '.123', ..\n if (match) {\n const sign = match[1] || \"\";\n const leadingZeros = match[2];\n let numTrimmedByZeros = trimZeros(match[3]); //complete num without leading zeros\n const decimalAdjacentToLeadingZeros = sign ? // 0., -00., 000.\n str[leadingZeros.length + 1] === \".\"\n : str[leadingZeros.length] === \".\";\n\n //trim ending zeros for floating number\n if (!options.leadingZeros //leading zeros are not allowed\n && (leadingZeros.length > 1\n || (leadingZeros.length === 1 && !decimalAdjacentToLeadingZeros))) {\n // 00, 00.3, +03.24, 03, 03.24\n return str;\n }\n else {//no leading zeros or leading zeros are allowed\n const num = Number(trimmedStr);\n const parsedStr = String(num);\n\n if (num === 0) return num;\n if (parsedStr.search(/[eE]/) !== -1) { //given number is long and parsed to eNotation\n if (options.eNotation) return num;\n else return str;\n } else if (trimmedStr.indexOf(\".\") !== -1) { //floating number\n if (parsedStr === \"0\") return num; //0.0\n else if (parsedStr === numTrimmedByZeros) return num; //0.456. 0.79000\n else if (parsedStr === `${sign}${numTrimmedByZeros}`) return num;\n else return str;\n }\n\n let n = leadingZeros ? numTrimmedByZeros : trimmedStr;\n if (leadingZeros) {\n // -009 => -9\n return (n === parsedStr) || (sign + n === parsedStr) ? num : str\n } else {\n // +9\n return (n === parsedStr) || (n === sign + parsedStr) ? num : str\n }\n }\n } else { //non-numeric string\n return str;\n }\n }\n}\n\nconst eNotationRegx = /^([-+])?(0*)(\\d*(\\.\\d*)?[eE][-\\+]?\\d+)$/;\nfunction resolveEnotation(str, trimmedStr, options) {\n if (!options.eNotation) return str;\n const notation = trimmedStr.match(eNotationRegx);\n if (notation) {\n let sign = notation[1] || \"\";\n const eChar = notation[3].indexOf(\"e\") === -1 ? \"E\" : \"e\";\n const leadingZeros = notation[2];\n const eAdjacentToLeadingZeros = sign ? // 0E.\n str[leadingZeros.length + 1] === eChar\n : str[leadingZeros.length] === eChar;\n\n if (leadingZeros.length > 1 && eAdjacentToLeadingZeros) return str;\n else if (leadingZeros.length === 1\n && (notation[3].startsWith(`.${eChar}`) || notation[3][0] === eChar)) {\n return Number(trimmedStr);\n } else if (leadingZeros.length > 0) {\n // Has leading zeros — only accept if leadingZeros option allows it\n if (options.leadingZeros && !eAdjacentToLeadingZeros) {\n trimmedStr = (notation[1] || \"\") + notation[3];\n return Number(trimmedStr);\n } else return str;\n } else {\n // No leading zeros — always valid e-notation, parse it\n return Number(trimmedStr);\n }\n } else {\n return str;\n }\n}\n\n/**\n * \n * @param {string} numStr without leading zeros\n * @returns \n */\nfunction trimZeros(numStr) {\n if (numStr && numStr.indexOf(\".\") !== -1) {//float\n numStr = numStr.replace(/0+$/, \"\"); //remove ending zeros\n if (numStr === \".\") numStr = \"0\";\n else if (numStr[0] === \".\") numStr = \"0\" + numStr;\n else if (numStr[numStr.length - 1] === \".\") numStr = numStr.substring(0, numStr.length - 1);\n return numStr;\n }\n return numStr;\n}\n\nfunction parse_int(numStr, base) {\n //polyfill\n if (parseInt) return parseInt(numStr, base);\n else if (Number.parseInt) return Number.parseInt(numStr, base);\n else if (window && window.parseInt) return window.parseInt(numStr, base);\n else throw new Error(\"parseInt, Number.parseInt, window.parseInt are not supported\")\n}\n\n/**\n * Handle infinite values based on user option\n * @param {string} str - original input string\n * @param {number} num - parsed number (Infinity or -Infinity)\n * @param {object} options - user options\n * @returns {string|number|null} based on infinity option\n */\nfunction handleInfinity(str, num, options) {\n const isPositive = num === Infinity;\n\n switch (options.infinity.toLowerCase()) {\n case \"null\":\n return null;\n case \"infinity\":\n return num; // Return Infinity or -Infinity\n case \"string\":\n return isPositive ? \"Infinity\" : \"-Infinity\";\n case \"original\":\n default:\n return str; // Return original string like \"1e1000\"\n }\n}","import ExpressionSet from \"./ExpressionSet.js\";\n\n/**\n * MatcherView - A lightweight read-only view over a Matcher's internal state.\n *\n * Created once by Matcher and reused across all callbacks. Holds a direct\n * reference to the parent Matcher so it always reflects current parser state\n * with zero copying or freezing overhead.\n *\n * Users receive this via {@link Matcher#readOnly} or directly from parser\n * callbacks. It exposes all query and matching methods but has no mutation\n * methods — misuse is caught at the TypeScript level rather than at runtime.\n *\n * @example\n * const matcher = new Matcher();\n * const view = matcher.readOnly();\n *\n * matcher.push(\"root\", {});\n * view.getCurrentTag(); // \"root\"\n * view.getDepth(); // 1\n */\nexport class MatcherView {\n /**\n * @param {Matcher} matcher - The parent Matcher instance to read from.\n */\n constructor(matcher) {\n this._matcher = matcher;\n }\n\n /**\n * Get the path separator used by the parent matcher.\n * @returns {string}\n */\n get separator() {\n return this._matcher.separator;\n }\n\n /**\n * Get current tag name.\n * @returns {string|undefined}\n */\n getCurrentTag() {\n const path = this._matcher.path;\n return path.length > 0 ? path[path.length - 1].tag : undefined;\n }\n\n /**\n * Get current namespace.\n * @returns {string|undefined}\n */\n getCurrentNamespace() {\n const path = this._matcher.path;\n return path.length > 0 ? path[path.length - 1].namespace : undefined;\n }\n\n /**\n * Get current node's attribute value.\n * @param {string} attrName\n * @returns {*}\n */\n getAttrValue(attrName) {\n const path = this._matcher.path;\n if (path.length === 0) return undefined;\n return path[path.length - 1].values?.[attrName];\n }\n\n /**\n * Check if current node has an attribute.\n * @param {string} attrName\n * @returns {boolean}\n */\n hasAttr(attrName) {\n const path = this._matcher.path;\n if (path.length === 0) return false;\n const current = path[path.length - 1];\n return current.values !== undefined && attrName in current.values;\n }\n\n /**\n * Get current node's sibling position (child index in parent).\n * @returns {number}\n */\n getPosition() {\n const path = this._matcher.path;\n if (path.length === 0) return -1;\n return path[path.length - 1].position ?? 0;\n }\n\n /**\n * Get current node's repeat counter (occurrence count of this tag name).\n * @returns {number}\n */\n getCounter() {\n const path = this._matcher.path;\n if (path.length === 0) return -1;\n return path[path.length - 1].counter ?? 0;\n }\n\n /**\n * Get current node's sibling index (alias for getPosition).\n * @returns {number}\n * @deprecated Use getPosition() or getCounter() instead\n */\n getIndex() {\n return this.getPosition();\n }\n\n /**\n * Get current path depth.\n * @returns {number}\n */\n getDepth() {\n return this._matcher.path.length;\n }\n\n /**\n * Get path as string.\n * @param {string} [separator] - Optional separator (uses default if not provided)\n * @param {boolean} [includeNamespace=true]\n * @returns {string}\n */\n toString(separator, includeNamespace = true) {\n return this._matcher.toString(separator, includeNamespace);\n }\n\n /**\n * Get path as array of tag names.\n * @returns {string[]}\n */\n toArray() {\n return this._matcher.path.map(n => n.tag);\n }\n\n /**\n * Match current path against an Expression.\n * @param {Expression} expression\n * @returns {boolean}\n */\n matches(expression) {\n return this._matcher.matches(expression);\n }\n\n /**\n * Match any expression in the given set against the current path.\n * @param {ExpressionSet} exprSet\n * @returns {boolean}\n */\n matchesAny(exprSet) {\n return exprSet.matchesAny(this._matcher);\n }\n}\n\n/**\n * Matcher - Tracks current path in XML/JSON tree and matches against Expressions.\n *\n * The matcher maintains a stack of nodes representing the current path from root to\n * current tag. It only stores attribute values for the current (top) node to minimize\n * memory usage. Sibling tracking is used to auto-calculate position and counter.\n *\n * Use {@link Matcher#readOnly} to obtain a {@link MatcherView} safe to pass to\n * user callbacks — it always reflects current state with no Proxy overhead.\n *\n * @example\n * const matcher = new Matcher();\n * matcher.push(\"root\", {});\n * matcher.push(\"users\", {});\n * matcher.push(\"user\", { id: \"123\", type: \"admin\" });\n *\n * const expr = new Expression(\"root.users.user\");\n * matcher.matches(expr); // true\n */\nexport default class Matcher {\n /**\n * Create a new Matcher.\n * @param {Object} [options={}]\n * @param {string} [options.separator='.'] - Default path separator\n */\n constructor(options = {}) {\n this.separator = options.separator || '.';\n this.path = [];\n this.siblingStacks = [];\n // Each path node: { tag, values, position, counter, namespace? }\n // values only present for current (last) node\n // Each siblingStacks entry: Map tracking occurrences at each level\n this._pathStringCache = null;\n this._view = new MatcherView(this);\n }\n\n /**\n * Push a new tag onto the path.\n * @param {string} tagName\n * @param {Object|null} [attrValues=null]\n * @param {string|null} [namespace=null]\n */\n push(tagName, attrValues = null, namespace = null) {\n this._pathStringCache = null;\n\n // Remove values from previous current node (now becoming ancestor)\n if (this.path.length > 0) {\n this.path[this.path.length - 1].values = undefined;\n }\n\n // Get or create sibling tracking for current level\n const currentLevel = this.path.length;\n if (!this.siblingStacks[currentLevel]) {\n this.siblingStacks[currentLevel] = new Map();\n }\n\n const siblings = this.siblingStacks[currentLevel];\n\n // Create a unique key for sibling tracking that includes namespace\n const siblingKey = namespace ? `${namespace}:${tagName}` : tagName;\n\n // Calculate counter (how many times this tag appeared at this level)\n const counter = siblings.get(siblingKey) || 0;\n\n // Calculate position (total children at this level so far)\n let position = 0;\n for (const count of siblings.values()) {\n position += count;\n }\n\n // Update sibling count for this tag\n siblings.set(siblingKey, counter + 1);\n\n // Create new node\n const node = {\n tag: tagName,\n position: position,\n counter: counter\n };\n\n if (namespace !== null && namespace !== undefined) {\n node.namespace = namespace;\n }\n\n if (attrValues !== null && attrValues !== undefined) {\n node.values = attrValues;\n }\n\n this.path.push(node);\n }\n\n /**\n * Pop the last tag from the path.\n * @returns {Object|undefined} The popped node\n */\n pop() {\n if (this.path.length === 0) return undefined;\n this._pathStringCache = null;\n\n const node = this.path.pop();\n\n if (this.siblingStacks.length > this.path.length + 1) {\n this.siblingStacks.length = this.path.length + 1;\n }\n\n return node;\n }\n\n /**\n * Update current node's attribute values.\n * Useful when attributes are parsed after push.\n * @param {Object} attrValues\n */\n updateCurrent(attrValues) {\n if (this.path.length > 0) {\n const current = this.path[this.path.length - 1];\n if (attrValues !== null && attrValues !== undefined) {\n current.values = attrValues;\n }\n }\n }\n\n /**\n * Get current tag name.\n * @returns {string|undefined}\n */\n getCurrentTag() {\n return this.path.length > 0 ? this.path[this.path.length - 1].tag : undefined;\n }\n\n /**\n * Get current namespace.\n * @returns {string|undefined}\n */\n getCurrentNamespace() {\n return this.path.length > 0 ? this.path[this.path.length - 1].namespace : undefined;\n }\n\n /**\n * Get current node's attribute value.\n * @param {string} attrName\n * @returns {*}\n */\n getAttrValue(attrName) {\n if (this.path.length === 0) return undefined;\n return this.path[this.path.length - 1].values?.[attrName];\n }\n\n /**\n * Check if current node has an attribute.\n * @param {string} attrName\n * @returns {boolean}\n */\n hasAttr(attrName) {\n if (this.path.length === 0) return false;\n const current = this.path[this.path.length - 1];\n return current.values !== undefined && attrName in current.values;\n }\n\n /**\n * Get current node's sibling position (child index in parent).\n * @returns {number}\n */\n getPosition() {\n if (this.path.length === 0) return -1;\n return this.path[this.path.length - 1].position ?? 0;\n }\n\n /**\n * Get current node's repeat counter (occurrence count of this tag name).\n * @returns {number}\n */\n getCounter() {\n if (this.path.length === 0) return -1;\n return this.path[this.path.length - 1].counter ?? 0;\n }\n\n /**\n * Get current node's sibling index (alias for getPosition).\n * @returns {number}\n * @deprecated Use getPosition() or getCounter() instead\n */\n getIndex() {\n return this.getPosition();\n }\n\n /**\n * Get current path depth.\n * @returns {number}\n */\n getDepth() {\n return this.path.length;\n }\n\n /**\n * Get path as string.\n * @param {string} [separator] - Optional separator (uses default if not provided)\n * @param {boolean} [includeNamespace=true]\n * @returns {string}\n */\n toString(separator, includeNamespace = true) {\n const sep = separator || this.separator;\n const isDefault = (sep === this.separator && includeNamespace === true);\n\n if (isDefault) {\n if (this._pathStringCache !== null) {\n return this._pathStringCache;\n }\n const result = this.path.map(n =>\n (n.namespace) ? `${n.namespace}:${n.tag}` : n.tag\n ).join(sep);\n this._pathStringCache = result;\n return result;\n }\n\n return this.path.map(n =>\n (includeNamespace && n.namespace) ? `${n.namespace}:${n.tag}` : n.tag\n ).join(sep);\n }\n\n /**\n * Get path as array of tag names.\n * @returns {string[]}\n */\n toArray() {\n return this.path.map(n => n.tag);\n }\n\n /**\n * Reset the path to empty.\n */\n reset() {\n this._pathStringCache = null;\n this.path = [];\n this.siblingStacks = [];\n }\n\n /**\n * Match current path against an Expression.\n * @param {Expression} expression\n * @returns {boolean}\n */\n matches(expression) {\n const segments = expression.segments;\n\n if (segments.length === 0) {\n return false;\n }\n\n if (expression.hasDeepWildcard()) {\n return this._matchWithDeepWildcard(segments);\n }\n\n return this._matchSimple(segments);\n }\n\n /**\n * @private\n */\n _matchSimple(segments) {\n if (this.path.length !== segments.length) {\n return false;\n }\n\n for (let i = 0; i < segments.length; i++) {\n if (!this._matchSegment(segments[i], this.path[i], i === this.path.length - 1)) {\n return false;\n }\n }\n\n return true;\n }\n\n /**\n * @private\n */\n _matchWithDeepWildcard(segments) {\n let pathIdx = this.path.length - 1;\n let segIdx = segments.length - 1;\n\n while (segIdx >= 0 && pathIdx >= 0) {\n const segment = segments[segIdx];\n\n if (segment.type === 'deep-wildcard') {\n segIdx--;\n\n if (segIdx < 0) {\n return true;\n }\n\n const nextSeg = segments[segIdx];\n let found = false;\n\n for (let i = pathIdx; i >= 0; i--) {\n if (this._matchSegment(nextSeg, this.path[i], i === this.path.length - 1)) {\n pathIdx = i - 1;\n segIdx--;\n found = true;\n break;\n }\n }\n\n if (!found) {\n return false;\n }\n } else {\n if (!this._matchSegment(segment, this.path[pathIdx], pathIdx === this.path.length - 1)) {\n return false;\n }\n pathIdx--;\n segIdx--;\n }\n }\n\n return segIdx < 0;\n }\n\n /**\n * @private\n */\n _matchSegment(segment, node, isCurrentNode) {\n if (segment.tag !== '*' && segment.tag !== node.tag) {\n return false;\n }\n\n if (segment.namespace !== undefined) {\n if (segment.namespace !== '*' && segment.namespace !== node.namespace) {\n return false;\n }\n }\n\n if (segment.attrName !== undefined) {\n if (!isCurrentNode) {\n return false;\n }\n\n if (!node.values || !(segment.attrName in node.values)) {\n return false;\n }\n\n if (segment.attrValue !== undefined) {\n if (String(node.values[segment.attrName]) !== String(segment.attrValue)) {\n return false;\n }\n }\n }\n\n if (segment.position !== undefined) {\n if (!isCurrentNode) {\n return false;\n }\n\n const counter = node.counter ?? 0;\n\n if (segment.position === 'first' && counter !== 0) {\n return false;\n } else if (segment.position === 'odd' && counter % 2 !== 1) {\n return false;\n } else if (segment.position === 'even' && counter % 2 !== 0) {\n return false;\n } else if (segment.position === 'nth' && counter !== segment.positionValue) {\n return false;\n }\n }\n\n return true;\n }\n\n /**\n * Match any expression in the given set against the current path.\n * @param {ExpressionSet} exprSet\n * @returns {boolean}\n */\n matchesAny(exprSet) {\n return exprSet.matchesAny(this);\n }\n\n /**\n * Create a snapshot of current state.\n * @returns {Object}\n */\n snapshot() {\n return {\n path: this.path.map(node => ({ ...node })),\n siblingStacks: this.siblingStacks.map(map => new Map(map))\n };\n }\n\n /**\n * Restore state from snapshot.\n * @param {Object} snapshot\n */\n restore(snapshot) {\n this._pathStringCache = null;\n this.path = snapshot.path.map(node => ({ ...node }));\n this.siblingStacks = snapshot.siblingStacks.map(map => new Map(map));\n }\n\n /**\n * Return the read-only {@link MatcherView} for this matcher.\n *\n * The same instance is returned on every call — no allocation occurs.\n * It always reflects the current parser state and is safe to pass to\n * user callbacks without risk of accidental mutation.\n *\n * @returns {MatcherView}\n *\n * @example\n * const view = matcher.readOnly();\n * // pass view to callbacks — it stays in sync automatically\n * view.matches(expr); // ✓\n * view.getCurrentTag(); // ✓\n * // view.push(...) // ✗ method does not exist — caught by TypeScript\n */\n readOnly() {\n return this._view;\n }\n}","/**\n * Expression - Parses and stores a tag pattern expression\n * \n * Patterns are parsed once and stored in an optimized structure for fast matching.\n * \n * @example\n * const expr = new Expression(\"root.users.user\");\n * const expr2 = new Expression(\"..user[id]:first\");\n * const expr3 = new Expression(\"root/users/user\", { separator: '/' });\n */\nexport default class Expression {\n /**\n * Create a new Expression\n * @param {string} pattern - Pattern string (e.g., \"root.users.user\", \"..user[id]\")\n * @param {Object} options - Configuration options\n * @param {string} options.separator - Path separator (default: '.')\n */\n constructor(pattern, options = {}, data) {\n this.pattern = pattern;\n this.separator = options.separator || '.';\n this.segments = this._parse(pattern);\n this.data = data;\n // Cache expensive checks for performance (O(1) instead of O(n))\n this._hasDeepWildcard = this.segments.some(seg => seg.type === 'deep-wildcard');\n this._hasAttributeCondition = this.segments.some(seg => seg.attrName !== undefined);\n this._hasPositionSelector = this.segments.some(seg => seg.position !== undefined);\n }\n\n /**\n * Parse pattern string into segments\n * @private\n * @param {string} pattern - Pattern to parse\n * @returns {Array} Array of segment objects\n */\n _parse(pattern) {\n const segments = [];\n\n // Split by separator but handle \"..\" specially\n let i = 0;\n let currentPart = '';\n\n while (i < pattern.length) {\n if (pattern[i] === this.separator) {\n // Check if next char is also separator (deep wildcard)\n if (i + 1 < pattern.length && pattern[i + 1] === this.separator) {\n // Flush current part if any\n if (currentPart.trim()) {\n segments.push(this._parseSegment(currentPart.trim()));\n currentPart = '';\n }\n // Add deep wildcard\n segments.push({ type: 'deep-wildcard' });\n i += 2; // Skip both separators\n } else {\n // Regular separator\n if (currentPart.trim()) {\n segments.push(this._parseSegment(currentPart.trim()));\n }\n currentPart = '';\n i++;\n }\n } else {\n currentPart += pattern[i];\n i++;\n }\n }\n\n // Flush remaining part\n if (currentPart.trim()) {\n segments.push(this._parseSegment(currentPart.trim()));\n }\n\n return segments;\n }\n\n /**\n * Parse a single segment\n * @private\n * @param {string} part - Segment string (e.g., \"user\", \"ns::user\", \"user[id]\", \"ns::user:first\")\n * @returns {Object} Segment object\n */\n _parseSegment(part) {\n const segment = { type: 'tag' };\n\n // NEW NAMESPACE SYNTAX (v2.0):\n // ============================\n // Namespace uses DOUBLE colon (::)\n // Position uses SINGLE colon (:)\n // \n // Examples:\n // \"user\" → tag\n // \"user:first\" → tag + position\n // \"user[id]\" → tag + attribute\n // \"user[id]:first\" → tag + attribute + position\n // \"ns::user\" → namespace + tag\n // \"ns::user:first\" → namespace + tag + position\n // \"ns::user[id]\" → namespace + tag + attribute\n // \"ns::user[id]:first\" → namespace + tag + attribute + position\n // \"ns::first\" → namespace + tag named \"first\" (NO ambiguity!)\n //\n // This eliminates all ambiguity:\n // :: = namespace separator\n // : = position selector\n // [] = attributes\n\n // Step 1: Extract brackets [attr] or [attr=value]\n let bracketContent = null;\n let withoutBrackets = part;\n\n const bracketMatch = part.match(/^([^\\[]+)(\\[[^\\]]*\\])(.*)$/);\n if (bracketMatch) {\n withoutBrackets = bracketMatch[1] + bracketMatch[3];\n if (bracketMatch[2]) {\n const content = bracketMatch[2].slice(1, -1);\n if (content) {\n bracketContent = content;\n }\n }\n }\n\n // Step 2: Check for namespace (double colon ::)\n let namespace = undefined;\n let tagAndPosition = withoutBrackets;\n\n if (withoutBrackets.includes('::')) {\n const nsIndex = withoutBrackets.indexOf('::');\n namespace = withoutBrackets.substring(0, nsIndex).trim();\n tagAndPosition = withoutBrackets.substring(nsIndex + 2).trim(); // Skip ::\n\n if (!namespace) {\n throw new Error(`Invalid namespace in pattern: ${part}`);\n }\n }\n\n // Step 3: Parse tag and position (single colon :)\n let tag = undefined;\n let positionMatch = null;\n\n if (tagAndPosition.includes(':')) {\n const colonIndex = tagAndPosition.lastIndexOf(':'); // Use last colon for position\n const tagPart = tagAndPosition.substring(0, colonIndex).trim();\n const posPart = tagAndPosition.substring(colonIndex + 1).trim();\n\n // Verify position is a valid keyword\n const isPositionKeyword = ['first', 'last', 'odd', 'even'].includes(posPart) ||\n /^nth\\(\\d+\\)$/.test(posPart);\n\n if (isPositionKeyword) {\n tag = tagPart;\n positionMatch = posPart;\n } else {\n // Not a valid position keyword, treat whole thing as tag\n tag = tagAndPosition;\n }\n } else {\n tag = tagAndPosition;\n }\n\n if (!tag) {\n throw new Error(`Invalid segment pattern: ${part}`);\n }\n\n segment.tag = tag;\n if (namespace) {\n segment.namespace = namespace;\n }\n\n // Step 4: Parse attributes\n if (bracketContent) {\n if (bracketContent.includes('=')) {\n const eqIndex = bracketContent.indexOf('=');\n segment.attrName = bracketContent.substring(0, eqIndex).trim();\n segment.attrValue = bracketContent.substring(eqIndex + 1).trim();\n } else {\n segment.attrName = bracketContent.trim();\n }\n }\n\n // Step 5: Parse position selector\n if (positionMatch) {\n const nthMatch = positionMatch.match(/^nth\\((\\d+)\\)$/);\n if (nthMatch) {\n segment.position = 'nth';\n segment.positionValue = parseInt(nthMatch[1], 10);\n } else {\n segment.position = positionMatch;\n }\n }\n\n return segment;\n }\n\n /**\n * Get the number of segments\n * @returns {number}\n */\n get length() {\n return this.segments.length;\n }\n\n /**\n * Check if expression contains deep wildcard\n * @returns {boolean}\n */\n hasDeepWildcard() {\n return this._hasDeepWildcard;\n }\n\n /**\n * Check if expression has attribute conditions\n * @returns {boolean}\n */\n hasAttributeCondition() {\n return this._hasAttributeCondition;\n }\n\n /**\n * Check if expression has position selectors\n * @returns {boolean}\n */\n hasPositionSelector() {\n return this._hasPositionSelector;\n }\n\n /**\n * Get string representation\n * @returns {string}\n */\n toString() {\n return this.pattern;\n }\n}","/**\n * ExpressionSet - An indexed collection of Expressions for efficient bulk matching\n *\n * Instead of iterating all expressions on every tag, ExpressionSet pre-indexes\n * them at insertion time by depth and terminal tag name. At match time, only\n * the relevant bucket is evaluated — typically reducing checks from O(E) to O(1)\n * lookup plus O(small bucket) matches.\n *\n * Three buckets are maintained:\n * - `_byDepthAndTag` — exact depth + exact tag name (tightest, used first)\n * - `_wildcardByDepth` — exact depth + wildcard tag `*` (depth-matched only)\n * - `_deepWildcards` — expressions containing `..` (cannot be depth-indexed)\n *\n * @example\n * import { Expression, ExpressionSet } from 'fast-xml-tagger';\n *\n * // Build once at config time\n * const stopNodes = new ExpressionSet();\n * stopNodes.add(new Expression('root.users.user'));\n * stopNodes.add(new Expression('root.config.setting'));\n * stopNodes.add(new Expression('..script'));\n *\n * // Query on every tag — hot path\n * if (stopNodes.matchesAny(matcher)) { ... }\n */\nexport default class ExpressionSet {\n constructor() {\n /** @type {Map} depth:tag → expressions */\n this._byDepthAndTag = new Map();\n\n /** @type {Map} depth → wildcard-tag expressions */\n this._wildcardByDepth = new Map();\n\n /** @type {import('./Expression.js').default[]} expressions containing deep wildcard (..) */\n this._deepWildcards = [];\n\n /** @type {Set} pattern strings already added — used for deduplication */\n this._patterns = new Set();\n\n /** @type {boolean} whether the set is sealed against further additions */\n this._sealed = false;\n }\n\n /**\n * Add an Expression to the set.\n * Duplicate patterns (same pattern string) are silently ignored.\n *\n * @param {import('./Expression.js').default} expression - A pre-constructed Expression instance\n * @returns {this} for chaining\n * @throws {TypeError} if called after seal()\n *\n * @example\n * set.add(new Expression('root.users.user'));\n * set.add(new Expression('..script'));\n */\n add(expression) {\n if (this._sealed) {\n throw new TypeError(\n 'ExpressionSet is sealed. Create a new ExpressionSet to add more expressions.'\n );\n }\n\n // Deduplicate by pattern string\n if (this._patterns.has(expression.pattern)) return this;\n this._patterns.add(expression.pattern);\n\n if (expression.hasDeepWildcard()) {\n this._deepWildcards.push(expression);\n return this;\n }\n\n const depth = expression.length;\n const lastSeg = expression.segments[expression.segments.length - 1];\n const tag = lastSeg?.tag;\n\n if (!tag || tag === '*') {\n // Can index by depth but not by tag\n if (!this._wildcardByDepth.has(depth)) this._wildcardByDepth.set(depth, []);\n this._wildcardByDepth.get(depth).push(expression);\n } else {\n // Tightest bucket: depth + tag\n const key = `${depth}:${tag}`;\n if (!this._byDepthAndTag.has(key)) this._byDepthAndTag.set(key, []);\n this._byDepthAndTag.get(key).push(expression);\n }\n\n return this;\n }\n\n /**\n * Add multiple expressions at once.\n *\n * @param {import('./Expression.js').default[]} expressions - Array of Expression instances\n * @returns {this} for chaining\n *\n * @example\n * set.addAll([\n * new Expression('root.users.user'),\n * new Expression('root.config.setting'),\n * ]);\n */\n addAll(expressions) {\n for (const expr of expressions) this.add(expr);\n return this;\n }\n\n /**\n * Check whether a pattern string is already present in the set.\n *\n * @param {import('./Expression.js').default} expression\n * @returns {boolean}\n */\n has(expression) {\n return this._patterns.has(expression.pattern);\n }\n\n /**\n * Number of expressions in the set.\n * @type {number}\n */\n get size() {\n return this._patterns.size;\n }\n\n /**\n * Seal the set against further modifications.\n * Useful to prevent accidental mutations after config is built.\n * Calling add() or addAll() on a sealed set throws a TypeError.\n *\n * @returns {this}\n */\n seal() {\n this._sealed = true;\n return this;\n }\n\n /**\n * Whether the set has been sealed.\n * @type {boolean}\n */\n get isSealed() {\n return this._sealed;\n }\n\n /**\n * Test whether the matcher's current path matches any expression in the set.\n *\n * Evaluation order (cheapest → most expensive):\n * 1. Exact depth + tag bucket — O(1) lookup, typically 0–2 expressions\n * 2. Depth-only wildcard bucket — O(1) lookup, rare\n * 3. Deep-wildcard list — always checked, but usually small\n *\n * @param {import('./Matcher.js').default} matcher - Matcher instance (or readOnly view)\n * @returns {boolean} true if any expression matches the current path\n *\n * @example\n * if (stopNodes.matchesAny(matcher)) {\n * // handle stop node\n * }\n */\n matchesAny(matcher) {\n return this.findMatch(matcher) !== null;\n }\n /**\n * Find and return the first Expression that matches the matcher's current path.\n *\n * Uses the same evaluation order as matchesAny (cheapest → most expensive):\n * 1. Exact depth + tag bucket\n * 2. Depth-only wildcard bucket\n * 3. Deep-wildcard list\n *\n * @param {import('./Matcher.js').default} matcher - Matcher instance (or readOnly view)\n * @returns {import('./Expression.js').default | null} the first matching Expression, or null\n *\n * @example\n * const expr = stopNodes.findMatch(matcher);\n * if (expr) {\n * // access expr.config, expr.pattern, etc.\n * }\n */\n findMatch(matcher) {\n const depth = matcher.getDepth();\n const tag = matcher.getCurrentTag();\n\n // 1. Tightest bucket — most expressions live here\n const exactKey = `${depth}:${tag}`;\n const exactBucket = this._byDepthAndTag.get(exactKey);\n if (exactBucket) {\n for (let i = 0; i < exactBucket.length; i++) {\n if (matcher.matches(exactBucket[i])) return exactBucket[i];\n }\n }\n\n // 2. Depth-matched wildcard-tag expressions\n const wildcardBucket = this._wildcardByDepth.get(depth);\n if (wildcardBucket) {\n for (let i = 0; i < wildcardBucket.length; i++) {\n if (matcher.matches(wildcardBucket[i])) return wildcardBucket[i];\n }\n }\n\n // 3. Deep wildcards — cannot be pre-filtered by depth or tag\n for (let i = 0; i < this._deepWildcards.length; i++) {\n if (matcher.matches(this._deepWildcards[i])) return this._deepWildcards[i];\n }\n\n return null;\n }\n}\n","// ---------------------------------------------------------------------------\n// Complete HTML5 named entity reference\n// Organized by logical categories for easy maintenance and selective importing\n// ---------------------------------------------------------------------------\n\n/**\n * Basic Latin & Special Characters\n * @type {Record}\n */\nexport const BASIC_LATIN = {\n amp: '&',\n AMP: '&',\n lt: '<',\n LT: '<',\n gt: '>',\n GT: '>',\n quot: '\"',\n QUOT: '\"',\n apos: \"'\",\n lsquo: '‘',\n rsquo: '’',\n ldquo: '“',\n rdquo: '”',\n lsquor: '‚',\n rsquor: '’',\n ldquor: '„',\n bdquo: '„',\n comma: ',',\n period: '.',\n colon: ':',\n semi: ';',\n excl: '!',\n quest: '?',\n num: '#',\n dollar: '$',\n percent: '%',\n amp: '&',\n ast: '*',\n commat: '@',\n lowbar: '_',\n verbar: '|',\n vert: '|',\n sol: '/',\n bsol: '\\\\',\n lbrace: '{',\n rbrace: '}',\n lbrack: '[',\n rbrack: ']',\n lpar: '(',\n rpar: ')',\n nbsp: '\\u00a0',\n iexcl: '¡',\n cent: '¢',\n pound: '£',\n curren: '¤',\n yen: '¥',\n brvbar: '¦',\n sect: '§',\n uml: '¨',\n copy: '©',\n COPY: '©',\n ordf: 'ª',\n laquo: '«',\n not: '¬',\n shy: '\\u00ad',\n reg: '®',\n REG: '®',\n macr: '¯',\n deg: '°',\n plusmn: '±',\n sup2: '²',\n sup3: '³',\n acute: '´',\n micro: 'µ',\n para: '¶',\n middot: '·',\n cedil: '¸',\n sup1: '¹',\n ordm: 'º',\n raquo: '»',\n frac14: '¼',\n frac12: '½',\n half: '½',\n frac34: '¾',\n iquest: '¿',\n times: '×',\n div: '÷',\n divide: '÷',\n};\n\n/**\n * Latin Extended & Accented Letters (A-Z)\n * @type {Record}\n */\nexport const LATIN_ACCENTS = {\n Agrave: 'À',\n agrave: 'à',\n Aacute: 'Á',\n aacute: 'á',\n Acirc: 'Â',\n acirc: 'â',\n Atilde: 'Ã',\n atilde: 'ã',\n Auml: 'Ä',\n auml: 'ä',\n Aring: 'Å',\n aring: 'å',\n AElig: 'Æ',\n aelig: 'æ',\n Ccedil: 'Ç',\n ccedil: 'ç',\n Egrave: 'È',\n egrave: 'è',\n Eacute: 'É',\n eacute: 'é',\n Ecirc: 'Ê',\n ecirc: 'ê',\n Euml: 'Ë',\n euml: 'ë',\n Igrave: 'Ì',\n igrave: 'ì',\n Iacute: 'Í',\n iacute: 'í',\n Icirc: 'Î',\n icirc: 'î',\n Iuml: 'Ï',\n iuml: 'ï',\n ETH: 'Ð',\n eth: 'ð',\n Ntilde: 'Ñ',\n ntilde: 'ñ',\n Ograve: 'Ò',\n ograve: 'ò',\n Oacute: 'Ó',\n oacute: 'ó',\n Ocirc: 'Ô',\n ocirc: 'ô',\n Otilde: 'Õ',\n otilde: 'õ',\n Ouml: 'Ö',\n ouml: 'ö',\n Oslash: 'Ø',\n oslash: 'ø',\n Ugrave: 'Ù',\n ugrave: 'ù',\n Uacute: 'Ú',\n uacute: 'ú',\n Ucirc: 'Û',\n ucirc: 'û',\n Uuml: 'Ü',\n uuml: 'ü',\n Yacute: 'Ý',\n yacute: 'ý',\n THORN: 'Þ',\n thorn: 'þ',\n szlig: 'ß',\n yuml: 'ÿ',\n Yuml: 'Ÿ',\n};\n\n/**\n * Latin Extended (Letters with diacritics)\n * @type {Record}\n */\nexport const LATIN_EXTENDED = {\n Amacr: 'Ā',\n amacr: 'ā',\n Abreve: 'Ă',\n abreve: 'ă',\n Aogon: 'Ą',\n aogon: 'ą',\n Cacute: 'Ć',\n cacute: 'ć',\n Ccirc: 'Ĉ',\n ccirc: 'ĉ',\n Cdot: 'Ċ',\n cdot: 'ċ',\n Ccaron: 'Č',\n ccaron: 'č',\n Dcaron: 'Ď',\n dcaron: 'ď',\n Dstrok: 'Đ',\n dstrok: 'đ',\n Emacr: 'Ē',\n emacr: 'ē',\n Ecaron: 'Ě',\n ecaron: 'ě',\n Edot: 'Ė',\n edot: 'ė',\n Eogon: 'Ę',\n eogon: 'ę',\n Gcirc: 'Ĝ',\n gcirc: 'ĝ',\n Gbreve: 'Ğ',\n gbreve: 'ğ',\n Gdot: 'Ġ',\n gdot: 'ġ',\n Gcedil: 'Ģ',\n Hcirc: 'Ĥ',\n hcirc: 'ĥ',\n Hstrok: 'Ħ',\n hstrok: 'ħ',\n Itilde: 'Ĩ',\n itilde: 'ĩ',\n Imacr: 'Ī',\n imacr: 'ī',\n Iogon: 'Į',\n iogon: 'į',\n Idot: 'İ',\n IJlig: 'IJ',\n ijlig: 'ij',\n Jcirc: 'Ĵ',\n jcirc: 'ĵ',\n Kcedil: 'Ķ',\n kcedil: 'ķ',\n kgreen: 'ĸ',\n Lacute: 'Ĺ',\n lacute: 'ĺ',\n Lcedil: 'Ļ',\n lcedil: 'ļ',\n Lcaron: 'Ľ',\n lcaron: 'ľ',\n Lmidot: 'Ŀ',\n lmidot: 'ŀ',\n Lstrok: 'Ł',\n lstrok: 'ł',\n Nacute: 'Ń',\n nacute: 'ń',\n Ncaron: 'Ň',\n ncaron: 'ň',\n Ncedil: 'Ņ',\n ncedil: 'ņ',\n ENG: 'Ŋ',\n eng: 'ŋ',\n Omacr: 'Ō',\n omacr: 'ō',\n Odblac: 'Ő',\n odblac: 'ő',\n OElig: 'Œ',\n oelig: 'œ',\n Racute: 'Ŕ',\n racute: 'ŕ',\n Rcaron: 'Ř',\n rcaron: 'ř',\n Rcedil: 'Ŗ',\n rcedil: 'ŗ',\n Sacute: 'Ś',\n sacute: 'ś',\n Scirc: 'Ŝ',\n scirc: 'ŝ',\n Scedil: 'Ş',\n scedil: 'ş',\n Scaron: 'Š',\n scaron: 'š',\n Tcedil: 'Ţ',\n tcedil: 'ţ',\n Tcaron: 'Ť',\n tcaron: 'ť',\n Tstrok: 'Ŧ',\n tstrok: 'ŧ',\n Utilde: 'Ũ',\n utilde: 'ũ',\n Umacr: 'Ū',\n umacr: 'ū',\n Ubreve: 'Ŭ',\n ubreve: 'ŭ',\n Uring: 'Ů',\n uring: 'ů',\n Udblac: 'Ű',\n udblac: 'ű',\n Uogon: 'Ų',\n uogon: 'ų',\n Wcirc: 'Ŵ',\n wcirc: 'ŵ',\n Ycirc: 'Ŷ',\n ycirc: 'ŷ',\n Zacute: 'Ź',\n zacute: 'ź',\n Zdot: 'Ż',\n zdot: 'ż',\n Zcaron: 'Ž',\n zcaron: 'ž',\n};\n\n/**\n * Greek Letters\n * @type {Record}\n */\nexport const GREEK = {\n Alpha: 'Α',\n alpha: 'α',\n Beta: 'Β',\n beta: 'β',\n Gamma: 'Γ',\n gamma: 'γ',\n Delta: 'Δ',\n delta: 'δ',\n Epsilon: 'Ε',\n epsilon: 'ε',\n epsiv: 'ϵ',\n varepsilon: 'ϵ',\n Zeta: 'Ζ',\n zeta: 'ζ',\n Eta: 'Η',\n eta: 'η',\n Theta: 'Θ',\n theta: 'θ',\n thetasym: 'ϑ',\n vartheta: 'ϑ',\n Iota: 'Ι',\n iota: 'ι',\n Kappa: 'Κ',\n kappa: 'κ',\n kappav: 'ϰ',\n varkappa: 'ϰ',\n Lambda: 'Λ',\n lambda: 'λ',\n Mu: 'Μ',\n mu: 'μ',\n Nu: 'Ν',\n nu: 'ν',\n Xi: 'Ξ',\n xi: 'ξ',\n Omicron: 'Ο',\n omicron: 'ο',\n Pi: 'Π',\n pi: 'π',\n piv: 'ϖ',\n varpi: 'ϖ',\n Rho: 'Ρ',\n rho: 'ρ',\n rhov: 'ϱ',\n varrho: 'ϱ',\n Sigma: 'Σ',\n sigma: 'σ',\n sigmaf: 'ς',\n sigmav: 'ς',\n varsigma: 'ς',\n Tau: 'Τ',\n tau: 'τ',\n Upsilon: 'Υ',\n upsilon: 'υ',\n upsi: 'υ',\n Upsi: 'ϒ',\n upsih: 'ϒ',\n Phi: 'Φ',\n phi: 'φ',\n phiv: 'ϕ',\n varphi: 'ϕ',\n Chi: 'Χ',\n chi: 'χ',\n Psi: 'Ψ',\n psi: 'ψ',\n Omega: 'Ω',\n omega: 'ω',\n ohm: 'Ω',\n Gammad: 'Ϝ',\n gammad: 'ϝ',\n digamma: 'ϝ',\n};\n\n/**\n * Cyrillic Letters\n * @type {Record}\n */\nexport const CYRILLIC = {\n Afr: '𝔄',\n afr: '𝔞',\n Acy: 'А',\n acy: 'а',\n Bcy: 'Б',\n bcy: 'б',\n Vcy: 'В',\n vcy: 'в',\n Gcy: 'Г',\n gcy: 'г',\n Dcy: 'Д',\n dcy: 'д',\n IEcy: 'Е',\n iecy: 'е',\n IOcy: 'Ё',\n iocy: 'ё',\n ZHcy: 'Ж',\n zhcy: 'ж',\n Zcy: 'З',\n zcy: 'з',\n Icy: 'И',\n icy: 'и',\n Jcy: 'Й',\n jcy: 'й',\n Kcy: 'К',\n kcy: 'к',\n Lcy: 'Л',\n lcy: 'л',\n Mcy: 'М',\n mcy: 'м',\n Ncy: 'Н',\n ncy: 'н',\n Ocy: 'О',\n ocy: 'о',\n Pcy: 'П',\n pcy: 'п',\n Rcy: 'Р',\n rcy: 'р',\n Scy: 'С',\n scy: 'с',\n Tcy: 'Т',\n tcy: 'т',\n Ucy: 'У',\n ucy: 'у',\n Fcy: 'Ф',\n fcy: 'ф',\n KHcy: 'Х',\n khcy: 'х',\n TScy: 'Ц',\n tscy: 'ц',\n CHcy: 'Ч',\n chcy: 'ч',\n SHcy: 'Ш',\n shcy: 'ш',\n SHCHcy: 'Щ',\n shchcy: 'щ',\n HARDcy: 'Ъ',\n hardcy: 'ъ',\n Ycy: 'Ы',\n ycy: 'ы',\n SOFTcy: 'Ь',\n softcy: 'ь',\n Ecy: 'Э',\n ecy: 'э',\n YUcy: 'Ю',\n yucy: 'ю',\n YAcy: 'Я',\n yacy: 'я',\n DJcy: 'Ђ',\n djcy: 'ђ',\n GJcy: 'Ѓ',\n gjcy: 'ѓ',\n Jukcy: 'Є',\n jukcy: 'є',\n DScy: 'Ѕ',\n dscy: 'ѕ',\n Iukcy: 'І',\n iukcy: 'і',\n YIcy: 'Ї',\n yicy: 'ї',\n Jsercy: 'Ј',\n jsercy: 'ј',\n LJcy: 'Љ',\n ljcy: 'љ',\n NJcy: 'Њ',\n njcy: 'њ',\n TSHcy: 'Ћ',\n tshcy: 'ћ',\n KJcy: 'Ќ',\n kjcy: 'ќ',\n Ubrcy: 'Ў',\n ubrcy: 'ў',\n DZcy: 'Џ',\n dzcy: 'џ',\n};\n\n/**\n * Mathematical Operators & Relations\n * @type {Record}\n */\nexport const MATH = {\n plus: '+',\n minus: '−',\n mnplus: '∓',\n mp: '∓',\n pm: '±',\n times: '×',\n div: '÷',\n divide: '÷',\n sdot: '⋅',\n star: '☆',\n starf: '★',\n bigstar: '★',\n lowast: '∗',\n ast: '*',\n midast: '*',\n compfn: '∘',\n smallcircle: '∘',\n bullet: '•',\n bull: '•',\n nbsp: '\\u00a0',\n hellip: '…',\n mldr: '…',\n prime: '′',\n Prime: '″',\n tprime: '‴',\n bprime: '‵',\n backprime: '‵',\n minus: '−',\n minusd: '∸',\n dotminus: '∸',\n plusdo: '∔',\n dotplus: '∔',\n plusmn: '±',\n minusplus: '∓',\n mnplus: '∓',\n mp: '∓',\n setminus: '∖',\n smallsetminus: '∖',\n Backslash: '∖',\n setmn: '∖',\n ssetmn: '∖',\n lowbar: '_',\n verbar: '|',\n vert: '|',\n VerticalLine: '|',\n colon: ':',\n Colon: '∷',\n Proportion: '∷',\n ratio: '∶',\n equals: '=',\n ne: '≠',\n nequiv: '≢',\n equiv: '≡',\n Congruent: '≡',\n sim: '∼',\n thicksim: '∼',\n thksim: '∼',\n sime: '≃',\n simeq: '≃',\n TildeEqual: '≃',\n asymp: '≈',\n approx: '≈',\n thickapprox: '≈',\n thkap: '≈',\n TildeTilde: '≈',\n ncong: '≇',\n cong: '≅',\n TildeFullEqual: '≅',\n asympeq: '≍',\n CupCap: '≍',\n bump: '≎',\n Bumpeq: '≎',\n HumpDownHump: '≎',\n bumpe: '≏',\n bumpeq: '≏',\n HumpEqual: '≏',\n dotminus: '∸',\n minusd: '∸',\n plusdo: '∔',\n dotplus: '∔',\n le: '≤',\n LessEqual: '≤',\n ge: '≥',\n GreaterEqual: '≥',\n lesseqgtr: '⋚',\n lesseqqgtr: '⪋',\n greater: '>',\n less: '<',\n};\n\n/**\n * Mathematical Operators (Advanced)\n * @type {Record}\n */\nexport const MATH_ADVANCED = {\n alefsym: 'ℵ',\n aleph: 'ℵ',\n beth: 'ℶ',\n gimel: 'ℷ',\n daleth: 'ℸ',\n forall: '∀',\n ForAll: '∀',\n part: '∂',\n PartialD: '∂',\n exist: '∃',\n Exists: '∃',\n nexist: '∄',\n nexists: '∄',\n empty: '∅',\n emptyset: '∅',\n emptyv: '∅',\n varnothing: '∅',\n nabla: '∇',\n Del: '∇',\n isin: '∈',\n isinv: '∈',\n in: '∈',\n Element: '∈',\n notin: '∉',\n notinva: '∉',\n ni: '∋',\n niv: '∋',\n SuchThat: '∋',\n ReverseElement: '∋',\n notni: '∌',\n notniva: '∌',\n prod: '∏',\n Product: '∏',\n coprod: '∐',\n Coproduct: '∐',\n sum: '∑',\n Sum: '∑',\n minus: '−',\n mp: '∓',\n plusdo: '∔',\n dotplus: '∔',\n setminus: '∖',\n lowast: '∗',\n radic: '√',\n Sqrt: '√',\n prop: '∝',\n propto: '∝',\n Proportional: '∝',\n varpropto: '∝',\n infin: '∞',\n infintie: '⧝',\n ang: '∠',\n angle: '∠',\n angmsd: '∡',\n measuredangle: '∡',\n angsph: '∢',\n mid: '∣',\n VerticalBar: '∣',\n nmid: '∤',\n nsmid: '∤',\n npar: '∦',\n parallel: '∥',\n spar: '∥',\n nparallel: '∦',\n nspar: '∦',\n and: '∧',\n wedge: '∧',\n or: '∨',\n vee: '∨',\n cap: '∩',\n cup: '∪',\n int: '∫',\n Integral: '∫',\n conint: '∮',\n ContourIntegral: '∮',\n Conint: '∯',\n DoubleContourIntegral: '∯',\n Cconint: '∰',\n there4: '∴',\n therefore: '∴',\n Therefore: '∴',\n becaus: '∵',\n because: '∵',\n Because: '∵',\n ratio: '∶',\n Proportion: '∷',\n minusd: '∸',\n dotminus: '∸',\n mDDot: '∺',\n homtht: '∻',\n sim: '∼',\n bsimg: '∽',\n backsim: '∽',\n ac: '∾',\n mstpos: '∾',\n acd: '∿',\n VerticalTilde: '≀',\n wr: '≀',\n wreath: '≀',\n nsime: '≄',\n nsimeq: '≄',\n nsimeq: '≄',\n ncong: '≇',\n simne: '≆',\n ncongdot: '⩭̸',\n ngsim: '≵',\n nsim: '≁',\n napprox: '≉',\n nap: '≉',\n ngeq: '≱',\n nge: '≱',\n nleq: '≰',\n nle: '≰',\n ngtr: '≯',\n ngt: '≯',\n nless: '≮',\n nlt: '≮',\n nprec: '⊀',\n npr: '⊀',\n nsucc: '⊁',\n nsc: '⊁',\n};\n\n/**\n * Arrows\n * @type {Record}\n */\nexport const ARROWS = {\n larr: '←',\n leftarrow: '←',\n LeftArrow: '←',\n uarr: '↑',\n uparrow: '↑',\n UpArrow: '↑',\n rarr: '→',\n rightarrow: '→',\n RightArrow: '→',\n darr: '↓',\n downarrow: '↓',\n DownArrow: '↓',\n harr: '↔',\n leftrightarrow: '↔',\n LeftRightArrow: '↔',\n varr: '↕',\n updownarrow: '↕',\n UpDownArrow: '↕',\n nwarr: '↖',\n nwarrow: '↖',\n UpperLeftArrow: '↖',\n nearr: '↗',\n nearrow: '↗',\n UpperRightArrow: '↗',\n searr: '↘',\n searrow: '↘',\n LowerRightArrow: '↘',\n swarr: '↙',\n swarrow: '↙',\n LowerLeftArrow: '↙',\n lArr: '⇐',\n Leftarrow: '⇐',\n uArr: '⇑',\n Uparrow: '⇑',\n rArr: '⇒',\n Rightarrow: '⇒',\n dArr: '⇓',\n Downarrow: '⇓',\n hArr: '⇔',\n Leftrightarrow: '⇔',\n iff: '⇔',\n vArr: '⇕',\n Updownarrow: '⇕',\n lAarr: '⇚',\n Lleftarrow: '⇚',\n rAarr: '⇛',\n Rrightarrow: '⇛',\n lrarr: '⇆',\n leftrightarrows: '⇆',\n rlarr: '⇄',\n rightleftarrows: '⇄',\n lrhar: '⇋',\n leftrightharpoons: '⇋',\n ReverseEquilibrium: '⇋',\n rlhar: '⇌',\n rightleftharpoons: '⇌',\n Equilibrium: '⇌',\n udarr: '⇅',\n UpArrowDownArrow: '⇅',\n duarr: '⇵',\n DownArrowUpArrow: '⇵',\n llarr: '⇇',\n leftleftarrows: '⇇',\n rrarr: '⇉',\n rightrightarrows: '⇉',\n ddarr: '⇊',\n downdownarrows: '⇊',\n har: '↽',\n lhard: '↽',\n leftharpoondown: '↽',\n lharu: '↼',\n leftharpoonup: '↼',\n rhard: '⇁',\n rightharpoondown: '⇁',\n rharu: '⇀',\n rightharpoonup: '⇀',\n lsh: '↰',\n Lsh: '↰',\n rsh: '↱',\n Rsh: '↱',\n ldsh: '↲',\n rdsh: '↳',\n hookleftarrow: '↩',\n hookrightarrow: '↪',\n mapstoleft: '↤',\n mapstoup: '↥',\n map: '↦',\n mapsto: '↦',\n mapstodown: '↧',\n crarr: '↵',\n nwarrow: '↖',\n nearrow: '↗',\n searrow: '↘',\n swarrow: '↙',\n nleftarrow: '↚',\n nleftrightarrow: '↮',\n nrightarrow: '↛',\n nrarr: '↛',\n larrtl: '↢',\n rarrtl: '↣',\n leftarrowtail: '↢',\n rightarrowtail: '↣',\n twoheadleftarrow: '↞',\n twoheadrightarrow: '↠',\n Larr: '↞',\n Rarr: '↠',\n larrhk: '↩',\n rarrhk: '↪',\n larrlp: '↫',\n looparrowleft: '↫',\n rarrlp: '↬',\n looparrowright: '↬',\n harrw: '↭',\n leftrightsquigarrow: '↭',\n nrarrw: '↝̸',\n rarrw: '↝',\n rightsquigarrow: '↝',\n larrbfs: '⤟',\n rarrbfs: '⤠',\n nvHarr: '⤄',\n nvlArr: '⤂',\n nvrArr: '⤃',\n larrfs: '⤝',\n rarrfs: '⤞',\n Map: '⤅',\n larrsim: '⥳',\n rarrsim: '⥴',\n harrcir: '⥈',\n Uarrocir: '⥉',\n lurdshar: '⥊',\n ldrdhar: '⥧',\n ldrushar: '⥋',\n rdldhar: '⥩',\n lrhard: '⥭',\n rlhar: '⇌',\n uharr: '↾',\n uharl: '↿',\n dharr: '⇂',\n dharl: '⇃',\n Uarr: '↟',\n Darr: '↡',\n zigrarr: '⇝',\n nwArr: '⇖',\n neArr: '⇗',\n seArr: '⇘',\n swArr: '⇙',\n nharr: '↮',\n nhArr: '⇎',\n nlarr: '↚',\n nlArr: '⇍',\n nrarr: '↛',\n nrArr: '⇏',\n larrb: '⇤',\n LeftArrowBar: '⇤',\n rarrb: '⇥',\n RightArrowBar: '⇥',\n};\n\n/**\n * Geometric Shapes\n * @type {Record}\n */\nexport const SHAPES = {\n square: '□',\n Square: '□',\n squ: '□',\n squf: '▪',\n squarf: '▪',\n blacksquar: '▪',\n blacksquare: '▪',\n FilledVerySmallSquare: '▪',\n blk34: '▓',\n blk12: '▒',\n blk14: '░',\n block: '█',\n srect: '▭',\n rect: '▭',\n sdot: '⋅',\n sdotb: '⊡',\n dotsquare: '⊡',\n triangle: '▵',\n tri: '▵',\n trine: '▵',\n utri: '▵',\n triangledown: '▿',\n dtri: '▿',\n tridown: '▿',\n triangleleft: '◃',\n ltri: '◃',\n triangleright: '▹',\n rtri: '▹',\n blacktriangle: '▴',\n utrif: '▴',\n blacktriangledown: '▾',\n dtrif: '▾',\n blacktriangleleft: '◂',\n ltrif: '◂',\n blacktriangleright: '▸',\n rtrif: '▸',\n loz: '◊',\n lozenge: '◊',\n blacklozenge: '⧫',\n lozf: '⧫',\n bigcirc: '◯',\n xcirc: '◯',\n circ: 'ˆ',\n Circle: '○',\n cir: '○',\n o: '○',\n bullet: '•',\n bull: '•',\n hellip: '…',\n mldr: '…',\n nldr: '‥',\n boxh: '─',\n HorizontalLine: '─',\n boxv: '│',\n boxdr: '┌',\n boxdl: '┐',\n boxur: '└',\n boxul: '┘',\n boxvr: '├',\n boxvl: '┤',\n boxhd: '┬',\n boxhu: '┴',\n boxvh: '┼',\n boxH: '═',\n boxV: '║',\n boxdR: '╒',\n boxDr: '╓',\n boxDR: '╔',\n boxDl: '╕',\n boxdL: '╖',\n boxDL: '╗',\n boxuR: '╘',\n boxUr: '╙',\n boxUR: '╚',\n boxUl: '╜',\n boxuL: '╛',\n boxUL: '╝',\n boxvR: '╞',\n boxVr: '╟',\n boxVR: '╠',\n boxVl: '╢',\n boxvL: '╡',\n boxVL: '╣',\n boxHd: '╤',\n boxhD: '╥',\n boxHD: '╦',\n boxHu: '╧',\n boxhU: '╨',\n boxHU: '╩',\n boxvH: '╪',\n boxVh: '╫',\n boxVH: '╬',\n};\n\n/**\n * Punctuation & Diacritics\n * @type {Record}\n */\nexport const PUNCTUATION = {\n excl: '!',\n iexcl: '¡',\n brvbar: '¦',\n sect: '§',\n uml: '¨',\n copy: '©',\n ordf: 'ª',\n laquo: '«',\n not: '¬',\n shy: '\\u00ad',\n reg: '®',\n macr: '¯',\n deg: '°',\n plusmn: '±',\n sup2: '²',\n sup3: '³',\n acute: '´',\n micro: 'µ',\n para: '¶',\n middot: '·',\n cedil: '¸',\n sup1: '¹',\n ordm: 'º',\n raquo: '»',\n frac14: '¼',\n frac12: '½',\n frac34: '¾',\n iquest: '¿',\n nbsp: '\\u00a0',\n comma: ',',\n period: '.',\n colon: ':',\n semi: ';',\n vert: '|',\n Verbar: '‖',\n verbar: '|',\n dblac: '˝',\n circ: 'ˆ',\n caron: 'ˇ',\n breve: '˘',\n dot: '˙',\n ring: '˚',\n ogon: '˛',\n tilde: '˜',\n DiacriticalGrave: '`',\n DiacriticalAcute: '´',\n DiacriticalTilde: '˜',\n DiacriticalDot: '˙',\n DiacriticalDoubleAcute: '˝',\n grave: '`',\n acute: '´',\n};\n\n/**\n * Currency Symbols\n * @type {Record}\n */\nexport const CURRENCY = {\n cent: '¢',\n pound: '£',\n curren: '¤',\n yen: '¥',\n euro: '€',\n dollar: '$',\n euro: '€',\n fnof: 'ƒ',\n inr: '₹',\n af: '؋',\n birr: 'ብር',\n peso: '₱',\n rub: '₽',\n won: '₩',\n yuan: '¥',\n cedil: '¸',\n};\n\n/**\n * Fractions\n * @type {Record}\n */\nexport const FRACTIONS = {\n frac12: '½',\n half: '½',\n frac13: '⅓',\n frac14: '¼',\n frac15: '⅕',\n frac16: '⅙',\n frac18: '⅛',\n frac23: '⅔',\n frac25: '⅖',\n frac34: '¾',\n frac35: '⅗',\n frac38: '⅜',\n frac45: '⅘',\n frac56: '⅚',\n frac58: '⅝',\n frac78: '⅞',\n frasl: '⁄',\n};\n\n/**\n * Miscellaneous Symbols\n * @type {Record}\n */\nexport const MISC_SYMBOLS = {\n trade: '™',\n TRADE: '™',\n telrec: '⌕',\n target: '⌖',\n ulcorn: '⌜',\n ulcorner: '⌜',\n urcorn: '⌝',\n urcorner: '⌝',\n dlcorn: '⌞',\n llcorner: '⌞',\n drcorn: '⌟',\n lrcorner: '⌟',\n intercal: '⊺',\n intcal: '⊺',\n oplus: '⊕',\n CirclePlus: '⊕',\n ominus: '⊖',\n CircleMinus: '⊖',\n otimes: '⊗',\n CircleTimes: '⊗',\n osol: '⊘',\n odot: '⊙',\n CircleDot: '⊙',\n oast: '⊛',\n circledast: '⊛',\n odash: '⊝',\n circleddash: '⊝',\n ocirc: '⊚',\n circledcirc: '⊚',\n boxplus: '⊞',\n plusb: '⊞',\n boxminus: '⊟',\n minusb: '⊟',\n boxtimes: '⊠',\n timesb: '⊠',\n boxdot: '⊡',\n sdotb: '⊡',\n veebar: '⊻',\n vee: '∨',\n barvee: '⊽',\n and: '∧',\n wedge: '∧',\n Cap: '⋒',\n Cup: '⋓',\n Fork: '⋔',\n pitchfork: '⋔',\n epar: '⋕',\n ltlarr: '⥶',\n nvap: '≍⃒',\n nvsim: '∼⃒',\n nvge: '≥⃒',\n nvle: '≤⃒',\n nvlt: '<⃒',\n nvgt: '>⃒',\n nvltrie: '⊴⃒',\n nvrtrie: '⊵⃒',\n Vdash: '⊩',\n dashv: '⊣',\n vDash: '⊨',\n Vdash: '⊩',\n Vvdash: '⊪',\n nvdash: '⊬',\n nvDash: '⊭',\n nVdash: '⊮',\n nVDash: '⊯',\n};\n\n/**\n * All entities combined (if you need everything)\n * @type {Record}\n */\nexport const ALL_ENTITIES = {\n ...BASIC_LATIN,\n ...LATIN_ACCENTS,\n ...LATIN_EXTENDED,\n ...GREEK,\n ...CYRILLIC,\n ...MATH,\n ...MATH_ADVANCED,\n ...ARROWS,\n ...SHAPES,\n ...PUNCTUATION,\n ...CURRENCY,\n ...FRACTIONS,\n ...MISC_SYMBOLS,\n};\n\nexport const XML = {\n amp: \"&\",\n apos: \"'\",\n gt: \">\",\n lt: \"<\",\n quot: \"\\\"\"\n}\nexport const COMMON_HTML = {\n nbsp: '\\u00a0',\n copy: '\\u00a9',\n reg: '\\u00ae',\n trade: '\\u2122',\n mdash: '\\u2014',\n ndash: '\\u2013',\n hellip: '\\u2026',\n laquo: '\\u00ab',\n raquo: '\\u00bb',\n lsquo: '\\u2018',\n rsquo: '\\u2019',\n ldquo: '\\u201c',\n rdquo: '\\u201d',\n bull: '\\u2022',\n para: '\\u00b6',\n sect: '\\u00a7',\n deg: '\\u00b0',\n frac12: '\\u00bd',\n frac14: '\\u00bc',\n frac34: '\\u00be',\n}\n// ---------------------------------------------------------------------------\n// Note: NUMERIC_ENTITIES (&#NNN; / &#xHH;) are handled by the scanner directly\n// via String.fromCodePoint() without any map lookup.\n// ---------------------------------------------------------------------------","// ---------------------------------------------------------------------------\n// Built-in named entity map (name → replacement string)\n// No regex, no {regex,val} objects — just flat key/value pairs.\n// ---------------------------------------------------------------------------\n\nimport { XML as DEFAULT_XML_ENTITIES } from \"./entities.js\"\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\nconst SPECIAL_CHARS = new Set('!?\\\\\\\\/[]$%{}^&*()<>|+');\n\n/**\n * Validate that an entity name contains no dangerous characters.\n * @param {string} name\n * @returns {string} the name, unchanged\n * @throws {Error} on invalid characters\n */\nfunction validateEntityName(name) {\n if (name[0] === '#') {\n throw new Error(`[EntityReplacer] Invalid character '#' in entity name: \"${name}\"`);\n }\n for (const ch of name) {\n if (SPECIAL_CHARS.has(ch)) {\n throw new Error(`[EntityReplacer] Invalid character '${ch}' in entity name: \"${name}\"`);\n }\n }\n return name;\n}\n\n/**\n * Merge one or more entity maps into a flat name→string map.\n * Accepts either:\n * - plain string values: { amp: '&' }\n * - legacy {regex,val} / {regx,val}: { lt: { regex: /.../, val: '<' } }\n *\n * Values containing '&' are skipped (recursive expansion risk).\n *\n * @param {...object} maps\n * @returns {Record}\n */\nfunction mergeEntityMaps(...maps) {\n const out = Object.create(null);\n for (const map of maps) {\n if (!map) continue;\n for (const key of Object.keys(map)) {\n const raw = map[key];\n if (typeof raw === 'string') {\n out[key] = raw;\n } else if (raw && typeof raw === 'object' && raw.val !== undefined) {\n // Legacy {regex,val} or {regx,val} — extract the string val only\n const val = raw.val;\n if (typeof val === 'string') {\n out[key] = val;\n }\n // function vals are not supported in the scanner — skip\n }\n }\n }\n return out;\n}\n\n// ---------------------------------------------------------------------------\n// applyLimitsTo helpers\n// ---------------------------------------------------------------------------\n\nconst LIMIT_TIER_EXTERNAL = 'external'; // input/runtime + persistent external maps\nconst LIMIT_TIER_BASE = 'base'; // DEFAULT_XML_ENTITIES + namedEntities (system) maps\nconst LIMIT_TIER_ALL = 'all'; // every entity regardless of tier\n\n/**\n * Resolve `applyLimitsTo` option into a normalised Set of tier strings.\n * Accepted values: 'external' | 'base' | 'all' | string[]\n * Default: 'external' (only untrusted injected entities are counted).\n * @param {string|string[]|undefined} raw\n * @returns {Set}\n */\nfunction parseLimitTiers(raw) {\n if (!raw || raw === LIMIT_TIER_EXTERNAL) return new Set([LIMIT_TIER_EXTERNAL]);\n if (raw === LIMIT_TIER_ALL) return new Set([LIMIT_TIER_ALL]);\n if (raw === LIMIT_TIER_BASE) return new Set([LIMIT_TIER_BASE]);\n if (Array.isArray(raw)) return new Set(raw);\n return new Set([LIMIT_TIER_EXTERNAL]); // safe default for unrecognised values\n}\n\n// ---------------------------------------------------------------------------\n// NCR (Numeric Character Reference) classification\n// ---------------------------------------------------------------------------\n\n// Severity order — higher number = stricter action.\n// Used to enforce minimum action levels for specific codepoint ranges.\nconst NCR_LEVEL = Object.freeze({ allow: 0, leave: 1, remove: 2, throw: 3 });\n\n// XML 1.0 §2.2: allowed chars are #x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF]\n// Restricted C0: U+0001–U+001F excluding U+0009, U+000A, U+000D\nconst XML10_ALLOWED_C0 = new Set([0x09, 0x0A, 0x0D]);\n\n/**\n * Parse the `ncr` constructor option into flat, hot-path-friendly fields.\n * @param {object|undefined} ncr\n * @returns {{ xmlVersion: number, onLevel: number, nullLevel: number }}\n */\nfunction parseNCRConfig(ncr) {\n if (!ncr) {\n return { xmlVersion: 1.0, onLevel: NCR_LEVEL.allow, nullLevel: NCR_LEVEL.remove };\n }\n const xmlVersion = ncr.xmlVersion === 1.1 ? 1.1 : 1.0;\n const onLevel = NCR_LEVEL[ncr.onNCR] ?? NCR_LEVEL.allow;\n const nullLevel = NCR_LEVEL[ncr.nullNCR] ?? NCR_LEVEL.remove;\n // 'allow' is not meaningful for null — clamp to at least 'remove'\n const clampedNull = Math.max(nullLevel, NCR_LEVEL.remove);\n return { xmlVersion, onLevel, nullLevel: clampedNull };\n}\n\n// ---------------------------------------------------------------------------\n// EntityReplacer\n// ---------------------------------------------------------------------------\n\n/**\n * Single-pass, zero-regex entity replacer for XML/HTML content.\n *\n * Algorithm: scan the string once for '&', read to ';', resolve via map\n * or direct codepoint conversion, build output chunks, join once at the end.\n *\n * Entity lookup priority (highest → lowest):\n * 1. input / runtime (DOCTYPE entities for current document)\n * 2. persistent external (survive across documents)\n * 3. base named map (DEFAULT_XML_ENTITIES + user-supplied namedEntities)\n *\n * Both input and external resolve as the 'external' tier for limit purposes.\n * Base map entities resolve as the 'base' tier.\n *\n * Numeric / hex references (&#NNN; / &#xHH;) are resolved directly via\n * String.fromCodePoint() — no map needed. They count as 'base' tier.\n *\n * @example\n * const replacer = new EntityReplacer({ namedEntities: COMMON_HTML });\n * replacer.setExternalEntities({ brand: 'Acme' });\n *\n * const instance = replacer.reset();\n * instance.addInputEntities({ version: '1.0' });\n * instance.encode('&brand; v&version; <'); // 'Acme v1.0 <'\n */\nexport default class EntityDecoder {\n /**\n * @param {object} [options]\n * @param {object|null} [options.namedEntities] — extra named entities merged into base map\n * @param {object} [options.limit] — security limits\n * @param {number} [options.limit.maxTotalExpansions=0] — 0 = unlimited\n * @param {number} [options.limit.maxExpandedLength=0] — 0 = unlimited\n * @param {'external'|'base'|'all'|string[]} [options.limit.applyLimitsTo='external']\n * Which entity tiers count against the security limits:\n * - 'external' (default) — only input/runtime + persistent external entities\n * - 'base' — only DEFAULT_XML_ENTITIES + namedEntities\n * - 'all' — every entity regardless of tier\n * - string[] — explicit combination, e.g. ['external', 'base']\n * @param {((resolved: string, original: string) => string)|null} [options.postCheck=null]\n * @param {string[]} [options.remove=[]] — entity names (e.g. ['nbsp', '#13']) to delete (replace with empty string)\n * @param {string[]} [options.leave=[]] — entity names to keep as literal (unchanged in output)\n * @param {object} [options.ncr] — Numeric Character Reference controls\n * @param {1.0|1.1} [options.ncr.xmlVersion=1.0]\n * XML version governing which codepoint ranges are restricted:\n * - 1.0 — C0 controls U+0001–U+001F (except U+0009/000A/000D) are prohibited\n * - 1.1 — C0 controls are allowed when written as NCRs; C1 (U+007F–U+009F) decoded as-is\n * @param {'allow'|'leave'|'remove'|'throw'} [options.ncr.onNCR='allow']\n * Base action for numeric references. Severity order: allow < leave < remove < throw.\n * For codepoint ranges that carry a minimum level (surrogates → remove, XML 1.0 C0 → remove),\n * the effective action is max(onNCR, rangeMinimum).\n * @param {'remove'|'throw'} [options.ncr.nullNCR='remove']\n * Action for U+0000 (null). 'allow' and 'leave' are clamped to 'remove' since null is never safe.\n */\n constructor(options = {}) {\n this._limit = options.limit || {};\n this._maxTotalExpansions = this._limit.maxTotalExpansions || 0;\n this._maxExpandedLength = this._limit.maxExpandedLength || 0;\n this._postCheck = typeof options.postCheck === 'function' ? options.postCheck : r => r;\n this._limitTiers = parseLimitTiers(this._limit.applyLimitsTo ?? LIMIT_TIER_EXTERNAL);\n this._numericAllowed = options.numericAllowed ?? true;\n // Base map: DEFAULT_XML_ENTITIES + user-supplied extras. Immutable after construction.\n this._baseMap = mergeEntityMaps(DEFAULT_XML_ENTITIES, options.namedEntities || null);\n\n // Persistent external entities — survive across documents.\n // Stored as a separate map so reset() never touches them.\n /** @type {Record} */\n this._externalMap = Object.create(null);\n\n // Input / runtime entities — current document only, wiped on reset().\n /** @type {Record} */\n this._inputMap = Object.create(null);\n\n // Per-document counters\n this._totalExpansions = 0;\n this._expandedLength = 0;\n\n // --- New: remove / leave sets ---\n /** @type {Set} */\n this._removeSet = new Set(options.remove && Array.isArray(options.remove) ? options.remove : []);\n /** @type {Set} */\n this._leaveSet = new Set(options.leave && Array.isArray(options.leave) ? options.leave : []);\n\n // --- NCR config (parsed into flat fields for hot-path speed) ---\n const ncrCfg = parseNCRConfig(options.ncr);\n this._ncrXmlVersion = ncrCfg.xmlVersion;\n this._ncrOnLevel = ncrCfg.onLevel;\n this._ncrNullLevel = ncrCfg.nullLevel;\n }\n\n // -------------------------------------------------------------------------\n // Persistent external entity registration\n // -------------------------------------------------------------------------\n\n /**\n * Replace the full set of persistent external entities.\n * All keys are validated — throws on invalid characters.\n * @param {Record} map\n */\n setExternalEntities(map) {\n if (map) {\n for (const key of Object.keys(map)) {\n validateEntityName(key);\n }\n }\n this._externalMap = mergeEntityMaps(map);\n }\n\n /**\n * Add a single persistent external entity.\n * @param {string} key\n * @param {string} value\n */\n addExternalEntity(key, value) {\n validateEntityName(key);\n if (typeof value === 'string' && value.indexOf('&') === -1) {\n this._externalMap[key] = value;\n }\n }\n\n // -------------------------------------------------------------------------\n // Input / runtime entity registration (per document)\n // -------------------------------------------------------------------------\n\n /**\n * Inject DOCTYPE entities for the current document.\n * Also resets per-document expansion counters.\n * @param {Record} map\n */\n addInputEntities(map) {\n this._totalExpansions = 0;\n this._expandedLength = 0;\n this._inputMap = mergeEntityMaps(map);\n }\n\n // -------------------------------------------------------------------------\n // Per-document reset\n // -------------------------------------------------------------------------\n\n /**\n * Wipe input/runtime entities and reset counters.\n * Call this before processing each new document.\n * @returns {this}\n */\n reset() {\n this._inputMap = Object.create(null);\n this._totalExpansions = 0;\n this._expandedLength = 0;\n return this;\n }\n\n // -------------------------------------------------------------------------\n // XML version (can be set after construction, e.g. once parser reads )\n // -------------------------------------------------------------------------\n\n /**\n * Update the XML version used for NCR classification.\n * Call this as soon as the document's `` declaration is parsed.\n * @param {1.0|1.1|number} version\n */\n setXmlVersion(version) {\n this._ncrXmlVersion = version === 1.1 ? 1.1 : 1.0;\n }\n\n // -------------------------------------------------------------------------\n // Primary API\n // -------------------------------------------------------------------------\n\n /**\n * Replace all entity references in `str` in a single pass.\n *\n * @param {string} str\n * @returns {string}\n */\n decode(str) {\n if (typeof str !== 'string' || str.length === 0) return str;\n //TODO: check if needed\n //if (str.indexOf('&') === -1) return str; // fast path — no entities at all\n\n const original = str;\n const chunks = [];\n const len = str.length;\n let last = 0; // start of next unprocessed literal chunk\n let i = 0;\n\n const limitExpansions = this._maxTotalExpansions > 0;\n const limitLength = this._maxExpandedLength > 0;\n const checkLimits = limitExpansions || limitLength;\n\n while (i < len) {\n // Scan forward to next '&'\n if (str.charCodeAt(i) !== 38 /* '&' */) { i++; continue; }\n\n // --- Found '&' at position i ---\n\n // Scan forward to ';'\n let j = i + 1;\n while (j < len && str.charCodeAt(j) !== 59 /* ';' */ && (j - i) <= 32) j++;\n\n if (j >= len || str.charCodeAt(j) !== 59) {\n // No closing ';' within window — treat '&' as literal\n i++;\n continue;\n }\n\n // Raw token between '&' and ';' (exclusive)\n const token = str.slice(i + 1, j);\n if (token.length === 0) { i++; continue; }\n\n let replacement;\n let tier; // which limit tier this entity belongs to\n\n if (this._removeSet.has(token)) {\n // Remove entity: replace with empty string\n replacement = '';\n // If entity was unknown (replacement undefined), we still need a tier for limits.\n // Treat as external tier because it's user-directed removal of an unknown reference.\n if (tier === undefined) {\n tier = LIMIT_TIER_EXTERNAL;\n }\n } else if (this._leaveSet.has(token)) {\n // Do not replace — keep original &token; as literal\n i++;\n continue;\n } else if (token.charCodeAt(0) === 35 /* '#' */) {\n // ---- Numeric / NCR reference ----\n // NCR classification always runs first — prohibited codepoints must be\n // caught regardless of numericAllowed.\n const ncrResult = this._resolveNCR(token);\n if (ncrResult === undefined) {\n // 'leave' action — keep original &token; as-is\n i++;\n continue;\n }\n replacement = ncrResult; // '' for remove, char string for allow\n tier = LIMIT_TIER_BASE;\n } else {\n // ---- Named reference ----\n const resolved = this._resolveName(token);\n replacement = resolved?.value;\n tier = resolved?.tier;\n }\n\n if (replacement === undefined) {\n // Unknown entity — leave as-is, advance past '&' only\n i++;\n continue;\n }\n\n // Flush literal chunk before this entity\n if (i > last) chunks.push(str.slice(last, i));\n chunks.push(replacement);\n last = j + 1; // skip past ';'\n i = last;\n\n // Apply expansion limits only if this tier is being tracked\n if (checkLimits && this._tierCounts(tier)) {\n if (limitExpansions) {\n this._totalExpansions++;\n if (this._totalExpansions > this._maxTotalExpansions) {\n throw new Error(\n `[EntityReplacer] Entity expansion count limit exceeded: ` +\n `${this._totalExpansions} > ${this._maxTotalExpansions}`\n );\n }\n }\n if (limitLength) {\n // delta: replacement.length minus the raw &token; length (token.length + 2 for '&' and ';')\n const delta = replacement.length - (token.length + 2);\n if (delta > 0) {\n this._expandedLength += delta;\n if (this._expandedLength > this._maxExpandedLength) {\n throw new Error(\n `[EntityReplacer] Expanded content length limit exceeded: ` +\n `${this._expandedLength} > ${this._maxExpandedLength}`\n );\n }\n }\n }\n }\n }\n\n // Flush trailing literal\n if (last < len) chunks.push(str.slice(last));\n\n // If nothing was replaced, chunks is empty — return original\n const result = chunks.length === 0 ? str : chunks.join('');\n\n return this._postCheck(result, original);\n }\n\n // -------------------------------------------------------------------------\n // Private: limit tier check\n // -------------------------------------------------------------------------\n\n /**\n * Returns true if a resolved entity of the given tier should count\n * against the expansion/length limits.\n * @param {string} tier — LIMIT_TIER_EXTERNAL | LIMIT_TIER_BASE\n * @returns {boolean}\n */\n _tierCounts(tier) {\n if (this._limitTiers.has(LIMIT_TIER_ALL)) return true;\n return this._limitTiers.has(tier);\n }\n\n // -------------------------------------------------------------------------\n // Private: entity resolution\n // -------------------------------------------------------------------------\n\n /**\n * Resolve a named entity token (without & and ;).\n * Priority: inputMap > externalMap > baseMap\n * Returns the resolved value tagged with its limit tier.\n *\n * @param {string} name\n * @returns {{ value: string, tier: string }|undefined}\n */\n _resolveName(name) {\n // input and external both count as 'external' tier for limit purposes —\n // they are injected at runtime and are the untrusted surface.\n if (name in this._inputMap) return { value: this._inputMap[name], tier: LIMIT_TIER_EXTERNAL };\n if (name in this._externalMap) return { value: this._externalMap[name], tier: LIMIT_TIER_EXTERNAL };\n if (name in this._baseMap) return { value: this._baseMap[name], tier: LIMIT_TIER_BASE };\n return undefined;\n }\n\n /**\n * Classify a codepoint and return the minimum action level that must be applied.\n * Returns -1 when no minimum is imposed (normal allow path).\n *\n * Ranges checked (in priority order):\n * 1. U+0000 — null, governed by nullNCR (always ≥ remove)\n * 2. U+D800–U+DFFF — surrogates, always prohibited (min: remove)\n * 3. U+0001–U+001F \\ {0x09,0x0A,0x0D} — XML 1.0 restricted C0 (min: remove)\n * (skipped in XML 1.1 — C0 controls are allowed when written as NCRs)\n *\n * @param {number} cp — codepoint\n * @returns {number} — minimum NCR_LEVEL value, or -1 for no restriction\n */\n _classifyNCR(cp) {\n // 1. Null\n if (cp === 0) return this._ncrNullLevel;\n\n // 2. Surrogates — always prohibited, minimum 'remove'\n if (cp >= 0xD800 && cp <= 0xDFFF) return NCR_LEVEL.remove;\n\n // 3. XML 1.0 restricted C0 controls\n if (this._ncrXmlVersion === 1.0) {\n if (cp >= 0x01 && cp <= 0x1F && !XML10_ALLOWED_C0.has(cp)) return NCR_LEVEL.remove;\n }\n\n return -1; // no restriction\n }\n\n /**\n * Execute a resolved NCR action.\n *\n * @param {number} action — NCR_LEVEL value\n * @param {string} token — raw token (e.g. '#38') for error messages\n * @param {number} cp — codepoint, used only for error messages\n * @returns {string|undefined}\n * - decoded character string → 'allow'\n * - '' → 'remove'\n * - undefined → 'leave' (caller must skip past '&' only)\n * - throws Error → 'throw'\n */\n _applyNCRAction(action, token, cp) {\n switch (action) {\n case NCR_LEVEL.allow: return String.fromCodePoint(cp);\n case NCR_LEVEL.remove: return '';\n case NCR_LEVEL.leave: return undefined; // signal: keep literal\n case NCR_LEVEL.throw:\n throw new Error(\n `[EntityDecoder] Prohibited numeric character reference ` +\n `&${token}; (U+${cp.toString(16).toUpperCase().padStart(4, '0')})`\n );\n default: return String.fromCodePoint(cp);\n }\n }\n\n /**\n * Full NCR resolution pipeline for a numeric token.\n *\n * Steps:\n * 1. Parse the codepoint (decimal or hex).\n * 2. Validate the raw codepoint range (NaN, <0, >0x10FFFF).\n * 3. If numericAllowed is false and no minimum restriction applies → leave as-is.\n * 4. Classify the codepoint to find the minimum required action level.\n * 5. Resolve effective action = max(onNCR, minimum).\n * 6. Apply and return.\n *\n * @param {string} token — e.g. '#38', '#x26', '#X26'\n * @returns {string|undefined}\n * - string (incl. '') — replacement ('' = remove)\n * - undefined — leave original &token; as-is\n */\n _resolveNCR(token) {\n // Step 1: parse codepoint\n const second = token.charCodeAt(1);\n let cp;\n if (second === 120 /* x */ || second === 88 /* X */) {\n cp = parseInt(token.slice(2), 16);\n } else {\n cp = parseInt(token.slice(1), 10);\n }\n\n // Step 2: out-of-range → leave as-is unconditionally\n if (Number.isNaN(cp) || cp < 0 || cp > 0x10FFFF) return undefined;\n\n // Step 3: classify to get minimum action level\n const minimum = this._classifyNCR(cp);\n\n // Step 4: if numericAllowed is false and no hard minimum → leave\n if (!this._numericAllowed && minimum < NCR_LEVEL.remove) return undefined;\n\n // Step 5: effective action = max(configured onNCR, range minimum)\n const effective = minimum === -1\n ? this._ncrOnLevel\n : Math.max(this._ncrOnLevel, minimum);\n\n // Step 6: apply\n return this._applyNCRAction(effective, token, cp);\n }\n}","'use strict';\n///@ts-check\n\nimport { getAllMatches, isExist, DANGEROUS_PROPERTY_NAMES, criticalProperties } from '../util.js';\nimport xmlNode from './xmlNode.js';\nimport DocTypeReader from './DocTypeReader.js';\nimport toNumber from \"strnum\";\nimport getIgnoreAttributesFn from \"../ignoreAttributes.js\";\nimport { Expression, Matcher } from 'path-expression-matcher';\nimport { ExpressionSet } from 'path-expression-matcher';\nimport { EntityDecoder, XML, CURRENCY, COMMON_HTML } from '@nodable/entities';\n\n// const regx =\n// '<((!\\\\[CDATA\\\\[([\\\\s\\\\S]*?)(]]>))|((NAME:)?(NAME))([^>]*)>|((\\\\/)(NAME)\\\\s*>))([^<]*)'\n// .replace(/NAME/g, util.nameRegexp);\n\n//const tagsRegx = new RegExp(\"<(\\\\/?[\\\\w:\\\\-\\._]+)([^>]*)>(\\\\s*\"+cdataRegx+\")*([^<]+)?\",\"g\");\n//const tagsRegx = new RegExp(\"<(\\\\/?)((\\\\w*:)?([\\\\w:\\\\-\\._]+))([^>]*)>([^<]*)(\"+cdataRegx+\"([^<]*))*([^<]+)?\",\"g\");\n\n// Helper functions for attribute and namespace handling\n\n/**\n * Extract raw attributes (without prefix) from prefixed attribute map\n * @param {object} prefixedAttrs - Attributes with prefix from buildAttributesMap\n * @param {object} options - Parser options containing attributeNamePrefix\n * @returns {object} Raw attributes for matcher\n */\nfunction extractRawAttributes(prefixedAttrs, options) {\n if (!prefixedAttrs) return {};\n\n // Handle attributesGroupName option\n const attrs = options.attributesGroupName\n ? prefixedAttrs[options.attributesGroupName]\n : prefixedAttrs;\n\n if (!attrs) return {};\n\n const rawAttrs = {};\n for (const key in attrs) {\n // Remove the attribute prefix to get raw name\n if (key.startsWith(options.attributeNamePrefix)) {\n const rawName = key.substring(options.attributeNamePrefix.length);\n rawAttrs[rawName] = attrs[key];\n } else {\n // Attribute without prefix (shouldn't normally happen, but be safe)\n rawAttrs[key] = attrs[key];\n }\n }\n return rawAttrs;\n}\n\n/**\n * Extract namespace from raw tag name\n * @param {string} rawTagName - Tag name possibly with namespace (e.g., \"soap:Envelope\")\n * @returns {string|undefined} Namespace or undefined\n */\nfunction extractNamespace(rawTagName) {\n if (!rawTagName || typeof rawTagName !== 'string') return undefined;\n\n const colonIndex = rawTagName.indexOf(':');\n if (colonIndex !== -1 && colonIndex > 0) {\n const ns = rawTagName.substring(0, colonIndex);\n // Don't treat xmlns as a namespace\n if (ns !== 'xmlns') {\n return ns;\n }\n }\n return undefined;\n}\n\nexport default class OrderedObjParser {\n constructor(options) {\n this.options = options;\n this.currentNode = null;\n this.tagsNodeStack = [];\n this.parseXml = parseXml;\n this.parseTextData = parseTextData;\n this.resolveNameSpace = resolveNameSpace;\n this.buildAttributesMap = buildAttributesMap;\n this.isItStopNode = isItStopNode;\n this.replaceEntitiesValue = replaceEntitiesValue;\n this.readStopNodeData = readStopNodeData;\n this.saveTextToParentTag = saveTextToParentTag;\n this.addChild = addChild;\n this.ignoreAttributesFn = getIgnoreAttributesFn(this.options.ignoreAttributes)\n this.entityExpansionCount = 0;\n this.currentExpandedLength = 0;\n let namedEntities = { ...XML };\n if (this.options.entityDecoder) {\n this.entityDecoder = this.options.entityDecoder\n } else {\n if (typeof this.options.htmlEntities === \"object\") namedEntities = this.options.htmlEntities;\n else if (this.options.htmlEntities === true) namedEntities = { ...COMMON_HTML, ...CURRENCY };\n this.entityDecoder = new EntityDecoder({\n namedEntities: namedEntities,\n numericAllowed: this.options.htmlEntities,\n limit: {\n maxTotalExpansions: this.options.processEntities.maxTotalExpansions,\n maxExpandedLength: this.options.processEntities.maxExpandedLength,\n applyLimitsTo: this.options.processEntities.appliesTo,\n }\n //postCheck: resolved => resolved\n });\n }\n\n // Initialize path matcher for path-expression-matcher\n this.matcher = new Matcher();\n\n // Live read-only proxy of matcher — PEM creates and caches this internally.\n // All user callbacks receive this instead of the mutable matcher.\n this.readonlyMatcher = this.matcher.readOnly();\n\n // Flag to track if current node is a stop node (optimization)\n this.isCurrentNodeStopNode = false;\n\n // Pre-compile stopNodes expressions\n this.stopNodeExpressionsSet = new ExpressionSet();\n const stopNodesOpts = this.options.stopNodes;\n if (stopNodesOpts && stopNodesOpts.length > 0) {\n for (let i = 0; i < stopNodesOpts.length; i++) {\n const stopNodeExp = stopNodesOpts[i];\n if (typeof stopNodeExp === 'string') {\n // Convert string to Expression object\n this.stopNodeExpressionsSet.add(new Expression(stopNodeExp));\n } else if (stopNodeExp instanceof Expression) {\n // Already an Expression object\n this.stopNodeExpressionsSet.add(stopNodeExp);\n }\n }\n this.stopNodeExpressionsSet.seal();\n }\n }\n\n}\n\n\n/**\n * @param {string} val\n * @param {string} tagName\n * @param {string|Matcher} jPath - jPath string or Matcher instance based on options.jPath\n * @param {boolean} dontTrim\n * @param {boolean} hasAttributes\n * @param {boolean} isLeafNode\n * @param {boolean} escapeEntities\n */\nfunction parseTextData(val, tagName, jPath, dontTrim, hasAttributes, isLeafNode, escapeEntities) {\n const options = this.options;\n if (val !== undefined) {\n if (options.trimValues && !dontTrim) {\n val = val.trim();\n }\n if (val.length > 0) {\n if (!escapeEntities) val = this.replaceEntitiesValue(val, tagName, jPath);\n\n // Pass jPath string or matcher based on options.jPath setting\n const jPathOrMatcher = options.jPath ? jPath.toString() : jPath;\n const newval = options.tagValueProcessor(tagName, val, jPathOrMatcher, hasAttributes, isLeafNode);\n if (newval === null || newval === undefined) {\n //don't parse\n return val;\n } else if (typeof newval !== typeof val || newval !== val) {\n //overwrite\n return newval;\n } else if (options.trimValues) {\n return parseValue(val, options.parseTagValue, options.numberParseOptions);\n } else {\n const trimmedVal = val.trim();\n if (trimmedVal === val) {\n return parseValue(val, options.parseTagValue, options.numberParseOptions);\n } else {\n return val;\n }\n }\n }\n }\n}\n\nfunction resolveNameSpace(tagname) {\n if (this.options.removeNSPrefix) {\n const tags = tagname.split(':');\n const prefix = tagname.charAt(0) === '/' ? '/' : '';\n if (tags[0] === 'xmlns') {\n return '';\n }\n if (tags.length === 2) {\n tagname = prefix + tags[1];\n }\n }\n return tagname;\n}\n\n//TODO: change regex to capture NS\n//const attrsRegx = new RegExp(\"([\\\\w\\\\-\\\\.\\\\:]+)\\\\s*=\\\\s*(['\\\"])((.|\\n)*?)\\\\2\",\"gm\");\nconst attrsRegx = new RegExp('([^\\\\s=]+)\\\\s*(=\\\\s*([\\'\"])([\\\\s\\\\S]*?)\\\\3)?', 'gm');\n\nfunction buildAttributesMap(attrStr, jPath, tagName) {\n const options = this.options;\n if (options.ignoreAttributes !== true && typeof attrStr === 'string') {\n // attrStr = attrStr.replace(/\\r?\\n/g, ' ');\n //attrStr = attrStr || attrStr.trim();\n\n const matches = getAllMatches(attrStr, attrsRegx);\n const len = matches.length; //don't make it inline\n const attrs = {};\n\n // Pre-process values once: trim + entity replacement\n // Reused in both matcher update and second pass\n const processedVals = new Array(len);\n let hasRawAttrs = false;\n const rawAttrsForMatcher = {};\n\n for (let i = 0; i < len; i++) {\n const attrName = this.resolveNameSpace(matches[i][1]);\n const oldVal = matches[i][4];\n\n if (attrName.length && oldVal !== undefined) {\n let val = oldVal;\n if (options.trimValues) val = val.trim();\n val = this.replaceEntitiesValue(val, tagName, this.readonlyMatcher);\n processedVals[i] = val;\n\n rawAttrsForMatcher[attrName] = val;\n hasRawAttrs = true;\n }\n }\n\n // Update matcher ONCE before second pass, if applicable\n if (hasRawAttrs && typeof jPath === 'object' && jPath.updateCurrent) {\n jPath.updateCurrent(rawAttrsForMatcher);\n }\n\n // Hoist toString() once — path doesn't change during attribute processing\n const jPathStr = options.jPath ? jPath.toString() : this.readonlyMatcher;\n\n // Second pass: apply processors, build final attrs\n let hasAttrs = false;\n for (let i = 0; i < len; i++) {\n const attrName = this.resolveNameSpace(matches[i][1]);\n\n if (this.ignoreAttributesFn(attrName, jPathStr)) continue;\n\n let aName = options.attributeNamePrefix + attrName;\n\n if (attrName.length) {\n if (options.transformAttributeName) {\n aName = options.transformAttributeName(aName);\n }\n aName = sanitizeName(aName, options);\n\n if (matches[i][4] !== undefined) {\n // Reuse already-processed value — no double entity replacement\n const oldVal = processedVals[i];\n\n const newVal = options.attributeValueProcessor(attrName, oldVal, jPathStr);\n if (newVal === null || newVal === undefined) {\n attrs[aName] = oldVal;\n } else if (typeof newVal !== typeof oldVal || newVal !== oldVal) {\n attrs[aName] = newVal;\n } else {\n attrs[aName] = parseValue(oldVal, options.parseAttributeValue, options.numberParseOptions);\n }\n hasAttrs = true;\n } else if (options.allowBooleanAttributes) {\n attrs[aName] = true;\n hasAttrs = true;\n }\n }\n }\n\n if (!hasAttrs) return;\n\n if (options.attributesGroupName) {\n const attrCollection = {};\n attrCollection[options.attributesGroupName] = attrs;\n return attrCollection;\n }\n return attrs;\n }\n}\nconst parseXml = function (xmlData) {\n xmlData = xmlData.replace(/\\r\\n?/g, \"\\n\"); //TODO: remove this line\n const xmlObj = new xmlNode('!xml');\n let currentNode = xmlObj;\n let textData = \"\";\n\n // Reset matcher for new document\n this.matcher.reset();\n this.entityDecoder.reset();\n\n // Reset entity expansion counters for this document\n this.entityExpansionCount = 0;\n this.currentExpandedLength = 0;\n const options = this.options;\n const docTypeReader = new DocTypeReader(options.processEntities);\n const xmlLen = xmlData.length;\n for (let i = 0; i < xmlLen; i++) {//for each char in XML data\n const ch = xmlData[i];\n if (ch === '<') {\n // const nextIndex = i+1;\n // const _2ndChar = xmlData[nextIndex];\n const c1 = xmlData.charCodeAt(i + 1);\n if (c1 === 47) {//Closing Tag '/'\n const closeIndex = findClosingIndex(xmlData, \">\", i, \"Closing Tag is not closed.\")\n let tagName = xmlData.substring(i + 2, closeIndex).trim();\n\n if (options.removeNSPrefix) {\n const colonIndex = tagName.indexOf(\":\");\n if (colonIndex !== -1) {\n tagName = tagName.substr(colonIndex + 1);\n }\n }\n\n tagName = transformTagName(options.transformTagName, tagName, \"\", options).tagName;\n\n if (currentNode) {\n textData = this.saveTextToParentTag(textData, currentNode, this.readonlyMatcher);\n }\n\n //check if last tag of nested tag was unpaired tag\n const lastTagName = this.matcher.getCurrentTag();\n if (tagName && options.unpairedTagsSet.has(tagName)) {\n throw new Error(`Unpaired tag can not be used as closing tag: `);\n }\n if (lastTagName && options.unpairedTagsSet.has(lastTagName)) {\n // Pop the unpaired tag\n this.matcher.pop();\n this.tagsNodeStack.pop();\n }\n // Pop the closing tag\n this.matcher.pop();\n this.isCurrentNodeStopNode = false; // Reset flag when closing tag\n\n currentNode = this.tagsNodeStack.pop();//avoid recursion, set the parent tag scope\n textData = \"\";\n i = closeIndex;\n } else if (c1 === 63) { //'?'\n\n let tagData = readTagExp(xmlData, i, false, \"?>\");\n if (!tagData) throw new Error(\"Pi Tag is not closed.\");\n\n textData = this.saveTextToParentTag(textData, currentNode, this.readonlyMatcher);\n const attsMap = this.buildAttributesMap(tagData.tagExp, this.matcher, tagData.tagName);\n if (attsMap && attsMap[\"version\"]) {\n this.entityDecoder.setXmlVersion(attsMap[\"version\"]);\n }\n if ((options.ignoreDeclaration && tagData.tagName === \"?xml\") || options.ignorePiTags) {\n //do nothing\n } else {\n\n const childNode = new xmlNode(tagData.tagName);\n childNode.add(options.textNodeName, \"\");\n\n if (tagData.tagName !== tagData.tagExp && tagData.attrExpPresent) {\n childNode[\":@\"] = attsMap\n }\n this.addChild(currentNode, childNode, this.readonlyMatcher, i);\n }\n\n\n i = tagData.closeIndex + 1;\n } else if (c1 === 33\n && xmlData.charCodeAt(i + 2) === 45\n && xmlData.charCodeAt(i + 3) === 45) { //'!--'\n const endIndex = findClosingIndex(xmlData, \"-->\", i + 4, \"Comment is not closed.\")\n if (options.commentPropName) {\n const comment = xmlData.substring(i + 4, endIndex - 2);\n\n textData = this.saveTextToParentTag(textData, currentNode, this.readonlyMatcher);\n\n currentNode.add(options.commentPropName, [{ [options.textNodeName]: comment }]);\n }\n i = endIndex;\n } else if (c1 === 33\n && xmlData.charCodeAt(i + 2) === 68) { //'!D'\n const result = docTypeReader.readDocType(xmlData, i);\n this.entityDecoder.addInputEntities(result.entities);\n i = result.i;\n } else if (c1 === 33\n && xmlData.charCodeAt(i + 2) === 91) { // '!['\n const closeIndex = findClosingIndex(xmlData, \"]]>\", i, \"CDATA is not closed.\") - 2;\n const tagExp = xmlData.substring(i + 9, closeIndex);\n\n textData = this.saveTextToParentTag(textData, currentNode, this.readonlyMatcher);\n\n let val = this.parseTextData(tagExp, currentNode.tagname, this.readonlyMatcher, true, false, true, true);\n if (val == undefined) val = \"\";\n\n //cdata should be set even if it is 0 length string\n if (options.cdataPropName) {\n currentNode.add(options.cdataPropName, [{ [options.textNodeName]: tagExp }]);\n } else {\n currentNode.add(options.textNodeName, val);\n }\n\n i = closeIndex + 2;\n } else {//Opening tag\n let result = readTagExp(xmlData, i, options.removeNSPrefix);\n\n // Safety check: readTagExp can return undefined\n if (!result) {\n // Log context for debugging\n const context = xmlData.substring(Math.max(0, i - 50), Math.min(xmlLen, i + 50));\n throw new Error(`readTagExp returned undefined at position ${i}. Context: \"${context}\"`);\n }\n\n let tagName = result.tagName;\n const rawTagName = result.rawTagName;\n let tagExp = result.tagExp;\n let attrExpPresent = result.attrExpPresent;\n let closeIndex = result.closeIndex;\n\n ({ tagName, tagExp } = transformTagName(options.transformTagName, tagName, tagExp, options));\n\n if (options.strictReservedNames &&\n (tagName === options.commentPropName\n || tagName === options.cdataPropName\n || tagName === options.textNodeName\n || tagName === options.attributesGroupName\n )) {\n throw new Error(`Invalid tag name: ${tagName}`);\n }\n\n //save text as child node\n if (currentNode && textData) {\n if (currentNode.tagname !== '!xml') {\n //when nested tag is found\n textData = this.saveTextToParentTag(textData, currentNode, this.readonlyMatcher, false);\n }\n }\n\n //check if last tag was unpaired tag\n const lastTag = currentNode;\n if (lastTag && options.unpairedTagsSet.has(lastTag.tagname)) {\n currentNode = this.tagsNodeStack.pop();\n this.matcher.pop();\n }\n\n // Clean up self-closing syntax BEFORE processing attributes\n // This is where tagExp gets the trailing / removed\n let isSelfClosing = false;\n if (tagExp.length > 0 && tagExp.lastIndexOf(\"/\") === tagExp.length - 1) {\n isSelfClosing = true;\n if (tagName[tagName.length - 1] === \"/\") {\n tagName = tagName.substr(0, tagName.length - 1);\n tagExp = tagName;\n } else {\n tagExp = tagExp.substr(0, tagExp.length - 1);\n }\n\n // Re-check attrExpPresent after cleaning\n attrExpPresent = (tagName !== tagExp);\n }\n\n // Now process attributes with CLEAN tagExp (no trailing /)\n let prefixedAttrs = null;\n let rawAttrs = {};\n let namespace = undefined;\n\n // Extract namespace from rawTagName\n namespace = extractNamespace(rawTagName);\n\n // Push tag to matcher FIRST (with empty attrs for now) so callbacks see correct path\n if (tagName !== xmlObj.tagname) {\n this.matcher.push(tagName, {}, namespace);\n }\n\n // Now build attributes - callbacks will see correct matcher state\n if (tagName !== tagExp && attrExpPresent) {\n // Build attributes (returns prefixed attributes for the tree)\n // Note: buildAttributesMap now internally updates the matcher with raw attributes\n prefixedAttrs = this.buildAttributesMap(tagExp, this.matcher, tagName);\n\n if (prefixedAttrs) {\n // Extract raw attributes (without prefix) for our use\n rawAttrs = extractRawAttributes(prefixedAttrs, options);\n }\n }\n\n // Now check if this is a stop node (after attributes are set)\n if (tagName !== xmlObj.tagname) {\n this.isCurrentNodeStopNode = this.isItStopNode();\n }\n\n const startIndex = i;\n if (this.isCurrentNodeStopNode) {\n let tagContent = \"\";\n\n // For self-closing tags, content is empty\n if (isSelfClosing) {\n i = result.closeIndex;\n }\n //unpaired tag\n else if (options.unpairedTagsSet.has(tagName)) {\n i = result.closeIndex;\n }\n //normal tag\n else {\n //read until closing tag is found\n const result = this.readStopNodeData(xmlData, rawTagName, closeIndex + 1);\n if (!result) throw new Error(`Unexpected end of ${rawTagName}`);\n i = result.i;\n tagContent = result.tagContent;\n }\n\n const childNode = new xmlNode(tagName);\n\n if (prefixedAttrs) {\n childNode[\":@\"] = prefixedAttrs;\n }\n\n // For stop nodes, store raw content as-is without any processing\n childNode.add(options.textNodeName, tagContent);\n\n this.matcher.pop(); // Pop the stop node tag\n this.isCurrentNodeStopNode = false; // Reset flag\n\n this.addChild(currentNode, childNode, this.readonlyMatcher, startIndex);\n } else {\n //selfClosing tag\n if (isSelfClosing) {\n ({ tagName, tagExp } = transformTagName(options.transformTagName, tagName, tagExp, options));\n\n const childNode = new xmlNode(tagName);\n if (prefixedAttrs) {\n childNode[\":@\"] = prefixedAttrs;\n }\n this.addChild(currentNode, childNode, this.readonlyMatcher, startIndex);\n this.matcher.pop(); // Pop self-closing tag\n this.isCurrentNodeStopNode = false; // Reset flag\n }\n else if (options.unpairedTagsSet.has(tagName)) {//unpaired tag\n const childNode = new xmlNode(tagName);\n if (prefixedAttrs) {\n childNode[\":@\"] = prefixedAttrs;\n }\n this.addChild(currentNode, childNode, this.readonlyMatcher, startIndex);\n this.matcher.pop(); // Pop unpaired tag\n this.isCurrentNodeStopNode = false; // Reset flag\n i = result.closeIndex;\n // Continue to next iteration without changing currentNode\n continue;\n }\n //opening tag\n else {\n const childNode = new xmlNode(tagName);\n if (this.tagsNodeStack.length > options.maxNestedTags) {\n throw new Error(\"Maximum nested tags exceeded\");\n }\n this.tagsNodeStack.push(currentNode);\n\n if (prefixedAttrs) {\n childNode[\":@\"] = prefixedAttrs;\n }\n this.addChild(currentNode, childNode, this.readonlyMatcher, startIndex);\n currentNode = childNode;\n }\n textData = \"\";\n i = closeIndex;\n }\n }\n } else {\n textData += xmlData[i];\n }\n }\n return xmlObj.child;\n}\n\nfunction addChild(currentNode, childNode, matcher, startIndex) {\n // unset startIndex if not requested\n if (!this.options.captureMetaData) startIndex = undefined;\n\n // Pass jPath string or matcher based on options.jPath setting\n const jPathOrMatcher = this.options.jPath ? matcher.toString() : matcher;\n const result = this.options.updateTag(childNode.tagname, jPathOrMatcher, childNode[\":@\"])\n if (result === false) {\n //do nothing\n } else if (typeof result === \"string\") {\n childNode.tagname = result\n currentNode.addChild(childNode, startIndex);\n } else {\n currentNode.addChild(childNode, startIndex);\n }\n}\n\n/**\n * @param {object} val - Entity object with regex and val properties\n * @param {string} tagName - Tag name\n * @param {string|Matcher} jPath - jPath string or Matcher instance based on options.jPath\n */\nfunction replaceEntitiesValue(val, tagName, jPath) {\n const entityConfig = this.options.processEntities;\n\n if (!entityConfig || !entityConfig.enabled) {\n return val;\n }\n\n // Check if tag is allowed to contain entities\n if (entityConfig.allowedTags) {\n const jPathOrMatcher = this.options.jPath ? jPath.toString() : jPath;\n const allowed = Array.isArray(entityConfig.allowedTags)\n ? entityConfig.allowedTags.includes(tagName)\n : entityConfig.allowedTags(tagName, jPathOrMatcher);\n\n if (!allowed) {\n return val;\n }\n }\n\n // Apply custom tag filter if provided\n if (entityConfig.tagFilter) {\n const jPathOrMatcher = this.options.jPath ? jPath.toString() : jPath;\n if (!entityConfig.tagFilter(tagName, jPathOrMatcher)) {\n return val; // Skip based on custom filter\n }\n }\n\n return this.entityDecoder.decode(val);\n}\n\n\nfunction saveTextToParentTag(textData, parentNode, matcher, isLeafNode) {\n if (textData) { //store previously collected data as textNode\n if (isLeafNode === undefined) isLeafNode = parentNode.child.length === 0\n\n textData = this.parseTextData(textData,\n parentNode.tagname,\n matcher,\n false,\n parentNode[\":@\"] ? Object.keys(parentNode[\":@\"]).length !== 0 : false,\n isLeafNode);\n\n if (textData !== undefined && textData !== \"\")\n parentNode.add(this.options.textNodeName, textData);\n textData = \"\";\n }\n return textData;\n}\n\n/**\n * @param {Array} stopNodeExpressions - Array of compiled Expression objects\n * @param {Matcher} matcher - Current path matcher\n */\nfunction isItStopNode() {\n if (this.stopNodeExpressionsSet.size === 0) return false;\n\n return this.matcher.matchesAny(this.stopNodeExpressionsSet);\n}\n\n/**\n * Returns the tag Expression and where it is ending handling single-double quotes situation\n * @param {string} xmlData \n * @param {number} i starting index\n * @returns \n */\nfunction tagExpWithClosingIndex(xmlData, i, closingChar = \">\") {\n let attrBoundary = 0;\n let hasTabInQuote = false;\n const len = xmlData.length;\n const closeCode0 = closingChar.charCodeAt(0);\n const closeCode1 = closingChar.length > 1 ? closingChar.charCodeAt(1) : -1;\n let closeIndex = -1;\n\n // First pass: locate the closing delimiter, tracking quote boundaries so\n // they don't mask the close. Note any \\t seen inside a quoted attribute\n // value — those must be preserved, so we can't bulk-replace tabs.\n for (let index = i; index < len; index++) {\n const code = xmlData.charCodeAt(index);\n\n if (attrBoundary) {\n if (code === attrBoundary) attrBoundary = 0;\n else if (code === 9) hasTabInQuote = true;\n } else if (code === 34 || code === 39) { // \" or '\n attrBoundary = code;\n } else if (code === closeCode0) {\n if (closeCode1 !== -1) {\n if (xmlData.charCodeAt(index + 1) === closeCode1) {\n closeIndex = index;\n break;\n }\n } else {\n closeIndex = index;\n break;\n }\n }\n }\n\n if (closeIndex === -1) return;\n\n const raw = xmlData.substring(i, closeIndex);\n\n // Fast path: any tabs are guaranteed to be outside quoted attr values,\n // so bulk-replace them with spaces.\n if (!hasTabInQuote) {\n return { data: raw.replace(/\\t/g, \" \"), index: closeIndex };\n }\n\n // Rare path: the tag expression has at least one tab inside a quoted\n // attribute value. Walk it and replace only the tabs that fall outside\n // quote boundaries.\n let tagExp = \"\";\n let boundary = 0;\n for (let k = 0; k < raw.length; k++) {\n const code = raw.charCodeAt(k);\n if (boundary) {\n if (code === boundary) boundary = 0;\n tagExp += raw[k];\n } else if (code === 34 || code === 39) {\n boundary = code;\n tagExp += raw[k];\n } else if (code === 9) {\n tagExp += \" \";\n } else {\n tagExp += raw[k];\n }\n }\n return { data: tagExp, index: closeIndex };\n}\n\nfunction findClosingIndex(xmlData, str, i, errMsg) {\n const closingIndex = xmlData.indexOf(str, i);\n if (closingIndex === -1) {\n throw new Error(errMsg)\n } else {\n return closingIndex + str.length - 1;\n }\n}\n\nfunction findClosingChar(xmlData, char, i, errMsg) {\n const closingIndex = xmlData.indexOf(char, i);\n if (closingIndex === -1) throw new Error(errMsg);\n return closingIndex; // no offset needed\n}\n\nfunction readTagExp(xmlData, i, removeNSPrefix, closingChar = \">\") {\n const result = tagExpWithClosingIndex(xmlData, i + 1, closingChar);\n if (!result) return;\n let tagExp = result.data;\n const closeIndex = result.index;\n const separatorIndex = tagExp.search(/\\s/);\n let tagName = tagExp;\n let attrExpPresent = true;\n if (separatorIndex !== -1) {//separate tag name and attributes expression\n tagName = tagExp.substring(0, separatorIndex);\n tagExp = tagExp.substring(separatorIndex + 1).trimStart();\n }\n\n const rawTagName = tagName;\n if (removeNSPrefix) {\n const colonIndex = tagName.indexOf(\":\");\n if (colonIndex !== -1) {\n tagName = tagName.substr(colonIndex + 1);\n attrExpPresent = tagName !== result.data.substr(colonIndex + 1);\n }\n }\n\n return {\n tagName: tagName,\n tagExp: tagExp,\n closeIndex: closeIndex,\n attrExpPresent: attrExpPresent,\n rawTagName: rawTagName,\n }\n}\n/**\n * find paired tag for a stop node\n * @param {string} xmlData \n * @param {string} tagName \n * @param {number} i \n */\nfunction readStopNodeData(xmlData, tagName, i) {\n const startIndex = i;\n // Starting at 1 since we already have an open tag\n let openTagCount = 1;\n\n const xmllen = xmlData.length;\n for (; i < xmllen; i++) {\n if (xmlData[i] === \"<\") {\n const c1 = xmlData.charCodeAt(i + 1);\n if (c1 === 47) {//close tag '/'\n const closeIndex = findClosingChar(xmlData, \">\", i, `${tagName} is not closed`);\n let closeTagName = xmlData.substring(i + 2, closeIndex).trim();\n if (closeTagName === tagName) {\n openTagCount--;\n if (openTagCount === 0) {\n return {\n tagContent: xmlData.substring(startIndex, i),\n i: closeIndex\n }\n }\n }\n i = closeIndex;\n } else if (c1 === 63) { //?\n const closeIndex = findClosingIndex(xmlData, \"?>\", i + 1, \"StopNode is not closed.\")\n i = closeIndex;\n } else if (c1 === 33\n && xmlData.charCodeAt(i + 2) === 45\n && xmlData.charCodeAt(i + 3) === 45) { // '!--'\n const closeIndex = findClosingIndex(xmlData, \"-->\", i + 3, \"StopNode is not closed.\")\n i = closeIndex;\n } else if (c1 === 33\n && xmlData.charCodeAt(i + 2) === 91) { // '!['\n const closeIndex = findClosingIndex(xmlData, \"]]>\", i, \"StopNode is not closed.\") - 2;\n i = closeIndex;\n } else {\n const tagData = readTagExp(xmlData, i, '>')\n\n if (tagData) {\n const openTagName = tagData && tagData.tagName;\n if (openTagName === tagName && tagData.tagExp[tagData.tagExp.length - 1] !== \"/\") {\n openTagCount++;\n }\n i = tagData.closeIndex;\n }\n }\n }\n }//end for loop\n}\n\nfunction parseValue(val, shouldParse, options) {\n if (shouldParse && typeof val === 'string') {\n //console.log(options)\n const newval = val.trim();\n if (newval === 'true') return true;\n else if (newval === 'false') return false;\n else return toNumber(val, options);\n } else {\n if (isExist(val)) {\n return val;\n } else {\n return '';\n }\n }\n}\n\nfunction fromCodePoint(str, base, prefix) {\n const codePoint = Number.parseInt(str, base);\n\n if (codePoint >= 0 && codePoint <= 0x10FFFF) {\n return String.fromCodePoint(codePoint);\n } else {\n return prefix + str + \";\";\n }\n}\n\nfunction transformTagName(fn, tagName, tagExp, options) {\n if (fn) {\n const newTagName = fn(tagName);\n if (tagExp === tagName) {\n tagExp = newTagName\n }\n tagName = newTagName;\n }\n tagName = sanitizeName(tagName, options);\n return { tagName, tagExp };\n}\n\n\n\nfunction sanitizeName(name, options) {\n if (criticalProperties.includes(name)) {\n throw new Error(`[SECURITY] Invalid name: \"${name}\" is a reserved JavaScript keyword that could cause prototype pollution`);\n } else if (DANGEROUS_PROPERTY_NAMES.includes(name)) {\n return options.onDangerousProperty(name);\n }\n return name;\n}","export default function getIgnoreAttributesFn(ignoreAttributes) {\n if (typeof ignoreAttributes === 'function') {\n return ignoreAttributes\n }\n if (Array.isArray(ignoreAttributes)) {\n return (attrName) => {\n for (const pattern of ignoreAttributes) {\n if (typeof pattern === 'string' && attrName === pattern) {\n return true\n }\n if (pattern instanceof RegExp && pattern.test(attrName)) {\n return true\n }\n }\n }\n }\n return () => false\n}","'use strict';\n\nimport XmlNode from './xmlNode.js';\nimport { Matcher } from 'path-expression-matcher';\n\nconst METADATA_SYMBOL = XmlNode.getMetaDataSymbol();\n\n/**\n * Helper function to strip attribute prefix from attribute map\n * @param {object} attrs - Attributes with prefix (e.g., {\"@_class\": \"code\"})\n * @param {string} prefix - Attribute prefix to remove (e.g., \"@_\")\n * @returns {object} Attributes without prefix (e.g., {\"class\": \"code\"})\n */\nfunction stripAttributePrefix(attrs, prefix) {\n if (!attrs || typeof attrs !== 'object') return {};\n if (!prefix) return attrs;\n\n const rawAttrs = {};\n for (const key in attrs) {\n if (key.startsWith(prefix)) {\n const rawName = key.substring(prefix.length);\n rawAttrs[rawName] = attrs[key];\n } else {\n // Attribute without prefix (shouldn't normally happen, but be safe)\n rawAttrs[key] = attrs[key];\n }\n }\n return rawAttrs;\n}\n\n/**\n * \n * @param {array} node \n * @param {any} options \n * @param {Matcher} matcher - Path matcher instance\n * @returns \n */\nexport default function prettify(node, options, matcher, readonlyMatcher) {\n return compress(node, options, matcher, readonlyMatcher);\n}\n\n/**\n * @param {array} arr \n * @param {object} options \n * @param {Matcher} matcher - Path matcher instance\n * @returns object\n */\nfunction compress(arr, options, matcher, readonlyMatcher) {\n let text;\n const compressedObj = {}; //This is intended to be a plain object\n for (let i = 0; i < arr.length; i++) {\n const tagObj = arr[i];\n const property = propName(tagObj);\n\n // Push current property to matcher WITH RAW ATTRIBUTES (no prefix)\n if (property !== undefined && property !== options.textNodeName) {\n const rawAttrs = stripAttributePrefix(\n tagObj[\":@\"] || {},\n options.attributeNamePrefix\n );\n matcher.push(property, rawAttrs);\n }\n\n if (property === options.textNodeName) {\n if (text === undefined) text = tagObj[property];\n else text += \"\" + tagObj[property];\n } else if (property === undefined) {\n continue;\n } else if (tagObj[property]) {\n\n let val = compress(tagObj[property], options, matcher, readonlyMatcher);\n const isLeaf = isLeafTag(val, options);\n\n if (tagObj[\":@\"]) {\n assignAttributes(val, tagObj[\":@\"], readonlyMatcher, options);\n } else if (Object.keys(val).length === 1 && val[options.textNodeName] !== undefined && !options.alwaysCreateTextNode) {\n val = val[options.textNodeName];\n } else if (Object.keys(val).length === 0) {\n if (options.alwaysCreateTextNode) val[options.textNodeName] = \"\";\n else val = \"\";\n }\n\n if (tagObj[METADATA_SYMBOL] !== undefined && typeof val === \"object\" && val !== null) {\n val[METADATA_SYMBOL] = tagObj[METADATA_SYMBOL]; // copy over metadata\n }\n\n\n if (compressedObj[property] !== undefined && Object.prototype.hasOwnProperty.call(compressedObj, property)) {\n if (!Array.isArray(compressedObj[property])) {\n compressedObj[property] = [compressedObj[property]];\n }\n compressedObj[property].push(val);\n } else {\n //TODO: if a node is not an array, then check if it should be an array\n //also determine if it is a leaf node\n\n // Pass jPath string or readonlyMatcher based on options.jPath setting\n const jPathOrMatcher = options.jPath ? readonlyMatcher.toString() : readonlyMatcher;\n if (options.isArray(property, jPathOrMatcher, isLeaf)) {\n compressedObj[property] = [val];\n } else {\n compressedObj[property] = val;\n }\n }\n\n // Pop property from matcher after processing\n if (property !== undefined && property !== options.textNodeName) {\n matcher.pop();\n }\n }\n\n }\n // if(text && text.length > 0) compressedObj[options.textNodeName] = text;\n if (typeof text === \"string\") {\n if (text.length > 0) compressedObj[options.textNodeName] = text;\n } else if (text !== undefined) compressedObj[options.textNodeName] = text;\n\n\n return compressedObj;\n}\n\nfunction propName(obj) {\n const keys = Object.keys(obj);\n for (let i = 0; i < keys.length; i++) {\n const key = keys[i];\n if (key !== \":@\") return key;\n }\n}\n\nfunction assignAttributes(obj, attrMap, readonlyMatcher, options) {\n if (attrMap) {\n const keys = Object.keys(attrMap);\n const len = keys.length; //don't make it inline\n for (let i = 0; i < len; i++) {\n const atrrName = keys[i]; // This is the PREFIXED name (e.g., \"@_class\")\n\n // Strip prefix for matcher path (for isArray callback)\n const rawAttrName = atrrName.startsWith(options.attributeNamePrefix)\n ? atrrName.substring(options.attributeNamePrefix.length)\n : atrrName;\n\n // For attributes, we need to create a temporary path\n // Pass jPath string or matcher based on options.jPath setting\n const jPathOrMatcher = options.jPath\n ? readonlyMatcher.toString() + \".\" + rawAttrName\n : readonlyMatcher;\n\n if (options.isArray(atrrName, jPathOrMatcher, true, true)) {\n obj[atrrName] = [attrMap[atrrName]];\n } else {\n obj[atrrName] = attrMap[atrrName];\n }\n }\n }\n}\n\nfunction isLeafTag(obj, options) {\n const { textNodeName } = options;\n const propCount = Object.keys(obj).length;\n\n if (propCount === 0) {\n return true;\n }\n\n if (\n propCount === 1 &&\n (obj[textNodeName] || typeof obj[textNodeName] === \"boolean\" || obj[textNodeName] === 0)\n ) {\n return true;\n }\n\n return false;\n}","'use strict';\n\nimport { getAllMatches, isName } from './util.js';\n\nconst defaultOptions = {\n allowBooleanAttributes: false, //A tag can have attributes without any value\n unpairedTags: []\n};\n\n//const tagsPattern = new RegExp(\"<\\\\/?([\\\\w:\\\\-_\\.]+)\\\\s*\\/?>\",\"g\");\nexport function validate(xmlData, options) {\n options = Object.assign({}, defaultOptions, options);\n\n //xmlData = xmlData.replace(/(\\r\\n|\\n|\\r)/gm,\"\");//make it single line\n //xmlData = xmlData.replace(/(^\\s*<\\?xml.*?\\?>)/g,\"\");//Remove XML starting tag\n //xmlData = xmlData.replace(/()/g,\"\");//Remove DOCTYPE\n const tags = [];\n let tagFound = false;\n\n //indicates that the root tag has been closed (aka. depth 0 has been reached)\n let reachedRoot = false;\n\n if (xmlData[0] === '\\ufeff') {\n // check for byte order mark (BOM)\n xmlData = xmlData.substr(1);\n }\n\n for (let i = 0; i < xmlData.length; i++) {\n\n if (xmlData[i] === '<' && xmlData[i + 1] === '?') {\n i += 2;\n i = readPI(xmlData, i);\n if (i.err) return i;\n } else if (xmlData[i] === '<') {\n //starting of tag\n //read until you reach to '>' avoiding any '>' in attribute value\n let tagStartPos = i;\n i++;\n\n if (xmlData[i] === '!') {\n i = readCommentAndCDATA(xmlData, i);\n continue;\n } else {\n let closingTag = false;\n if (xmlData[i] === '/') {\n //closing tag\n closingTag = true;\n i++;\n }\n //read tagname\n let tagName = '';\n for (; i < xmlData.length &&\n xmlData[i] !== '>' &&\n xmlData[i] !== ' ' &&\n xmlData[i] !== '\\t' &&\n xmlData[i] !== '\\n' &&\n xmlData[i] !== '\\r'; i++\n ) {\n tagName += xmlData[i];\n }\n tagName = tagName.trim();\n //console.log(tagName);\n\n if (tagName[tagName.length - 1] === '/') {\n //self closing tag without attributes\n tagName = tagName.substring(0, tagName.length - 1);\n //continue;\n i--;\n }\n if (!validateTagName(tagName)) {\n let msg;\n if (tagName.trim().length === 0) {\n msg = \"Invalid space after '<'.\";\n } else {\n msg = \"Tag '\" + tagName + \"' is an invalid name.\";\n }\n return getErrorObject('InvalidTag', msg, getLineNumberForPosition(xmlData, i));\n }\n\n const result = readAttributeStr(xmlData, i);\n if (result === false) {\n return getErrorObject('InvalidAttr', \"Attributes for '\" + tagName + \"' have open quote.\", getLineNumberForPosition(xmlData, i));\n }\n let attrStr = result.value;\n i = result.index;\n\n if (attrStr[attrStr.length - 1] === '/') {\n //self closing tag\n const attrStrStart = i - attrStr.length;\n attrStr = attrStr.substring(0, attrStr.length - 1);\n const isValid = validateAttributeString(attrStr, options);\n if (isValid === true) {\n tagFound = true;\n //continue; //text may presents after self closing tag\n } else {\n //the result from the nested function returns the position of the error within the attribute\n //in order to get the 'true' error line, we need to calculate the position where the attribute begins (i - attrStr.length) and then add the position within the attribute\n //this gives us the absolute index in the entire xml, which we can use to find the line at last\n return getErrorObject(isValid.err.code, isValid.err.msg, getLineNumberForPosition(xmlData, attrStrStart + isValid.err.line));\n }\n } else if (closingTag) {\n if (!result.tagClosed) {\n return getErrorObject('InvalidTag', \"Closing tag '\" + tagName + \"' doesn't have proper closing.\", getLineNumberForPosition(xmlData, i));\n } else if (attrStr.trim().length > 0) {\n return getErrorObject('InvalidTag', \"Closing tag '\" + tagName + \"' can't have attributes or invalid starting.\", getLineNumberForPosition(xmlData, tagStartPos));\n } else if (tags.length === 0) {\n return getErrorObject('InvalidTag', \"Closing tag '\" + tagName + \"' has not been opened.\", getLineNumberForPosition(xmlData, tagStartPos));\n } else {\n const otg = tags.pop();\n if (tagName !== otg.tagName) {\n let openPos = getLineNumberForPosition(xmlData, otg.tagStartPos);\n return getErrorObject('InvalidTag',\n \"Expected closing tag '\" + otg.tagName + \"' (opened in line \" + openPos.line + \", col \" + openPos.col + \") instead of closing tag '\" + tagName + \"'.\",\n getLineNumberForPosition(xmlData, tagStartPos));\n }\n\n //when there are no more tags, we reached the root level.\n if (tags.length == 0) {\n reachedRoot = true;\n }\n }\n } else {\n const isValid = validateAttributeString(attrStr, options);\n if (isValid !== true) {\n //the result from the nested function returns the position of the error within the attribute\n //in order to get the 'true' error line, we need to calculate the position where the attribute begins (i - attrStr.length) and then add the position within the attribute\n //this gives us the absolute index in the entire xml, which we can use to find the line at last\n return getErrorObject(isValid.err.code, isValid.err.msg, getLineNumberForPosition(xmlData, i - attrStr.length + isValid.err.line));\n }\n\n //if the root level has been reached before ...\n if (reachedRoot === true) {\n return getErrorObject('InvalidXml', 'Multiple possible root nodes found.', getLineNumberForPosition(xmlData, i));\n } else if (options.unpairedTags.indexOf(tagName) !== -1) {\n //don't push into stack\n } else {\n tags.push({ tagName, tagStartPos });\n }\n tagFound = true;\n }\n\n //skip tag text value\n //It may include comments and CDATA value\n for (i++; i < xmlData.length; i++) {\n if (xmlData[i] === '<') {\n if (xmlData[i + 1] === '!') {\n //comment or CADATA\n i++;\n i = readCommentAndCDATA(xmlData, i);\n continue;\n } else if (xmlData[i + 1] === '?') {\n i = readPI(xmlData, ++i);\n if (i.err) return i;\n } else {\n break;\n }\n } else if (xmlData[i] === '&') {\n const afterAmp = validateAmpersand(xmlData, i);\n if (afterAmp == -1)\n return getErrorObject('InvalidChar', \"char '&' is not expected.\", getLineNumberForPosition(xmlData, i));\n i = afterAmp;\n } else {\n if (reachedRoot === true && !isWhiteSpace(xmlData[i])) {\n return getErrorObject('InvalidXml', \"Extra text at the end\", getLineNumberForPosition(xmlData, i));\n }\n }\n } //end of reading tag text value\n if (xmlData[i] === '<') {\n i--;\n }\n }\n } else {\n if (isWhiteSpace(xmlData[i])) {\n continue;\n }\n return getErrorObject('InvalidChar', \"char '\" + xmlData[i] + \"' is not expected.\", getLineNumberForPosition(xmlData, i));\n }\n }\n\n if (!tagFound) {\n return getErrorObject('InvalidXml', 'Start tag expected.', 1);\n } else if (tags.length == 1) {\n return getErrorObject('InvalidTag', \"Unclosed tag '\" + tags[0].tagName + \"'.\", getLineNumberForPosition(xmlData, tags[0].tagStartPos));\n } else if (tags.length > 0) {\n return getErrorObject('InvalidXml', \"Invalid '\" +\n JSON.stringify(tags.map(t => t.tagName), null, 4).replace(/\\r?\\n/g, '') +\n \"' found.\", { line: 1, col: 1 });\n }\n\n return true;\n};\n\nfunction isWhiteSpace(char) {\n return char === ' ' || char === '\\t' || char === '\\n' || char === '\\r';\n}\n/**\n * Read Processing insstructions and skip\n * @param {*} xmlData\n * @param {*} i\n */\nfunction readPI(xmlData, i) {\n const start = i;\n for (; i < xmlData.length; i++) {\n if (xmlData[i] == '?' || xmlData[i] == ' ') {\n //tagname\n const tagname = xmlData.substr(start, i - start);\n if (i > 5 && tagname === 'xml') {\n return getErrorObject('InvalidXml', 'XML declaration allowed only at the start of the document.', getLineNumberForPosition(xmlData, i));\n } else if (xmlData[i] == '?' && xmlData[i + 1] == '>') {\n //check if valid attribut string\n i++;\n break;\n } else {\n continue;\n }\n }\n }\n return i;\n}\n\nfunction readCommentAndCDATA(xmlData, i) {\n if (xmlData.length > i + 5 && xmlData[i + 1] === '-' && xmlData[i + 2] === '-') {\n //comment\n for (i += 3; i < xmlData.length; i++) {\n if (xmlData[i] === '-' && xmlData[i + 1] === '-' && xmlData[i + 2] === '>') {\n i += 2;\n break;\n }\n }\n } else if (\n xmlData.length > i + 8 &&\n xmlData[i + 1] === 'D' &&\n xmlData[i + 2] === 'O' &&\n xmlData[i + 3] === 'C' &&\n xmlData[i + 4] === 'T' &&\n xmlData[i + 5] === 'Y' &&\n xmlData[i + 6] === 'P' &&\n xmlData[i + 7] === 'E'\n ) {\n let angleBracketsCount = 1;\n for (i += 8; i < xmlData.length; i++) {\n if (xmlData[i] === '<') {\n angleBracketsCount++;\n } else if (xmlData[i] === '>') {\n angleBracketsCount--;\n if (angleBracketsCount === 0) {\n break;\n }\n }\n }\n } else if (\n xmlData.length > i + 9 &&\n xmlData[i + 1] === '[' &&\n xmlData[i + 2] === 'C' &&\n xmlData[i + 3] === 'D' &&\n xmlData[i + 4] === 'A' &&\n xmlData[i + 5] === 'T' &&\n xmlData[i + 6] === 'A' &&\n xmlData[i + 7] === '['\n ) {\n for (i += 8; i < xmlData.length; i++) {\n if (xmlData[i] === ']' && xmlData[i + 1] === ']' && xmlData[i + 2] === '>') {\n i += 2;\n break;\n }\n }\n }\n\n return i;\n}\n\nconst doubleQuote = '\"';\nconst singleQuote = \"'\";\n\n/**\n * Keep reading xmlData until '<' is found outside the attribute value.\n * @param {string} xmlData\n * @param {number} i\n */\nfunction readAttributeStr(xmlData, i) {\n let attrStr = '';\n let startChar = '';\n let tagClosed = false;\n for (; i < xmlData.length; i++) {\n if (xmlData[i] === doubleQuote || xmlData[i] === singleQuote) {\n if (startChar === '') {\n startChar = xmlData[i];\n } else if (startChar !== xmlData[i]) {\n //if vaue is enclosed with double quote then single quotes are allowed inside the value and vice versa\n } else {\n startChar = '';\n }\n } else if (xmlData[i] === '>') {\n if (startChar === '') {\n tagClosed = true;\n break;\n }\n }\n attrStr += xmlData[i];\n }\n if (startChar !== '') {\n return false;\n }\n\n return {\n value: attrStr,\n index: i,\n tagClosed: tagClosed\n };\n}\n\n/**\n * Select all the attributes whether valid or invalid.\n */\nconst validAttrStrRegxp = new RegExp('(\\\\s*)([^\\\\s=]+)(\\\\s*=)?(\\\\s*([\\'\"])(([\\\\s\\\\S])*?)\\\\5)?', 'g');\n\n//attr, =\"sd\", a=\"amit's\", a=\"sd\"b=\"saf\", ab cd=\"\"\n\nfunction validateAttributeString(attrStr, options) {\n //console.log(\"start:\"+attrStr+\":end\");\n\n //if(attrStr.trim().length === 0) return true; //empty string\n\n const matches = getAllMatches(attrStr, validAttrStrRegxp);\n const attrNames = {};\n\n for (let i = 0; i < matches.length; i++) {\n if (matches[i][1].length === 0) {\n //nospace before attribute name: a=\"sd\"b=\"saf\"\n return getErrorObject('InvalidAttr', \"Attribute '\" + matches[i][2] + \"' has no space in starting.\", getPositionFromMatch(matches[i]))\n } else if (matches[i][3] !== undefined && matches[i][4] === undefined) {\n return getErrorObject('InvalidAttr', \"Attribute '\" + matches[i][2] + \"' is without value.\", getPositionFromMatch(matches[i]));\n } else if (matches[i][3] === undefined && !options.allowBooleanAttributes) {\n //independent attribute: ab\n return getErrorObject('InvalidAttr', \"boolean attribute '\" + matches[i][2] + \"' is not allowed.\", getPositionFromMatch(matches[i]));\n }\n /* else if(matches[i][6] === undefined){//attribute without value: ab=\n return { err: { code:\"InvalidAttr\",msg:\"attribute \" + matches[i][2] + \" has no value assigned.\"}};\n } */\n const attrName = matches[i][2];\n if (!validateAttrName(attrName)) {\n return getErrorObject('InvalidAttr', \"Attribute '\" + attrName + \"' is an invalid name.\", getPositionFromMatch(matches[i]));\n }\n if (!Object.prototype.hasOwnProperty.call(attrNames, attrName)) {\n //check for duplicate attribute.\n attrNames[attrName] = 1;\n } else {\n return getErrorObject('InvalidAttr', \"Attribute '\" + attrName + \"' is repeated.\", getPositionFromMatch(matches[i]));\n }\n }\n\n return true;\n}\n\nfunction validateNumberAmpersand(xmlData, i) {\n let re = /\\d/;\n if (xmlData[i] === 'x') {\n i++;\n re = /[\\da-fA-F]/;\n }\n for (; i < xmlData.length; i++) {\n if (xmlData[i] === ';')\n return i;\n if (!xmlData[i].match(re))\n break;\n }\n return -1;\n}\n\nfunction validateAmpersand(xmlData, i) {\n // https://www.w3.org/TR/xml/#dt-charref\n i++;\n if (xmlData[i] === ';')\n return -1;\n if (xmlData[i] === '#') {\n i++;\n return validateNumberAmpersand(xmlData, i);\n }\n let count = 0;\n for (; i < xmlData.length; i++, count++) {\n if (xmlData[i].match(/\\w/) && count < 20)\n continue;\n if (xmlData[i] === ';')\n break;\n return -1;\n }\n return i;\n}\n\nfunction getErrorObject(code, message, lineNumber) {\n return {\n err: {\n code: code,\n msg: message,\n line: lineNumber.line || lineNumber,\n col: lineNumber.col,\n },\n };\n}\n\nfunction validateAttrName(attrName) {\n return isName(attrName);\n}\n\n// const startsWithXML = /^xml/i;\n\nfunction validateTagName(tagname) {\n return isName(tagname) /* && !tagname.match(startsWithXML) */;\n}\n\n//this function returns the line number for the character at the given index\nfunction getLineNumberForPosition(xmlData, index) {\n const lines = xmlData.substring(0, index).split(/\\r?\\n/);\n return {\n line: lines.length,\n\n // column number is last line's length + 1, because column numbering starts at 1:\n col: lines[lines.length - 1].length + 1\n };\n}\n\n//this function returns the position of the first character of match within attrStr\nfunction getPositionFromMatch(match) {\n return match.startIndex + match[1].length;\n}\n","import { buildOptions } from './OptionsBuilder.js';\nimport OrderedObjParser from './OrderedObjParser.js';\nimport prettify from './node2json.js';\nimport { validate } from \"../validator.js\";\nimport XmlNode from './xmlNode.js';\n\nexport default class XMLParser {\n\n constructor(options) {\n this.externalEntities = {};\n this.options = buildOptions(options);\n\n }\n /**\n * Parse XML dats to JS object \n * @param {string|Uint8Array} xmlData \n * @param {boolean|Object} validationOption \n */\n parse(xmlData, validationOption) {\n if (typeof xmlData !== \"string\" && xmlData.toString) {\n xmlData = xmlData.toString();\n } else if (typeof xmlData !== \"string\") {\n throw new Error(\"XML data is accepted in String or Bytes[] form.\")\n }\n\n if (validationOption) {\n if (validationOption === true) validationOption = {}; //validate with default options\n\n const result = validate(xmlData, validationOption);\n if (result !== true) {\n throw Error(`${result.err.msg}:${result.err.line}:${result.err.col}`)\n }\n }\n const orderedObjParser = new OrderedObjParser(this.options);\n orderedObjParser.entityDecoder.setExternalEntities(this.externalEntities);\n const orderedResult = orderedObjParser.parseXml(xmlData);\n if (this.options.preserveOrder || orderedResult === undefined) return orderedResult;\n else return prettify(orderedResult, this.options, orderedObjParser.matcher, orderedObjParser.readonlyMatcher);\n }\n\n /**\n * Add Entity which is not by default supported by this library\n * @param {string} key \n * @param {string} value \n */\n addEntity(key, value) {\n if (value.indexOf(\"&\") !== -1) {\n throw new Error(\"Entity value can't have '&'\")\n } else if (key.indexOf(\"&\") !== -1 || key.indexOf(\";\") !== -1) {\n throw new Error(\"An entity must be set without '&' and ';'. Eg. use '#xD' for ' '\")\n } else if (value === \"&\") {\n throw new Error(\"An entity with value '&' is not permitted\");\n } else {\n this.externalEntities[key] = value;\n }\n }\n\n /**\n * Returns a Symbol that can be used to access the metadata\n * property on a node.\n * \n * If Symbol is not available in the environment, an ordinary property is used\n * and the name of the property is here returned.\n * \n * The XMLMetaData property is only present when `captureMetaData`\n * is true in the options.\n */\n static getMetaDataSymbol() {\n return XmlNode.getMetaDataSymbol();\n }\n}"],"names":["root","factory","exports","module","define","amd","this","__webpack_require__","definition","key","o","Object","defineProperty","enumerable","get","obj","prop","prototype","hasOwnProperty","call","Symbol","toStringTag","value","nameStartChar","regexName","RegExp","getAllMatches","string","regex","matches","match","exec","allmatches","startIndex","lastIndex","length","len","index","push","isName","DANGEROUS_PROPERTY_NAMES","criticalProperties","defaultOnDangerousProperty","name","includes","defaultOptions","preserveOrder","attributeNamePrefix","attributesGroupName","textNodeName","ignoreAttributes","removeNSPrefix","allowBooleanAttributes","parseTagValue","parseAttributeValue","trimValues","cdataPropName","numberParseOptions","hex","leadingZeros","eNotation","tagValueProcessor","tagName","val","attributeValueProcessor","attrName","stopNodes","alwaysCreateTextNode","isArray","commentPropName","unpairedTags","processEntities","htmlEntities","entityDecoder","ignoreDeclaration","ignorePiTags","transformTagName","transformAttributeName","updateTag","jPath","attrs","captureMetaData","maxNestedTags","strictReservedNames","onDangerousProperty","validatePropertyName","propertyName","optionName","normalized","toLowerCase","some","dangerous","Error","normalizeProcessEntities","enabled","maxEntitySize","maxExpansionDepth","maxTotalExpansions","Infinity","maxExpandedLength","maxEntityCount","allowedTags","tagFilter","appliesTo","Math","max","_value$maxEntitySize","_value$maxExpansionDe","_value$maxTotalExpans","_value$maxExpandedLen","_value$maxEntityCount","_value$allowedTags","_value$tagFilter","_value$appliesTo","METADATA_SYMBOL","buildOptions","options","built","assign","_i","_propertyNameOptions","_propertyNameOptions$","unpairedTagsSet","Set","Array","map","node","startsWith","substring","XmlNode","tagname","child","create","_proto","add","_this$child$push","addChild","_this$child$push2","_this$child$push3","keys","undefined","getMetaDataSymbol","DocTypeReader","suppressValidationErr","readDocType","xmlData","i","entities","entityCount","angleBracketsCount","hasBody","comment","hasSeq","entityName","_this$readEntityExp","readEntityExp","indexOf","readElementExp","readNotationExp","skipWhitespace","test","validateEntityName","toUpperCase","entityValue","_this$readIdentifierV","readIdentifierVal","notationName","identifierType","publicIdentifier","systemIdentifier","_this$readIdentifierV2","_this$readIdentifierV3","_this$readIdentifierV4","type","identifierVal","startChar","elementName","contentModel","trim","readAttlistExp","attributeName","attributeType","allowedNotations","notation","join","defaultValue","_this$readIdentifierV5","data","seq","j","hexRegex","numRegex","consider","decimalPoint","infinity","eNotationRegx","MatcherView","constructor","matcher","_matcher","separator","getCurrentTag","path","tag","getCurrentNamespace","namespace","getAttrValue","values","hasAttr","current","getPosition","position","getCounter","counter","getIndex","getDepth","toString","includeNamespace","toArray","n","expression","matchesAny","exprSet","Matcher","siblingStacks","_pathStringCache","_view","attrValues","currentLevel","Map","siblings","siblingKey","count","set","pop","updateCurrent","sep","result","reset","segments","hasDeepWildcard","_matchWithDeepWildcard","_matchSimple","_matchSegment","pathIdx","segIdx","segment","nextSeg","found","isCurrentNode","attrValue","String","positionValue","snapshot","restore","readOnly","Expression","pattern","_parse","_hasDeepWildcard","seg","_hasAttributeCondition","_hasPositionSelector","currentPart","_parseSegment","part","bracketContent","withoutBrackets","bracketMatch","content","slice","tagAndPosition","nsIndex","positionMatch","colonIndex","lastIndexOf","tagPart","posPart","eqIndex","nthMatch","parseInt","hasAttributeCondition","hasPositionSelector","ExpressionSet","_byDepthAndTag","_wildcardByDepth","_deepWildcards","_patterns","_sealed","TypeError","has","depth","lastSeg","addAll","expressions","expr","size","seal","isSealed","findMatch","exactKey","exactBucket","wildcardBucket","CURRENCY","cent","pound","curren","yen","euro","dollar","fnof","inr","af","birr","peso","rub","won","yuan","cedil","XML","amp","apos","gt","lt","quot","COMMON_HTML","nbsp","copy","reg","trade","mdash","ndash","hellip","laquo","raquo","lsquo","rsquo","ldquo","rdquo","bull","para","sect","deg","frac12","frac14","frac34","SPECIAL_CHARS","ch","mergeEntityMaps","maps","out","raw","LIMIT_TIER_EXTERNAL","LIMIT_TIER_BASE","LIMIT_TIER_ALL","NCR_LEVEL","freeze","allow","leave","remove","throw","XML10_ALLOWED_C0","EntityDecoder","_limit","limit","_maxTotalExpansions","_maxExpandedLength","_postCheck","postCheck","r","_limitTiers","applyLimitsTo","_numericAllowed","numericAllowed","_baseMap","DEFAULT_XML_ENTITIES","namedEntities","_externalMap","_inputMap","_totalExpansions","_expandedLength","_removeSet","_leaveSet","ncrCfg","ncr","xmlVersion","onLevel","nullLevel","onNCR","nullNCR","parseNCRConfig","_ncrXmlVersion","_ncrOnLevel","_ncrNullLevel","setExternalEntities","addExternalEntity","addInputEntities","setXmlVersion","version","decode","str","original","chunks","last","limitExpansions","limitLength","checkLimits","charCodeAt","token","replacement","tier","ncrResult","_resolveNCR","resolved","_resolveName","_tierCounts","delta","_classifyNCR","cp","_applyNCRAction","action","fromCodePoint","padStart","second","Number","isNaN","minimum","effective","_extends","bind","e","arguments","t","apply","extractRawAttributes","prefixedAttrs","rawAttrs","extractNamespace","rawTagName","ns","OrderedObjParser","currentNode","tagsNodeStack","parseXml","parseTextData","resolveNameSpace","buildAttributesMap","isItStopNode","replaceEntitiesValue","readStopNodeData","saveTextToParentTag","ignoreAttributesFn","_step","_iterator","_createForOfIteratorHelperLoose","done","entityExpansionCount","currentExpandedLength","readonlyMatcher","isCurrentNodeStopNode","stopNodeExpressionsSet","stopNodesOpts","stopNodeExp","dontTrim","hasAttributes","isLeafNode","escapeEntities","jPathOrMatcher","newval","parseValue","tags","split","prefix","charAt","attrsRegx","attrStr","processedVals","hasRawAttrs","rawAttrsForMatcher","oldVal","jPathStr","hasAttrs","aName","sanitizeName","newVal","attrCollection","replace","xmlObj","xmlNode","textData","docTypeReader","xmlLen","c1","closeIndex","findClosingIndex","substr","lastTagName","tagData","readTagExp","attsMap","tagExp","childNode","attrExpPresent","endIndex","_ref","_ref2","context","min","_transformTagName","lastTag","isSelfClosing","tagContent","_transformTagName2","entityConfig","parentNode","errMsg","closingIndex","findClosingChar","char","closingChar","attrBoundary","hasTabInQuote","closeCode0","closeCode1","code","boundary","k","tagExpWithClosingIndex","separatorIndex","search","trimStart","openTagCount","xmllen","shouldParse","trimmedStr","skipLike","numStr","window","parse_int","isFinite","sign","eChar","eAdjacentToLeadingZeros","resolveEnotation","numTrimmedByZeros","decimalAdjacentToLeadingZeros","num","parsedStr","isPositive","handleInfinity","toNumber","fn","newTagName","stripAttributePrefix","prettify","compress","arr","text","compressedObj","tagObj","property","propName","isLeaf","isLeafTag","assignAttributes","attrMap","atrrName","rawAttrName","propCount","isWhiteSpace","readPI","start","getErrorObject","getLineNumberForPosition","readCommentAndCDATA","readAttributeStr","tagClosed","validAttrStrRegxp","validateAttributeString","attrNames","getPositionFromMatch","validateAttrName","validateAmpersand","re","validateNumberAmpersand","message","lineNumber","err","msg","line","col","validateTagName","lines","XMLParser","externalEntities","parse","validationOption","tagFound","reachedRoot","tagStartPos","closingTag","attrStrStart","isValid","otg","openPos","afterAmp","JSON","stringify","validate","orderedObjParser","orderedResult","addEntity"],"sourceRoot":""} \ No newline at end of file diff --git a/spec/large_spec.js b/spec/large_spec.js index b439403e..4456004b 100644 --- a/spec/large_spec.js +++ b/spec/large_spec.js @@ -20,4 +20,31 @@ describe("XMLParser", function() { const result = XMLValidator.validate(svgData); expect(result).toBe(true); }); + + // Regression for https://github.com/NaturalIntelligence/fast-xml-parser/issues/817 + // 5.5.11's tagExpWithClosingIndex accumulated char codes into an array and + // returned via String.fromCharCode(...chars). For a tag expression large + // enough, the spread exceeds V8's argument-count limit and surfaces as + // "RangeError: Maximum call stack size exceeded". + it("should parse a tag with a very long attribute value without stack overflow", function() { + const longValue = "x".repeat(200000); + const xmlData = ``; + + const parser = new XMLParser({ ignoreAttributes: false }); + let result; + expect(() => { result = parser.parse(xmlData); }).not.toThrow(); + expect(result.root.item["@_attr"]).toBe(longValue); + }); + + // Tabs inside quoted attribute values must be preserved verbatim. + // Only tabs outside quoted attributes (between attributes) are + // normalised to spaces. The spacing between attributes is + // implementation detail and is not asserted here. + it("should preserve tab characters inside quoted attribute values", function() { + const xmlData = ''; + + const parser = new XMLParser({ ignoreAttributes: false }); + const result = parser.parse(xmlData); + expect(result.root.item["@_a"]).toBe("x\ty"); + }); }); diff --git a/src/xmlparser/OrderedObjParser.js b/src/xmlparser/OrderedObjParser.js index d76383eb..d350ce2d 100644 --- a/src/xmlparser/OrderedObjParser.js +++ b/src/xmlparser/OrderedObjParser.js @@ -654,33 +654,66 @@ function isItStopNode() { */ function tagExpWithClosingIndex(xmlData, i, closingChar = ">") { let attrBoundary = 0; - const chars = []; + let hasTabInQuote = false; const len = xmlData.length; const closeCode0 = closingChar.charCodeAt(0); const closeCode1 = closingChar.length > 1 ? closingChar.charCodeAt(1) : -1; + let closeIndex = -1; + // First pass: locate the closing delimiter, tracking quote boundaries so + // they don't mask the close. Note any \t seen inside a quoted attribute + // value — those must be preserved, so we can't bulk-replace tabs. for (let index = i; index < len; index++) { const code = xmlData.charCodeAt(index); if (attrBoundary) { if (code === attrBoundary) attrBoundary = 0; + else if (code === 9) hasTabInQuote = true; } else if (code === 34 || code === 39) { // " or ' attrBoundary = code; } else if (code === closeCode0) { if (closeCode1 !== -1) { if (xmlData.charCodeAt(index + 1) === closeCode1) { - return { data: String.fromCharCode(...chars), index }; + closeIndex = index; + break; } } else { - return { data: String.fromCharCode(...chars), index }; + closeIndex = index; + break; } - } else if (code === 9) { // \t - chars.push(32); // space - continue; } + } + + if (closeIndex === -1) return; - chars.push(code); + const raw = xmlData.substring(i, closeIndex); + + // Fast path: any tabs are guaranteed to be outside quoted attr values, + // so bulk-replace them with spaces. + if (!hasTabInQuote) { + return { data: raw.replace(/\t/g, " "), index: closeIndex }; + } + + // Rare path: the tag expression has at least one tab inside a quoted + // attribute value. Walk it and replace only the tabs that fall outside + // quote boundaries. + let tagExp = ""; + let boundary = 0; + for (let k = 0; k < raw.length; k++) { + const code = raw.charCodeAt(k); + if (boundary) { + if (code === boundary) boundary = 0; + tagExp += raw[k]; + } else if (code === 34 || code === 39) { + boundary = code; + tagExp += raw[k]; + } else if (code === 9) { + tagExp += " "; + } else { + tagExp += raw[k]; + } } + return { data: tagExp, index: closeIndex }; } function findClosingIndex(xmlData, str, i, errMsg) {