{"version":3,"file":"pzfx-parser.min.js","sources":["../node_modules/fast-xml-parser/src/util.js","../node_modules/fast-xml-parser/src/node2json.js","../node_modules/fast-xml-parser/src/xmlNode.js","../node_modules/fast-xml-parser/src/xmlstr2xmlnode.js","../node_modules/fast-xml-parser/src/validator.js","../node_modules/fast-xml-parser/src/nimndata.js","../node_modules/fast-xml-parser/src/node2json_str.js","../node_modules/fast-xml-parser/src/json2xml.js","../node_modules/fast-xml-parser/src/parser.js","../src/index.js"],"sourcesContent":["'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';\nconst nameRegexp = '[' + nameStartChar + '][' + nameChar + ']*'\nconst regexName = new RegExp('^' + nameRegexp + '$');\n\nconst getAllMatches = function(string, regex) {\n  const matches = [];\n  let match = regex.exec(string);\n  while (match) {\n    const allmatches = [];\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\nconst isName = function(string) {\n  const match = regexName.exec(string);\n  return !(match === null || typeof match === 'undefined');\n};\n\nexports.isExist = function(v) {\n  return typeof v !== 'undefined';\n};\n\nexports.isEmptyObject = function(obj) {\n  return Object.keys(obj).length === 0;\n};\n\n/**\n * Copy all the properties of a into b.\n * @param {*} target\n * @param {*} a\n */\nexports.merge = function(target, a, arrayMode) {\n  if (a) {\n    const keys = Object.keys(a); // will return an array of own properties\n    const len = keys.length; //don't make it inline\n    for (let i = 0; i < len; i++) {\n      if(arrayMode === 'strict'){\n        target[keys[i]] = [ a[keys[i]] ];\n      }else{\n        target[keys[i]] = a[keys[i]];\n      }\n    }\n  }\n};\n/* exports.merge =function (b,a){\n  return Object.assign(b,a);\n} */\n\nexports.getValue = function(v) {\n  if (exports.isExist(v)) {\n    return v;\n  } else {\n    return '';\n  }\n};\n\n// const fakeCall = function(a) {return a;};\n// const fakeCallNoReturn = function() {};\n\nexports.buildOptions = function(options, defaultOptions, props) {\n  var newOptions = {};\n  if (!options) {\n    return defaultOptions; //if there are not options\n  }\n\n  for (let i = 0; i < props.length; i++) {\n    if (options[props[i]] !== undefined) {\n      newOptions[props[i]] = options[props[i]];\n    } else {\n      newOptions[props[i]] = defaultOptions[props[i]];\n    }\n  }\n  return newOptions;\n};\n\nexports.isName = isName;\nexports.getAllMatches = getAllMatches;\nexports.nameRegexp = nameRegexp;\n","'use strict';\n\nconst util = require('./util');\n\nconst convertToJson = function(node, options) {\n  const jObj = {};\n\n  //when no child node or attr is present\n  if ((!node.child || util.isEmptyObject(node.child)) && (!node.attrsMap || util.isEmptyObject(node.attrsMap))) {\n    return util.isExist(node.val) ? node.val : '';\n  } else {\n    //otherwise create a textnode if node has some text\n    if (util.isExist(node.val)) {\n      if (!(typeof node.val === 'string' && (node.val === '' || node.val === options.cdataPositionChar))) {\n        if(options.arrayMode === \"strict\"){\n          jObj[options.textNodeName] = [ node.val ];\n        }else{\n          jObj[options.textNodeName] = node.val;\n        }\n      }\n    }\n  }\n\n  util.merge(jObj, node.attrsMap, options.arrayMode);\n\n  const keys = Object.keys(node.child);\n  for (let index = 0; index < keys.length; index++) {\n    var tagname = keys[index];\n    if (node.child[tagname] && node.child[tagname].length > 1) {\n      jObj[tagname] = [];\n      for (var tag in node.child[tagname]) {\n        jObj[tagname].push(convertToJson(node.child[tagname][tag], options));\n      }\n    } else {\n      if(options.arrayMode === true){\n        const result = convertToJson(node.child[tagname][0], options)\n        if(typeof result === 'object')\n          jObj[tagname] = [ result ];\n        else\n          jObj[tagname] = result;\n      }else if(options.arrayMode === \"strict\"){\n        jObj[tagname] = [convertToJson(node.child[tagname][0], options) ];\n      }else{\n        jObj[tagname] = convertToJson(node.child[tagname][0], options);\n      }\n    }\n  }\n\n  //add value\n  return jObj;\n};\n\nexports.convertToJson = convertToJson;\n","'use strict';\n\nmodule.exports = function(tagname, parent, val) {\n  this.tagname = tagname;\n  this.parent = parent;\n  this.child = {}; //child tags\n  this.attrsMap = {}; //attributes map\n  this.val = val; //text only\n  this.addChild = function(child) {\n    if (Array.isArray(this.child[child.tagname])) {\n      //already presents\n      this.child[child.tagname].push(child);\n    } else {\n      this.child[child.tagname] = [child];\n    }\n  };\n};\n","'use strict';\n\nconst util = require('./util');\nconst buildOptions = require('./util').buildOptions;\nconst xmlNode = require('./xmlNode');\nconst 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//polyfill\nif (!Number.parseInt && window.parseInt) {\n  Number.parseInt = window.parseInt;\n}\nif (!Number.parseFloat && window.parseFloat) {\n  Number.parseFloat = window.parseFloat;\n}\n\nconst defaultOptions = {\n  attributeNamePrefix: '@_',\n  attrNodeName: false,\n  textNodeName: '#text',\n  ignoreAttributes: true,\n  ignoreNameSpace: false,\n  allowBooleanAttributes: false, //a tag can have attributes without any value\n  //ignoreRootElement : false,\n  parseNodeValue: true,\n  parseAttributeValue: false,\n  arrayMode: false,\n  trimValues: true, //Trim string values of tag and attributes\n  cdataTagName: false,\n  cdataPositionChar: '\\\\c',\n  tagValueProcessor: function(a, tagName) {\n    return a;\n  },\n  attrValueProcessor: function(a, attrName) {\n    return a;\n  },\n  stopNodes: []\n  //decodeStrict: false,\n};\n\nexports.defaultOptions = defaultOptions;\n\nconst props = [\n  'attributeNamePrefix',\n  'attrNodeName',\n  'textNodeName',\n  'ignoreAttributes',\n  'ignoreNameSpace',\n  'allowBooleanAttributes',\n  'parseNodeValue',\n  'parseAttributeValue',\n  'arrayMode',\n  'trimValues',\n  'cdataTagName',\n  'cdataPositionChar',\n  'tagValueProcessor',\n  'attrValueProcessor',\n  'parseTrueNumberOnly',\n  'stopNodes'\n];\nexports.props = props;\n\n/**\n * Trim -> valueProcessor -> parse value\n * @param {string} tagName\n * @param {string} val\n * @param {object} options\n */\nfunction processTagValue(tagName, val, options) {\n  if (val) {\n    if (options.trimValues) {\n      val = val.trim();\n    }\n    val = options.tagValueProcessor(val, tagName);\n    val = parseValue(val, options.parseNodeValue, options.parseTrueNumberOnly);\n  }\n\n  return val;\n}\n\nfunction resolveNameSpace(tagname, options) {\n  if (options.ignoreNameSpace) {\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\nfunction parseValue(val, shouldParse, parseTrueNumberOnly) {\n  if (shouldParse && typeof val === 'string') {\n    let parsed;\n    if (val.trim() === '' || isNaN(val)) {\n      parsed = val === 'true' ? true : val === 'false' ? false : val;\n    } else {\n      if (val.indexOf('0x') !== -1) {\n        //support hexa decimal\n        parsed = Number.parseInt(val, 16);\n      } else if (val.indexOf('.') !== -1) {\n        parsed = Number.parseFloat(val);\n        val = val.replace(/\\.?0+$/, \"\");\n      } else {\n        parsed = Number.parseInt(val, 10);\n      }\n      if (parseTrueNumberOnly) {\n        parsed = String(parsed) === val ? parsed : val;\n      }\n    }\n    return parsed;\n  } else {\n    if (util.isExist(val)) {\n      return val;\n    } else {\n      return '';\n    }\n  }\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*([\\'\"])(.*?)\\\\3)?', 'g');\n\nfunction buildAttributesMap(attrStr, options) {\n  if (!options.ignoreAttributes && typeof attrStr === 'string') {\n    attrStr = attrStr.replace(/\\r?\\n/g, ' ');\n    //attrStr = attrStr || attrStr.trim();\n\n    const matches = util.getAllMatches(attrStr, attrsRegx);\n    const len = matches.length; //don't make it inline\n    const attrs = {};\n    for (let i = 0; i < len; i++) {\n      const attrName = resolveNameSpace(matches[i][1], options);\n      if (attrName.length) {\n        if (matches[i][4] !== undefined) {\n          if (options.trimValues) {\n            matches[i][4] = matches[i][4].trim();\n          }\n          matches[i][4] = options.attrValueProcessor(matches[i][4], attrName);\n          attrs[options.attributeNamePrefix + attrName] = parseValue(\n            matches[i][4],\n            options.parseAttributeValue,\n            options.parseTrueNumberOnly\n          );\n        } else if (options.allowBooleanAttributes) {\n          attrs[options.attributeNamePrefix + attrName] = true;\n        }\n      }\n    }\n    if (!Object.keys(attrs).length) {\n      return;\n    }\n    if (options.attrNodeName) {\n      const attrCollection = {};\n      attrCollection[options.attrNodeName] = attrs;\n      return attrCollection;\n    }\n    return attrs;\n  }\n}\n\nconst getTraversalObj = function(xmlData, options) {\n  xmlData = xmlData.replace(/(\\r\\n)|\\n/, \" \");\n  options = buildOptions(options, defaultOptions, props);\n  const xmlObj = new xmlNode('!xml');\n  let currentNode = xmlObj;\n  let textData = \"\";\n\n//function match(xmlData){\n  for(let i=0; i< xmlData.length; i++){\n    const ch = xmlData[i];\n    if(ch === '<'){\n      if( xmlData[i+1] === '/') {//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.ignoreNameSpace){\n          const colonIndex = tagName.indexOf(\":\");\n          if(colonIndex !== -1){\n            tagName = tagName.substr(colonIndex+1);\n          }\n        }\n\n        /* if (currentNode.parent) {\n          currentNode.parent.val = util.getValue(currentNode.parent.val) + '' + processTagValue2(tagName, textData , options);\n        } */\n        if(currentNode){\n          if(currentNode.val){\n            currentNode.val = util.getValue(currentNode.val) + '' + processTagValue(tagName, textData , options);\n          }else{\n            currentNode.val = processTagValue(tagName, textData , options);\n          }\n        }\n\n        if (options.stopNodes.length && options.stopNodes.includes(currentNode.tagname)) {\n          currentNode.child = []\n          if (currentNode.attrsMap == undefined) { currentNode.attrsMap = {}}\n          currentNode.val = xmlData.substr(currentNode.startIndex + 1, i - currentNode.startIndex - 1)\n        }\n        currentNode = currentNode.parent;\n        textData = \"\";\n        i = closeIndex;\n      } else if( xmlData[i+1] === '?') {\n        i = findClosingIndex(xmlData, \"?>\", i, \"Pi Tag is not closed.\")\n      } else if(xmlData.substr(i + 1, 3) === '!--') {\n        i = findClosingIndex(xmlData, \"-->\", i, \"Comment is not closed.\")\n      } else if( xmlData.substr(i + 1, 2) === '!D') {\n        const closeIndex = findClosingIndex(xmlData, \">\", i, \"DOCTYPE is not closed.\")\n        const tagExp = xmlData.substring(i, closeIndex);\n        if(tagExp.indexOf(\"[\") >= 0){\n          i = xmlData.indexOf(\"]>\", i) + 1;\n        }else{\n          i = closeIndex;\n        }\n      }else if(xmlData.substr(i + 1, 2) === '![') {\n        const closeIndex = findClosingIndex(xmlData, \"]]>\", i, \"CDATA is not closed.\") - 2\n        const tagExp = xmlData.substring(i + 9,closeIndex);\n\n        //considerations\n        //1. CDATA will always have parent node\n        //2. A tag with CDATA is not a leaf node so it's value would be string type.\n        if(textData){\n          currentNode.val = util.getValue(currentNode.val) + '' + processTagValue(currentNode.tagname, textData , options);\n          textData = \"\";\n        }\n\n        if (options.cdataTagName) {\n          //add cdata node\n          const childNode = new xmlNode(options.cdataTagName, currentNode, tagExp);\n          currentNode.addChild(childNode);\n          //for backtracking\n          currentNode.val = util.getValue(currentNode.val) + options.cdataPositionChar;\n          //add rest value to parent node\n          if (tagExp) {\n            childNode.val = tagExp;\n          }\n        } else {\n          currentNode.val = (currentNode.val || '') + (tagExp || '');\n        }\n\n        i = closeIndex + 2;\n      }else {//Opening tag\n        const result = closingIndexForOpeningTag(xmlData, i+1)\n        let tagExp = result.data;\n        const closeIndex = result.index;\n        const separatorIndex = tagExp.indexOf(\" \");\n        let tagName = tagExp;\n        if(separatorIndex !== -1){\n          tagName = tagExp.substr(0, separatorIndex).trimRight();\n          tagExp = tagExp.substr(separatorIndex + 1);\n        }\n\n        if(options.ignoreNameSpace){\n          const colonIndex = tagName.indexOf(\":\");\n          if(colonIndex !== -1){\n            tagName = tagName.substr(colonIndex+1);\n          }\n        }\n\n        //save text to parent node\n        if (currentNode && textData) {\n          if(currentNode.tagname !== '!xml'){\n            currentNode.val = util.getValue(currentNode.val) + '' + processTagValue( currentNode.tagname, textData, options);\n          }\n        }\n\n        if(tagExp.length > 0 && tagExp.lastIndexOf(\"/\") === tagExp.length - 1){//selfClosing tag\n\n          if(tagName[tagName.length - 1] === \"/\"){ //remove trailing '/'\n            tagName = tagName.substr(0, tagName.length - 1);\n            tagExp = tagName;\n          }else{\n            tagExp = tagExp.substr(0, tagExp.length - 1);\n          }\n\n          const childNode = new xmlNode(tagName, currentNode, '');\n          if(tagName !== tagExp){\n            childNode.attrsMap = buildAttributesMap(tagExp, options);\n          }\n          currentNode.addChild(childNode);\n        }else{//opening tag\n\n          const childNode = new xmlNode( tagName, currentNode );\n          if (options.stopNodes.length && options.stopNodes.includes(childNode.tagname)) {\n            childNode.startIndex=closeIndex;\n          }\n          if(tagName !== tagExp){\n            childNode.attrsMap = buildAttributesMap(tagExp, options);\n          }\n          currentNode.addChild(childNode);\n          currentNode = childNode;\n        }\n        textData = \"\";\n        i = closeIndex;\n      }\n    }else{\n      textData += xmlData[i];\n    }\n  }\n  return xmlObj;\n}\n\nfunction closingIndexForOpeningTag(data, i){\n  let attrBoundary;\n  let tagExp = \"\";\n  for (let index = i; index < data.length; index++) {\n    let ch = data[index];\n    if (attrBoundary) {\n        if (ch === attrBoundary) attrBoundary = \"\";//reset\n    } else if (ch === '\"' || ch === \"'\") {\n        attrBoundary = ch;\n    } else if (ch === '>') {\n        return {\n          data: tagExp,\n          index: index\n        }\n    } else if (ch === '\\t') {\n      ch = \" \"\n    }\n    tagExp += ch;\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\nexports.getTraversalObj = getTraversalObj;\n","'use strict';\n\nconst util = require('./util');\n\nconst defaultOptions = {\n  allowBooleanAttributes: false, //A tag can have attributes without any value\n};\n\nconst props = ['allowBooleanAttributes'];\n\n//const tagsPattern = new RegExp(\"<\\\\/?([\\\\w:\\\\-_\\.]+)\\\\s*\\/?>\",\"g\");\nexports.validate = function (xmlData, options) {\n  options = util.buildOptions(options, defaultOptions, props);\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(/(<!DOCTYPE[\\s\\w\\\"\\.\\/\\-\\:]+(\\[.*\\])*\\s*>)/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    if (xmlData[i] === '<') {\n      //starting of tag\n      //read until you reach to '>' avoiding any '>' in attribute value\n\n      i++;\n      if (xmlData[i] === '?') {\n        i = readPI(xmlData, ++i);\n        if (i.err) {\n          return i;\n        }\n      } else 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 = \"There is an unnecessary space between tag name and backward slash '</ ..'.\";\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          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, i - attrStr.length + 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, i));\n          } else {\n            const otg = tags.pop();\n            if (tagName !== otg) {\n              return getErrorObject('InvalidTag', \"Closing tag '\"+otg+\"' is expected inplace of '\"+tagName+\"'.\", getLineNumberForPosition(xmlData, i));\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 {\n            tags.push(tagName);\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 {\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          }\n        } //end of reading tag text value\n        if (xmlData[i] === '<') {\n          i--;\n        }\n      }\n    } else {\n      if (xmlData[i] === ' ' || xmlData[i] === '\\t' || xmlData[i] === '\\n' || xmlData[i] === '\\r') {\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 > 0) {\n    return getErrorObject('InvalidXml', \"Invalid '\"+JSON.stringify(tags, null, 4).replace(/\\r?\\n/g, '')+\"' found.\", 1);\n  }\n\n  return true;\n};\n\n/**\n * Read Processing insstructions and skip\n * @param {*} xmlData\n * @param {*} i\n */\nfunction readPI(xmlData, i) {\n  var start = i;\n  for (; i < xmlData.length; i++) {\n    if (xmlData[i] == '?' || xmlData[i] == ' ') {\n      //tagname\n      var 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\nvar doubleQuote = '\"';\nvar 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        continue;\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 = util.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(attrStr, matches[i][0]))\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(attrStr, matches[i][0]));\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(attrStr, matches[i][0]));\n    }\n    if (!attrNames.hasOwnProperty(attrName)) {\n      //check for duplicate attribute.\n      attrNames[attrName] = 1;\n    } else {\n      return getErrorObject('InvalidAttr', \"Attribute '\"+attrName+\"' is repeated.\", getPositionFromMatch(attrStr, matches[i][0]));\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,\n    },\n  };\n}\n\nfunction validateAttrName(attrName) {\n  return util.isName(attrName);\n}\n\n// const startsWithXML = /^xml/i;\n\nfunction validateTagName(tagname) {\n  return util.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  var lines = xmlData.substring(0, index).split(/\\r?\\n/);\n  return lines.length;\n}\n\n//this function returns the position of the last character of match within attrStr\nfunction getPositionFromMatch(attrStr, match) {\n  return attrStr.indexOf(match) + match.length;\n}\n","'use strict';\nconst char = function(a) {\n  return String.fromCharCode(a);\n};\n\nconst chars = {\n  nilChar: char(176),\n  missingChar: char(201),\n  nilPremitive: char(175),\n  missingPremitive: char(200),\n\n  emptyChar: char(178),\n  emptyValue: char(177), //empty Premitive\n\n  boundryChar: char(179),\n\n  objStart: char(198),\n  arrStart: char(204),\n  arrayEnd: char(185),\n};\n\nconst charsArr = [\n  chars.nilChar,\n  chars.nilPremitive,\n  chars.missingChar,\n  chars.missingPremitive,\n  chars.boundryChar,\n  chars.emptyChar,\n  chars.emptyValue,\n  chars.arrayEnd,\n  chars.objStart,\n  chars.arrStart,\n];\n\nconst _e = function(node, e_schema, options) {\n  if (typeof e_schema === 'string') {\n    //premitive\n    if (node && node[0] && node[0].val !== undefined) {\n      return getValue(node[0].val, e_schema);\n    } else {\n      return getValue(node, e_schema);\n    }\n  } else {\n    const hasValidData = hasData(node);\n    if (hasValidData === true) {\n      let str = '';\n      if (Array.isArray(e_schema)) {\n        //attributes can't be repeated. hence check in children tags only\n        str += chars.arrStart;\n        const itemSchema = e_schema[0];\n        //var itemSchemaType = itemSchema;\n        const arr_len = node.length;\n\n        if (typeof itemSchema === 'string') {\n          for (let arr_i = 0; arr_i < arr_len; arr_i++) {\n            const r = getValue(node[arr_i].val, itemSchema);\n            str = processValue(str, r);\n          }\n        } else {\n          for (let arr_i = 0; arr_i < arr_len; arr_i++) {\n            const r = _e(node[arr_i], itemSchema, options);\n            str = processValue(str, r);\n          }\n        }\n        str += chars.arrayEnd; //indicates that next item is not array item\n      } else {\n        //object\n        str += chars.objStart;\n        const keys = Object.keys(e_schema);\n        if (Array.isArray(node)) {\n          node = node[0];\n        }\n        for (let i in keys) {\n          const key = keys[i];\n          //a property defined in schema can be present either in attrsMap or children tags\n          //options.textNodeName will not present in both maps, take it's value from val\n          //options.attrNodeName will be present in attrsMap\n          let r;\n          if (!options.ignoreAttributes && node.attrsMap && node.attrsMap[key]) {\n            r = _e(node.attrsMap[key], e_schema[key], options);\n          } else if (key === options.textNodeName) {\n            r = _e(node.val, e_schema[key], options);\n          } else {\n            r = _e(node.child[key], e_schema[key], options);\n          }\n          str = processValue(str, r);\n        }\n      }\n      return str;\n    } else {\n      return hasValidData;\n    }\n  }\n};\n\nconst getValue = function(a /*, type*/) {\n  switch (a) {\n    case undefined:\n      return chars.missingPremitive;\n    case null:\n      return chars.nilPremitive;\n    case '':\n      return chars.emptyValue;\n    default:\n      return a;\n  }\n};\n\nconst processValue = function(str, r) {\n  if (!isAppChar(r[0]) && !isAppChar(str[str.length - 1])) {\n    str += chars.boundryChar;\n  }\n  return str + r;\n};\n\nconst isAppChar = function(ch) {\n  return charsArr.indexOf(ch) !== -1;\n};\n\nfunction hasData(jObj) {\n  if (jObj === undefined) {\n    return chars.missingChar;\n  } else if (jObj === null) {\n    return chars.nilChar;\n  } else if (\n    jObj.child &&\n    Object.keys(jObj.child).length === 0 &&\n    (!jObj.attrsMap || Object.keys(jObj.attrsMap).length === 0)\n  ) {\n    return chars.emptyChar;\n  } else {\n    return true;\n  }\n}\n\nconst x2j = require('./xmlstr2xmlnode');\nconst buildOptions = require('./util').buildOptions;\n\nconst convert2nimn = function(node, e_schema, options) {\n  options = buildOptions(options, x2j.defaultOptions, x2j.props);\n  return _e(node, e_schema, options);\n};\n\nexports.convert2nimn = convert2nimn;\n","'use strict';\n\nconst util = require('./util');\nconst buildOptions = require('./util').buildOptions;\nconst x2j = require('./xmlstr2xmlnode');\n\n//TODO: do it later\nconst convertToJsonString = function(node, options) {\n  options = buildOptions(options, x2j.defaultOptions, x2j.props);\n\n  options.indentBy = options.indentBy || '';\n  return _cToJsonStr(node, options, 0);\n};\n\nconst _cToJsonStr = function(node, options, level) {\n  let jObj = '{';\n\n  //traver through all the children\n  const keys = Object.keys(node.child);\n\n  for (let index = 0; index < keys.length; index++) {\n    var tagname = keys[index];\n    if (node.child[tagname] && node.child[tagname].length > 1) {\n      jObj += '\"' + tagname + '\" : [ ';\n      for (var tag in node.child[tagname]) {\n        jObj += _cToJsonStr(node.child[tagname][tag], options) + ' , ';\n      }\n      jObj = jObj.substr(0, jObj.length - 1) + ' ] '; //remove extra comma in last\n    } else {\n      jObj += '\"' + tagname + '\" : ' + _cToJsonStr(node.child[tagname][0], options) + ' ,';\n    }\n  }\n  util.merge(jObj, node.attrsMap);\n  //add attrsMap as new children\n  if (util.isEmptyObject(jObj)) {\n    return util.isExist(node.val) ? node.val : '';\n  } else {\n    if (util.isExist(node.val)) {\n      if (!(typeof node.val === 'string' && (node.val === '' || node.val === options.cdataPositionChar))) {\n        jObj += '\"' + options.textNodeName + '\" : ' + stringval(node.val);\n      }\n    }\n  }\n  //add value\n  if (jObj[jObj.length - 1] === ',') {\n    jObj = jObj.substr(0, jObj.length - 2);\n  }\n  return jObj + '}';\n};\n\nfunction stringval(v) {\n  if (v === true || v === false || !isNaN(v)) {\n    return v;\n  } else {\n    return '\"' + v + '\"';\n  }\n}\n\nfunction indentate(options, level) {\n  return options.indentBy.repeat(level);\n}\n\nexports.convertToJsonString = convertToJsonString;\n","'use strict';\n//parse Empty Node as self closing node\nconst buildOptions = require('./util').buildOptions;\n\nconst defaultOptions = {\n  attributeNamePrefix: '@_',\n  attrNodeName: false,\n  textNodeName: '#text',\n  ignoreAttributes: true,\n  cdataTagName: false,\n  cdataPositionChar: '\\\\c',\n  format: false,\n  indentBy: '  ',\n  supressEmptyNode: false,\n  tagValueProcessor: function(a) {\n    return a;\n  },\n  attrValueProcessor: function(a) {\n    return a;\n  },\n};\n\nconst props = [\n  'attributeNamePrefix',\n  'attrNodeName',\n  'textNodeName',\n  'ignoreAttributes',\n  'cdataTagName',\n  'cdataPositionChar',\n  'format',\n  'indentBy',\n  'supressEmptyNode',\n  'tagValueProcessor',\n  'attrValueProcessor',\n];\n\nfunction Parser(options) {\n  this.options = buildOptions(options, defaultOptions, props);\n  if (this.options.ignoreAttributes || this.options.attrNodeName) {\n    this.isAttribute = function(/*a*/) {\n      return false;\n    };\n  } else {\n    this.attrPrefixLen = this.options.attributeNamePrefix.length;\n    this.isAttribute = isAttribute;\n  }\n  if (this.options.cdataTagName) {\n    this.isCDATA = isCDATA;\n  } else {\n    this.isCDATA = function(/*a*/) {\n      return false;\n    };\n  }\n  this.replaceCDATAstr = replaceCDATAstr;\n  this.replaceCDATAarr = replaceCDATAarr;\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  if (this.options.supressEmptyNode) {\n    this.buildTextNode = buildEmptyTextNode;\n    this.buildObjNode = buildEmptyObjNode;\n  } else {\n    this.buildTextNode = buildTextValNode;\n    this.buildObjNode = buildObjectNode;\n  }\n\n  this.buildTextValNode = buildTextValNode;\n  this.buildObjectNode = buildObjectNode;\n}\n\nParser.prototype.parse = function(jObj) {\n  return this.j2x(jObj, 0).val;\n};\n\nParser.prototype.j2x = function(jObj, level) {\n  let attrStr = '';\n  let val = '';\n  const keys = Object.keys(jObj);\n  const len = keys.length;\n  for (let i = 0; i < len; i++) {\n    const key = keys[i];\n    if (typeof jObj[key] === 'undefined') {\n      // supress undefined node\n    } else if (jObj[key] === null) {\n      val += this.indentate(level) + '<' + key + '/' + this.tagEndChar;\n    } else if (jObj[key] instanceof Date) {\n      val += this.buildTextNode(jObj[key], key, '', level);\n    } else if (typeof jObj[key] !== 'object') {\n      //premitive type\n      const attr = this.isAttribute(key);\n      if (attr) {\n        attrStr += ' ' + attr + '=\"' + this.options.attrValueProcessor('' + jObj[key]) + '\"';\n      } else if (this.isCDATA(key)) {\n        if (jObj[this.options.textNodeName]) {\n          val += this.replaceCDATAstr(jObj[this.options.textNodeName], jObj[key]);\n        } else {\n          val += this.replaceCDATAstr('', jObj[key]);\n        }\n      } else {\n        //tag value\n        if (key === this.options.textNodeName) {\n          if (jObj[this.options.cdataTagName]) {\n            //value will added while processing cdata\n          } else {\n            val += this.options.tagValueProcessor('' + jObj[key]);\n          }\n        } else {\n          val += this.buildTextNode(jObj[key], key, '', level);\n        }\n      }\n    } else if (Array.isArray(jObj[key])) {\n      //repeated nodes\n      if (this.isCDATA(key)) {\n        val += this.indentate(level);\n        if (jObj[this.options.textNodeName]) {\n          val += this.replaceCDATAarr(jObj[this.options.textNodeName], jObj[key]);\n        } else {\n          val += this.replaceCDATAarr('', jObj[key]);\n        }\n      } else {\n        //nested nodes\n        const arrLen = jObj[key].length;\n        for (let j = 0; j < arrLen; j++) {\n          const item = jObj[key][j];\n          if (typeof item === 'undefined') {\n            // supress undefined node\n          } else if (item === null) {\n            val += this.indentate(level) + '<' + key + '/' + this.tagEndChar;\n          } else if (typeof item === 'object') {\n            const result = this.j2x(item, level + 1);\n            val += this.buildObjNode(result.val, key, result.attrStr, level);\n          } else {\n            val += this.buildTextNode(item, key, '', level);\n          }\n        }\n      }\n    } else {\n      //nested node\n      if (this.options.attrNodeName && key === this.options.attrNodeName) {\n        const Ks = Object.keys(jObj[key]);\n        const L = Ks.length;\n        for (let j = 0; j < L; j++) {\n          attrStr += ' ' + Ks[j] + '=\"' + this.options.attrValueProcessor('' + jObj[key][Ks[j]]) + '\"';\n        }\n      } else {\n        const result = this.j2x(jObj[key], level + 1);\n        val += this.buildObjNode(result.val, key, result.attrStr, level);\n      }\n    }\n  }\n  return {attrStr: attrStr, val: val};\n};\n\nfunction replaceCDATAstr(str, cdata) {\n  str = this.options.tagValueProcessor('' + str);\n  if (this.options.cdataPositionChar === '' || str === '') {\n    return str + '<![CDATA[' + cdata + ']]' + this.tagEndChar;\n  } else {\n    return str.replace(this.options.cdataPositionChar, '<![CDATA[' + cdata + ']]' + this.tagEndChar);\n  }\n}\n\nfunction replaceCDATAarr(str, cdata) {\n  str = this.options.tagValueProcessor('' + str);\n  if (this.options.cdataPositionChar === '' || str === '') {\n    return str + '<![CDATA[' + cdata.join(']]><![CDATA[') + ']]' + this.tagEndChar;\n  } else {\n    for (let v in cdata) {\n      str = str.replace(this.options.cdataPositionChar, '<![CDATA[' + cdata[v] + ']]>');\n    }\n    return str + this.newLine;\n  }\n}\n\nfunction buildObjectNode(val, key, attrStr, level) {\n  if (attrStr && !val.includes('<')) {\n    return (\n      this.indentate(level) +\n      '<' +\n      key +\n      attrStr +\n      '>' +\n      val +\n      //+ this.newLine\n      // + this.indentate(level)\n      '</' +\n      key +\n      this.tagEndChar\n    );\n  } else {\n    return (\n      this.indentate(level) +\n      '<' +\n      key +\n      attrStr +\n      this.tagEndChar +\n      val +\n      //+ this.newLine\n      this.indentate(level) +\n      '</' +\n      key +\n      this.tagEndChar\n    );\n  }\n}\n\nfunction buildEmptyObjNode(val, key, attrStr, level) {\n  if (val !== '') {\n    return this.buildObjectNode(val, key, attrStr, level);\n  } else {\n    return this.indentate(level) + '<' + key + attrStr + '/' + this.tagEndChar;\n    //+ this.newLine\n  }\n}\n\nfunction buildTextValNode(val, key, attrStr, level) {\n  return (\n    this.indentate(level) +\n    '<' +\n    key +\n    attrStr +\n    '>' +\n    this.options.tagValueProcessor(val) +\n    '</' +\n    key +\n    this.tagEndChar\n  );\n}\n\nfunction buildEmptyTextNode(val, key, attrStr, level) {\n  if (val !== '') {\n    return this.buildTextValNode(val, key, attrStr, level);\n  } else {\n    return this.indentate(level) + '<' + key + attrStr + '/' + this.tagEndChar;\n  }\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)) {\n    return name.substr(this.attrPrefixLen);\n  } else {\n    return false;\n  }\n}\n\nfunction isCDATA(name) {\n  return name === this.options.cdataTagName;\n}\n\n//formatting\n//indentation\n//\\n after each closing or self closing tag\n\nmodule.exports = Parser;\n","'use strict';\n\nconst nodeToJson = require('./node2json');\nconst xmlToNodeobj = require('./xmlstr2xmlnode');\nconst x2xmlnode = require('./xmlstr2xmlnode');\nconst buildOptions = require('./util').buildOptions;\nconst validator = require('./validator');\n\nexports.parse = function(xmlData, options, validationOption) {\n  if( validationOption){\n    if(validationOption === true) validationOption = {}\n    \n    const result = validator.validate(xmlData, validationOption);\n    if (result !== true) {\n      throw Error( result.err.msg)\n    }\n  }\n  options = buildOptions(options, x2xmlnode.defaultOptions, x2xmlnode.props);\n  const traversableObj = xmlToNodeobj.getTraversalObj(xmlData, options)\n  //print(traversableObj, \"  \");\n  return nodeToJson.convertToJson(traversableObj, options);\n};\nexports.convertTonimn = require('../src/nimndata').convert2nimn;\nexports.getTraversalObj = xmlToNodeobj.getTraversalObj;\nexports.convertToJson = nodeToJson.convertToJson;\nexports.convertToJsonString = require('./node2json_str').convertToJsonString;\nexports.validate = validator.validate;\nexports.j2xParser = require('./json2xml');\nexports.parseToNimn = function(xmlData, schema, options) {\n  return exports.convertTonimn(exports.getTraversalObj(xmlData, options), schema, options);\n};\n\n\nfunction print(xmlNode, indentation){\n  if(xmlNode){\n    console.log(indentation + \"{\")\n    console.log(indentation + \"  \\\"tagName\\\": \\\"\" + xmlNode.tagname + \"\\\", \");\n    if(xmlNode.parent){\n      console.log(indentation + \"  \\\"parent\\\": \\\"\" + xmlNode.parent.tagname  + \"\\\", \");\n    }\n    console.log(indentation + \"  \\\"val\\\": \\\"\" + xmlNode.val  + \"\\\", \");\n    console.log(indentation + \"  \\\"attrs\\\": \" + JSON.stringify(xmlNode.attrsMap,null,4)  + \", \");\n\n    if(xmlNode.child){\n      console.log(indentation + \"\\\"child\\\": {\")\n      const indentation2 = indentation + indentation;\n      Object.keys(xmlNode.child).forEach( function(key) {\n        const node = xmlNode.child[key];\n\n        if(Array.isArray(node)){\n          console.log(indentation +  \"\\\"\"+key+\"\\\" :[\")\n          node.forEach( function(item,index) {\n            //console.log(indentation + \" \\\"\"+index+\"\\\" : [\")\n            print(item, indentation2);\n          })\n          console.log(indentation + \"],\")  \n        }else{\n          console.log(indentation + \" \\\"\"+key+\"\\\" : {\")\n          print(node, indentation2);\n          console.log(indentation + \"},\")  \n        }\n      });\n      console.log(indentation + \"},\")\n    }\n    console.log(indentation + \"},\")\n  }\n}","import { parse } from 'fast-xml-parser';\n\n/**\n * Returns a JSON with data about project information and tables from PZFX files.\n * @param {String} pzfx - File with the PZFX data.\n * @return {Object} [Object.information] Metadata of the experiment.\n * @return {Array} [Object.table] Table data from file.\n * @return {Array} [Object.hugeTable] Huge table data from file.\n */\n\nexport function pzfxParser(pzfx) {\n  pzfx = ensureText(pzfx);\n\n  if (typeof pzfx !== 'string') throw new TypeError('pzfx must be a string');\n\n  const parsed = parse(pzfx, {\n    textNodeName: '_data',\n    attributeNamePrefix: '',\n    parseAttributeValue: true,\n    attrNodeName: '_attr',\n    ignoreAttributes: false,\n  });\n\n  const table = parseTable(parsed.GraphPadPrismFile.Table);\n  const hugeTable = parseTable(parsed.GraphPadPrismFile.HugeTable);\n  const constant = parsed.GraphPadPrismFile.Info.Constant;\n  let information = {};\n  for (let i = 0; i < constant.length; i++) {\n    information[constant[i].Name.replace(/ /g, '')] = constant[i].Value;\n  }\n  information.notes = checkLabel(parsed.GraphPadPrismFile.Info.Notes);\n\n  return {\n    parsed: parsed,\n    information: information,\n    table: table,\n    hugeTable: hugeTable,\n  };\n}\n\nfunction parseTable(table) {\n  let dataTable = [];\n  if (!table) return dataTable;\n  if (Array.isArray(table)) {\n    for (let i = 0; i < table.length; i++) {\n      let element = Object.assign(table[i]._attr, {\n        title: table[i].Title,\n      });\n      if (table[0].XColumn) {\n        element.x = {\n          label: checkLabel(table[i].XColumn.Title),\n          data: table[i].XColumn.Subcolumn.d,\n        };\n      }\n      let y = [];\n      if (Array.isArray(table[i].YColumn)) {\n        for (let j = 0; j < table[i].YColumn.length; j++) {\n          y.push({\n            label: checkLabel(table[i].YColumn[j].Title),\n            data: Array.isArray(table[i].YColumn[j].Subcolumn)\n              ? table[i].YColumn[j].Subcolumn.map((x) => x.d)\n              : table[i].YColumn[j].Subcolumn.d,\n          });\n        }\n        element.y = y;\n      } else {\n        y.push({\n          label: checkLabel(table[i].YColumn.Title),\n          data: Array.isArray(table[i].YColumn.Subcolumn)\n            ? table[i].YColumn.Subcolumn.map((x) => x.d)\n            : table[i].YColumn.Subcolumn.d,\n        });\n        element.y = y;\n      }\n      dataTable.push(element);\n    }\n  } else {\n    let element = Object.assign(table._attr, {\n      title: table.Title,\n    });\n    if (table.XColumn) {\n      element.x = {\n        label: checkLabel(table.XColumn.Title),\n        data: table.XColumn.Subcolumn.d,\n      };\n    }\n    let y = [];\n    if (Array.isArray(table.YColumn)) {\n      for (let j = 0; j < table.YColumn.length; j++) {\n        y.push({\n          label: checkLabel(table.YColumn[j].Title),\n          data: Array.isArray(table.YColumn[j].Subcolumn)\n            ? table.YColumn[j].Subcolumn.map((x) => x.d)\n            : table.YColumn[j].Subcolumn.d,\n        });\n      }\n    } else {\n      y.push({\n        label: checkLabel(table.YColumn.Title),\n        data: Array.isArray(table.YColumn.Subcolumn)\n          ? table.YColumn.Subcolumn.map((x) => x.d)\n          : table.YColumn.Subcolumn.d,\n      });\n    }\n\n    element.y = y;\n    dataTable.push(element);\n  }\n\n  return dataTable;\n}\n\nfunction checkLabel(input) {\n  let result;\n  if (typeof input === 'object') {\n    let entries = Object.entries(input)[0];\n    result = entries.filter((item) => item._data)[0]._data;\n  } else {\n    return input;\n  }\n  return result;\n}\n\n/*\n  https://github.com/cheminfo/mzData/blob/master/src/util/ensureText.js\n  */\nexport function ensureText(data, options = {}) {\n  const { encoding = 'utf8' } = options;\n  if (typeof Buffer !== 'undefined' && data instanceof Buffer) {\n    return data.toString(encoding);\n  }\n  if (typeof ArrayBuffer !== 'undefined' && data instanceof ArrayBuffer) {\n    return new TextDecoder(encoding).decode(data);\n  }\n  return data;\n}\n"],"names":["nameStartChar","nameRegexp","regexName","RegExp","exports","v","obj","Object","keys","length","target","a","arrayMode","len","i","isExist","options","defaultOptions","props","newOptions","undefined","string","match","exec","regex","matches","allmatches","index","push","convertToJson","node","jObj","child","util","isEmptyObject","attrsMap","val","cdataPositionChar","textNodeName","merge","tagname","tag","result","parent","addChild","Array","isArray","this","buildOptions","replace","Number","parseInt","window","parseFloat","attributeNamePrefix","attrNodeName","ignoreAttributes","ignoreNameSpace","allowBooleanAttributes","parseNodeValue","parseAttributeValue","trimValues","cdataTagName","tagValueProcessor","tagName","attrValueProcessor","attrName","stopNodes","processTagValue","trim","parseValue","parseTrueNumberOnly","resolveNameSpace","tags","split","prefix","charAt","shouldParse","parsed","isNaN","indexOf","String","attrsRegx","buildAttributesMap","attrStr","getAllMatches","attrs","attrCollection","closingIndexForOpeningTag","data","attrBoundary","tagExp","ch","findClosingIndex","xmlData","str","errMsg","closingIndex","Error","xmlObj","xmlNode","currentNode","textData","closeIndex","substring","colonIndex","substr","getValue","includes","startIndex","childNode","separatorIndex","trimRight","lastIndexOf","readPI","start","getErrorObject","getLineNumberForPosition","readCommentAndCDATA","angleBracketsCount","readAttributeStr","startChar","tagClosed","value","validAttrStrRegxp","validateAttributeString","attrNames","getPositionFromMatch","validateAttrName","hasOwnProperty","validateAmpersand","re","validateNumberAmpersand","count","code","message","lineNumber","err","msg","line","isName","tagFound","reachedRoot","closingTag","isValid","otg","pop","afterAmp","JSON","stringify","char","fromCharCode","chars","nilChar","missingChar","nilPremitive","missingPremitive","emptyChar","emptyValue","boundryChar","objStart","arrStart","arrayEnd","charsArr","_e","e_schema","hasValidData","itemSchema","arr_len","arr_i","r","processValue","key","isAppChar","require$$0","x2j","_cToJsonStr","level","indentBy","format","supressEmptyNode","Parser","isAttribute","attrPrefixLen","isCDATA","replaceCDATAstr","replaceCDATAarr","indentate","tagEndChar","newLine","buildTextNode","buildEmptyTextNode","buildObjNode","buildEmptyObjNode","buildTextValNode","buildObjectNode","cdata","join","repeat","name","startsWith","prototype","parse","j2x","Date","attr","arrLen","j","item","Ks","L","x2xmlnode","xmlToNodeobj","validationOption","validator","traversableObj","getTraversalObj","nodeToJson","require$$1","convert2nimn","require$$2","convertToJsonString","require$$3","schema","convertTonimn","parseTable","table","dataTable","element","assign","_attr","title","Title","XColumn","x","label","checkLabel","Subcolumn","d","y","YColumn","map","input","entries","filter","_data","ensureText","encoding","Buffer","toString","ArrayBuffer","TextDecoder","decode","pzfx","TypeError","GraphPadPrismFile","Table","hugeTable","HugeTable","constant","Info","Constant","information","Name","Value","notes","Notes"],"mappings":"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"}