{"version":3,"file":"video-utils-DfKS4cGg.mjs","sources":["../../../node_modules/.pnpm/@videojs+vhs-utils@4.1.1/node_modules/@videojs/vhs-utils/es/stream.js","../../../node_modules/.pnpm/@videojs+vhs-utils@4.1.1/node_modules/@videojs/vhs-utils/es/decode-b64-to-uint8-array.js","../../../node_modules/.pnpm/m3u8-parser@7.2.0/node_modules/m3u8-parser/dist/m3u8-parser.es.js","../../../node_modules/.pnpm/@videojs+vhs-utils@4.1.1/node_modules/@videojs/vhs-utils/es/media-groups.js","../../../node_modules/.pnpm/@xmldom+xmldom@0.8.11/node_modules/@xmldom/xmldom/lib/conventions.js","../../../node_modules/.pnpm/@xmldom+xmldom@0.8.11/node_modules/@xmldom/xmldom/lib/dom.js","../../../node_modules/.pnpm/@xmldom+xmldom@0.8.11/node_modules/@xmldom/xmldom/lib/entities.js","../../../node_modules/.pnpm/@xmldom+xmldom@0.8.11/node_modules/@xmldom/xmldom/lib/sax.js","../../../node_modules/.pnpm/@xmldom+xmldom@0.8.11/node_modules/@xmldom/xmldom/lib/dom-parser.js","../../../node_modules/.pnpm/@xmldom+xmldom@0.8.11/node_modules/@xmldom/xmldom/lib/index.js","../../../node_modules/.pnpm/mpd-parser@1.3.1/node_modules/mpd-parser/dist/mpd-parser.es.js"],"sourcesContent":["/**\n * @file stream.js\n */\n\n/**\n * A lightweight readable stream implemention that handles event dispatching.\n *\n * @class Stream\n */\nvar Stream = /*#__PURE__*/function () {\n  function Stream() {\n    this.listeners = {};\n  }\n  /**\n   * Add a listener for a specified event type.\n   *\n   * @param {string} type the event name\n   * @param {Function} listener the callback to be invoked when an event of\n   * the specified type occurs\n   */\n\n\n  var _proto = Stream.prototype;\n\n  _proto.on = function on(type, listener) {\n    if (!this.listeners[type]) {\n      this.listeners[type] = [];\n    }\n\n    this.listeners[type].push(listener);\n  }\n  /**\n   * Remove a listener for a specified event type.\n   *\n   * @param {string} type the event name\n   * @param {Function} listener  a function previously registered for this\n   * type of event through `on`\n   * @return {boolean} if we could turn it off or not\n   */\n  ;\n\n  _proto.off = function off(type, listener) {\n    if (!this.listeners[type]) {\n      return false;\n    }\n\n    var index = this.listeners[type].indexOf(listener); // TODO: which is better?\n    // In Video.js we slice listener functions\n    // on trigger so that it does not mess up the order\n    // while we loop through.\n    //\n    // Here we slice on off so that the loop in trigger\n    // can continue using it's old reference to loop without\n    // messing up the order.\n\n    this.listeners[type] = this.listeners[type].slice(0);\n    this.listeners[type].splice(index, 1);\n    return index > -1;\n  }\n  /**\n   * Trigger an event of the specified type on this stream. Any additional\n   * arguments to this function are passed as parameters to event listeners.\n   *\n   * @param {string} type the event name\n   */\n  ;\n\n  _proto.trigger = function trigger(type) {\n    var callbacks = this.listeners[type];\n\n    if (!callbacks) {\n      return;\n    } // Slicing the arguments on every invocation of this method\n    // can add a significant amount of overhead. Avoid the\n    // intermediate object creation for the common case of a\n    // single callback argument\n\n\n    if (arguments.length === 2) {\n      var length = callbacks.length;\n\n      for (var i = 0; i < length; ++i) {\n        callbacks[i].call(this, arguments[1]);\n      }\n    } else {\n      var args = Array.prototype.slice.call(arguments, 1);\n      var _length = callbacks.length;\n\n      for (var _i = 0; _i < _length; ++_i) {\n        callbacks[_i].apply(this, args);\n      }\n    }\n  }\n  /**\n   * Destroys the stream and cleans up.\n   */\n  ;\n\n  _proto.dispose = function dispose() {\n    this.listeners = {};\n  }\n  /**\n   * Forwards all `data` events on this stream to the destination stream. The\n   * destination stream should provide a method `push` to receive the data\n   * events as they arrive.\n   *\n   * @param {Stream} destination the stream that will receive all `data` events\n   * @see http://nodejs.org/api/stream.html#stream_readable_pipe_destination_options\n   */\n  ;\n\n  _proto.pipe = function pipe(destination) {\n    this.on('data', function (data) {\n      destination.push(data);\n    });\n  };\n\n  return Stream;\n}();\n\nexport { Stream as default };","import window from 'global/window';\n\nvar atob = function atob(s) {\n  return window.atob ? window.atob(s) : Buffer.from(s, 'base64').toString('binary');\n};\n\nexport default function decodeB64ToUint8Array(b64Text) {\n  var decodedString = atob(b64Text);\n  var array = new Uint8Array(decodedString.length);\n\n  for (var i = 0; i < decodedString.length; i++) {\n    array[i] = decodedString.charCodeAt(i);\n  }\n\n  return array;\n}","/*! @name m3u8-parser @version 7.2.0 @license Apache-2.0 */\nimport Stream from '@videojs/vhs-utils/es/stream.js';\nimport _extends from '@babel/runtime/helpers/extends';\nimport decodeB64ToUint8Array from '@videojs/vhs-utils/es/decode-b64-to-uint8-array.js';\n\n/**\n * @file m3u8/line-stream.js\n */\n/**\n * A stream that buffers string input and generates a `data` event for each\n * line.\n *\n * @class LineStream\n * @extends Stream\n */\n\nclass LineStream extends Stream {\n  constructor() {\n    super();\n    this.buffer = '';\n  }\n  /**\n   * Add new data to be parsed.\n   *\n   * @param {string} data the text to process\n   */\n\n\n  push(data) {\n    let nextNewline;\n    this.buffer += data;\n    nextNewline = this.buffer.indexOf('\\n');\n\n    for (; nextNewline > -1; nextNewline = this.buffer.indexOf('\\n')) {\n      this.trigger('data', this.buffer.substring(0, nextNewline));\n      this.buffer = this.buffer.substring(nextNewline + 1);\n    }\n  }\n\n}\n\nconst TAB = String.fromCharCode(0x09);\n\nconst parseByterange = function (byterangeString) {\n  // optionally match and capture 0+ digits before `@`\n  // optionally match and capture 0+ digits after `@`\n  const match = /([0-9.]*)?@?([0-9.]*)?/.exec(byterangeString || '');\n  const result = {};\n\n  if (match[1]) {\n    result.length = parseInt(match[1], 10);\n  }\n\n  if (match[2]) {\n    result.offset = parseInt(match[2], 10);\n  }\n\n  return result;\n};\n/**\n * \"forgiving\" attribute list psuedo-grammar:\n * attributes -> keyvalue (',' keyvalue)*\n * keyvalue   -> key '=' value\n * key        -> [^=]*\n * value      -> '\"' [^\"]* '\"' | [^,]*\n */\n\n\nconst attributeSeparator = function () {\n  const key = '[^=]*';\n  const value = '\"[^\"]*\"|[^,]*';\n  const keyvalue = '(?:' + key + ')=(?:' + value + ')';\n  return new RegExp('(?:^|,)(' + keyvalue + ')');\n};\n/**\n * Parse attributes from a line given the separator\n *\n * @param {string} attributes the attribute line to parse\n */\n\n\nconst parseAttributes = function (attributes) {\n  const result = {};\n\n  if (!attributes) {\n    return result;\n  } // split the string using attributes as the separator\n\n\n  const attrs = attributes.split(attributeSeparator());\n  let i = attrs.length;\n  let attr;\n\n  while (i--) {\n    // filter out unmatched portions of the string\n    if (attrs[i] === '') {\n      continue;\n    } // split the key and value\n\n\n    attr = /([^=]*)=(.*)/.exec(attrs[i]).slice(1); // trim whitespace and remove optional quotes around the value\n\n    attr[0] = attr[0].replace(/^\\s+|\\s+$/g, '');\n    attr[1] = attr[1].replace(/^\\s+|\\s+$/g, '');\n    attr[1] = attr[1].replace(/^['\"](.*)['\"]$/g, '$1');\n    result[attr[0]] = attr[1];\n  }\n\n  return result;\n};\n/**\n * Converts a string into a resolution object\n *\n * @param {string} resolution a string such as 3840x2160\n *\n * @return {Object} An object representing the resolution\n *\n */\n\n\nconst parseResolution = resolution => {\n  const split = resolution.split('x');\n  const result = {};\n\n  if (split[0]) {\n    result.width = parseInt(split[0], 10);\n  }\n\n  if (split[1]) {\n    result.height = parseInt(split[1], 10);\n  }\n\n  return result;\n};\n/**\n * A line-level M3U8 parser event stream. It expects to receive input one\n * line at a time and performs a context-free parse of its contents. A stream\n * interpretation of a manifest can be useful if the manifest is expected to\n * be too large to fit comfortably into memory or the entirety of the input\n * is not immediately available. Otherwise, it's probably much easier to work\n * with a regular `Parser` object.\n *\n * Produces `data` events with an object that captures the parser's\n * interpretation of the input. That object has a property `tag` that is one\n * of `uri`, `comment`, or `tag`. URIs only have a single additional\n * property, `line`, which captures the entirety of the input without\n * interpretation. Comments similarly have a single additional property\n * `text` which is the input without the leading `#`.\n *\n * Tags always have a property `tagType` which is the lower-cased version of\n * the M3U8 directive without the `#EXT` or `#EXT-X-` prefix. For instance,\n * `#EXT-X-MEDIA-SEQUENCE` becomes `media-sequence` when parsed. Unrecognized\n * tags are given the tag type `unknown` and a single additional property\n * `data` with the remainder of the input.\n *\n * @class ParseStream\n * @extends Stream\n */\n\n\nclass ParseStream extends Stream {\n  constructor() {\n    super();\n    this.customParsers = [];\n    this.tagMappers = [];\n  }\n  /**\n   * Parses an additional line of input.\n   *\n   * @param {string} line a single line of an M3U8 file to parse\n   */\n\n\n  push(line) {\n    let match;\n    let event; // strip whitespace\n\n    line = line.trim();\n\n    if (line.length === 0) {\n      // ignore empty lines\n      return;\n    } // URIs\n\n\n    if (line[0] !== '#') {\n      this.trigger('data', {\n        type: 'uri',\n        uri: line\n      });\n      return;\n    } // map tags\n\n\n    const newLines = this.tagMappers.reduce((acc, mapper) => {\n      const mappedLine = mapper(line); // skip if unchanged\n\n      if (mappedLine === line) {\n        return acc;\n      }\n\n      return acc.concat([mappedLine]);\n    }, [line]);\n    newLines.forEach(newLine => {\n      for (let i = 0; i < this.customParsers.length; i++) {\n        if (this.customParsers[i].call(this, newLine)) {\n          return;\n        }\n      } // Comments\n\n\n      if (newLine.indexOf('#EXT') !== 0) {\n        this.trigger('data', {\n          type: 'comment',\n          text: newLine.slice(1)\n        });\n        return;\n      } // strip off any carriage returns here so the regex matching\n      // doesn't have to account for them.\n\n\n      newLine = newLine.replace('\\r', ''); // Tags\n\n      match = /^#EXTM3U/.exec(newLine);\n\n      if (match) {\n        this.trigger('data', {\n          type: 'tag',\n          tagType: 'm3u'\n        });\n        return;\n      }\n\n      match = /^#EXTINF:([0-9\\.]*)?,?(.*)?$/.exec(newLine);\n\n      if (match) {\n        event = {\n          type: 'tag',\n          tagType: 'inf'\n        };\n\n        if (match[1]) {\n          event.duration = parseFloat(match[1]);\n        }\n\n        if (match[2]) {\n          event.title = match[2];\n        }\n\n        this.trigger('data', event);\n        return;\n      }\n\n      match = /^#EXT-X-TARGETDURATION:([0-9.]*)?/.exec(newLine);\n\n      if (match) {\n        event = {\n          type: 'tag',\n          tagType: 'targetduration'\n        };\n\n        if (match[1]) {\n          event.duration = parseInt(match[1], 10);\n        }\n\n        this.trigger('data', event);\n        return;\n      }\n\n      match = /^#EXT-X-VERSION:([0-9.]*)?/.exec(newLine);\n\n      if (match) {\n        event = {\n          type: 'tag',\n          tagType: 'version'\n        };\n\n        if (match[1]) {\n          event.version = parseInt(match[1], 10);\n        }\n\n        this.trigger('data', event);\n        return;\n      }\n\n      match = /^#EXT-X-MEDIA-SEQUENCE:(\\-?[0-9.]*)?/.exec(newLine);\n\n      if (match) {\n        event = {\n          type: 'tag',\n          tagType: 'media-sequence'\n        };\n\n        if (match[1]) {\n          event.number = parseInt(match[1], 10);\n        }\n\n        this.trigger('data', event);\n        return;\n      }\n\n      match = /^#EXT-X-DISCONTINUITY-SEQUENCE:(\\-?[0-9.]*)?/.exec(newLine);\n\n      if (match) {\n        event = {\n          type: 'tag',\n          tagType: 'discontinuity-sequence'\n        };\n\n        if (match[1]) {\n          event.number = parseInt(match[1], 10);\n        }\n\n        this.trigger('data', event);\n        return;\n      }\n\n      match = /^#EXT-X-PLAYLIST-TYPE:(.*)?$/.exec(newLine);\n\n      if (match) {\n        event = {\n          type: 'tag',\n          tagType: 'playlist-type'\n        };\n\n        if (match[1]) {\n          event.playlistType = match[1];\n        }\n\n        this.trigger('data', event);\n        return;\n      }\n\n      match = /^#EXT-X-BYTERANGE:(.*)?$/.exec(newLine);\n\n      if (match) {\n        event = _extends(parseByterange(match[1]), {\n          type: 'tag',\n          tagType: 'byterange'\n        });\n        this.trigger('data', event);\n        return;\n      }\n\n      match = /^#EXT-X-ALLOW-CACHE:(YES|NO)?/.exec(newLine);\n\n      if (match) {\n        event = {\n          type: 'tag',\n          tagType: 'allow-cache'\n        };\n\n        if (match[1]) {\n          event.allowed = !/NO/.test(match[1]);\n        }\n\n        this.trigger('data', event);\n        return;\n      }\n\n      match = /^#EXT-X-MAP:(.*)$/.exec(newLine);\n\n      if (match) {\n        event = {\n          type: 'tag',\n          tagType: 'map'\n        };\n\n        if (match[1]) {\n          const attributes = parseAttributes(match[1]);\n\n          if (attributes.URI) {\n            event.uri = attributes.URI;\n          }\n\n          if (attributes.BYTERANGE) {\n            event.byterange = parseByterange(attributes.BYTERANGE);\n          }\n        }\n\n        this.trigger('data', event);\n        return;\n      }\n\n      match = /^#EXT-X-STREAM-INF:(.*)$/.exec(newLine);\n\n      if (match) {\n        event = {\n          type: 'tag',\n          tagType: 'stream-inf'\n        };\n\n        if (match[1]) {\n          event.attributes = parseAttributes(match[1]);\n\n          if (event.attributes.RESOLUTION) {\n            event.attributes.RESOLUTION = parseResolution(event.attributes.RESOLUTION);\n          }\n\n          if (event.attributes.BANDWIDTH) {\n            event.attributes.BANDWIDTH = parseInt(event.attributes.BANDWIDTH, 10);\n          }\n\n          if (event.attributes['FRAME-RATE']) {\n            event.attributes['FRAME-RATE'] = parseFloat(event.attributes['FRAME-RATE']);\n          }\n\n          if (event.attributes['PROGRAM-ID']) {\n            event.attributes['PROGRAM-ID'] = parseInt(event.attributes['PROGRAM-ID'], 10);\n          }\n        }\n\n        this.trigger('data', event);\n        return;\n      }\n\n      match = /^#EXT-X-MEDIA:(.*)$/.exec(newLine);\n\n      if (match) {\n        event = {\n          type: 'tag',\n          tagType: 'media'\n        };\n\n        if (match[1]) {\n          event.attributes = parseAttributes(match[1]);\n        }\n\n        this.trigger('data', event);\n        return;\n      }\n\n      match = /^#EXT-X-ENDLIST/.exec(newLine);\n\n      if (match) {\n        this.trigger('data', {\n          type: 'tag',\n          tagType: 'endlist'\n        });\n        return;\n      }\n\n      match = /^#EXT-X-DISCONTINUITY/.exec(newLine);\n\n      if (match) {\n        this.trigger('data', {\n          type: 'tag',\n          tagType: 'discontinuity'\n        });\n        return;\n      }\n\n      match = /^#EXT-X-PROGRAM-DATE-TIME:(.*)$/.exec(newLine);\n\n      if (match) {\n        event = {\n          type: 'tag',\n          tagType: 'program-date-time'\n        };\n\n        if (match[1]) {\n          event.dateTimeString = match[1];\n          event.dateTimeObject = new Date(match[1]);\n        }\n\n        this.trigger('data', event);\n        return;\n      }\n\n      match = /^#EXT-X-KEY:(.*)$/.exec(newLine);\n\n      if (match) {\n        event = {\n          type: 'tag',\n          tagType: 'key'\n        };\n\n        if (match[1]) {\n          event.attributes = parseAttributes(match[1]); // parse the IV string into a Uint32Array\n\n          if (event.attributes.IV) {\n            if (event.attributes.IV.substring(0, 2).toLowerCase() === '0x') {\n              event.attributes.IV = event.attributes.IV.substring(2);\n            }\n\n            event.attributes.IV = event.attributes.IV.match(/.{8}/g);\n            event.attributes.IV[0] = parseInt(event.attributes.IV[0], 16);\n            event.attributes.IV[1] = parseInt(event.attributes.IV[1], 16);\n            event.attributes.IV[2] = parseInt(event.attributes.IV[2], 16);\n            event.attributes.IV[3] = parseInt(event.attributes.IV[3], 16);\n            event.attributes.IV = new Uint32Array(event.attributes.IV);\n          }\n        }\n\n        this.trigger('data', event);\n        return;\n      }\n\n      match = /^#EXT-X-START:(.*)$/.exec(newLine);\n\n      if (match) {\n        event = {\n          type: 'tag',\n          tagType: 'start'\n        };\n\n        if (match[1]) {\n          event.attributes = parseAttributes(match[1]);\n          event.attributes['TIME-OFFSET'] = parseFloat(event.attributes['TIME-OFFSET']);\n          event.attributes.PRECISE = /YES/.test(event.attributes.PRECISE);\n        }\n\n        this.trigger('data', event);\n        return;\n      }\n\n      match = /^#EXT-X-CUE-OUT-CONT:(.*)?$/.exec(newLine);\n\n      if (match) {\n        event = {\n          type: 'tag',\n          tagType: 'cue-out-cont'\n        };\n\n        if (match[1]) {\n          event.data = match[1];\n        } else {\n          event.data = '';\n        }\n\n        this.trigger('data', event);\n        return;\n      }\n\n      match = /^#EXT-X-CUE-OUT:(.*)?$/.exec(newLine);\n\n      if (match) {\n        event = {\n          type: 'tag',\n          tagType: 'cue-out'\n        };\n\n        if (match[1]) {\n          event.data = match[1];\n        } else {\n          event.data = '';\n        }\n\n        this.trigger('data', event);\n        return;\n      }\n\n      match = /^#EXT-X-CUE-IN:?(.*)?$/.exec(newLine);\n\n      if (match) {\n        event = {\n          type: 'tag',\n          tagType: 'cue-in'\n        };\n\n        if (match[1]) {\n          event.data = match[1];\n        } else {\n          event.data = '';\n        }\n\n        this.trigger('data', event);\n        return;\n      }\n\n      match = /^#EXT-X-SKIP:(.*)$/.exec(newLine);\n\n      if (match && match[1]) {\n        event = {\n          type: 'tag',\n          tagType: 'skip'\n        };\n        event.attributes = parseAttributes(match[1]);\n\n        if (event.attributes.hasOwnProperty('SKIPPED-SEGMENTS')) {\n          event.attributes['SKIPPED-SEGMENTS'] = parseInt(event.attributes['SKIPPED-SEGMENTS'], 10);\n        }\n\n        if (event.attributes.hasOwnProperty('RECENTLY-REMOVED-DATERANGES')) {\n          event.attributes['RECENTLY-REMOVED-DATERANGES'] = event.attributes['RECENTLY-REMOVED-DATERANGES'].split(TAB);\n        }\n\n        this.trigger('data', event);\n        return;\n      }\n\n      match = /^#EXT-X-PART:(.*)$/.exec(newLine);\n\n      if (match && match[1]) {\n        event = {\n          type: 'tag',\n          tagType: 'part'\n        };\n        event.attributes = parseAttributes(match[1]);\n        ['DURATION'].forEach(function (key) {\n          if (event.attributes.hasOwnProperty(key)) {\n            event.attributes[key] = parseFloat(event.attributes[key]);\n          }\n        });\n        ['INDEPENDENT', 'GAP'].forEach(function (key) {\n          if (event.attributes.hasOwnProperty(key)) {\n            event.attributes[key] = /YES/.test(event.attributes[key]);\n          }\n        });\n\n        if (event.attributes.hasOwnProperty('BYTERANGE')) {\n          event.attributes.byterange = parseByterange(event.attributes.BYTERANGE);\n        }\n\n        this.trigger('data', event);\n        return;\n      }\n\n      match = /^#EXT-X-SERVER-CONTROL:(.*)$/.exec(newLine);\n\n      if (match && match[1]) {\n        event = {\n          type: 'tag',\n          tagType: 'server-control'\n        };\n        event.attributes = parseAttributes(match[1]);\n        ['CAN-SKIP-UNTIL', 'PART-HOLD-BACK', 'HOLD-BACK'].forEach(function (key) {\n          if (event.attributes.hasOwnProperty(key)) {\n            event.attributes[key] = parseFloat(event.attributes[key]);\n          }\n        });\n        ['CAN-SKIP-DATERANGES', 'CAN-BLOCK-RELOAD'].forEach(function (key) {\n          if (event.attributes.hasOwnProperty(key)) {\n            event.attributes[key] = /YES/.test(event.attributes[key]);\n          }\n        });\n        this.trigger('data', event);\n        return;\n      }\n\n      match = /^#EXT-X-PART-INF:(.*)$/.exec(newLine);\n\n      if (match && match[1]) {\n        event = {\n          type: 'tag',\n          tagType: 'part-inf'\n        };\n        event.attributes = parseAttributes(match[1]);\n        ['PART-TARGET'].forEach(function (key) {\n          if (event.attributes.hasOwnProperty(key)) {\n            event.attributes[key] = parseFloat(event.attributes[key]);\n          }\n        });\n        this.trigger('data', event);\n        return;\n      }\n\n      match = /^#EXT-X-PRELOAD-HINT:(.*)$/.exec(newLine);\n\n      if (match && match[1]) {\n        event = {\n          type: 'tag',\n          tagType: 'preload-hint'\n        };\n        event.attributes = parseAttributes(match[1]);\n        ['BYTERANGE-START', 'BYTERANGE-LENGTH'].forEach(function (key) {\n          if (event.attributes.hasOwnProperty(key)) {\n            event.attributes[key] = parseInt(event.attributes[key], 10);\n            const subkey = key === 'BYTERANGE-LENGTH' ? 'length' : 'offset';\n            event.attributes.byterange = event.attributes.byterange || {};\n            event.attributes.byterange[subkey] = event.attributes[key]; // only keep the parsed byterange object.\n\n            delete event.attributes[key];\n          }\n        });\n        this.trigger('data', event);\n        return;\n      }\n\n      match = /^#EXT-X-RENDITION-REPORT:(.*)$/.exec(newLine);\n\n      if (match && match[1]) {\n        event = {\n          type: 'tag',\n          tagType: 'rendition-report'\n        };\n        event.attributes = parseAttributes(match[1]);\n        ['LAST-MSN', 'LAST-PART'].forEach(function (key) {\n          if (event.attributes.hasOwnProperty(key)) {\n            event.attributes[key] = parseInt(event.attributes[key], 10);\n          }\n        });\n        this.trigger('data', event);\n        return;\n      }\n\n      match = /^#EXT-X-DATERANGE:(.*)$/.exec(newLine);\n\n      if (match && match[1]) {\n        event = {\n          type: 'tag',\n          tagType: 'daterange'\n        };\n        event.attributes = parseAttributes(match[1]);\n        ['ID', 'CLASS'].forEach(function (key) {\n          if (event.attributes.hasOwnProperty(key)) {\n            event.attributes[key] = String(event.attributes[key]);\n          }\n        });\n        ['START-DATE', 'END-DATE'].forEach(function (key) {\n          if (event.attributes.hasOwnProperty(key)) {\n            event.attributes[key] = new Date(event.attributes[key]);\n          }\n        });\n        ['DURATION', 'PLANNED-DURATION'].forEach(function (key) {\n          if (event.attributes.hasOwnProperty(key)) {\n            event.attributes[key] = parseFloat(event.attributes[key]);\n          }\n        });\n        ['END-ON-NEXT'].forEach(function (key) {\n          if (event.attributes.hasOwnProperty(key)) {\n            event.attributes[key] = /YES/i.test(event.attributes[key]);\n          }\n        });\n        ['SCTE35-CMD', ' SCTE35-OUT', 'SCTE35-IN'].forEach(function (key) {\n          if (event.attributes.hasOwnProperty(key)) {\n            event.attributes[key] = event.attributes[key].toString(16);\n          }\n        });\n        const clientAttributePattern = /^X-([A-Z]+-)+[A-Z]+$/;\n\n        for (const key in event.attributes) {\n          if (!clientAttributePattern.test(key)) {\n            continue;\n          }\n\n          const isHexaDecimal = /[0-9A-Fa-f]{6}/g.test(event.attributes[key]);\n          const isDecimalFloating = /^\\d+(\\.\\d+)?$/.test(event.attributes[key]);\n          event.attributes[key] = isHexaDecimal ? event.attributes[key].toString(16) : isDecimalFloating ? parseFloat(event.attributes[key]) : String(event.attributes[key]);\n        }\n\n        this.trigger('data', event);\n        return;\n      }\n\n      match = /^#EXT-X-INDEPENDENT-SEGMENTS/.exec(newLine);\n\n      if (match) {\n        this.trigger('data', {\n          type: 'tag',\n          tagType: 'independent-segments'\n        });\n        return;\n      }\n\n      match = /^#EXT-X-I-FRAMES-ONLY/.exec(newLine);\n\n      if (match) {\n        this.trigger('data', {\n          type: 'tag',\n          tagType: 'i-frames-only'\n        });\n        return;\n      }\n\n      match = /^#EXT-X-CONTENT-STEERING:(.*)$/.exec(newLine);\n\n      if (match) {\n        event = {\n          type: 'tag',\n          tagType: 'content-steering'\n        };\n        event.attributes = parseAttributes(match[1]);\n        this.trigger('data', event);\n        return;\n      }\n\n      match = /^#EXT-X-I-FRAME-STREAM-INF:(.*)$/.exec(newLine);\n\n      if (match) {\n        event = {\n          type: 'tag',\n          tagType: 'i-frame-playlist'\n        };\n        event.attributes = parseAttributes(match[1]);\n\n        if (event.attributes.URI) {\n          event.uri = event.attributes.URI;\n        }\n\n        if (event.attributes.BANDWIDTH) {\n          event.attributes.BANDWIDTH = parseInt(event.attributes.BANDWIDTH, 10);\n        }\n\n        if (event.attributes.RESOLUTION) {\n          event.attributes.RESOLUTION = parseResolution(event.attributes.RESOLUTION);\n        }\n\n        if (event.attributes['AVERAGE-BANDWIDTH']) {\n          event.attributes['AVERAGE-BANDWIDTH'] = parseInt(event.attributes['AVERAGE-BANDWIDTH'], 10);\n        }\n\n        if (event.attributes['FRAME-RATE']) {\n          event.attributes['FRAME-RATE'] = parseFloat(event.attributes['FRAME-RATE']);\n        }\n\n        this.trigger('data', event);\n        return;\n      }\n\n      match = /^#EXT-X-DEFINE:(.*)$/.exec(newLine);\n\n      if (match) {\n        event = {\n          type: 'tag',\n          tagType: 'define'\n        };\n        event.attributes = parseAttributes(match[1]);\n        this.trigger('data', event);\n        return;\n      } // unknown tag type\n\n\n      this.trigger('data', {\n        type: 'tag',\n        data: newLine.slice(4)\n      });\n    });\n  }\n  /**\n   * Add a parser for custom headers\n   *\n   * @param {Object}   options              a map of options for the added parser\n   * @param {RegExp}   options.expression   a regular expression to match the custom header\n   * @param {string}   options.customType   the custom type to register to the output\n   * @param {Function} [options.dataParser] function to parse the line into an object\n   * @param {boolean}  [options.segment]    should tag data be attached to the segment object\n   */\n\n\n  addParser({\n    expression,\n    customType,\n    dataParser,\n    segment\n  }) {\n    if (typeof dataParser !== 'function') {\n      dataParser = line => line;\n    }\n\n    this.customParsers.push(line => {\n      const match = expression.exec(line);\n\n      if (match) {\n        this.trigger('data', {\n          type: 'custom',\n          data: dataParser(line),\n          customType,\n          segment\n        });\n        return true;\n      }\n    });\n  }\n  /**\n   * Add a custom header mapper\n   *\n   * @param {Object}   options\n   * @param {RegExp}   options.expression   a regular expression to match the custom header\n   * @param {Function} options.map          function to translate tag into a different tag\n   */\n\n\n  addTagMapper({\n    expression,\n    map\n  }) {\n    const mapFn = line => {\n      if (expression.test(line)) {\n        return map(line);\n      }\n\n      return line;\n    };\n\n    this.tagMappers.push(mapFn);\n  }\n\n}\n\nconst camelCase = str => str.toLowerCase().replace(/-(\\w)/g, a => a[1].toUpperCase());\n\nconst camelCaseKeys = function (attributes) {\n  const result = {};\n  Object.keys(attributes).forEach(function (key) {\n    result[camelCase(key)] = attributes[key];\n  });\n  return result;\n}; // set SERVER-CONTROL hold back based upon targetDuration and partTargetDuration\n// we need this helper because defaults are based upon targetDuration and\n// partTargetDuration being set, but they may not be if SERVER-CONTROL appears before\n// target durations are set.\n\n\nconst setHoldBack = function (manifest) {\n  const {\n    serverControl,\n    targetDuration,\n    partTargetDuration\n  } = manifest;\n\n  if (!serverControl) {\n    return;\n  }\n\n  const tag = '#EXT-X-SERVER-CONTROL';\n  const hb = 'holdBack';\n  const phb = 'partHoldBack';\n  const minTargetDuration = targetDuration && targetDuration * 3;\n  const minPartDuration = partTargetDuration && partTargetDuration * 2;\n\n  if (targetDuration && !serverControl.hasOwnProperty(hb)) {\n    serverControl[hb] = minTargetDuration;\n    this.trigger('info', {\n      message: `${tag} defaulting HOLD-BACK to targetDuration * 3 (${minTargetDuration}).`\n    });\n  }\n\n  if (minTargetDuration && serverControl[hb] < minTargetDuration) {\n    this.trigger('warn', {\n      message: `${tag} clamping HOLD-BACK (${serverControl[hb]}) to targetDuration * 3 (${minTargetDuration})`\n    });\n    serverControl[hb] = minTargetDuration;\n  } // default no part hold back to part target duration * 3\n\n\n  if (partTargetDuration && !serverControl.hasOwnProperty(phb)) {\n    serverControl[phb] = partTargetDuration * 3;\n    this.trigger('info', {\n      message: `${tag} defaulting PART-HOLD-BACK to partTargetDuration * 3 (${serverControl[phb]}).`\n    });\n  } // if part hold back is too small default it to part target duration * 2\n\n\n  if (partTargetDuration && serverControl[phb] < minPartDuration) {\n    this.trigger('warn', {\n      message: `${tag} clamping PART-HOLD-BACK (${serverControl[phb]}) to partTargetDuration * 2 (${minPartDuration}).`\n    });\n    serverControl[phb] = minPartDuration;\n  }\n};\n/**\n * A parser for M3U8 files. The current interpretation of the input is\n * exposed as a property `manifest` on parser objects. It's just two lines to\n * create and parse a manifest once you have the contents available as a string:\n *\n * ```js\n * var parser = new m3u8.Parser();\n * parser.push(xhr.responseText);\n * ```\n *\n * New input can later be applied to update the manifest object by calling\n * `push` again.\n *\n * The parser attempts to create a usable manifest object even if the\n * underlying input is somewhat nonsensical. It emits `info` and `warning`\n * events during the parse if it encounters input that seems invalid or\n * requires some property of the manifest object to be defaulted.\n *\n * @class Parser\n * @param {Object} [opts] Options for the constructor, needed for substitutions\n * @param {string} [opts.uri] URL to check for query params\n * @param {Object} [opts.mainDefinitions] Definitions on main playlist that can be imported\n * @extends Stream\n */\n\n\nclass Parser extends Stream {\n  constructor(opts = {}) {\n    super();\n    this.lineStream = new LineStream();\n    this.parseStream = new ParseStream();\n    this.lineStream.pipe(this.parseStream);\n    this.mainDefinitions = opts.mainDefinitions || {};\n    this.params = new URL(opts.uri, 'https://a.com').searchParams;\n    this.lastProgramDateTime = null;\n    /* eslint-disable consistent-this */\n\n    const self = this;\n    /* eslint-enable consistent-this */\n\n    const uris = [];\n    let currentUri = {}; // if specified, the active EXT-X-MAP definition\n\n    let currentMap; // if specified, the active decryption key\n\n    let key;\n    let hasParts = false;\n\n    const noop = function () {};\n\n    const defaultMediaGroups = {\n      'AUDIO': {},\n      'VIDEO': {},\n      'CLOSED-CAPTIONS': {},\n      'SUBTITLES': {}\n    }; // This is the Widevine UUID from DASH IF IOP. The same exact string is\n    // used in MPDs with Widevine encrypted streams.\n\n    const widevineUuid = 'urn:uuid:edef8ba9-79d6-4ace-a3c8-27dcd51d21ed'; // group segments into numbered timelines delineated by discontinuities\n\n    let currentTimeline = 0; // the manifest is empty until the parse stream begins delivering data\n\n    this.manifest = {\n      allowCache: true,\n      discontinuityStarts: [],\n      dateRanges: [],\n      iFramePlaylists: [],\n      segments: []\n    }; // keep track of the last seen segment's byte range end, as segments are not required\n    // to provide the offset, in which case it defaults to the next byte after the\n    // previous segment\n\n    let lastByterangeEnd = 0; // keep track of the last seen part's byte range end.\n\n    let lastPartByterangeEnd = 0;\n    const dateRangeTags = {};\n    this.on('end', () => {\n      // only add preloadSegment if we don't yet have a uri for it.\n      // and we actually have parts/preloadHints\n      if (currentUri.uri || !currentUri.parts && !currentUri.preloadHints) {\n        return;\n      }\n\n      if (!currentUri.map && currentMap) {\n        currentUri.map = currentMap;\n      }\n\n      if (!currentUri.key && key) {\n        currentUri.key = key;\n      }\n\n      if (!currentUri.timeline && typeof currentTimeline === 'number') {\n        currentUri.timeline = currentTimeline;\n      }\n\n      this.manifest.preloadSegment = currentUri;\n    }); // update the manifest with the m3u8 entry from the parse stream\n\n    this.parseStream.on('data', function (entry) {\n      let mediaGroup;\n      let rendition; // Replace variables in uris and attributes as defined in #EXT-X-DEFINE tags\n\n      if (self.manifest.definitions) {\n        for (const def in self.manifest.definitions) {\n          if (entry.uri) {\n            entry.uri = entry.uri.replace(`{$${def}}`, self.manifest.definitions[def]);\n          }\n\n          if (entry.attributes) {\n            for (const attr in entry.attributes) {\n              if (typeof entry.attributes[attr] === 'string') {\n                entry.attributes[attr] = entry.attributes[attr].replace(`{$${def}}`, self.manifest.definitions[def]);\n              }\n            }\n          }\n        }\n      }\n\n      ({\n        tag() {\n          // switch based on the tag type\n          (({\n            version() {\n              if (entry.version) {\n                this.manifest.version = entry.version;\n              }\n            },\n\n            'allow-cache'() {\n              this.manifest.allowCache = entry.allowed;\n\n              if (!('allowed' in entry)) {\n                this.trigger('info', {\n                  message: 'defaulting allowCache to YES'\n                });\n                this.manifest.allowCache = true;\n              }\n            },\n\n            byterange() {\n              const byterange = {};\n\n              if ('length' in entry) {\n                currentUri.byterange = byterange;\n                byterange.length = entry.length;\n\n                if (!('offset' in entry)) {\n                  /*\n                   * From the latest spec (as of this writing):\n                   * https://tools.ietf.org/html/draft-pantos-http-live-streaming-23#section-4.3.2.2\n                   *\n                   * Same text since EXT-X-BYTERANGE's introduction in draft 7:\n                   * https://tools.ietf.org/html/draft-pantos-http-live-streaming-07#section-3.3.1)\n                   *\n                   * \"If o [offset] is not present, the sub-range begins at the next byte\n                   * following the sub-range of the previous media segment.\"\n                   */\n                  entry.offset = lastByterangeEnd;\n                }\n              }\n\n              if ('offset' in entry) {\n                currentUri.byterange = byterange;\n                byterange.offset = entry.offset;\n              }\n\n              lastByterangeEnd = byterange.offset + byterange.length;\n            },\n\n            endlist() {\n              this.manifest.endList = true;\n            },\n\n            inf() {\n              if (!('mediaSequence' in this.manifest)) {\n                this.manifest.mediaSequence = 0;\n                this.trigger('info', {\n                  message: 'defaulting media sequence to zero'\n                });\n              }\n\n              if (!('discontinuitySequence' in this.manifest)) {\n                this.manifest.discontinuitySequence = 0;\n                this.trigger('info', {\n                  message: 'defaulting discontinuity sequence to zero'\n                });\n              }\n\n              if (entry.title) {\n                currentUri.title = entry.title;\n              }\n\n              if (entry.duration > 0) {\n                currentUri.duration = entry.duration;\n              }\n\n              if (entry.duration === 0) {\n                currentUri.duration = 0.01;\n                this.trigger('info', {\n                  message: 'updating zero segment duration to a small value'\n                });\n              }\n\n              this.manifest.segments = uris;\n            },\n\n            key() {\n              if (!entry.attributes) {\n                this.trigger('warn', {\n                  message: 'ignoring key declaration without attribute list'\n                });\n                return;\n              } // clear the active encryption key\n\n\n              if (entry.attributes.METHOD === 'NONE') {\n                key = null;\n                return;\n              }\n\n              if (!entry.attributes.URI) {\n                this.trigger('warn', {\n                  message: 'ignoring key declaration without URI'\n                });\n                return;\n              }\n\n              if (entry.attributes.KEYFORMAT === 'com.apple.streamingkeydelivery') {\n                this.manifest.contentProtection = this.manifest.contentProtection || {}; // TODO: add full support for this.\n\n                this.manifest.contentProtection['com.apple.fps.1_0'] = {\n                  attributes: entry.attributes\n                };\n                return;\n              }\n\n              if (entry.attributes.KEYFORMAT === 'com.microsoft.playready') {\n                this.manifest.contentProtection = this.manifest.contentProtection || {}; // TODO: add full support for this.\n\n                this.manifest.contentProtection['com.microsoft.playready'] = {\n                  uri: entry.attributes.URI\n                };\n                return;\n              } // check if the content is encrypted for Widevine\n              // Widevine/HLS spec: https://storage.googleapis.com/wvdocs/Widevine_DRM_HLS.pdf\n\n\n              if (entry.attributes.KEYFORMAT === widevineUuid) {\n                const VALID_METHODS = ['SAMPLE-AES', 'SAMPLE-AES-CTR', 'SAMPLE-AES-CENC'];\n\n                if (VALID_METHODS.indexOf(entry.attributes.METHOD) === -1) {\n                  this.trigger('warn', {\n                    message: 'invalid key method provided for Widevine'\n                  });\n                  return;\n                }\n\n                if (entry.attributes.METHOD === 'SAMPLE-AES-CENC') {\n                  this.trigger('warn', {\n                    message: 'SAMPLE-AES-CENC is deprecated, please use SAMPLE-AES-CTR instead'\n                  });\n                }\n\n                if (entry.attributes.URI.substring(0, 23) !== 'data:text/plain;base64,') {\n                  this.trigger('warn', {\n                    message: 'invalid key URI provided for Widevine'\n                  });\n                  return;\n                }\n\n                if (!(entry.attributes.KEYID && entry.attributes.KEYID.substring(0, 2) === '0x')) {\n                  this.trigger('warn', {\n                    message: 'invalid key ID provided for Widevine'\n                  });\n                  return;\n                } // if Widevine key attributes are valid, store them as `contentProtection`\n                // on the manifest to emulate Widevine tag structure in a DASH mpd\n\n\n                this.manifest.contentProtection = this.manifest.contentProtection || {};\n                this.manifest.contentProtection['com.widevine.alpha'] = {\n                  attributes: {\n                    schemeIdUri: entry.attributes.KEYFORMAT,\n                    // remove '0x' from the key id string\n                    keyId: entry.attributes.KEYID.substring(2)\n                  },\n                  // decode the base64-encoded PSSH box\n                  pssh: decodeB64ToUint8Array(entry.attributes.URI.split(',')[1])\n                };\n                return;\n              }\n\n              if (!entry.attributes.METHOD) {\n                this.trigger('warn', {\n                  message: 'defaulting key method to AES-128'\n                });\n              } // setup an encryption key for upcoming segments\n\n\n              key = {\n                method: entry.attributes.METHOD || 'AES-128',\n                uri: entry.attributes.URI\n              };\n\n              if (typeof entry.attributes.IV !== 'undefined') {\n                key.iv = entry.attributes.IV;\n              }\n            },\n\n            'media-sequence'() {\n              if (!isFinite(entry.number)) {\n                this.trigger('warn', {\n                  message: 'ignoring invalid media sequence: ' + entry.number\n                });\n                return;\n              }\n\n              this.manifest.mediaSequence = entry.number;\n            },\n\n            'discontinuity-sequence'() {\n              if (!isFinite(entry.number)) {\n                this.trigger('warn', {\n                  message: 'ignoring invalid discontinuity sequence: ' + entry.number\n                });\n                return;\n              }\n\n              this.manifest.discontinuitySequence = entry.number;\n              currentTimeline = entry.number;\n            },\n\n            'playlist-type'() {\n              if (!/VOD|EVENT/.test(entry.playlistType)) {\n                this.trigger('warn', {\n                  message: 'ignoring unknown playlist type: ' + entry.playlist\n                });\n                return;\n              }\n\n              this.manifest.playlistType = entry.playlistType;\n            },\n\n            map() {\n              currentMap = {};\n\n              if (entry.uri) {\n                currentMap.uri = entry.uri;\n              }\n\n              if (entry.byterange) {\n                currentMap.byterange = entry.byterange;\n              }\n\n              if (key) {\n                currentMap.key = key;\n              }\n            },\n\n            'stream-inf'() {\n              this.manifest.playlists = uris;\n              this.manifest.mediaGroups = this.manifest.mediaGroups || defaultMediaGroups;\n\n              if (!entry.attributes) {\n                this.trigger('warn', {\n                  message: 'ignoring empty stream-inf attributes'\n                });\n                return;\n              }\n\n              if (!currentUri.attributes) {\n                currentUri.attributes = {};\n              }\n\n              _extends(currentUri.attributes, entry.attributes);\n            },\n\n            media() {\n              this.manifest.mediaGroups = this.manifest.mediaGroups || defaultMediaGroups;\n\n              if (!(entry.attributes && entry.attributes.TYPE && entry.attributes['GROUP-ID'] && entry.attributes.NAME)) {\n                this.trigger('warn', {\n                  message: 'ignoring incomplete or missing media group'\n                });\n                return;\n              } // find the media group, creating defaults as necessary\n\n\n              const mediaGroupType = this.manifest.mediaGroups[entry.attributes.TYPE];\n              mediaGroupType[entry.attributes['GROUP-ID']] = mediaGroupType[entry.attributes['GROUP-ID']] || {};\n              mediaGroup = mediaGroupType[entry.attributes['GROUP-ID']]; // collect the rendition metadata\n\n              rendition = {\n                default: /yes/i.test(entry.attributes.DEFAULT)\n              };\n\n              if (rendition.default) {\n                rendition.autoselect = true;\n              } else {\n                rendition.autoselect = /yes/i.test(entry.attributes.AUTOSELECT);\n              }\n\n              if (entry.attributes.LANGUAGE) {\n                rendition.language = entry.attributes.LANGUAGE;\n              }\n\n              if (entry.attributes.URI) {\n                rendition.uri = entry.attributes.URI;\n              }\n\n              if (entry.attributes['INSTREAM-ID']) {\n                rendition.instreamId = entry.attributes['INSTREAM-ID'];\n              }\n\n              if (entry.attributes.CHARACTERISTICS) {\n                rendition.characteristics = entry.attributes.CHARACTERISTICS;\n              }\n\n              if (entry.attributes.FORCED) {\n                rendition.forced = /yes/i.test(entry.attributes.FORCED);\n              } // insert the new rendition\n\n\n              mediaGroup[entry.attributes.NAME] = rendition;\n            },\n\n            discontinuity() {\n              currentTimeline += 1;\n              currentUri.discontinuity = true;\n              this.manifest.discontinuityStarts.push(uris.length);\n            },\n\n            'program-date-time'() {\n              if (typeof this.manifest.dateTimeString === 'undefined') {\n                // PROGRAM-DATE-TIME is a media-segment tag, but for backwards\n                // compatibility, we add the first occurence of the PROGRAM-DATE-TIME tag\n                // to the manifest object\n                // TODO: Consider removing this in future major version\n                this.manifest.dateTimeString = entry.dateTimeString;\n                this.manifest.dateTimeObject = entry.dateTimeObject;\n              }\n\n              currentUri.dateTimeString = entry.dateTimeString;\n              currentUri.dateTimeObject = entry.dateTimeObject;\n              const {\n                lastProgramDateTime\n              } = this;\n              this.lastProgramDateTime = new Date(entry.dateTimeString).getTime(); // We should extrapolate Program Date Time backward only during first program date time occurrence.\n              // Once we have at least one program date time point, we can always extrapolate it forward using lastProgramDateTime reference.\n\n              if (lastProgramDateTime === null) {\n                // Extrapolate Program Date Time backward\n                // Since it is first program date time occurrence we're assuming that\n                // all this.manifest.segments have no program date time info\n                this.manifest.segments.reduceRight((programDateTime, segment) => {\n                  segment.programDateTime = programDateTime - segment.duration * 1000;\n                  return segment.programDateTime;\n                }, this.lastProgramDateTime);\n              }\n            },\n\n            targetduration() {\n              if (!isFinite(entry.duration) || entry.duration < 0) {\n                this.trigger('warn', {\n                  message: 'ignoring invalid target duration: ' + entry.duration\n                });\n                return;\n              }\n\n              this.manifest.targetDuration = entry.duration;\n              setHoldBack.call(this, this.manifest);\n            },\n\n            start() {\n              if (!entry.attributes || isNaN(entry.attributes['TIME-OFFSET'])) {\n                this.trigger('warn', {\n                  message: 'ignoring start declaration without appropriate attribute list'\n                });\n                return;\n              }\n\n              this.manifest.start = {\n                timeOffset: entry.attributes['TIME-OFFSET'],\n                precise: entry.attributes.PRECISE\n              };\n            },\n\n            'cue-out'() {\n              currentUri.cueOut = entry.data;\n            },\n\n            'cue-out-cont'() {\n              currentUri.cueOutCont = entry.data;\n            },\n\n            'cue-in'() {\n              currentUri.cueIn = entry.data;\n            },\n\n            'skip'() {\n              this.manifest.skip = camelCaseKeys(entry.attributes);\n              this.warnOnMissingAttributes_('#EXT-X-SKIP', entry.attributes, ['SKIPPED-SEGMENTS']);\n            },\n\n            'part'() {\n              hasParts = true; // parts are always specifed before a segment\n\n              const segmentIndex = this.manifest.segments.length;\n              const part = camelCaseKeys(entry.attributes);\n              currentUri.parts = currentUri.parts || [];\n              currentUri.parts.push(part);\n\n              if (part.byterange) {\n                if (!part.byterange.hasOwnProperty('offset')) {\n                  part.byterange.offset = lastPartByterangeEnd;\n                }\n\n                lastPartByterangeEnd = part.byterange.offset + part.byterange.length;\n              }\n\n              const partIndex = currentUri.parts.length - 1;\n              this.warnOnMissingAttributes_(`#EXT-X-PART #${partIndex} for segment #${segmentIndex}`, entry.attributes, ['URI', 'DURATION']);\n\n              if (this.manifest.renditionReports) {\n                this.manifest.renditionReports.forEach((r, i) => {\n                  if (!r.hasOwnProperty('lastPart')) {\n                    this.trigger('warn', {\n                      message: `#EXT-X-RENDITION-REPORT #${i} lacks required attribute(s): LAST-PART`\n                    });\n                  }\n                });\n              }\n            },\n\n            'server-control'() {\n              const attrs = this.manifest.serverControl = camelCaseKeys(entry.attributes);\n\n              if (!attrs.hasOwnProperty('canBlockReload')) {\n                attrs.canBlockReload = false;\n                this.trigger('info', {\n                  message: '#EXT-X-SERVER-CONTROL defaulting CAN-BLOCK-RELOAD to false'\n                });\n              }\n\n              setHoldBack.call(this, this.manifest);\n\n              if (attrs.canSkipDateranges && !attrs.hasOwnProperty('canSkipUntil')) {\n                this.trigger('warn', {\n                  message: '#EXT-X-SERVER-CONTROL lacks required attribute CAN-SKIP-UNTIL which is required when CAN-SKIP-DATERANGES is set'\n                });\n              }\n            },\n\n            'preload-hint'() {\n              // parts are always specifed before a segment\n              const segmentIndex = this.manifest.segments.length;\n              const hint = camelCaseKeys(entry.attributes);\n              const isPart = hint.type && hint.type === 'PART';\n              currentUri.preloadHints = currentUri.preloadHints || [];\n              currentUri.preloadHints.push(hint);\n\n              if (hint.byterange) {\n                if (!hint.byterange.hasOwnProperty('offset')) {\n                  // use last part byterange end or zero if not a part.\n                  hint.byterange.offset = isPart ? lastPartByterangeEnd : 0;\n\n                  if (isPart) {\n                    lastPartByterangeEnd = hint.byterange.offset + hint.byterange.length;\n                  }\n                }\n              }\n\n              const index = currentUri.preloadHints.length - 1;\n              this.warnOnMissingAttributes_(`#EXT-X-PRELOAD-HINT #${index} for segment #${segmentIndex}`, entry.attributes, ['TYPE', 'URI']);\n\n              if (!hint.type) {\n                return;\n              } // search through all preload hints except for the current one for\n              // a duplicate type.\n\n\n              for (let i = 0; i < currentUri.preloadHints.length - 1; i++) {\n                const otherHint = currentUri.preloadHints[i];\n\n                if (!otherHint.type) {\n                  continue;\n                }\n\n                if (otherHint.type === hint.type) {\n                  this.trigger('warn', {\n                    message: `#EXT-X-PRELOAD-HINT #${index} for segment #${segmentIndex} has the same TYPE ${hint.type} as preload hint #${i}`\n                  });\n                }\n              }\n            },\n\n            'rendition-report'() {\n              const report = camelCaseKeys(entry.attributes);\n              this.manifest.renditionReports = this.manifest.renditionReports || [];\n              this.manifest.renditionReports.push(report);\n              const index = this.manifest.renditionReports.length - 1;\n              const required = ['LAST-MSN', 'URI'];\n\n              if (hasParts) {\n                required.push('LAST-PART');\n              }\n\n              this.warnOnMissingAttributes_(`#EXT-X-RENDITION-REPORT #${index}`, entry.attributes, required);\n            },\n\n            'part-inf'() {\n              this.manifest.partInf = camelCaseKeys(entry.attributes);\n              this.warnOnMissingAttributes_('#EXT-X-PART-INF', entry.attributes, ['PART-TARGET']);\n\n              if (this.manifest.partInf.partTarget) {\n                this.manifest.partTargetDuration = this.manifest.partInf.partTarget;\n              }\n\n              setHoldBack.call(this, this.manifest);\n            },\n\n            'daterange'() {\n              this.manifest.dateRanges.push(camelCaseKeys(entry.attributes));\n              const index = this.manifest.dateRanges.length - 1;\n              this.warnOnMissingAttributes_(`#EXT-X-DATERANGE #${index}`, entry.attributes, ['ID', 'START-DATE']);\n              const dateRange = this.manifest.dateRanges[index];\n\n              if (dateRange.endDate && dateRange.startDate && new Date(dateRange.endDate) < new Date(dateRange.startDate)) {\n                this.trigger('warn', {\n                  message: 'EXT-X-DATERANGE END-DATE must be equal to or later than the value of the START-DATE'\n                });\n              }\n\n              if (dateRange.duration && dateRange.duration < 0) {\n                this.trigger('warn', {\n                  message: 'EXT-X-DATERANGE DURATION must not be negative'\n                });\n              }\n\n              if (dateRange.plannedDuration && dateRange.plannedDuration < 0) {\n                this.trigger('warn', {\n                  message: 'EXT-X-DATERANGE PLANNED-DURATION must not be negative'\n                });\n              }\n\n              const endOnNextYes = !!dateRange.endOnNext;\n\n              if (endOnNextYes && !dateRange.class) {\n                this.trigger('warn', {\n                  message: 'EXT-X-DATERANGE with an END-ON-NEXT=YES attribute must have a CLASS attribute'\n                });\n              }\n\n              if (endOnNextYes && (dateRange.duration || dateRange.endDate)) {\n                this.trigger('warn', {\n                  message: 'EXT-X-DATERANGE with an END-ON-NEXT=YES attribute must not contain DURATION or END-DATE attributes'\n                });\n              }\n\n              if (dateRange.duration && dateRange.endDate) {\n                const startDate = dateRange.startDate;\n                const newDateInSeconds = startDate.getTime() + dateRange.duration * 1000;\n                this.manifest.dateRanges[index].endDate = new Date(newDateInSeconds);\n              }\n\n              if (!dateRangeTags[dateRange.id]) {\n                dateRangeTags[dateRange.id] = dateRange;\n              } else {\n                for (const attribute in dateRangeTags[dateRange.id]) {\n                  if (!!dateRange[attribute] && JSON.stringify(dateRangeTags[dateRange.id][attribute]) !== JSON.stringify(dateRange[attribute])) {\n                    this.trigger('warn', {\n                      message: 'EXT-X-DATERANGE tags with the same ID in a playlist must have the same attributes values'\n                    });\n                    break;\n                  }\n                } // if tags with the same ID do not have conflicting attributes, merge them\n\n\n                const dateRangeWithSameId = this.manifest.dateRanges.findIndex(dateRangeToFind => dateRangeToFind.id === dateRange.id);\n                this.manifest.dateRanges[dateRangeWithSameId] = _extends(this.manifest.dateRanges[dateRangeWithSameId], dateRange);\n                dateRangeTags[dateRange.id] = _extends(dateRangeTags[dateRange.id], dateRange); // after merging, delete the duplicate dateRange that was added last\n\n                this.manifest.dateRanges.pop();\n              }\n            },\n\n            'independent-segments'() {\n              this.manifest.independentSegments = true;\n            },\n\n            'i-frames-only'() {\n              this.manifest.iFramesOnly = true;\n              this.requiredCompatibilityversion(this.manifest.version, 4);\n            },\n\n            'content-steering'() {\n              this.manifest.contentSteering = camelCaseKeys(entry.attributes);\n              this.warnOnMissingAttributes_('#EXT-X-CONTENT-STEERING', entry.attributes, ['SERVER-URI']);\n            },\n\n            /** @this {Parser} */\n            define() {\n              this.manifest.definitions = this.manifest.definitions || {};\n\n              const addDef = (n, v) => {\n                if (n in this.manifest.definitions) {\n                  // An EXT-X-DEFINE tag MUST NOT specify the same Variable Name as any other\n                  // EXT-X-DEFINE tag in the same Playlist.  Parsers that encounter duplicate\n                  // Variable Name declarations MUST fail to parse the Playlist.\n                  this.trigger('error', {\n                    message: `EXT-X-DEFINE: Duplicate name ${n}`\n                  });\n                  return;\n                }\n\n                this.manifest.definitions[n] = v;\n              };\n\n              if ('QUERYPARAM' in entry.attributes) {\n                if ('NAME' in entry.attributes || 'IMPORT' in entry.attributes) {\n                  // An EXT-X-DEFINE tag MUST contain either a NAME, an IMPORT, or a\n                  // QUERYPARAM attribute, but only one of the three.  Otherwise, the\n                  // client MUST fail to parse the Playlist.\n                  this.trigger('error', {\n                    message: 'EXT-X-DEFINE: Invalid attributes'\n                  });\n                  return;\n                }\n\n                const val = this.params.get(entry.attributes.QUERYPARAM);\n\n                if (!val) {\n                  // If the QUERYPARAM attribute value does not match any query parameter in\n                  // the URI or the matching parameter has no associated value, the parser\n                  // MUST fail to parse the Playlist.  If more than one parameter matches,\n                  // any of the associated values MAY be used.\n                  this.trigger('error', {\n                    message: `EXT-X-DEFINE: No query param ${entry.attributes.QUERYPARAM}`\n                  });\n                  return;\n                }\n\n                addDef(entry.attributes.QUERYPARAM, decodeURIComponent(val));\n                return;\n              }\n\n              if ('NAME' in entry.attributes) {\n                if ('IMPORT' in entry.attributes) {\n                  // An EXT-X-DEFINE tag MUST contain either a NAME, an IMPORT, or a\n                  // QUERYPARAM attribute, but only one of the three.  Otherwise, the\n                  // client MUST fail to parse the Playlist.\n                  this.trigger('error', {\n                    message: 'EXT-X-DEFINE: Invalid attributes'\n                  });\n                  return;\n                }\n\n                if (!('VALUE' in entry.attributes) || typeof entry.attributes.VALUE !== 'string') {\n                  // This attribute is REQUIRED if the EXT-X-DEFINE tag has a NAME attribute.\n                  // The quoted-string MAY be empty.\n                  this.trigger('error', {\n                    message: `EXT-X-DEFINE: No value for ${entry.attributes.NAME}`\n                  });\n                  return;\n                }\n\n                addDef(entry.attributes.NAME, entry.attributes.VALUE);\n                return;\n              }\n\n              if ('IMPORT' in entry.attributes) {\n                if (!this.mainDefinitions[entry.attributes.IMPORT]) {\n                  // Covers two conditions, as mainDefinitions will always be empty on main\n                  //\n                  // EXT-X-DEFINE tags containing the IMPORT attribute MUST NOT occur in\n                  // Multivariant Playlists; they are only allowed in Media Playlists.\n                  //\n                  // If the IMPORT attribute value does not match any Variable Name in the\n                  // Multivariant Playlist, or if the Media Playlist loaded from a\n                  // Multivariant Playlist, the parser MUST fail the Playlist.\n                  this.trigger('error', {\n                    message: `EXT-X-DEFINE: No value ${entry.attributes.IMPORT} to import, or IMPORT used on main playlist`\n                  });\n                  return;\n                }\n\n                addDef(entry.attributes.IMPORT, this.mainDefinitions[entry.attributes.IMPORT]);\n                return;\n              } // An EXT-X-DEFINE tag MUST contain either a NAME, an IMPORT, or a QUERYPARAM\n              // attribute, but only one of the three.  Otherwise, the client MUST fail to\n              // parse the Playlist.\n\n\n              this.trigger('error', {\n                message: 'EXT-X-DEFINE: No attribute'\n              });\n            },\n\n            'i-frame-playlist'() {\n              this.manifest.iFramePlaylists.push({\n                attributes: entry.attributes,\n                uri: entry.uri,\n                timeline: currentTimeline\n              });\n              this.warnOnMissingAttributes_('#EXT-X-I-FRAME-STREAM-INF', entry.attributes, ['BANDWIDTH', 'URI']);\n            }\n\n          })[entry.tagType] || noop).call(self);\n        },\n\n        uri() {\n          currentUri.uri = entry.uri;\n          uris.push(currentUri); // if no explicit duration was declared, use the target duration\n\n          if (this.manifest.targetDuration && !('duration' in currentUri)) {\n            this.trigger('warn', {\n              message: 'defaulting segment duration to the target duration'\n            });\n            currentUri.duration = this.manifest.targetDuration;\n          } // annotate with encryption information, if necessary\n\n\n          if (key) {\n            currentUri.key = key;\n          }\n\n          currentUri.timeline = currentTimeline; // annotate with initialization segment information, if necessary\n\n          if (currentMap) {\n            currentUri.map = currentMap;\n          } // reset the last byterange end as it needs to be 0 between parts\n\n\n          lastPartByterangeEnd = 0; // Once we have at least one program date time we can always extrapolate it forward\n\n          if (this.lastProgramDateTime !== null) {\n            currentUri.programDateTime = this.lastProgramDateTime;\n            this.lastProgramDateTime += currentUri.duration * 1000;\n          } // prepare for the next URI\n\n\n          currentUri = {};\n        },\n\n        comment() {// comments are not important for playback\n        },\n\n        custom() {\n          // if this is segment-level data attach the output to the segment\n          if (entry.segment) {\n            currentUri.custom = currentUri.custom || {};\n            currentUri.custom[entry.customType] = entry.data; // if this is manifest-level data attach to the top level manifest object\n          } else {\n            this.manifest.custom = this.manifest.custom || {};\n            this.manifest.custom[entry.customType] = entry.data;\n          }\n        }\n\n      })[entry.type].call(self);\n    });\n  }\n\n  requiredCompatibilityversion(currentVersion, targetVersion) {\n    if (currentVersion < targetVersion || !currentVersion) {\n      this.trigger('warn', {\n        message: `manifest must be at least version ${targetVersion}`\n      });\n    }\n  }\n\n  warnOnMissingAttributes_(identifier, attributes, required) {\n    const missing = [];\n    required.forEach(function (key) {\n      if (!attributes.hasOwnProperty(key)) {\n        missing.push(key);\n      }\n    });\n\n    if (missing.length) {\n      this.trigger('warn', {\n        message: `${identifier} lacks required attribute(s): ${missing.join(', ')}`\n      });\n    }\n  }\n  /**\n   * Parse the input string and update the manifest object.\n   *\n   * @param {string} chunk a potentially incomplete portion of the manifest\n   */\n\n\n  push(chunk) {\n    this.lineStream.push(chunk);\n  }\n  /**\n   * Flush any remaining input. This can be handy if the last line of an M3U8\n   * manifest did not contain a trailing newline but the file has been\n   * completely received.\n   */\n\n\n  end() {\n    // flush any buffered input\n    this.lineStream.push('\\n');\n\n    if (this.manifest.dateRanges.length && this.lastProgramDateTime === null) {\n      this.trigger('warn', {\n        message: 'A playlist with EXT-X-DATERANGE tag must contain atleast one EXT-X-PROGRAM-DATE-TIME tag'\n      });\n    }\n\n    this.lastProgramDateTime = null;\n    this.trigger('end');\n  }\n  /**\n   * Add an additional parser for non-standard tags\n   *\n   * @param {Object}   options              a map of options for the added parser\n   * @param {RegExp}   options.expression   a regular expression to match the custom header\n   * @param {string}   options.customType   the custom type to register to the output\n   * @param {Function} [options.dataParser] function to parse the line into an object\n   * @param {boolean}  [options.segment]    should tag data be attached to the segment object\n   */\n\n\n  addParser(options) {\n    this.parseStream.addParser(options);\n  }\n  /**\n   * Add a custom header mapper\n   *\n   * @param {Object}   options\n   * @param {RegExp}   options.expression   a regular expression to match the custom header\n   * @param {Function} options.map          function to translate tag into a different tag\n   */\n\n\n  addTagMapper(options) {\n    this.parseStream.addTagMapper(options);\n  }\n\n}\n\nexport { LineStream, ParseStream, Parser };\n","/**\n * Loops through all supported media groups in master and calls the provided\n * callback for each group\n *\n * @param {Object} master\n *        The parsed master manifest object\n * @param {string[]} groups\n *        The media groups to call the callback for\n * @param {Function} callback\n *        Callback to call for each media group\n */\nexport var forEachMediaGroup = function forEachMediaGroup(master, groups, callback) {\n  groups.forEach(function (mediaType) {\n    for (var groupKey in master.mediaGroups[mediaType]) {\n      for (var labelKey in master.mediaGroups[mediaType][groupKey]) {\n        var mediaProperties = master.mediaGroups[mediaType][groupKey][labelKey];\n        callback(mediaProperties, mediaType, groupKey, labelKey);\n      }\n    }\n  });\n};","'use strict'\n\n/**\n * Ponyfill for `Array.prototype.find` which is only available in ES6 runtimes.\n *\n * Works with anything that has a `length` property and index access properties, including NodeList.\n *\n * @template {unknown} T\n * @param {Array<T> | ({length:number, [number]: T})} list\n * @param {function (item: T, index: number, list:Array<T> | ({length:number, [number]: T})):boolean} predicate\n * @param {Partial<Pick<ArrayConstructor['prototype'], 'find'>>?} ac `Array.prototype` by default,\n * \t\t\t\tallows injecting a custom implementation in tests\n * @returns {T | undefined}\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/find\n * @see https://tc39.es/ecma262/multipage/indexed-collections.html#sec-array.prototype.find\n */\nfunction find(list, predicate, ac) {\n\tif (ac === undefined) {\n\t\tac = Array.prototype;\n\t}\n\tif (list && typeof ac.find === 'function') {\n\t\treturn ac.find.call(list, predicate);\n\t}\n\tfor (var i = 0; i < list.length; i++) {\n\t\tif (Object.prototype.hasOwnProperty.call(list, i)) {\n\t\t\tvar item = list[i];\n\t\t\tif (predicate.call(undefined, item, i, list)) {\n\t\t\t\treturn item;\n\t\t\t}\n\t\t}\n\t}\n}\n\n/**\n * \"Shallow freezes\" an object to render it immutable.\n * Uses `Object.freeze` if available,\n * otherwise the immutability is only in the type.\n *\n * Is used to create \"enum like\" objects.\n *\n * @template T\n * @param {T} object the object to freeze\n * @param {Pick<ObjectConstructor, 'freeze'> = Object} oc `Object` by default,\n * \t\t\t\tallows to inject custom object constructor for tests\n * @returns {Readonly<T>}\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/freeze\n */\nfunction freeze(object, oc) {\n\tif (oc === undefined) {\n\t\toc = Object\n\t}\n\treturn oc && typeof oc.freeze === 'function' ? oc.freeze(object) : object\n}\n\n/**\n * Since we can not rely on `Object.assign` we provide a simplified version\n * that is sufficient for our needs.\n *\n * @param {Object} target\n * @param {Object | null | undefined} source\n *\n * @returns {Object} target\n * @throws TypeError if target is not an object\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign\n * @see https://tc39.es/ecma262/multipage/fundamental-objects.html#sec-object.assign\n */\nfunction assign(target, source) {\n\tif (target === null || typeof target !== 'object') {\n\t\tthrow new TypeError('target is not an object')\n\t}\n\tfor (var key in source) {\n\t\tif (Object.prototype.hasOwnProperty.call(source, key)) {\n\t\t\ttarget[key] = source[key]\n\t\t}\n\t}\n\treturn target\n}\n\n/**\n * All mime types that are allowed as input to `DOMParser.parseFromString`\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/API/DOMParser/parseFromString#Argument02 MDN\n * @see https://html.spec.whatwg.org/multipage/dynamic-markup-insertion.html#domparsersupportedtype WHATWG HTML Spec\n * @see DOMParser.prototype.parseFromString\n */\nvar MIME_TYPE = freeze({\n\t/**\n\t * `text/html`, the only mime type that triggers treating an XML document as HTML.\n\t *\n\t * @see DOMParser.SupportedType.isHTML\n\t * @see https://www.iana.org/assignments/media-types/text/html IANA MimeType registration\n\t * @see https://en.wikipedia.org/wiki/HTML Wikipedia\n\t * @see https://developer.mozilla.org/en-US/docs/Web/API/DOMParser/parseFromString MDN\n\t * @see https://html.spec.whatwg.org/multipage/dynamic-markup-insertion.html#dom-domparser-parsefromstring WHATWG HTML Spec\n\t */\n\tHTML: 'text/html',\n\n\t/**\n\t * Helper method to check a mime type if it indicates an HTML document\n\t *\n\t * @param {string} [value]\n\t * @returns {boolean}\n\t *\n\t * @see https://www.iana.org/assignments/media-types/text/html IANA MimeType registration\n\t * @see https://en.wikipedia.org/wiki/HTML Wikipedia\n\t * @see https://developer.mozilla.org/en-US/docs/Web/API/DOMParser/parseFromString MDN\n\t * @see https://html.spec.whatwg.org/multipage/dynamic-markup-insertion.html#dom-domparser-parsefromstring \t */\n\tisHTML: function (value) {\n\t\treturn value === MIME_TYPE.HTML\n\t},\n\n\t/**\n\t * `application/xml`, the standard mime type for XML documents.\n\t *\n\t * @see https://www.iana.org/assignments/media-types/application/xml IANA MimeType registration\n\t * @see https://tools.ietf.org/html/rfc7303#section-9.1 RFC 7303\n\t * @see https://en.wikipedia.org/wiki/XML_and_MIME Wikipedia\n\t */\n\tXML_APPLICATION: 'application/xml',\n\n\t/**\n\t * `text/html`, an alias for `application/xml`.\n\t *\n\t * @see https://tools.ietf.org/html/rfc7303#section-9.2 RFC 7303\n\t * @see https://www.iana.org/assignments/media-types/text/xml IANA MimeType registration\n\t * @see https://en.wikipedia.org/wiki/XML_and_MIME Wikipedia\n\t */\n\tXML_TEXT: 'text/xml',\n\n\t/**\n\t * `application/xhtml+xml`, indicates an XML document that has the default HTML namespace,\n\t * but is parsed as an XML document.\n\t *\n\t * @see https://www.iana.org/assignments/media-types/application/xhtml+xml IANA MimeType registration\n\t * @see https://dom.spec.whatwg.org/#dom-domimplementation-createdocument WHATWG DOM Spec\n\t * @see https://en.wikipedia.org/wiki/XHTML Wikipedia\n\t */\n\tXML_XHTML_APPLICATION: 'application/xhtml+xml',\n\n\t/**\n\t * `image/svg+xml`,\n\t *\n\t * @see https://www.iana.org/assignments/media-types/image/svg+xml IANA MimeType registration\n\t * @see https://www.w3.org/TR/SVG11/ W3C SVG 1.1\n\t * @see https://en.wikipedia.org/wiki/Scalable_Vector_Graphics Wikipedia\n\t */\n\tXML_SVG_IMAGE: 'image/svg+xml',\n})\n\n/**\n * Namespaces that are used in this code base.\n *\n * @see http://www.w3.org/TR/REC-xml-names\n */\nvar NAMESPACE = freeze({\n\t/**\n\t * The XHTML namespace.\n\t *\n\t * @see http://www.w3.org/1999/xhtml\n\t */\n\tHTML: 'http://www.w3.org/1999/xhtml',\n\n\t/**\n\t * Checks if `uri` equals `NAMESPACE.HTML`.\n\t *\n\t * @param {string} [uri]\n\t *\n\t * @see NAMESPACE.HTML\n\t */\n\tisHTML: function (uri) {\n\t\treturn uri === NAMESPACE.HTML\n\t},\n\n\t/**\n\t * The SVG namespace.\n\t *\n\t * @see http://www.w3.org/2000/svg\n\t */\n\tSVG: 'http://www.w3.org/2000/svg',\n\n\t/**\n\t * The `xml:` namespace.\n\t *\n\t * @see http://www.w3.org/XML/1998/namespace\n\t */\n\tXML: 'http://www.w3.org/XML/1998/namespace',\n\n\t/**\n\t * The `xmlns:` namespace\n\t *\n\t * @see https://www.w3.org/2000/xmlns/\n\t */\n\tXMLNS: 'http://www.w3.org/2000/xmlns/',\n})\n\nexports.assign = assign;\nexports.find = find;\nexports.freeze = freeze;\nexports.MIME_TYPE = MIME_TYPE;\nexports.NAMESPACE = NAMESPACE;\n","var conventions = require(\"./conventions\");\n\nvar find = conventions.find;\nvar NAMESPACE = conventions.NAMESPACE;\n\n/**\n * A prerequisite for `[].filter`, to drop elements that are empty\n * @param {string} input\n * @returns {boolean}\n */\nfunction notEmptyString (input) {\n\treturn input !== ''\n}\n/**\n * @see https://infra.spec.whatwg.org/#split-on-ascii-whitespace\n * @see https://infra.spec.whatwg.org/#ascii-whitespace\n *\n * @param {string} input\n * @returns {string[]} (can be empty)\n */\nfunction splitOnASCIIWhitespace(input) {\n\t// U+0009 TAB, U+000A LF, U+000C FF, U+000D CR, U+0020 SPACE\n\treturn input ? input.split(/[\\t\\n\\f\\r ]+/).filter(notEmptyString) : []\n}\n\n/**\n * Adds element as a key to current if it is not already present.\n *\n * @param {Record<string, boolean | undefined>} current\n * @param {string} element\n * @returns {Record<string, boolean | undefined>}\n */\nfunction orderedSetReducer (current, element) {\n\tif (!current.hasOwnProperty(element)) {\n\t\tcurrent[element] = true;\n\t}\n\treturn current;\n}\n\n/**\n * @see https://infra.spec.whatwg.org/#ordered-set\n * @param {string} input\n * @returns {string[]}\n */\nfunction toOrderedSet(input) {\n\tif (!input) return [];\n\tvar list = splitOnASCIIWhitespace(input);\n\treturn Object.keys(list.reduce(orderedSetReducer, {}))\n}\n\n/**\n * Uses `list.indexOf` to implement something like `Array.prototype.includes`,\n * which we can not rely on being available.\n *\n * @param {any[]} list\n * @returns {function(any): boolean}\n */\nfunction arrayIncludes (list) {\n\treturn function(element) {\n\t\treturn list && list.indexOf(element) !== -1;\n\t}\n}\n\nfunction copy(src,dest){\n\tfor(var p in src){\n\t\tif (Object.prototype.hasOwnProperty.call(src, p)) {\n\t\t\tdest[p] = src[p];\n\t\t}\n\t}\n}\n\n/**\n^\\w+\\.prototype\\.([_\\w]+)\\s*=\\s*((?:.*\\{\\s*?[\\r\\n][\\s\\S]*?^})|\\S.*?(?=[;\\r\\n]));?\n^\\w+\\.prototype\\.([_\\w]+)\\s*=\\s*(\\S.*?(?=[;\\r\\n]));?\n */\nfunction _extends(Class,Super){\n\tvar pt = Class.prototype;\n\tif(!(pt instanceof Super)){\n\t\tfunction t(){};\n\t\tt.prototype = Super.prototype;\n\t\tt = new t();\n\t\tcopy(pt,t);\n\t\tClass.prototype = pt = t;\n\t}\n\tif(pt.constructor != Class){\n\t\tif(typeof Class != 'function'){\n\t\t\tconsole.error(\"unknown Class:\"+Class)\n\t\t}\n\t\tpt.constructor = Class\n\t}\n}\n\n// Node Types\nvar NodeType = {}\nvar ELEMENT_NODE                = NodeType.ELEMENT_NODE                = 1;\nvar ATTRIBUTE_NODE              = NodeType.ATTRIBUTE_NODE              = 2;\nvar TEXT_NODE                   = NodeType.TEXT_NODE                   = 3;\nvar CDATA_SECTION_NODE          = NodeType.CDATA_SECTION_NODE          = 4;\nvar ENTITY_REFERENCE_NODE       = NodeType.ENTITY_REFERENCE_NODE       = 5;\nvar ENTITY_NODE                 = NodeType.ENTITY_NODE                 = 6;\nvar PROCESSING_INSTRUCTION_NODE = NodeType.PROCESSING_INSTRUCTION_NODE = 7;\nvar COMMENT_NODE                = NodeType.COMMENT_NODE                = 8;\nvar DOCUMENT_NODE               = NodeType.DOCUMENT_NODE               = 9;\nvar DOCUMENT_TYPE_NODE          = NodeType.DOCUMENT_TYPE_NODE          = 10;\nvar DOCUMENT_FRAGMENT_NODE      = NodeType.DOCUMENT_FRAGMENT_NODE      = 11;\nvar NOTATION_NODE               = NodeType.NOTATION_NODE               = 12;\n\n// ExceptionCode\nvar ExceptionCode = {}\nvar ExceptionMessage = {};\nvar INDEX_SIZE_ERR              = ExceptionCode.INDEX_SIZE_ERR              = ((ExceptionMessage[1]=\"Index size error\"),1);\nvar DOMSTRING_SIZE_ERR          = ExceptionCode.DOMSTRING_SIZE_ERR          = ((ExceptionMessage[2]=\"DOMString size error\"),2);\nvar HIERARCHY_REQUEST_ERR       = ExceptionCode.HIERARCHY_REQUEST_ERR       = ((ExceptionMessage[3]=\"Hierarchy request error\"),3);\nvar WRONG_DOCUMENT_ERR          = ExceptionCode.WRONG_DOCUMENT_ERR          = ((ExceptionMessage[4]=\"Wrong document\"),4);\nvar INVALID_CHARACTER_ERR       = ExceptionCode.INVALID_CHARACTER_ERR       = ((ExceptionMessage[5]=\"Invalid character\"),5);\nvar NO_DATA_ALLOWED_ERR         = ExceptionCode.NO_DATA_ALLOWED_ERR         = ((ExceptionMessage[6]=\"No data allowed\"),6);\nvar NO_MODIFICATION_ALLOWED_ERR = ExceptionCode.NO_MODIFICATION_ALLOWED_ERR = ((ExceptionMessage[7]=\"No modification allowed\"),7);\nvar NOT_FOUND_ERR               = ExceptionCode.NOT_FOUND_ERR               = ((ExceptionMessage[8]=\"Not found\"),8);\nvar NOT_SUPPORTED_ERR           = ExceptionCode.NOT_SUPPORTED_ERR           = ((ExceptionMessage[9]=\"Not supported\"),9);\nvar INUSE_ATTRIBUTE_ERR         = ExceptionCode.INUSE_ATTRIBUTE_ERR         = ((ExceptionMessage[10]=\"Attribute in use\"),10);\n//level2\nvar INVALID_STATE_ERR        \t= ExceptionCode.INVALID_STATE_ERR        \t= ((ExceptionMessage[11]=\"Invalid state\"),11);\nvar SYNTAX_ERR               \t= ExceptionCode.SYNTAX_ERR               \t= ((ExceptionMessage[12]=\"Syntax error\"),12);\nvar INVALID_MODIFICATION_ERR \t= ExceptionCode.INVALID_MODIFICATION_ERR \t= ((ExceptionMessage[13]=\"Invalid modification\"),13);\nvar NAMESPACE_ERR            \t= ExceptionCode.NAMESPACE_ERR           \t= ((ExceptionMessage[14]=\"Invalid namespace\"),14);\nvar INVALID_ACCESS_ERR       \t= ExceptionCode.INVALID_ACCESS_ERR      \t= ((ExceptionMessage[15]=\"Invalid access\"),15);\n\n/**\n * DOM Level 2\n * Object DOMException\n * @see http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/ecma-script-binding.html\n * @see http://www.w3.org/TR/REC-DOM-Level-1/ecma-script-language-binding.html\n */\nfunction DOMException(code, message) {\n\tif(message instanceof Error){\n\t\tvar error = message;\n\t}else{\n\t\terror = this;\n\t\tError.call(this, ExceptionMessage[code]);\n\t\tthis.message = ExceptionMessage[code];\n\t\tif(Error.captureStackTrace) Error.captureStackTrace(this, DOMException);\n\t}\n\terror.code = code;\n\tif(message) this.message = this.message + \": \" + message;\n\treturn error;\n};\nDOMException.prototype = Error.prototype;\ncopy(ExceptionCode,DOMException)\n\n/**\n * @see http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-536297177\n * The NodeList interface provides the abstraction of an ordered collection of nodes, without defining or constraining how this collection is implemented. NodeList objects in the DOM are live.\n * The items in the NodeList are accessible via an integral index, starting from 0.\n */\nfunction NodeList() {\n};\nNodeList.prototype = {\n\t/**\n\t * The number of nodes in the list. The range of valid child node indices is 0 to length-1 inclusive.\n\t * @standard level1\n\t */\n\tlength:0,\n\t/**\n\t * Returns the indexth item in the collection. If index is greater than or equal to the number of nodes in the list, this returns null.\n\t * @standard level1\n\t * @param index  unsigned long\n\t *   Index into the collection.\n\t * @return Node\n\t * \tThe node at the indexth position in the NodeList, or null if that is not a valid index.\n\t */\n\titem: function(index) {\n\t\treturn index >= 0 && index < this.length ? this[index] : null;\n\t},\n\ttoString:function(isHTML,nodeFilter){\n\t\tfor(var buf = [], i = 0;i<this.length;i++){\n\t\t\tserializeToString(this[i],buf,isHTML,nodeFilter);\n\t\t}\n\t\treturn buf.join('');\n\t},\n\t/**\n\t * @private\n\t * @param {function (Node):boolean} predicate\n\t * @returns {Node[]}\n\t */\n\tfilter: function (predicate) {\n\t\treturn Array.prototype.filter.call(this, predicate);\n\t},\n\t/**\n\t * @private\n\t * @param {Node} item\n\t * @returns {number}\n\t */\n\tindexOf: function (item) {\n\t\treturn Array.prototype.indexOf.call(this, item);\n\t},\n};\n\nfunction LiveNodeList(node,refresh){\n\tthis._node = node;\n\tthis._refresh = refresh\n\t_updateLiveList(this);\n}\nfunction _updateLiveList(list){\n\tvar inc = list._node._inc || list._node.ownerDocument._inc;\n\tif (list._inc !== inc) {\n\t\tvar ls = list._refresh(list._node);\n\t\t__set__(list,'length',ls.length);\n\t\tif (!list.$$length || ls.length < list.$$length) {\n\t\t\tfor (var i = ls.length; i in list; i++) {\n\t\t\t\tif (Object.prototype.hasOwnProperty.call(list, i)) {\n\t\t\t\t\tdelete list[i];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tcopy(ls,list);\n\t\tlist._inc = inc;\n\t}\n}\nLiveNodeList.prototype.item = function(i){\n\t_updateLiveList(this);\n\treturn this[i] || null;\n}\n\n_extends(LiveNodeList,NodeList);\n\n/**\n * Objects implementing the NamedNodeMap interface are used\n * to represent collections of nodes that can be accessed by name.\n * Note that NamedNodeMap does not inherit from NodeList;\n * NamedNodeMaps are not maintained in any particular order.\n * Objects contained in an object implementing NamedNodeMap may also be accessed by an ordinal index,\n * but this is simply to allow convenient enumeration of the contents of a NamedNodeMap,\n * and does not imply that the DOM specifies an order to these Nodes.\n * NamedNodeMap objects in the DOM are live.\n * used for attributes or DocumentType entities\n */\nfunction NamedNodeMap() {\n};\n\nfunction _findNodeIndex(list,node){\n\tvar i = list.length;\n\twhile(i--){\n\t\tif(list[i] === node){return i}\n\t}\n}\n\nfunction _addNamedNode(el,list,newAttr,oldAttr){\n\tif(oldAttr){\n\t\tlist[_findNodeIndex(list,oldAttr)] = newAttr;\n\t}else{\n\t\tlist[list.length++] = newAttr;\n\t}\n\tif(el){\n\t\tnewAttr.ownerElement = el;\n\t\tvar doc = el.ownerDocument;\n\t\tif(doc){\n\t\t\toldAttr && _onRemoveAttribute(doc,el,oldAttr);\n\t\t\t_onAddAttribute(doc,el,newAttr);\n\t\t}\n\t}\n}\nfunction _removeNamedNode(el,list,attr){\n\t//console.log('remove attr:'+attr)\n\tvar i = _findNodeIndex(list,attr);\n\tif(i>=0){\n\t\tvar lastIndex = list.length-1\n\t\twhile(i<lastIndex){\n\t\t\tlist[i] = list[++i]\n\t\t}\n\t\tlist.length = lastIndex;\n\t\tif(el){\n\t\t\tvar doc = el.ownerDocument;\n\t\t\tif(doc){\n\t\t\t\t_onRemoveAttribute(doc,el,attr);\n\t\t\t\tattr.ownerElement = null;\n\t\t\t}\n\t\t}\n\t}else{\n\t\tthrow new DOMException(NOT_FOUND_ERR,new Error(el.tagName+'@'+attr))\n\t}\n}\nNamedNodeMap.prototype = {\n\tlength:0,\n\titem:NodeList.prototype.item,\n\tgetNamedItem: function(key) {\n//\t\tif(key.indexOf(':')>0 || key == 'xmlns'){\n//\t\t\treturn null;\n//\t\t}\n\t\t//console.log()\n\t\tvar i = this.length;\n\t\twhile(i--){\n\t\t\tvar attr = this[i];\n\t\t\t//console.log(attr.nodeName,key)\n\t\t\tif(attr.nodeName == key){\n\t\t\t\treturn attr;\n\t\t\t}\n\t\t}\n\t},\n\tsetNamedItem: function(attr) {\n\t\tvar el = attr.ownerElement;\n\t\tif(el && el!=this._ownerElement){\n\t\t\tthrow new DOMException(INUSE_ATTRIBUTE_ERR);\n\t\t}\n\t\tvar oldAttr = this.getNamedItem(attr.nodeName);\n\t\t_addNamedNode(this._ownerElement,this,attr,oldAttr);\n\t\treturn oldAttr;\n\t},\n\t/* returns Node */\n\tsetNamedItemNS: function(attr) {// raises: WRONG_DOCUMENT_ERR,NO_MODIFICATION_ALLOWED_ERR,INUSE_ATTRIBUTE_ERR\n\t\tvar el = attr.ownerElement, oldAttr;\n\t\tif(el && el!=this._ownerElement){\n\t\t\tthrow new DOMException(INUSE_ATTRIBUTE_ERR);\n\t\t}\n\t\toldAttr = this.getNamedItemNS(attr.namespaceURI,attr.localName);\n\t\t_addNamedNode(this._ownerElement,this,attr,oldAttr);\n\t\treturn oldAttr;\n\t},\n\n\t/* returns Node */\n\tremoveNamedItem: function(key) {\n\t\tvar attr = this.getNamedItem(key);\n\t\t_removeNamedNode(this._ownerElement,this,attr);\n\t\treturn attr;\n\n\n\t},// raises: NOT_FOUND_ERR,NO_MODIFICATION_ALLOWED_ERR\n\n\t//for level2\n\tremoveNamedItemNS:function(namespaceURI,localName){\n\t\tvar attr = this.getNamedItemNS(namespaceURI,localName);\n\t\t_removeNamedNode(this._ownerElement,this,attr);\n\t\treturn attr;\n\t},\n\tgetNamedItemNS: function(namespaceURI, localName) {\n\t\tvar i = this.length;\n\t\twhile(i--){\n\t\t\tvar node = this[i];\n\t\t\tif(node.localName == localName && node.namespaceURI == namespaceURI){\n\t\t\t\treturn node;\n\t\t\t}\n\t\t}\n\t\treturn null;\n\t}\n};\n\n/**\n * The DOMImplementation interface represents an object providing methods\n * which are not dependent on any particular document.\n * Such an object is returned by the `Document.implementation` property.\n *\n * __The individual methods describe the differences compared to the specs.__\n *\n * @constructor\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/API/DOMImplementation MDN\n * @see https://www.w3.org/TR/REC-DOM-Level-1/level-one-core.html#ID-102161490 DOM Level 1 Core (Initial)\n * @see https://www.w3.org/TR/DOM-Level-2-Core/core.html#ID-102161490 DOM Level 2 Core\n * @see https://www.w3.org/TR/DOM-Level-3-Core/core.html#ID-102161490 DOM Level 3 Core\n * @see https://dom.spec.whatwg.org/#domimplementation DOM Living Standard\n */\nfunction DOMImplementation() {\n}\n\nDOMImplementation.prototype = {\n\t/**\n\t * The DOMImplementation.hasFeature() method returns a Boolean flag indicating if a given feature is supported.\n\t * The different implementations fairly diverged in what kind of features were reported.\n\t * The latest version of the spec settled to force this method to always return true, where the functionality was accurate and in use.\n\t *\n\t * @deprecated It is deprecated and modern browsers return true in all cases.\n\t *\n\t * @param {string} feature\n\t * @param {string} [version]\n\t * @returns {boolean} always true\n\t *\n\t * @see https://developer.mozilla.org/en-US/docs/Web/API/DOMImplementation/hasFeature MDN\n\t * @see https://www.w3.org/TR/REC-DOM-Level-1/level-one-core.html#ID-5CED94D7 DOM Level 1 Core\n\t * @see https://dom.spec.whatwg.org/#dom-domimplementation-hasfeature DOM Living Standard\n\t */\n\thasFeature: function(feature, version) {\n\t\t\treturn true;\n\t},\n\t/**\n\t * Creates an XML Document object of the specified type with its document element.\n\t *\n\t * __It behaves slightly different from the description in the living standard__:\n\t * - There is no interface/class `XMLDocument`, it returns a `Document` instance.\n\t * - `contentType`, `encoding`, `mode`, `origin`, `url` fields are currently not declared.\n\t * - this implementation is not validating names or qualified names\n\t *   (when parsing XML strings, the SAX parser takes care of that)\n\t *\n\t * @param {string|null} namespaceURI\n\t * @param {string} qualifiedName\n\t * @param {DocumentType=null} doctype\n\t * @returns {Document}\n\t *\n\t * @see https://developer.mozilla.org/en-US/docs/Web/API/DOMImplementation/createDocument MDN\n\t * @see https://www.w3.org/TR/DOM-Level-2-Core/core.html#Level-2-Core-DOM-createDocument DOM Level 2 Core (initial)\n\t * @see https://dom.spec.whatwg.org/#dom-domimplementation-createdocument  DOM Level 2 Core\n\t *\n\t * @see https://dom.spec.whatwg.org/#validate-and-extract DOM: Validate and extract\n\t * @see https://www.w3.org/TR/xml/#NT-NameStartChar XML Spec: Names\n\t * @see https://www.w3.org/TR/xml-names/#ns-qualnames XML Namespaces: Qualified names\n\t */\n\tcreateDocument: function(namespaceURI,  qualifiedName, doctype){\n\t\tvar doc = new Document();\n\t\tdoc.implementation = this;\n\t\tdoc.childNodes = new NodeList();\n\t\tdoc.doctype = doctype || null;\n\t\tif (doctype){\n\t\t\tdoc.appendChild(doctype);\n\t\t}\n\t\tif (qualifiedName){\n\t\t\tvar root = doc.createElementNS(namespaceURI, qualifiedName);\n\t\t\tdoc.appendChild(root);\n\t\t}\n\t\treturn doc;\n\t},\n\t/**\n\t * Returns a doctype, with the given `qualifiedName`, `publicId`, and `systemId`.\n\t *\n\t * __This behavior is slightly different from the in the specs__:\n\t * - this implementation is not validating names or qualified names\n\t *   (when parsing XML strings, the SAX parser takes care of that)\n\t *\n\t * @param {string} qualifiedName\n\t * @param {string} [publicId]\n\t * @param {string} [systemId]\n\t * @returns {DocumentType} which can either be used with `DOMImplementation.createDocument` upon document creation\n\t * \t\t\t\t  or can be put into the document via methods like `Node.insertBefore()` or `Node.replaceChild()`\n\t *\n\t * @see https://developer.mozilla.org/en-US/docs/Web/API/DOMImplementation/createDocumentType MDN\n\t * @see https://www.w3.org/TR/DOM-Level-2-Core/core.html#Level-2-Core-DOM-createDocType DOM Level 2 Core\n\t * @see https://dom.spec.whatwg.org/#dom-domimplementation-createdocumenttype DOM Living Standard\n\t *\n\t * @see https://dom.spec.whatwg.org/#validate-and-extract DOM: Validate and extract\n\t * @see https://www.w3.org/TR/xml/#NT-NameStartChar XML Spec: Names\n\t * @see https://www.w3.org/TR/xml-names/#ns-qualnames XML Namespaces: Qualified names\n\t */\n\tcreateDocumentType: function(qualifiedName, publicId, systemId){\n\t\tvar node = new DocumentType();\n\t\tnode.name = qualifiedName;\n\t\tnode.nodeName = qualifiedName;\n\t\tnode.publicId = publicId || '';\n\t\tnode.systemId = systemId || '';\n\n\t\treturn node;\n\t}\n};\n\n\n/**\n * @see http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-1950641247\n */\n\nfunction Node() {\n};\n\nNode.prototype = {\n\tfirstChild : null,\n\tlastChild : null,\n\tpreviousSibling : null,\n\tnextSibling : null,\n\tattributes : null,\n\tparentNode : null,\n\tchildNodes : null,\n\townerDocument : null,\n\tnodeValue : null,\n\tnamespaceURI : null,\n\tprefix : null,\n\tlocalName : null,\n\t// Modified in DOM Level 2:\n\tinsertBefore:function(newChild, refChild){//raises\n\t\treturn _insertBefore(this,newChild,refChild);\n\t},\n\treplaceChild:function(newChild, oldChild){//raises\n\t\t_insertBefore(this, newChild,oldChild, assertPreReplacementValidityInDocument);\n\t\tif(oldChild){\n\t\t\tthis.removeChild(oldChild);\n\t\t}\n\t},\n\tremoveChild:function(oldChild){\n\t\treturn _removeChild(this,oldChild);\n\t},\n\tappendChild:function(newChild){\n\t\treturn this.insertBefore(newChild,null);\n\t},\n\thasChildNodes:function(){\n\t\treturn this.firstChild != null;\n\t},\n\tcloneNode:function(deep){\n\t\treturn cloneNode(this.ownerDocument||this,this,deep);\n\t},\n\t// Modified in DOM Level 2:\n\tnormalize:function(){\n\t\tvar child = this.firstChild;\n\t\twhile(child){\n\t\t\tvar next = child.nextSibling;\n\t\t\tif(next && next.nodeType == TEXT_NODE && child.nodeType == TEXT_NODE){\n\t\t\t\tthis.removeChild(next);\n\t\t\t\tchild.appendData(next.data);\n\t\t\t}else{\n\t\t\t\tchild.normalize();\n\t\t\t\tchild = next;\n\t\t\t}\n\t\t}\n\t},\n  \t// Introduced in DOM Level 2:\n\tisSupported:function(feature, version){\n\t\treturn this.ownerDocument.implementation.hasFeature(feature,version);\n\t},\n    // Introduced in DOM Level 2:\n    hasAttributes:function(){\n    \treturn this.attributes.length>0;\n    },\n\t/**\n\t * Look up the prefix associated to the given namespace URI, starting from this node.\n\t * **The default namespace declarations are ignored by this method.**\n\t * See Namespace Prefix Lookup for details on the algorithm used by this method.\n\t *\n\t * _Note: The implementation seems to be incomplete when compared to the algorithm described in the specs._\n\t *\n\t * @param {string | null} namespaceURI\n\t * @returns {string | null}\n\t * @see https://www.w3.org/TR/DOM-Level-3-Core/core.html#Node3-lookupNamespacePrefix\n\t * @see https://www.w3.org/TR/DOM-Level-3-Core/namespaces-algorithms.html#lookupNamespacePrefixAlgo\n\t * @see https://dom.spec.whatwg.org/#dom-node-lookupprefix\n\t * @see https://github.com/xmldom/xmldom/issues/322\n\t */\n    lookupPrefix:function(namespaceURI){\n    \tvar el = this;\n    \twhile(el){\n    \t\tvar map = el._nsMap;\n    \t\t//console.dir(map)\n    \t\tif(map){\n    \t\t\tfor(var n in map){\n\t\t\t\t\t\tif (Object.prototype.hasOwnProperty.call(map, n) && map[n] === namespaceURI) {\n\t\t\t\t\t\t\treturn n;\n\t\t\t\t\t\t}\n    \t\t\t}\n    \t\t}\n    \t\tel = el.nodeType == ATTRIBUTE_NODE?el.ownerDocument : el.parentNode;\n    \t}\n    \treturn null;\n    },\n    // Introduced in DOM Level 3:\n    lookupNamespaceURI:function(prefix){\n    \tvar el = this;\n    \twhile(el){\n    \t\tvar map = el._nsMap;\n    \t\t//console.dir(map)\n    \t\tif(map){\n    \t\t\tif(Object.prototype.hasOwnProperty.call(map, prefix)){\n    \t\t\t\treturn map[prefix] ;\n    \t\t\t}\n    \t\t}\n    \t\tel = el.nodeType == ATTRIBUTE_NODE?el.ownerDocument : el.parentNode;\n    \t}\n    \treturn null;\n    },\n    // Introduced in DOM Level 3:\n    isDefaultNamespace:function(namespaceURI){\n    \tvar prefix = this.lookupPrefix(namespaceURI);\n    \treturn prefix == null;\n    }\n};\n\n\nfunction _xmlEncoder(c){\n\treturn c == '<' && '&lt;' ||\n         c == '>' && '&gt;' ||\n         c == '&' && '&amp;' ||\n         c == '\"' && '&quot;' ||\n         '&#'+c.charCodeAt()+';'\n}\n\n\ncopy(NodeType,Node);\ncopy(NodeType,Node.prototype);\n\n/**\n * @param callback return true for continue,false for break\n * @return boolean true: break visit;\n */\nfunction _visitNode(node,callback){\n\tif(callback(node)){\n\t\treturn true;\n\t}\n\tif(node = node.firstChild){\n\t\tdo{\n\t\t\tif(_visitNode(node,callback)){return true}\n        }while(node=node.nextSibling)\n    }\n}\n\n\n\nfunction Document(){\n\tthis.ownerDocument = this;\n}\n\nfunction _onAddAttribute(doc,el,newAttr){\n\tdoc && doc._inc++;\n\tvar ns = newAttr.namespaceURI ;\n\tif(ns === NAMESPACE.XMLNS){\n\t\t//update namespace\n\t\tel._nsMap[newAttr.prefix?newAttr.localName:''] = newAttr.value\n\t}\n}\n\nfunction _onRemoveAttribute(doc,el,newAttr,remove){\n\tdoc && doc._inc++;\n\tvar ns = newAttr.namespaceURI ;\n\tif(ns === NAMESPACE.XMLNS){\n\t\t//update namespace\n\t\tdelete el._nsMap[newAttr.prefix?newAttr.localName:'']\n\t}\n}\n\n/**\n * Updates `el.childNodes`, updating the indexed items and it's `length`.\n * Passing `newChild` means it will be appended.\n * Otherwise it's assumed that an item has been removed,\n * and `el.firstNode` and it's `.nextSibling` are used\n * to walk the current list of child nodes.\n *\n * @param {Document} doc\n * @param {Node} el\n * @param {Node} [newChild]\n * @private\n */\nfunction _onUpdateChild (doc, el, newChild) {\n\tif(doc && doc._inc){\n\t\tdoc._inc++;\n\t\t//update childNodes\n\t\tvar cs = el.childNodes;\n\t\tif (newChild) {\n\t\t\tcs[cs.length++] = newChild;\n\t\t} else {\n\t\t\tvar child = el.firstChild;\n\t\t\tvar i = 0;\n\t\t\twhile (child) {\n\t\t\t\tcs[i++] = child;\n\t\t\t\tchild = child.nextSibling;\n\t\t\t}\n\t\t\tcs.length = i;\n\t\t\tdelete cs[cs.length];\n\t\t}\n\t}\n}\n\n/**\n * Removes the connections between `parentNode` and `child`\n * and any existing `child.previousSibling` or `child.nextSibling`.\n *\n * @see https://github.com/xmldom/xmldom/issues/135\n * @see https://github.com/xmldom/xmldom/issues/145\n *\n * @param {Node} parentNode\n * @param {Node} child\n * @returns {Node} the child that was removed.\n * @private\n */\nfunction _removeChild (parentNode, child) {\n\tvar previous = child.previousSibling;\n\tvar next = child.nextSibling;\n\tif (previous) {\n\t\tprevious.nextSibling = next;\n\t} else {\n\t\tparentNode.firstChild = next;\n\t}\n\tif (next) {\n\t\tnext.previousSibling = previous;\n\t} else {\n\t\tparentNode.lastChild = previous;\n\t}\n\tchild.parentNode = null;\n\tchild.previousSibling = null;\n\tchild.nextSibling = null;\n\t_onUpdateChild(parentNode.ownerDocument, parentNode);\n\treturn child;\n}\n\n/**\n * Returns `true` if `node` can be a parent for insertion.\n * @param {Node} node\n * @returns {boolean}\n */\nfunction hasValidParentNodeType(node) {\n\treturn (\n\t\tnode &&\n\t\t(node.nodeType === Node.DOCUMENT_NODE || node.nodeType === Node.DOCUMENT_FRAGMENT_NODE || node.nodeType === Node.ELEMENT_NODE)\n\t);\n}\n\n/**\n * Returns `true` if `node` can be inserted according to it's `nodeType`.\n * @param {Node} node\n * @returns {boolean}\n */\nfunction hasInsertableNodeType(node) {\n\treturn (\n\t\tnode &&\n\t\t(isElementNode(node) ||\n\t\t\tisTextNode(node) ||\n\t\t\tisDocTypeNode(node) ||\n\t\t\tnode.nodeType === Node.DOCUMENT_FRAGMENT_NODE ||\n\t\t\tnode.nodeType === Node.COMMENT_NODE ||\n\t\t\tnode.nodeType === Node.PROCESSING_INSTRUCTION_NODE)\n\t);\n}\n\n/**\n * Returns true if `node` is a DOCTYPE node\n * @param {Node} node\n * @returns {boolean}\n */\nfunction isDocTypeNode(node) {\n\treturn node && node.nodeType === Node.DOCUMENT_TYPE_NODE;\n}\n\n/**\n * Returns true if the node is an element\n * @param {Node} node\n * @returns {boolean}\n */\nfunction isElementNode(node) {\n\treturn node && node.nodeType === Node.ELEMENT_NODE;\n}\n/**\n * Returns true if `node` is a text node\n * @param {Node} node\n * @returns {boolean}\n */\nfunction isTextNode(node) {\n\treturn node && node.nodeType === Node.TEXT_NODE;\n}\n\n/**\n * Check if en element node can be inserted before `child`, or at the end if child is falsy,\n * according to the presence and position of a doctype node on the same level.\n *\n * @param {Document} doc The document node\n * @param {Node} child the node that would become the nextSibling if the element would be inserted\n * @returns {boolean} `true` if an element can be inserted before child\n * @private\n * https://dom.spec.whatwg.org/#concept-node-ensure-pre-insertion-validity\n */\nfunction isElementInsertionPossible(doc, child) {\n\tvar parentChildNodes = doc.childNodes || [];\n\tif (find(parentChildNodes, isElementNode) || isDocTypeNode(child)) {\n\t\treturn false;\n\t}\n\tvar docTypeNode = find(parentChildNodes, isDocTypeNode);\n\treturn !(child && docTypeNode && parentChildNodes.indexOf(docTypeNode) > parentChildNodes.indexOf(child));\n}\n\n/**\n * Check if en element node can be inserted before `child`, or at the end if child is falsy,\n * according to the presence and position of a doctype node on the same level.\n *\n * @param {Node} doc The document node\n * @param {Node} child the node that would become the nextSibling if the element would be inserted\n * @returns {boolean} `true` if an element can be inserted before child\n * @private\n * https://dom.spec.whatwg.org/#concept-node-ensure-pre-insertion-validity\n */\nfunction isElementReplacementPossible(doc, child) {\n\tvar parentChildNodes = doc.childNodes || [];\n\n\tfunction hasElementChildThatIsNotChild(node) {\n\t\treturn isElementNode(node) && node !== child;\n\t}\n\n\tif (find(parentChildNodes, hasElementChildThatIsNotChild)) {\n\t\treturn false;\n\t}\n\tvar docTypeNode = find(parentChildNodes, isDocTypeNode);\n\treturn !(child && docTypeNode && parentChildNodes.indexOf(docTypeNode) > parentChildNodes.indexOf(child));\n}\n\n/**\n * @private\n * Steps 1-5 of the checks before inserting and before replacing a child are the same.\n *\n * @param {Node} parent the parent node to insert `node` into\n * @param {Node} node the node to insert\n * @param {Node=} child the node that should become the `nextSibling` of `node`\n * @returns {Node}\n * @throws DOMException for several node combinations that would create a DOM that is not well-formed.\n * @throws DOMException if `child` is provided but is not a child of `parent`.\n * @see https://dom.spec.whatwg.org/#concept-node-ensure-pre-insertion-validity\n * @see https://dom.spec.whatwg.org/#concept-node-replace\n */\nfunction assertPreInsertionValidity1to5(parent, node, child) {\n\t// 1. If `parent` is not a Document, DocumentFragment, or Element node, then throw a \"HierarchyRequestError\" DOMException.\n\tif (!hasValidParentNodeType(parent)) {\n\t\tthrow new DOMException(HIERARCHY_REQUEST_ERR, 'Unexpected parent node type ' + parent.nodeType);\n\t}\n\t// 2. If `node` is a host-including inclusive ancestor of `parent`, then throw a \"HierarchyRequestError\" DOMException.\n\t// not implemented!\n\t// 3. If `child` is non-null and its parent is not `parent`, then throw a \"NotFoundError\" DOMException.\n\tif (child && child.parentNode !== parent) {\n\t\tthrow new DOMException(NOT_FOUND_ERR, 'child not in parent');\n\t}\n\tif (\n\t\t// 4. If `node` is not a DocumentFragment, DocumentType, Element, or CharacterData node, then throw a \"HierarchyRequestError\" DOMException.\n\t\t!hasInsertableNodeType(node) ||\n\t\t// 5. If either `node` is a Text node and `parent` is a document,\n\t\t// the sax parser currently adds top level text nodes, this will be fixed in 0.9.0\n\t\t// || (node.nodeType === Node.TEXT_NODE && parent.nodeType === Node.DOCUMENT_NODE)\n\t\t// or `node` is a doctype and `parent` is not a document, then throw a \"HierarchyRequestError\" DOMException.\n\t\t(isDocTypeNode(node) && parent.nodeType !== Node.DOCUMENT_NODE)\n\t) {\n\t\tthrow new DOMException(\n\t\t\tHIERARCHY_REQUEST_ERR,\n\t\t\t'Unexpected node type ' + node.nodeType + ' for parent node type ' + parent.nodeType\n\t\t);\n\t}\n}\n\n/**\n * @private\n * Step 6 of the checks before inserting and before replacing a child are different.\n *\n * @param {Document} parent the parent node to insert `node` into\n * @param {Node} node the node to insert\n * @param {Node | undefined} child the node that should become the `nextSibling` of `node`\n * @returns {Node}\n * @throws DOMException for several node combinations that would create a DOM that is not well-formed.\n * @throws DOMException if `child` is provided but is not a child of `parent`.\n * @see https://dom.spec.whatwg.org/#concept-node-ensure-pre-insertion-validity\n * @see https://dom.spec.whatwg.org/#concept-node-replace\n */\nfunction assertPreInsertionValidityInDocument(parent, node, child) {\n\tvar parentChildNodes = parent.childNodes || [];\n\tvar nodeChildNodes = node.childNodes || [];\n\n\t// DocumentFragment\n\tif (node.nodeType === Node.DOCUMENT_FRAGMENT_NODE) {\n\t\tvar nodeChildElements = nodeChildNodes.filter(isElementNode);\n\t\t// If node has more than one element child or has a Text node child.\n\t\tif (nodeChildElements.length > 1 || find(nodeChildNodes, isTextNode)) {\n\t\t\tthrow new DOMException(HIERARCHY_REQUEST_ERR, 'More than one element or text in fragment');\n\t\t}\n\t\t// Otherwise, if `node` has one element child and either `parent` has an element child,\n\t\t// `child` is a doctype, or `child` is non-null and a doctype is following `child`.\n\t\tif (nodeChildElements.length === 1 && !isElementInsertionPossible(parent, child)) {\n\t\t\tthrow new DOMException(HIERARCHY_REQUEST_ERR, 'Element in fragment can not be inserted before doctype');\n\t\t}\n\t}\n\t// Element\n\tif (isElementNode(node)) {\n\t\t// `parent` has an element child, `child` is a doctype,\n\t\t// or `child` is non-null and a doctype is following `child`.\n\t\tif (!isElementInsertionPossible(parent, child)) {\n\t\t\tthrow new DOMException(HIERARCHY_REQUEST_ERR, 'Only one element can be added and only after doctype');\n\t\t}\n\t}\n\t// DocumentType\n\tif (isDocTypeNode(node)) {\n\t\t// `parent` has a doctype child,\n\t\tif (find(parentChildNodes, isDocTypeNode)) {\n\t\t\tthrow new DOMException(HIERARCHY_REQUEST_ERR, 'Only one doctype is allowed');\n\t\t}\n\t\tvar parentElementChild = find(parentChildNodes, isElementNode);\n\t\t// `child` is non-null and an element is preceding `child`,\n\t\tif (child && parentChildNodes.indexOf(parentElementChild) < parentChildNodes.indexOf(child)) {\n\t\t\tthrow new DOMException(HIERARCHY_REQUEST_ERR, 'Doctype can only be inserted before an element');\n\t\t}\n\t\t// or `child` is null and `parent` has an element child.\n\t\tif (!child && parentElementChild) {\n\t\t\tthrow new DOMException(HIERARCHY_REQUEST_ERR, 'Doctype can not be appended since element is present');\n\t\t}\n\t}\n}\n\n/**\n * @private\n * Step 6 of the checks before inserting and before replacing a child are different.\n *\n * @param {Document} parent the parent node to insert `node` into\n * @param {Node} node the node to insert\n * @param {Node | undefined} child the node that should become the `nextSibling` of `node`\n * @returns {Node}\n * @throws DOMException for several node combinations that would create a DOM that is not well-formed.\n * @throws DOMException if `child` is provided but is not a child of `parent`.\n * @see https://dom.spec.whatwg.org/#concept-node-ensure-pre-insertion-validity\n * @see https://dom.spec.whatwg.org/#concept-node-replace\n */\nfunction assertPreReplacementValidityInDocument(parent, node, child) {\n\tvar parentChildNodes = parent.childNodes || [];\n\tvar nodeChildNodes = node.childNodes || [];\n\n\t// DocumentFragment\n\tif (node.nodeType === Node.DOCUMENT_FRAGMENT_NODE) {\n\t\tvar nodeChildElements = nodeChildNodes.filter(isElementNode);\n\t\t// If `node` has more than one element child or has a Text node child.\n\t\tif (nodeChildElements.length > 1 || find(nodeChildNodes, isTextNode)) {\n\t\t\tthrow new DOMException(HIERARCHY_REQUEST_ERR, 'More than one element or text in fragment');\n\t\t}\n\t\t// Otherwise, if `node` has one element child and either `parent` has an element child that is not `child` or a doctype is following `child`.\n\t\tif (nodeChildElements.length === 1 && !isElementReplacementPossible(parent, child)) {\n\t\t\tthrow new DOMException(HIERARCHY_REQUEST_ERR, 'Element in fragment can not be inserted before doctype');\n\t\t}\n\t}\n\t// Element\n\tif (isElementNode(node)) {\n\t\t// `parent` has an element child that is not `child` or a doctype is following `child`.\n\t\tif (!isElementReplacementPossible(parent, child)) {\n\t\t\tthrow new DOMException(HIERARCHY_REQUEST_ERR, 'Only one element can be added and only after doctype');\n\t\t}\n\t}\n\t// DocumentType\n\tif (isDocTypeNode(node)) {\n\t\tfunction hasDoctypeChildThatIsNotChild(node) {\n\t\t\treturn isDocTypeNode(node) && node !== child;\n\t\t}\n\n\t\t// `parent` has a doctype child that is not `child`,\n\t\tif (find(parentChildNodes, hasDoctypeChildThatIsNotChild)) {\n\t\t\tthrow new DOMException(HIERARCHY_REQUEST_ERR, 'Only one doctype is allowed');\n\t\t}\n\t\tvar parentElementChild = find(parentChildNodes, isElementNode);\n\t\t// or an element is preceding `child`.\n\t\tif (child && parentChildNodes.indexOf(parentElementChild) < parentChildNodes.indexOf(child)) {\n\t\t\tthrow new DOMException(HIERARCHY_REQUEST_ERR, 'Doctype can only be inserted before an element');\n\t\t}\n\t}\n}\n\n/**\n * @private\n * @param {Node} parent the parent node to insert `node` into\n * @param {Node} node the node to insert\n * @param {Node=} child the node that should become the `nextSibling` of `node`\n * @returns {Node}\n * @throws DOMException for several node combinations that would create a DOM that is not well-formed.\n * @throws DOMException if `child` is provided but is not a child of `parent`.\n * @see https://dom.spec.whatwg.org/#concept-node-ensure-pre-insertion-validity\n */\nfunction _insertBefore(parent, node, child, _inDocumentAssertion) {\n\t// To ensure pre-insertion validity of a node into a parent before a child, run these steps:\n\tassertPreInsertionValidity1to5(parent, node, child);\n\n\t// If parent is a document, and any of the statements below, switched on the interface node implements,\n\t// are true, then throw a \"HierarchyRequestError\" DOMException.\n\tif (parent.nodeType === Node.DOCUMENT_NODE) {\n\t\t(_inDocumentAssertion || assertPreInsertionValidityInDocument)(parent, node, child);\n\t}\n\n\tvar cp = node.parentNode;\n\tif(cp){\n\t\tcp.removeChild(node);//remove and update\n\t}\n\tif(node.nodeType === DOCUMENT_FRAGMENT_NODE){\n\t\tvar newFirst = node.firstChild;\n\t\tif (newFirst == null) {\n\t\t\treturn node;\n\t\t}\n\t\tvar newLast = node.lastChild;\n\t}else{\n\t\tnewFirst = newLast = node;\n\t}\n\tvar pre = child ? child.previousSibling : parent.lastChild;\n\n\tnewFirst.previousSibling = pre;\n\tnewLast.nextSibling = child;\n\n\n\tif(pre){\n\t\tpre.nextSibling = newFirst;\n\t}else{\n\t\tparent.firstChild = newFirst;\n\t}\n\tif(child == null){\n\t\tparent.lastChild = newLast;\n\t}else{\n\t\tchild.previousSibling = newLast;\n\t}\n\tdo{\n\t\tnewFirst.parentNode = parent;\n\t\t// Update ownerDocument for each node being inserted\n\t\tvar targetDoc = parent.ownerDocument || parent;\n\t\t_updateOwnerDocument(newFirst, targetDoc);\n\t}while(newFirst !== newLast && (newFirst= newFirst.nextSibling))\n\t_onUpdateChild(parent.ownerDocument||parent, parent);\n\t//console.log(parent.lastChild.nextSibling == null)\n\tif (node.nodeType == DOCUMENT_FRAGMENT_NODE) {\n\t\tnode.firstChild = node.lastChild = null;\n\t}\n\treturn node;\n}\n\n/**\n * Recursively updates the ownerDocument property for a node and all its descendants\n * @param {Node} node\n * @param {Document} newOwnerDocument\n * @private\n */\nfunction _updateOwnerDocument(node, newOwnerDocument) {\n\tif (node.ownerDocument === newOwnerDocument) {\n\t\treturn;\n\t}\n\t\n\tnode.ownerDocument = newOwnerDocument;\n\t\n\t// Update attributes if this is an element\n\tif (node.nodeType === ELEMENT_NODE && node.attributes) {\n\t\tfor (var i = 0; i < node.attributes.length; i++) {\n\t\t\tvar attr = node.attributes.item(i);\n\t\t\tif (attr) {\n\t\t\t\tattr.ownerDocument = newOwnerDocument;\n\t\t\t}\n\t\t}\n\t}\n\t\n\t// Recursively update child nodes\n\tvar child = node.firstChild;\n\twhile (child) {\n\t\t_updateOwnerDocument(child, newOwnerDocument);\n\t\tchild = child.nextSibling;\n\t}\n}\n\n/**\n * Appends `newChild` to `parentNode`.\n * If `newChild` is already connected to a `parentNode` it is first removed from it.\n *\n * @see https://github.com/xmldom/xmldom/issues/135\n * @see https://github.com/xmldom/xmldom/issues/145\n * @param {Node} parentNode\n * @param {Node} newChild\n * @returns {Node}\n * @private\n */\nfunction _appendSingleChild (parentNode, newChild) {\n\tif (newChild.parentNode) {\n\t\tnewChild.parentNode.removeChild(newChild);\n\t}\n\tnewChild.parentNode = parentNode;\n\tnewChild.previousSibling = parentNode.lastChild;\n\tnewChild.nextSibling = null;\n\tif (newChild.previousSibling) {\n\t\tnewChild.previousSibling.nextSibling = newChild;\n\t} else {\n\t\tparentNode.firstChild = newChild;\n\t}\n\tparentNode.lastChild = newChild;\n\t_onUpdateChild(parentNode.ownerDocument, parentNode, newChild);\n\t\n\t// Update ownerDocument for the new child and all its descendants\n\tvar targetDoc = parentNode.ownerDocument || parentNode;\n\t_updateOwnerDocument(newChild, targetDoc);\n\t\n\treturn newChild;\n}\n\nDocument.prototype = {\n\t//implementation : null,\n\tnodeName :  '#document',\n\tnodeType :  DOCUMENT_NODE,\n\t/**\n\t * The DocumentType node of the document.\n\t *\n\t * @readonly\n\t * @type DocumentType\n\t */\n\tdoctype :  null,\n\tdocumentElement :  null,\n\t_inc : 1,\n\n\tinsertBefore :  function(newChild, refChild){//raises\n\t\tif(newChild.nodeType == DOCUMENT_FRAGMENT_NODE){\n\t\t\tvar child = newChild.firstChild;\n\t\t\twhile(child){\n\t\t\t\tvar next = child.nextSibling;\n\t\t\t\tthis.insertBefore(child,refChild);\n\t\t\t\tchild = next;\n\t\t\t}\n\t\t\treturn newChild;\n\t\t}\n\t\t_insertBefore(this, newChild, refChild);\n\t\t_updateOwnerDocument(newChild, this);\n\t\tif (this.documentElement === null && newChild.nodeType === ELEMENT_NODE) {\n\t\t\tthis.documentElement = newChild;\n\t\t}\n\n\t\treturn newChild;\n\t},\n\tremoveChild :  function(oldChild){\n\t\tif(this.documentElement == oldChild){\n\t\t\tthis.documentElement = null;\n\t\t}\n\t\treturn _removeChild(this,oldChild);\n\t},\n\treplaceChild: function (newChild, oldChild) {\n\t\t//raises\n\t\t_insertBefore(this, newChild, oldChild, assertPreReplacementValidityInDocument);\n\t\t_updateOwnerDocument(newChild, this);\n\t\tif (oldChild) {\n\t\t\tthis.removeChild(oldChild);\n\t\t}\n\t\tif (isElementNode(newChild)) {\n\t\t\tthis.documentElement = newChild;\n\t\t}\n\t},\n\t// Introduced in DOM Level 2:\n\timportNode : function(importedNode,deep){\n\t\treturn importNode(this,importedNode,deep);\n\t},\n\t// Introduced in DOM Level 2:\n\tgetElementById :\tfunction(id){\n\t\tvar rtv = null;\n\t\t_visitNode(this.documentElement,function(node){\n\t\t\tif(node.nodeType == ELEMENT_NODE){\n\t\t\t\tif(node.getAttribute('id') == id){\n\t\t\t\t\trtv = node;\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\t\treturn rtv;\n\t},\n\n\t/**\n\t * The `getElementsByClassName` method of `Document` interface returns an array-like object\n\t * of all child elements which have **all** of the given class name(s).\n\t *\n\t * Returns an empty list if `classeNames` is an empty string or only contains HTML white space characters.\n\t *\n\t *\n\t * Warning: This is a live LiveNodeList.\n\t * Changes in the DOM will reflect in the array as the changes occur.\n\t * If an element selected by this array no longer qualifies for the selector,\n\t * it will automatically be removed. Be aware of this for iteration purposes.\n\t *\n\t * @param {string} classNames is a string representing the class name(s) to match; multiple class names are separated by (ASCII-)whitespace\n\t *\n\t * @see https://developer.mozilla.org/en-US/docs/Web/API/Document/getElementsByClassName\n\t * @see https://dom.spec.whatwg.org/#concept-getelementsbyclassname\n\t */\n\tgetElementsByClassName: function(classNames) {\n\t\tvar classNamesSet = toOrderedSet(classNames)\n\t\treturn new LiveNodeList(this, function(base) {\n\t\t\tvar ls = [];\n\t\t\tif (classNamesSet.length > 0) {\n\t\t\t\t_visitNode(base.documentElement, function(node) {\n\t\t\t\t\tif(node !== base && node.nodeType === ELEMENT_NODE) {\n\t\t\t\t\t\tvar nodeClassNames = node.getAttribute('class')\n\t\t\t\t\t\t// can be null if the attribute does not exist\n\t\t\t\t\t\tif (nodeClassNames) {\n\t\t\t\t\t\t\t// before splitting and iterating just compare them for the most common case\n\t\t\t\t\t\t\tvar matches = classNames === nodeClassNames;\n\t\t\t\t\t\t\tif (!matches) {\n\t\t\t\t\t\t\t\tvar nodeClassNamesSet = toOrderedSet(nodeClassNames)\n\t\t\t\t\t\t\t\tmatches = classNamesSet.every(arrayIncludes(nodeClassNamesSet))\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif(matches) {\n\t\t\t\t\t\t\t\tls.push(node);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t\treturn ls;\n\t\t});\n\t},\n\n\t//document factory method:\n\tcreateElement :\tfunction(tagName){\n\t\tvar node = new Element();\n\t\tnode.ownerDocument = this;\n\t\tnode.nodeName = tagName;\n\t\tnode.tagName = tagName;\n\t\tnode.localName = tagName;\n\t\tnode.childNodes = new NodeList();\n\t\tvar attrs\t= node.attributes = new NamedNodeMap();\n\t\tattrs._ownerElement = node;\n\t\treturn node;\n\t},\n\tcreateDocumentFragment :\tfunction(){\n\t\tvar node = new DocumentFragment();\n\t\tnode.ownerDocument = this;\n\t\tnode.childNodes = new NodeList();\n\t\treturn node;\n\t},\n\tcreateTextNode :\tfunction(data){\n\t\tvar node = new Text();\n\t\tnode.ownerDocument = this;\n\t\tnode.appendData(data)\n\t\treturn node;\n\t},\n\tcreateComment :\tfunction(data){\n\t\tvar node = new Comment();\n\t\tnode.ownerDocument = this;\n\t\tnode.appendData(data)\n\t\treturn node;\n\t},\n\tcreateCDATASection :\tfunction(data){\n\t\tvar node = new CDATASection();\n\t\tnode.ownerDocument = this;\n\t\tnode.appendData(data)\n\t\treturn node;\n\t},\n\tcreateProcessingInstruction :\tfunction(target,data){\n\t\tvar node = new ProcessingInstruction();\n\t\tnode.ownerDocument = this;\n\t\tnode.tagName = node.nodeName = node.target = target;\n\t\tnode.nodeValue = node.data = data;\n\t\treturn node;\n\t},\n\tcreateAttribute :\tfunction(name){\n\t\tvar node = new Attr();\n\t\tnode.ownerDocument\t= this;\n\t\tnode.name = name;\n\t\tnode.nodeName\t= name;\n\t\tnode.localName = name;\n\t\tnode.specified = true;\n\t\treturn node;\n\t},\n\tcreateEntityReference :\tfunction(name){\n\t\tvar node = new EntityReference();\n\t\tnode.ownerDocument\t= this;\n\t\tnode.nodeName\t= name;\n\t\treturn node;\n\t},\n\t// Introduced in DOM Level 2:\n\tcreateElementNS :\tfunction(namespaceURI,qualifiedName){\n\t\tvar node = new Element();\n\t\tvar pl = qualifiedName.split(':');\n\t\tvar attrs\t= node.attributes = new NamedNodeMap();\n\t\tnode.childNodes = new NodeList();\n\t\tnode.ownerDocument = this;\n\t\tnode.nodeName = qualifiedName;\n\t\tnode.tagName = qualifiedName;\n\t\tnode.namespaceURI = namespaceURI;\n\t\tif(pl.length == 2){\n\t\t\tnode.prefix = pl[0];\n\t\t\tnode.localName = pl[1];\n\t\t}else{\n\t\t\t//el.prefix = null;\n\t\t\tnode.localName = qualifiedName;\n\t\t}\n\t\tattrs._ownerElement = node;\n\t\treturn node;\n\t},\n\t// Introduced in DOM Level 2:\n\tcreateAttributeNS :\tfunction(namespaceURI,qualifiedName){\n\t\tvar node = new Attr();\n\t\tvar pl = qualifiedName.split(':');\n\t\tnode.ownerDocument = this;\n\t\tnode.nodeName = qualifiedName;\n\t\tnode.name = qualifiedName;\n\t\tnode.namespaceURI = namespaceURI;\n\t\tnode.specified = true;\n\t\tif(pl.length == 2){\n\t\t\tnode.prefix = pl[0];\n\t\t\tnode.localName = pl[1];\n\t\t}else{\n\t\t\t//el.prefix = null;\n\t\t\tnode.localName = qualifiedName;\n\t\t}\n\t\treturn node;\n\t}\n};\n_extends(Document,Node);\n\n\nfunction Element() {\n\tthis._nsMap = {};\n};\nElement.prototype = {\n\tnodeType : ELEMENT_NODE,\n\thasAttribute : function(name){\n\t\treturn this.getAttributeNode(name)!=null;\n\t},\n\tgetAttribute : function(name){\n\t\tvar attr = this.getAttributeNode(name);\n\t\treturn attr && attr.value || '';\n\t},\n\tgetAttributeNode : function(name){\n\t\treturn this.attributes.getNamedItem(name);\n\t},\n\tsetAttribute : function(name, value){\n\t\tvar attr = this.ownerDocument.createAttribute(name);\n\t\tattr.value = attr.nodeValue = \"\" + value;\n\t\tthis.setAttributeNode(attr)\n\t},\n\tremoveAttribute : function(name){\n\t\tvar attr = this.getAttributeNode(name)\n\t\tattr && this.removeAttributeNode(attr);\n\t},\n\n\t//four real opeartion method\n\tappendChild:function(newChild){\n\t\tif(newChild.nodeType === DOCUMENT_FRAGMENT_NODE){\n\t\t\treturn this.insertBefore(newChild,null);\n\t\t}else{\n\t\t\treturn _appendSingleChild(this,newChild);\n\t\t}\n\t},\n\tsetAttributeNode : function(newAttr){\n\t\treturn this.attributes.setNamedItem(newAttr);\n\t},\n\tsetAttributeNodeNS : function(newAttr){\n\t\treturn this.attributes.setNamedItemNS(newAttr);\n\t},\n\tremoveAttributeNode : function(oldAttr){\n\t\t//console.log(this == oldAttr.ownerElement)\n\t\treturn this.attributes.removeNamedItem(oldAttr.nodeName);\n\t},\n\t//get real attribute name,and remove it by removeAttributeNode\n\tremoveAttributeNS : function(namespaceURI, localName){\n\t\tvar old = this.getAttributeNodeNS(namespaceURI, localName);\n\t\told && this.removeAttributeNode(old);\n\t},\n\n\thasAttributeNS : function(namespaceURI, localName){\n\t\treturn this.getAttributeNodeNS(namespaceURI, localName)!=null;\n\t},\n\tgetAttributeNS : function(namespaceURI, localName){\n\t\tvar attr = this.getAttributeNodeNS(namespaceURI, localName);\n\t\treturn attr && attr.value || '';\n\t},\n\tsetAttributeNS : function(namespaceURI, qualifiedName, value){\n\t\tvar attr = this.ownerDocument.createAttributeNS(namespaceURI, qualifiedName);\n\t\tattr.value = attr.nodeValue = \"\" + value;\n\t\tthis.setAttributeNode(attr)\n\t},\n\tgetAttributeNodeNS : function(namespaceURI, localName){\n\t\treturn this.attributes.getNamedItemNS(namespaceURI, localName);\n\t},\n\n\tgetElementsByTagName : function(tagName){\n\t\treturn new LiveNodeList(this,function(base){\n\t\t\tvar ls = [];\n\t\t\t_visitNode(base,function(node){\n\t\t\t\tif(node !== base && node.nodeType == ELEMENT_NODE && (tagName === '*' || node.tagName == tagName)){\n\t\t\t\t\tls.push(node);\n\t\t\t\t}\n\t\t\t});\n\t\t\treturn ls;\n\t\t});\n\t},\n\tgetElementsByTagNameNS : function(namespaceURI, localName){\n\t\treturn new LiveNodeList(this,function(base){\n\t\t\tvar ls = [];\n\t\t\t_visitNode(base,function(node){\n\t\t\t\tif(node !== base && node.nodeType === ELEMENT_NODE && (namespaceURI === '*' || node.namespaceURI === namespaceURI) && (localName === '*' || node.localName == localName)){\n\t\t\t\t\tls.push(node);\n\t\t\t\t}\n\t\t\t});\n\t\t\treturn ls;\n\n\t\t});\n\t}\n};\nDocument.prototype.getElementsByTagName = Element.prototype.getElementsByTagName;\nDocument.prototype.getElementsByTagNameNS = Element.prototype.getElementsByTagNameNS;\n\n\n_extends(Element,Node);\nfunction Attr() {\n};\nAttr.prototype.nodeType = ATTRIBUTE_NODE;\n_extends(Attr,Node);\n\n\nfunction CharacterData() {\n};\nCharacterData.prototype = {\n\tdata : '',\n\tsubstringData : function(offset, count) {\n\t\treturn this.data.substring(offset, offset+count);\n\t},\n\tappendData: function(text) {\n\t\ttext = this.data+text;\n\t\tthis.nodeValue = this.data = text;\n\t\tthis.length = text.length;\n\t},\n\tinsertData: function(offset,text) {\n\t\tthis.replaceData(offset,0,text);\n\n\t},\n\tappendChild:function(newChild){\n\t\tthrow new Error(ExceptionMessage[HIERARCHY_REQUEST_ERR])\n\t},\n\tdeleteData: function(offset, count) {\n\t\tthis.replaceData(offset,count,\"\");\n\t},\n\treplaceData: function(offset, count, text) {\n\t\tvar start = this.data.substring(0,offset);\n\t\tvar end = this.data.substring(offset+count);\n\t\ttext = start + text + end;\n\t\tthis.nodeValue = this.data = text;\n\t\tthis.length = text.length;\n\t}\n}\n_extends(CharacterData,Node);\nfunction Text() {\n};\nText.prototype = {\n\tnodeName : \"#text\",\n\tnodeType : TEXT_NODE,\n\tsplitText : function(offset) {\n\t\tvar text = this.data;\n\t\tvar newText = text.substring(offset);\n\t\ttext = text.substring(0, offset);\n\t\tthis.data = this.nodeValue = text;\n\t\tthis.length = text.length;\n\t\tvar newNode = this.ownerDocument.createTextNode(newText);\n\t\tif(this.parentNode){\n\t\t\tthis.parentNode.insertBefore(newNode, this.nextSibling);\n\t\t}\n\t\treturn newNode;\n\t}\n}\n_extends(Text,CharacterData);\nfunction Comment() {\n};\nComment.prototype = {\n\tnodeName : \"#comment\",\n\tnodeType : COMMENT_NODE\n}\n_extends(Comment,CharacterData);\n\nfunction CDATASection() {\n};\nCDATASection.prototype = {\n\tnodeName : \"#cdata-section\",\n\tnodeType : CDATA_SECTION_NODE\n}\n_extends(CDATASection,CharacterData);\n\n\nfunction DocumentType() {\n};\nDocumentType.prototype.nodeType = DOCUMENT_TYPE_NODE;\n_extends(DocumentType,Node);\n\nfunction Notation() {\n};\nNotation.prototype.nodeType = NOTATION_NODE;\n_extends(Notation,Node);\n\nfunction Entity() {\n};\nEntity.prototype.nodeType = ENTITY_NODE;\n_extends(Entity,Node);\n\nfunction EntityReference() {\n};\nEntityReference.prototype.nodeType = ENTITY_REFERENCE_NODE;\n_extends(EntityReference,Node);\n\nfunction DocumentFragment() {\n};\nDocumentFragment.prototype.nodeName =\t\"#document-fragment\";\nDocumentFragment.prototype.nodeType =\tDOCUMENT_FRAGMENT_NODE;\n_extends(DocumentFragment,Node);\n\n\nfunction ProcessingInstruction() {\n}\nProcessingInstruction.prototype.nodeType = PROCESSING_INSTRUCTION_NODE;\n_extends(ProcessingInstruction,Node);\nfunction XMLSerializer(){}\nXMLSerializer.prototype.serializeToString = function(node,isHtml,nodeFilter){\n\treturn nodeSerializeToString.call(node,isHtml,nodeFilter);\n}\nNode.prototype.toString = nodeSerializeToString;\nfunction nodeSerializeToString(isHtml,nodeFilter){\n\tvar buf = [];\n\tvar refNode = this.nodeType == 9 && this.documentElement || this;\n\tvar prefix = refNode.prefix;\n\tvar uri = refNode.namespaceURI;\n\n\tif(uri && prefix == null){\n\t\t//console.log(prefix)\n\t\tvar prefix = refNode.lookupPrefix(uri);\n\t\tif(prefix == null){\n\t\t\t//isHTML = true;\n\t\t\tvar visibleNamespaces=[\n\t\t\t{namespace:uri,prefix:null}\n\t\t\t//{namespace:uri,prefix:''}\n\t\t\t]\n\t\t}\n\t}\n\tserializeToString(this,buf,isHtml,nodeFilter,visibleNamespaces);\n\t//console.log('###',this.nodeType,uri,prefix,buf.join(''))\n\treturn buf.join('');\n}\n\nfunction needNamespaceDefine(node, isHTML, visibleNamespaces) {\n\tvar prefix = node.prefix || '';\n\tvar uri = node.namespaceURI;\n\t// According to [Namespaces in XML 1.0](https://www.w3.org/TR/REC-xml-names/#ns-using) ,\n\t// and more specifically https://www.w3.org/TR/REC-xml-names/#nsc-NoPrefixUndecl :\n\t// > In a namespace declaration for a prefix [...], the attribute value MUST NOT be empty.\n\t// in a similar manner [Namespaces in XML 1.1](https://www.w3.org/TR/xml-names11/#ns-using)\n\t// and more specifically https://www.w3.org/TR/xml-names11/#nsc-NSDeclared :\n\t// > [...] Furthermore, the attribute value [...] must not be an empty string.\n\t// so serializing empty namespace value like xmlns:ds=\"\" would produce an invalid XML document.\n\tif (!uri) {\n\t\treturn false;\n\t}\n\tif (prefix === \"xml\" && uri === NAMESPACE.XML || uri === NAMESPACE.XMLNS) {\n\t\treturn false;\n\t}\n\n\tvar i = visibleNamespaces.length\n\twhile (i--) {\n\t\tvar ns = visibleNamespaces[i];\n\t\t// get namespace prefix\n\t\tif (ns.prefix === prefix) {\n\t\t\treturn ns.namespace !== uri;\n\t\t}\n\t}\n\treturn true;\n}\n/**\n * Well-formed constraint: No < in Attribute Values\n * > The replacement text of any entity referred to directly or indirectly\n * > in an attribute value must not contain a <.\n * @see https://www.w3.org/TR/xml11/#CleanAttrVals\n * @see https://www.w3.org/TR/xml11/#NT-AttValue\n *\n * Literal whitespace other than space that appear in attribute values\n * are serialized as their entity references, so they will be preserved.\n * (In contrast to whitespace literals in the input which are normalized to spaces)\n * @see https://www.w3.org/TR/xml11/#AVNormalize\n * @see https://w3c.github.io/DOM-Parsing/#serializing-an-element-s-attributes\n */\nfunction addSerializedAttribute(buf, qualifiedName, value) {\n\tbuf.push(' ', qualifiedName, '=\"', value.replace(/[<>&\"\\t\\n\\r]/g, _xmlEncoder), '\"')\n}\n\nfunction serializeToString(node,buf,isHTML,nodeFilter,visibleNamespaces){\n\tif (!visibleNamespaces) {\n\t\tvisibleNamespaces = [];\n\t}\n\n\tif(nodeFilter){\n\t\tnode = nodeFilter(node);\n\t\tif(node){\n\t\t\tif(typeof node == 'string'){\n\t\t\t\tbuf.push(node);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}else{\n\t\t\treturn;\n\t\t}\n\t\t//buf.sort.apply(attrs, attributeSorter);\n\t}\n\n\tswitch(node.nodeType){\n\tcase ELEMENT_NODE:\n\t\tvar attrs = node.attributes;\n\t\tvar len = attrs.length;\n\t\tvar child = node.firstChild;\n\t\tvar nodeName = node.tagName;\n\n\t\tisHTML = NAMESPACE.isHTML(node.namespaceURI) || isHTML\n\n\t\tvar prefixedNodeName = nodeName\n\t\tif (!isHTML && !node.prefix && node.namespaceURI) {\n\t\t\tvar defaultNS\n\t\t\t// lookup current default ns from `xmlns` attribute\n\t\t\tfor (var ai = 0; ai < attrs.length; ai++) {\n\t\t\t\tif (attrs.item(ai).name === 'xmlns') {\n\t\t\t\t\tdefaultNS = attrs.item(ai).value\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (!defaultNS) {\n\t\t\t\t// lookup current default ns in visibleNamespaces\n\t\t\t\tfor (var nsi = visibleNamespaces.length - 1; nsi >= 0; nsi--) {\n\t\t\t\t\tvar namespace = visibleNamespaces[nsi]\n\t\t\t\t\tif (namespace.prefix === '' && namespace.namespace === node.namespaceURI) {\n\t\t\t\t\t\tdefaultNS = namespace.namespace\n\t\t\t\t\t\tbreak\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (defaultNS !== node.namespaceURI) {\n\t\t\t\tfor (var nsi = visibleNamespaces.length - 1; nsi >= 0; nsi--) {\n\t\t\t\t\tvar namespace = visibleNamespaces[nsi]\n\t\t\t\t\tif (namespace.namespace === node.namespaceURI) {\n\t\t\t\t\t\tif (namespace.prefix) {\n\t\t\t\t\t\t\tprefixedNodeName = namespace.prefix + ':' + nodeName\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tbuf.push('<', prefixedNodeName);\n\n\t\tfor(var i=0;i<len;i++){\n\t\t\t// add namespaces for attributes\n\t\t\tvar attr = attrs.item(i);\n\t\t\tif (attr.prefix == 'xmlns') {\n\t\t\t\tvisibleNamespaces.push({ prefix: attr.localName, namespace: attr.value });\n\t\t\t}else if(attr.nodeName == 'xmlns'){\n\t\t\t\tvisibleNamespaces.push({ prefix: '', namespace: attr.value });\n\t\t\t}\n\t\t}\n\n\t\tfor(var i=0;i<len;i++){\n\t\t\tvar attr = attrs.item(i);\n\t\t\tif (needNamespaceDefine(attr,isHTML, visibleNamespaces)) {\n\t\t\t\tvar prefix = attr.prefix||'';\n\t\t\t\tvar uri = attr.namespaceURI;\n\t\t\t\taddSerializedAttribute(buf, prefix ? 'xmlns:' + prefix : \"xmlns\", uri);\n\t\t\t\tvisibleNamespaces.push({ prefix: prefix, namespace:uri });\n\t\t\t}\n\t\t\tserializeToString(attr,buf,isHTML,nodeFilter,visibleNamespaces);\n\t\t}\n\n\t\t// add namespace for current node\n\t\tif (nodeName === prefixedNodeName && needNamespaceDefine(node, isHTML, visibleNamespaces)) {\n\t\t\tvar prefix = node.prefix||'';\n\t\t\tvar uri = node.namespaceURI;\n\t\t\taddSerializedAttribute(buf, prefix ? 'xmlns:' + prefix : \"xmlns\", uri);\n\t\t\tvisibleNamespaces.push({ prefix: prefix, namespace:uri });\n\t\t}\n\n\t\tif(child || isHTML && !/^(?:meta|link|img|br|hr|input)$/i.test(nodeName)){\n\t\t\tbuf.push('>');\n\t\t\t//if is cdata child node\n\t\t\tif(isHTML && /^script$/i.test(nodeName)){\n\t\t\t\twhile(child){\n\t\t\t\t\tif(child.data){\n\t\t\t\t\t\tbuf.push(child.data);\n\t\t\t\t\t}else{\n\t\t\t\t\t\tserializeToString(child, buf, isHTML, nodeFilter, visibleNamespaces.slice());\n\t\t\t\t\t}\n\t\t\t\t\tchild = child.nextSibling;\n\t\t\t\t}\n\t\t\t}else\n\t\t\t{\n\t\t\t\twhile(child){\n\t\t\t\t\tserializeToString(child, buf, isHTML, nodeFilter, visibleNamespaces.slice());\n\t\t\t\t\tchild = child.nextSibling;\n\t\t\t\t}\n\t\t\t}\n\t\t\tbuf.push('</',prefixedNodeName,'>');\n\t\t}else{\n\t\t\tbuf.push('/>');\n\t\t}\n\t\t// remove added visible namespaces\n\t\t//visibleNamespaces.length = startVisibleNamespaces;\n\t\treturn;\n\tcase DOCUMENT_NODE:\n\tcase DOCUMENT_FRAGMENT_NODE:\n\t\tvar child = node.firstChild;\n\t\twhile(child){\n\t\t\tserializeToString(child, buf, isHTML, nodeFilter, visibleNamespaces.slice());\n\t\t\tchild = child.nextSibling;\n\t\t}\n\t\treturn;\n\tcase ATTRIBUTE_NODE:\n\t\treturn addSerializedAttribute(buf, node.name, node.value);\n\tcase TEXT_NODE:\n\t\t/**\n\t\t * The ampersand character (&) and the left angle bracket (<) must not appear in their literal form,\n\t\t * except when used as markup delimiters, or within a comment, a processing instruction, or a CDATA section.\n\t\t * If they are needed elsewhere, they must be escaped using either numeric character references or the strings\n\t\t * `&amp;` and `&lt;` respectively.\n\t\t * The right angle bracket (>) may be represented using the string \" &gt; \", and must, for compatibility,\n\t\t * be escaped using either `&gt;` or a character reference when it appears in the string `]]>` in content,\n\t\t * when that string is not marking the end of a CDATA section.\n\t\t *\n\t\t * In the content of elements, character data is any string of characters\n\t\t * which does not contain the start-delimiter of any markup\n\t\t * and does not include the CDATA-section-close delimiter, `]]>`.\n\t\t *\n\t\t * @see https://www.w3.org/TR/xml/#NT-CharData\n\t\t * @see https://w3c.github.io/DOM-Parsing/#xml-serializing-a-text-node\n\t\t */\n\t\treturn buf.push(node.data\n\t\t\t.replace(/[<&>]/g,_xmlEncoder)\n\t\t);\n\tcase CDATA_SECTION_NODE:\n\t\treturn buf.push( '<![CDATA[',node.data,']]>');\n\tcase COMMENT_NODE:\n\t\treturn buf.push( \"<!--\",node.data,\"-->\");\n\tcase DOCUMENT_TYPE_NODE:\n\t\tvar pubid = node.publicId;\n\t\tvar sysid = node.systemId;\n\t\tbuf.push('<!DOCTYPE ',node.name);\n\t\tif(pubid){\n\t\t\tbuf.push(' PUBLIC ', pubid);\n\t\t\tif (sysid && sysid!='.') {\n\t\t\t\tbuf.push(' ', sysid);\n\t\t\t}\n\t\t\tbuf.push('>');\n\t\t}else if(sysid && sysid!='.'){\n\t\t\tbuf.push(' SYSTEM ', sysid, '>');\n\t\t}else{\n\t\t\tvar sub = node.internalSubset;\n\t\t\tif(sub){\n\t\t\t\tbuf.push(\" [\",sub,\"]\");\n\t\t\t}\n\t\t\tbuf.push(\">\");\n\t\t}\n\t\treturn;\n\tcase PROCESSING_INSTRUCTION_NODE:\n\t\treturn buf.push( \"<?\",node.target,\" \",node.data,\"?>\");\n\tcase ENTITY_REFERENCE_NODE:\n\t\treturn buf.push( '&',node.nodeName,';');\n\t//case ENTITY_NODE:\n\t//case NOTATION_NODE:\n\tdefault:\n\t\tbuf.push('??',node.nodeName);\n\t}\n}\nfunction importNode(doc,node,deep){\n\tvar node2;\n\tswitch (node.nodeType) {\n\tcase ELEMENT_NODE:\n\t\tnode2 = node.cloneNode(false);\n\t\tnode2.ownerDocument = doc;\n\t\t//var attrs = node2.attributes;\n\t\t//var len = attrs.length;\n\t\t//for(var i=0;i<len;i++){\n\t\t\t//node2.setAttributeNodeNS(importNode(doc,attrs.item(i),deep));\n\t\t//}\n\tcase DOCUMENT_FRAGMENT_NODE:\n\t\tbreak;\n\tcase ATTRIBUTE_NODE:\n\t\tdeep = true;\n\t\tbreak;\n\t//case ENTITY_REFERENCE_NODE:\n\t//case PROCESSING_INSTRUCTION_NODE:\n\t////case TEXT_NODE:\n\t//case CDATA_SECTION_NODE:\n\t//case COMMENT_NODE:\n\t//\tdeep = false;\n\t//\tbreak;\n\t//case DOCUMENT_NODE:\n\t//case DOCUMENT_TYPE_NODE:\n\t//cannot be imported.\n\t//case ENTITY_NODE:\n\t//case NOTATION_NODE：\n\t//can not hit in level3\n\t//default:throw e;\n\t}\n\tif(!node2){\n\t\tnode2 = node.cloneNode(false);//false\n\t}\n\tnode2.ownerDocument = doc;\n\tnode2.parentNode = null;\n\tif(deep){\n\t\tvar child = node.firstChild;\n\t\twhile(child){\n\t\t\tnode2.appendChild(importNode(doc,child,deep));\n\t\t\tchild = child.nextSibling;\n\t\t}\n\t}\n\treturn node2;\n}\n//\n//var _relationMap = {firstChild:1,lastChild:1,previousSibling:1,nextSibling:1,\n//\t\t\t\t\tattributes:1,childNodes:1,parentNode:1,documentElement:1,doctype,};\nfunction cloneNode(doc,node,deep){\n\tvar node2 = new node.constructor();\n\tfor (var n in node) {\n\t\tif (Object.prototype.hasOwnProperty.call(node, n)) {\n\t\t\tvar v = node[n];\n\t\t\tif (typeof v != \"object\") {\n\t\t\t\tif (v != node2[n]) {\n\t\t\t\t\tnode2[n] = v;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\tif(node.childNodes){\n\t\tnode2.childNodes = new NodeList();\n\t}\n\tnode2.ownerDocument = doc;\n\tswitch (node2.nodeType) {\n\tcase ELEMENT_NODE:\n\t\tvar attrs\t= node.attributes;\n\t\tvar attrs2\t= node2.attributes = new NamedNodeMap();\n\t\tvar len = attrs.length\n\t\tattrs2._ownerElement = node2;\n\t\tfor(var i=0;i<len;i++){\n\t\t\tnode2.setAttributeNode(cloneNode(doc,attrs.item(i),true));\n\t\t}\n\t\tbreak;;\n\tcase ATTRIBUTE_NODE:\n\t\tdeep = true;\n\t}\n\tif(deep){\n\t\tvar child = node.firstChild;\n\t\twhile(child){\n\t\t\tnode2.appendChild(cloneNode(doc,child,deep));\n\t\t\tchild = child.nextSibling;\n\t\t}\n\t}\n\treturn node2;\n}\n\nfunction __set__(object,key,value){\n\tobject[key] = value\n}\n//do dynamic\ntry{\n\tif(Object.defineProperty){\n\t\tObject.defineProperty(LiveNodeList.prototype,'length',{\n\t\t\tget:function(){\n\t\t\t\t_updateLiveList(this);\n\t\t\t\treturn this.$$length;\n\t\t\t}\n\t\t});\n\n\t\tObject.defineProperty(Node.prototype,'textContent',{\n\t\t\tget:function(){\n\t\t\t\treturn getTextContent(this);\n\t\t\t},\n\n\t\t\tset:function(data){\n\t\t\t\tswitch(this.nodeType){\n\t\t\t\tcase ELEMENT_NODE:\n\t\t\t\tcase DOCUMENT_FRAGMENT_NODE:\n\t\t\t\t\twhile(this.firstChild){\n\t\t\t\t\t\tthis.removeChild(this.firstChild);\n\t\t\t\t\t}\n\t\t\t\t\tif(data || String(data)){\n\t\t\t\t\t\tthis.appendChild(this.ownerDocument.createTextNode(data));\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\n\t\t\t\tdefault:\n\t\t\t\t\tthis.data = data;\n\t\t\t\t\tthis.value = data;\n\t\t\t\t\tthis.nodeValue = data;\n\t\t\t\t}\n\t\t\t}\n\t\t})\n\n\t\tfunction getTextContent(node){\n\t\t\tswitch(node.nodeType){\n\t\t\tcase ELEMENT_NODE:\n\t\t\tcase DOCUMENT_FRAGMENT_NODE:\n\t\t\t\tvar buf = [];\n\t\t\t\tnode = node.firstChild;\n\t\t\t\twhile(node){\n\t\t\t\t\tif(node.nodeType!==7 && node.nodeType !==8){\n\t\t\t\t\t\tbuf.push(getTextContent(node));\n\t\t\t\t\t}\n\t\t\t\t\tnode = node.nextSibling;\n\t\t\t\t}\n\t\t\t\treturn buf.join('');\n\t\t\tdefault:\n\t\t\t\treturn node.nodeValue;\n\t\t\t}\n\t\t}\n\n\t\t__set__ = function(object,key,value){\n\t\t\t//console.log(value)\n\t\t\tobject['$$'+key] = value\n\t\t}\n\t}\n}catch(e){//ie8\n}\n\n//if(typeof require == 'function'){\n\texports.DocumentType = DocumentType;\n\texports.DOMException = DOMException;\n\texports.DOMImplementation = DOMImplementation;\n\texports.Element = Element;\n\texports.Node = Node;\n\texports.NodeList = NodeList;\n\texports.XMLSerializer = XMLSerializer;\n//}\n","'use strict';\n\nvar freeze = require('./conventions').freeze;\n\n/**\n * The entities that are predefined in every XML document.\n *\n * @see https://www.w3.org/TR/2006/REC-xml11-20060816/#sec-predefined-ent W3C XML 1.1\n * @see https://www.w3.org/TR/2008/REC-xml-20081126/#sec-predefined-ent W3C XML 1.0\n * @see https://en.wikipedia.org/wiki/List_of_XML_and_HTML_character_entity_references#Predefined_entities_in_XML Wikipedia\n */\nexports.XML_ENTITIES = freeze({\n\tamp: '&',\n\tapos: \"'\",\n\tgt: '>',\n\tlt: '<',\n\tquot: '\"',\n});\n\n/**\n * A map of all entities that are detected in an HTML document.\n * They contain all entries from `XML_ENTITIES`.\n *\n * @see XML_ENTITIES\n * @see DOMParser.parseFromString\n * @see DOMImplementation.prototype.createHTMLDocument\n * @see https://html.spec.whatwg.org/#named-character-references WHATWG HTML(5) Spec\n * @see https://html.spec.whatwg.org/entities.json JSON\n * @see https://www.w3.org/TR/xml-entity-names/ W3C XML Entity Names\n * @see https://www.w3.org/TR/html4/sgml/entities.html W3C HTML4/SGML\n * @see https://en.wikipedia.org/wiki/List_of_XML_and_HTML_character_entity_references#Character_entity_references_in_HTML Wikipedia (HTML)\n * @see https://en.wikipedia.org/wiki/List_of_XML_and_HTML_character_entity_references#Entities_representing_special_characters_in_XHTML Wikpedia (XHTML)\n */\nexports.HTML_ENTITIES = freeze({\n\tAacute: '\\u00C1',\n\taacute: '\\u00E1',\n\tAbreve: '\\u0102',\n\tabreve: '\\u0103',\n\tac: '\\u223E',\n\tacd: '\\u223F',\n\tacE: '\\u223E\\u0333',\n\tAcirc: '\\u00C2',\n\tacirc: '\\u00E2',\n\tacute: '\\u00B4',\n\tAcy: '\\u0410',\n\tacy: '\\u0430',\n\tAElig: '\\u00C6',\n\taelig: '\\u00E6',\n\taf: '\\u2061',\n\tAfr: '\\uD835\\uDD04',\n\tafr: '\\uD835\\uDD1E',\n\tAgrave: '\\u00C0',\n\tagrave: '\\u00E0',\n\talefsym: '\\u2135',\n\taleph: '\\u2135',\n\tAlpha: '\\u0391',\n\talpha: '\\u03B1',\n\tAmacr: '\\u0100',\n\tamacr: '\\u0101',\n\tamalg: '\\u2A3F',\n\tAMP: '\\u0026',\n\tamp: '\\u0026',\n\tAnd: '\\u2A53',\n\tand: '\\u2227',\n\tandand: '\\u2A55',\n\tandd: '\\u2A5C',\n\tandslope: '\\u2A58',\n\tandv: '\\u2A5A',\n\tang: '\\u2220',\n\tange: '\\u29A4',\n\tangle: '\\u2220',\n\tangmsd: '\\u2221',\n\tangmsdaa: '\\u29A8',\n\tangmsdab: '\\u29A9',\n\tangmsdac: '\\u29AA',\n\tangmsdad: '\\u29AB',\n\tangmsdae: '\\u29AC',\n\tangmsdaf: '\\u29AD',\n\tangmsdag: '\\u29AE',\n\tangmsdah: '\\u29AF',\n\tangrt: '\\u221F',\n\tangrtvb: '\\u22BE',\n\tangrtvbd: '\\u299D',\n\tangsph: '\\u2222',\n\tangst: '\\u00C5',\n\tangzarr: '\\u237C',\n\tAogon: '\\u0104',\n\taogon: '\\u0105',\n\tAopf: '\\uD835\\uDD38',\n\taopf: '\\uD835\\uDD52',\n\tap: '\\u2248',\n\tapacir: '\\u2A6F',\n\tapE: '\\u2A70',\n\tape: '\\u224A',\n\tapid: '\\u224B',\n\tapos: '\\u0027',\n\tApplyFunction: '\\u2061',\n\tapprox: '\\u2248',\n\tapproxeq: '\\u224A',\n\tAring: '\\u00C5',\n\taring: '\\u00E5',\n\tAscr: '\\uD835\\uDC9C',\n\tascr: '\\uD835\\uDCB6',\n\tAssign: '\\u2254',\n\tast: '\\u002A',\n\tasymp: '\\u2248',\n\tasympeq: '\\u224D',\n\tAtilde: '\\u00C3',\n\tatilde: '\\u00E3',\n\tAuml: '\\u00C4',\n\tauml: '\\u00E4',\n\tawconint: '\\u2233',\n\tawint: '\\u2A11',\n\tbackcong: '\\u224C',\n\tbackepsilon: '\\u03F6',\n\tbackprime: '\\u2035',\n\tbacksim: '\\u223D',\n\tbacksimeq: '\\u22CD',\n\tBackslash: '\\u2216',\n\tBarv: '\\u2AE7',\n\tbarvee: '\\u22BD',\n\tBarwed: '\\u2306',\n\tbarwed: '\\u2305',\n\tbarwedge: '\\u2305',\n\tbbrk: '\\u23B5',\n\tbbrktbrk: '\\u23B6',\n\tbcong: '\\u224C',\n\tBcy: '\\u0411',\n\tbcy: '\\u0431',\n\tbdquo: '\\u201E',\n\tbecaus: '\\u2235',\n\tBecause: '\\u2235',\n\tbecause: '\\u2235',\n\tbemptyv: '\\u29B0',\n\tbepsi: '\\u03F6',\n\tbernou: '\\u212C',\n\tBernoullis: '\\u212C',\n\tBeta: '\\u0392',\n\tbeta: '\\u03B2',\n\tbeth: '\\u2136',\n\tbetween: '\\u226C',\n\tBfr: '\\uD835\\uDD05',\n\tbfr: '\\uD835\\uDD1F',\n\tbigcap: '\\u22C2',\n\tbigcirc: '\\u25EF',\n\tbigcup: '\\u22C3',\n\tbigodot: '\\u2A00',\n\tbigoplus: '\\u2A01',\n\tbigotimes: '\\u2A02',\n\tbigsqcup: '\\u2A06',\n\tbigstar: '\\u2605',\n\tbigtriangledown: '\\u25BD',\n\tbigtriangleup: '\\u25B3',\n\tbiguplus: '\\u2A04',\n\tbigvee: '\\u22C1',\n\tbigwedge: '\\u22C0',\n\tbkarow: '\\u290D',\n\tblacklozenge: '\\u29EB',\n\tblacksquare: '\\u25AA',\n\tblacktriangle: '\\u25B4',\n\tblacktriangledown: '\\u25BE',\n\tblacktriangleleft: '\\u25C2',\n\tblacktriangleright: '\\u25B8',\n\tblank: '\\u2423',\n\tblk12: '\\u2592',\n\tblk14: '\\u2591',\n\tblk34: '\\u2593',\n\tblock: '\\u2588',\n\tbne: '\\u003D\\u20E5',\n\tbnequiv: '\\u2261\\u20E5',\n\tbNot: '\\u2AED',\n\tbnot: '\\u2310',\n\tBopf: '\\uD835\\uDD39',\n\tbopf: '\\uD835\\uDD53',\n\tbot: '\\u22A5',\n\tbottom: '\\u22A5',\n\tbowtie: '\\u22C8',\n\tboxbox: '\\u29C9',\n\tboxDL: '\\u2557',\n\tboxDl: '\\u2556',\n\tboxdL: '\\u2555',\n\tboxdl: '\\u2510',\n\tboxDR: '\\u2554',\n\tboxDr: '\\u2553',\n\tboxdR: '\\u2552',\n\tboxdr: '\\u250C',\n\tboxH: '\\u2550',\n\tboxh: '\\u2500',\n\tboxHD: '\\u2566',\n\tboxHd: '\\u2564',\n\tboxhD: '\\u2565',\n\tboxhd: '\\u252C',\n\tboxHU: '\\u2569',\n\tboxHu: '\\u2567',\n\tboxhU: '\\u2568',\n\tboxhu: '\\u2534',\n\tboxminus: '\\u229F',\n\tboxplus: '\\u229E',\n\tboxtimes: '\\u22A0',\n\tboxUL: '\\u255D',\n\tboxUl: '\\u255C',\n\tboxuL: '\\u255B',\n\tboxul: '\\u2518',\n\tboxUR: '\\u255A',\n\tboxUr: '\\u2559',\n\tboxuR: '\\u2558',\n\tboxur: '\\u2514',\n\tboxV: '\\u2551',\n\tboxv: '\\u2502',\n\tboxVH: '\\u256C',\n\tboxVh: '\\u256B',\n\tboxvH: '\\u256A',\n\tboxvh: '\\u253C',\n\tboxVL: '\\u2563',\n\tboxVl: '\\u2562',\n\tboxvL: '\\u2561',\n\tboxvl: '\\u2524',\n\tboxVR: '\\u2560',\n\tboxVr: '\\u255F',\n\tboxvR: '\\u255E',\n\tboxvr: '\\u251C',\n\tbprime: '\\u2035',\n\tBreve: '\\u02D8',\n\tbreve: '\\u02D8',\n\tbrvbar: '\\u00A6',\n\tBscr: '\\u212C',\n\tbscr: '\\uD835\\uDCB7',\n\tbsemi: '\\u204F',\n\tbsim: '\\u223D',\n\tbsime: '\\u22CD',\n\tbsol: '\\u005C',\n\tbsolb: '\\u29C5',\n\tbsolhsub: '\\u27C8',\n\tbull: '\\u2022',\n\tbullet: '\\u2022',\n\tbump: '\\u224E',\n\tbumpE: '\\u2AAE',\n\tbumpe: '\\u224F',\n\tBumpeq: '\\u224E',\n\tbumpeq: '\\u224F',\n\tCacute: '\\u0106',\n\tcacute: '\\u0107',\n\tCap: '\\u22D2',\n\tcap: '\\u2229',\n\tcapand: '\\u2A44',\n\tcapbrcup: '\\u2A49',\n\tcapcap: '\\u2A4B',\n\tcapcup: '\\u2A47',\n\tcapdot: '\\u2A40',\n\tCapitalDifferentialD: '\\u2145',\n\tcaps: '\\u2229\\uFE00',\n\tcaret: '\\u2041',\n\tcaron: '\\u02C7',\n\tCayleys: '\\u212D',\n\tccaps: '\\u2A4D',\n\tCcaron: '\\u010C',\n\tccaron: '\\u010D',\n\tCcedil: '\\u00C7',\n\tccedil: '\\u00E7',\n\tCcirc: '\\u0108',\n\tccirc: '\\u0109',\n\tCconint: '\\u2230',\n\tccups: '\\u2A4C',\n\tccupssm: '\\u2A50',\n\tCdot: '\\u010A',\n\tcdot: '\\u010B',\n\tcedil: '\\u00B8',\n\tCedilla: '\\u00B8',\n\tcemptyv: '\\u29B2',\n\tcent: '\\u00A2',\n\tCenterDot: '\\u00B7',\n\tcenterdot: '\\u00B7',\n\tCfr: '\\u212D',\n\tcfr: '\\uD835\\uDD20',\n\tCHcy: '\\u0427',\n\tchcy: '\\u0447',\n\tcheck: '\\u2713',\n\tcheckmark: '\\u2713',\n\tChi: '\\u03A7',\n\tchi: '\\u03C7',\n\tcir: '\\u25CB',\n\tcirc: '\\u02C6',\n\tcirceq: '\\u2257',\n\tcirclearrowleft: '\\u21BA',\n\tcirclearrowright: '\\u21BB',\n\tcircledast: '\\u229B',\n\tcircledcirc: '\\u229A',\n\tcircleddash: '\\u229D',\n\tCircleDot: '\\u2299',\n\tcircledR: '\\u00AE',\n\tcircledS: '\\u24C8',\n\tCircleMinus: '\\u2296',\n\tCirclePlus: '\\u2295',\n\tCircleTimes: '\\u2297',\n\tcirE: '\\u29C3',\n\tcire: '\\u2257',\n\tcirfnint: '\\u2A10',\n\tcirmid: '\\u2AEF',\n\tcirscir: '\\u29C2',\n\tClockwiseContourIntegral: '\\u2232',\n\tCloseCurlyDoubleQuote: '\\u201D',\n\tCloseCurlyQuote: '\\u2019',\n\tclubs: '\\u2663',\n\tclubsuit: '\\u2663',\n\tColon: '\\u2237',\n\tcolon: '\\u003A',\n\tColone: '\\u2A74',\n\tcolone: '\\u2254',\n\tcoloneq: '\\u2254',\n\tcomma: '\\u002C',\n\tcommat: '\\u0040',\n\tcomp: '\\u2201',\n\tcompfn: '\\u2218',\n\tcomplement: '\\u2201',\n\tcomplexes: '\\u2102',\n\tcong: '\\u2245',\n\tcongdot: '\\u2A6D',\n\tCongruent: '\\u2261',\n\tConint: '\\u222F',\n\tconint: '\\u222E',\n\tContourIntegral: '\\u222E',\n\tCopf: '\\u2102',\n\tcopf: '\\uD835\\uDD54',\n\tcoprod: '\\u2210',\n\tCoproduct: '\\u2210',\n\tCOPY: '\\u00A9',\n\tcopy: '\\u00A9',\n\tcopysr: '\\u2117',\n\tCounterClockwiseContourIntegral: '\\u2233',\n\tcrarr: '\\u21B5',\n\tCross: '\\u2A2F',\n\tcross: '\\u2717',\n\tCscr: '\\uD835\\uDC9E',\n\tcscr: '\\uD835\\uDCB8',\n\tcsub: '\\u2ACF',\n\tcsube: '\\u2AD1',\n\tcsup: '\\u2AD0',\n\tcsupe: '\\u2AD2',\n\tctdot: '\\u22EF',\n\tcudarrl: '\\u2938',\n\tcudarrr: '\\u2935',\n\tcuepr: '\\u22DE',\n\tcuesc: '\\u22DF',\n\tcularr: '\\u21B6',\n\tcularrp: '\\u293D',\n\tCup: '\\u22D3',\n\tcup: '\\u222A',\n\tcupbrcap: '\\u2A48',\n\tCupCap: '\\u224D',\n\tcupcap: '\\u2A46',\n\tcupcup: '\\u2A4A',\n\tcupdot: '\\u228D',\n\tcupor: '\\u2A45',\n\tcups: '\\u222A\\uFE00',\n\tcurarr: '\\u21B7',\n\tcurarrm: '\\u293C',\n\tcurlyeqprec: '\\u22DE',\n\tcurlyeqsucc: '\\u22DF',\n\tcurlyvee: '\\u22CE',\n\tcurlywedge: '\\u22CF',\n\tcurren: '\\u00A4',\n\tcurvearrowleft: '\\u21B6',\n\tcurvearrowright: '\\u21B7',\n\tcuvee: '\\u22CE',\n\tcuwed: '\\u22CF',\n\tcwconint: '\\u2232',\n\tcwint: '\\u2231',\n\tcylcty: '\\u232D',\n\tDagger: '\\u2021',\n\tdagger: '\\u2020',\n\tdaleth: '\\u2138',\n\tDarr: '\\u21A1',\n\tdArr: '\\u21D3',\n\tdarr: '\\u2193',\n\tdash: '\\u2010',\n\tDashv: '\\u2AE4',\n\tdashv: '\\u22A3',\n\tdbkarow: '\\u290F',\n\tdblac: '\\u02DD',\n\tDcaron: '\\u010E',\n\tdcaron: '\\u010F',\n\tDcy: '\\u0414',\n\tdcy: '\\u0434',\n\tDD: '\\u2145',\n\tdd: '\\u2146',\n\tddagger: '\\u2021',\n\tddarr: '\\u21CA',\n\tDDotrahd: '\\u2911',\n\tddotseq: '\\u2A77',\n\tdeg: '\\u00B0',\n\tDel: '\\u2207',\n\tDelta: '\\u0394',\n\tdelta: '\\u03B4',\n\tdemptyv: '\\u29B1',\n\tdfisht: '\\u297F',\n\tDfr: '\\uD835\\uDD07',\n\tdfr: '\\uD835\\uDD21',\n\tdHar: '\\u2965',\n\tdharl: '\\u21C3',\n\tdharr: '\\u21C2',\n\tDiacriticalAcute: '\\u00B4',\n\tDiacriticalDot: '\\u02D9',\n\tDiacriticalDoubleAcute: '\\u02DD',\n\tDiacriticalGrave: '\\u0060',\n\tDiacriticalTilde: '\\u02DC',\n\tdiam: '\\u22C4',\n\tDiamond: '\\u22C4',\n\tdiamond: '\\u22C4',\n\tdiamondsuit: '\\u2666',\n\tdiams: '\\u2666',\n\tdie: '\\u00A8',\n\tDifferentialD: '\\u2146',\n\tdigamma: '\\u03DD',\n\tdisin: '\\u22F2',\n\tdiv: '\\u00F7',\n\tdivide: '\\u00F7',\n\tdivideontimes: '\\u22C7',\n\tdivonx: '\\u22C7',\n\tDJcy: '\\u0402',\n\tdjcy: '\\u0452',\n\tdlcorn: '\\u231E',\n\tdlcrop: '\\u230D',\n\tdollar: '\\u0024',\n\tDopf: '\\uD835\\uDD3B',\n\tdopf: '\\uD835\\uDD55',\n\tDot: '\\u00A8',\n\tdot: '\\u02D9',\n\tDotDot: '\\u20DC',\n\tdoteq: '\\u2250',\n\tdoteqdot: '\\u2251',\n\tDotEqual: '\\u2250',\n\tdotminus: '\\u2238',\n\tdotplus: '\\u2214',\n\tdotsquare: '\\u22A1',\n\tdoublebarwedge: '\\u2306',\n\tDoubleContourIntegral: '\\u222F',\n\tDoubleDot: '\\u00A8',\n\tDoubleDownArrow: '\\u21D3',\n\tDoubleLeftArrow: '\\u21D0',\n\tDoubleLeftRightArrow: '\\u21D4',\n\tDoubleLeftTee: '\\u2AE4',\n\tDoubleLongLeftArrow: '\\u27F8',\n\tDoubleLongLeftRightArrow: '\\u27FA',\n\tDoubleLongRightArrow: '\\u27F9',\n\tDoubleRightArrow: '\\u21D2',\n\tDoubleRightTee: '\\u22A8',\n\tDoubleUpArrow: '\\u21D1',\n\tDoubleUpDownArrow: '\\u21D5',\n\tDoubleVerticalBar: '\\u2225',\n\tDownArrow: '\\u2193',\n\tDownarrow: '\\u21D3',\n\tdownarrow: '\\u2193',\n\tDownArrowBar: '\\u2913',\n\tDownArrowUpArrow: '\\u21F5',\n\tDownBreve: '\\u0311',\n\tdowndownarrows: '\\u21CA',\n\tdownharpoonleft: '\\u21C3',\n\tdownharpoonright: '\\u21C2',\n\tDownLeftRightVector: '\\u2950',\n\tDownLeftTeeVector: '\\u295E',\n\tDownLeftVector: '\\u21BD',\n\tDownLeftVectorBar: '\\u2956',\n\tDownRightTeeVector: '\\u295F',\n\tDownRightVector: '\\u21C1',\n\tDownRightVectorBar: '\\u2957',\n\tDownTee: '\\u22A4',\n\tDownTeeArrow: '\\u21A7',\n\tdrbkarow: '\\u2910',\n\tdrcorn: '\\u231F',\n\tdrcrop: '\\u230C',\n\tDscr: '\\uD835\\uDC9F',\n\tdscr: '\\uD835\\uDCB9',\n\tDScy: '\\u0405',\n\tdscy: '\\u0455',\n\tdsol: '\\u29F6',\n\tDstrok: '\\u0110',\n\tdstrok: '\\u0111',\n\tdtdot: '\\u22F1',\n\tdtri: '\\u25BF',\n\tdtrif: '\\u25BE',\n\tduarr: '\\u21F5',\n\tduhar: '\\u296F',\n\tdwangle: '\\u29A6',\n\tDZcy: '\\u040F',\n\tdzcy: '\\u045F',\n\tdzigrarr: '\\u27FF',\n\tEacute: '\\u00C9',\n\teacute: '\\u00E9',\n\teaster: '\\u2A6E',\n\tEcaron: '\\u011A',\n\tecaron: '\\u011B',\n\tecir: '\\u2256',\n\tEcirc: '\\u00CA',\n\tecirc: '\\u00EA',\n\tecolon: '\\u2255',\n\tEcy: '\\u042D',\n\tecy: '\\u044D',\n\teDDot: '\\u2A77',\n\tEdot: '\\u0116',\n\teDot: '\\u2251',\n\tedot: '\\u0117',\n\tee: '\\u2147',\n\tefDot: '\\u2252',\n\tEfr: '\\uD835\\uDD08',\n\tefr: '\\uD835\\uDD22',\n\teg: '\\u2A9A',\n\tEgrave: '\\u00C8',\n\tegrave: '\\u00E8',\n\tegs: '\\u2A96',\n\tegsdot: '\\u2A98',\n\tel: '\\u2A99',\n\tElement: '\\u2208',\n\telinters: '\\u23E7',\n\tell: '\\u2113',\n\tels: '\\u2A95',\n\telsdot: '\\u2A97',\n\tEmacr: '\\u0112',\n\temacr: '\\u0113',\n\tempty: '\\u2205',\n\temptyset: '\\u2205',\n\tEmptySmallSquare: '\\u25FB',\n\temptyv: '\\u2205',\n\tEmptyVerySmallSquare: '\\u25AB',\n\temsp: '\\u2003',\n\temsp13: '\\u2004',\n\temsp14: '\\u2005',\n\tENG: '\\u014A',\n\teng: '\\u014B',\n\tensp: '\\u2002',\n\tEogon: '\\u0118',\n\teogon: '\\u0119',\n\tEopf: '\\uD835\\uDD3C',\n\teopf: '\\uD835\\uDD56',\n\tepar: '\\u22D5',\n\teparsl: '\\u29E3',\n\teplus: '\\u2A71',\n\tepsi: '\\u03B5',\n\tEpsilon: '\\u0395',\n\tepsilon: '\\u03B5',\n\tepsiv: '\\u03F5',\n\teqcirc: '\\u2256',\n\teqcolon: '\\u2255',\n\teqsim: '\\u2242',\n\teqslantgtr: '\\u2A96',\n\teqslantless: '\\u2A95',\n\tEqual: '\\u2A75',\n\tequals: '\\u003D',\n\tEqualTilde: '\\u2242',\n\tequest: '\\u225F',\n\tEquilibrium: '\\u21CC',\n\tequiv: '\\u2261',\n\tequivDD: '\\u2A78',\n\teqvparsl: '\\u29E5',\n\terarr: '\\u2971',\n\terDot: '\\u2253',\n\tEscr: '\\u2130',\n\tescr: '\\u212F',\n\tesdot: '\\u2250',\n\tEsim: '\\u2A73',\n\tesim: '\\u2242',\n\tEta: '\\u0397',\n\teta: '\\u03B7',\n\tETH: '\\u00D0',\n\teth: '\\u00F0',\n\tEuml: '\\u00CB',\n\teuml: '\\u00EB',\n\teuro: '\\u20AC',\n\texcl: '\\u0021',\n\texist: '\\u2203',\n\tExists: '\\u2203',\n\texpectation: '\\u2130',\n\tExponentialE: '\\u2147',\n\texponentiale: '\\u2147',\n\tfallingdotseq: '\\u2252',\n\tFcy: '\\u0424',\n\tfcy: '\\u0444',\n\tfemale: '\\u2640',\n\tffilig: '\\uFB03',\n\tfflig: '\\uFB00',\n\tffllig: '\\uFB04',\n\tFfr: '\\uD835\\uDD09',\n\tffr: '\\uD835\\uDD23',\n\tfilig: '\\uFB01',\n\tFilledSmallSquare: '\\u25FC',\n\tFilledVerySmallSquare: '\\u25AA',\n\tfjlig: '\\u0066\\u006A',\n\tflat: '\\u266D',\n\tfllig: '\\uFB02',\n\tfltns: '\\u25B1',\n\tfnof: '\\u0192',\n\tFopf: '\\uD835\\uDD3D',\n\tfopf: '\\uD835\\uDD57',\n\tForAll: '\\u2200',\n\tforall: '\\u2200',\n\tfork: '\\u22D4',\n\tforkv: '\\u2AD9',\n\tFouriertrf: '\\u2131',\n\tfpartint: '\\u2A0D',\n\tfrac12: '\\u00BD',\n\tfrac13: '\\u2153',\n\tfrac14: '\\u00BC',\n\tfrac15: '\\u2155',\n\tfrac16: '\\u2159',\n\tfrac18: '\\u215B',\n\tfrac23: '\\u2154',\n\tfrac25: '\\u2156',\n\tfrac34: '\\u00BE',\n\tfrac35: '\\u2157',\n\tfrac38: '\\u215C',\n\tfrac45: '\\u2158',\n\tfrac56: '\\u215A',\n\tfrac58: '\\u215D',\n\tfrac78: '\\u215E',\n\tfrasl: '\\u2044',\n\tfrown: '\\u2322',\n\tFscr: '\\u2131',\n\tfscr: '\\uD835\\uDCBB',\n\tgacute: '\\u01F5',\n\tGamma: '\\u0393',\n\tgamma: '\\u03B3',\n\tGammad: '\\u03DC',\n\tgammad: '\\u03DD',\n\tgap: '\\u2A86',\n\tGbreve: '\\u011E',\n\tgbreve: '\\u011F',\n\tGcedil: '\\u0122',\n\tGcirc: '\\u011C',\n\tgcirc: '\\u011D',\n\tGcy: '\\u0413',\n\tgcy: '\\u0433',\n\tGdot: '\\u0120',\n\tgdot: '\\u0121',\n\tgE: '\\u2267',\n\tge: '\\u2265',\n\tgEl: '\\u2A8C',\n\tgel: '\\u22DB',\n\tgeq: '\\u2265',\n\tgeqq: '\\u2267',\n\tgeqslant: '\\u2A7E',\n\tges: '\\u2A7E',\n\tgescc: '\\u2AA9',\n\tgesdot: '\\u2A80',\n\tgesdoto: '\\u2A82',\n\tgesdotol: '\\u2A84',\n\tgesl: '\\u22DB\\uFE00',\n\tgesles: '\\u2A94',\n\tGfr: '\\uD835\\uDD0A',\n\tgfr: '\\uD835\\uDD24',\n\tGg: '\\u22D9',\n\tgg: '\\u226B',\n\tggg: '\\u22D9',\n\tgimel: '\\u2137',\n\tGJcy: '\\u0403',\n\tgjcy: '\\u0453',\n\tgl: '\\u2277',\n\tgla: '\\u2AA5',\n\tglE: '\\u2A92',\n\tglj: '\\u2AA4',\n\tgnap: '\\u2A8A',\n\tgnapprox: '\\u2A8A',\n\tgnE: '\\u2269',\n\tgne: '\\u2A88',\n\tgneq: '\\u2A88',\n\tgneqq: '\\u2269',\n\tgnsim: '\\u22E7',\n\tGopf: '\\uD835\\uDD3E',\n\tgopf: '\\uD835\\uDD58',\n\tgrave: '\\u0060',\n\tGreaterEqual: '\\u2265',\n\tGreaterEqualLess: '\\u22DB',\n\tGreaterFullEqual: '\\u2267',\n\tGreaterGreater: '\\u2AA2',\n\tGreaterLess: '\\u2277',\n\tGreaterSlantEqual: '\\u2A7E',\n\tGreaterTilde: '\\u2273',\n\tGscr: '\\uD835\\uDCA2',\n\tgscr: '\\u210A',\n\tgsim: '\\u2273',\n\tgsime: '\\u2A8E',\n\tgsiml: '\\u2A90',\n\tGt: '\\u226B',\n\tGT: '\\u003E',\n\tgt: '\\u003E',\n\tgtcc: '\\u2AA7',\n\tgtcir: '\\u2A7A',\n\tgtdot: '\\u22D7',\n\tgtlPar: '\\u2995',\n\tgtquest: '\\u2A7C',\n\tgtrapprox: '\\u2A86',\n\tgtrarr: '\\u2978',\n\tgtrdot: '\\u22D7',\n\tgtreqless: '\\u22DB',\n\tgtreqqless: '\\u2A8C',\n\tgtrless: '\\u2277',\n\tgtrsim: '\\u2273',\n\tgvertneqq: '\\u2269\\uFE00',\n\tgvnE: '\\u2269\\uFE00',\n\tHacek: '\\u02C7',\n\thairsp: '\\u200A',\n\thalf: '\\u00BD',\n\thamilt: '\\u210B',\n\tHARDcy: '\\u042A',\n\thardcy: '\\u044A',\n\thArr: '\\u21D4',\n\tharr: '\\u2194',\n\tharrcir: '\\u2948',\n\tharrw: '\\u21AD',\n\tHat: '\\u005E',\n\thbar: '\\u210F',\n\tHcirc: '\\u0124',\n\thcirc: '\\u0125',\n\thearts: '\\u2665',\n\theartsuit: '\\u2665',\n\thellip: '\\u2026',\n\thercon: '\\u22B9',\n\tHfr: '\\u210C',\n\thfr: '\\uD835\\uDD25',\n\tHilbertSpace: '\\u210B',\n\thksearow: '\\u2925',\n\thkswarow: '\\u2926',\n\thoarr: '\\u21FF',\n\thomtht: '\\u223B',\n\thookleftarrow: '\\u21A9',\n\thookrightarrow: '\\u21AA',\n\tHopf: '\\u210D',\n\thopf: '\\uD835\\uDD59',\n\thorbar: '\\u2015',\n\tHorizontalLine: '\\u2500',\n\tHscr: '\\u210B',\n\thscr: '\\uD835\\uDCBD',\n\thslash: '\\u210F',\n\tHstrok: '\\u0126',\n\thstrok: '\\u0127',\n\tHumpDownHump: '\\u224E',\n\tHumpEqual: '\\u224F',\n\thybull: '\\u2043',\n\thyphen: '\\u2010',\n\tIacute: '\\u00CD',\n\tiacute: '\\u00ED',\n\tic: '\\u2063',\n\tIcirc: '\\u00CE',\n\ticirc: '\\u00EE',\n\tIcy: '\\u0418',\n\ticy: '\\u0438',\n\tIdot: '\\u0130',\n\tIEcy: '\\u0415',\n\tiecy: '\\u0435',\n\tiexcl: '\\u00A1',\n\tiff: '\\u21D4',\n\tIfr: '\\u2111',\n\tifr: '\\uD835\\uDD26',\n\tIgrave: '\\u00CC',\n\tigrave: '\\u00EC',\n\tii: '\\u2148',\n\tiiiint: '\\u2A0C',\n\tiiint: '\\u222D',\n\tiinfin: '\\u29DC',\n\tiiota: '\\u2129',\n\tIJlig: '\\u0132',\n\tijlig: '\\u0133',\n\tIm: '\\u2111',\n\tImacr: '\\u012A',\n\timacr: '\\u012B',\n\timage: '\\u2111',\n\tImaginaryI: '\\u2148',\n\timagline: '\\u2110',\n\timagpart: '\\u2111',\n\timath: '\\u0131',\n\timof: '\\u22B7',\n\timped: '\\u01B5',\n\tImplies: '\\u21D2',\n\tin: '\\u2208',\n\tincare: '\\u2105',\n\tinfin: '\\u221E',\n\tinfintie: '\\u29DD',\n\tinodot: '\\u0131',\n\tInt: '\\u222C',\n\tint: '\\u222B',\n\tintcal: '\\u22BA',\n\tintegers: '\\u2124',\n\tIntegral: '\\u222B',\n\tintercal: '\\u22BA',\n\tIntersection: '\\u22C2',\n\tintlarhk: '\\u2A17',\n\tintprod: '\\u2A3C',\n\tInvisibleComma: '\\u2063',\n\tInvisibleTimes: '\\u2062',\n\tIOcy: '\\u0401',\n\tiocy: '\\u0451',\n\tIogon: '\\u012E',\n\tiogon: '\\u012F',\n\tIopf: '\\uD835\\uDD40',\n\tiopf: '\\uD835\\uDD5A',\n\tIota: '\\u0399',\n\tiota: '\\u03B9',\n\tiprod: '\\u2A3C',\n\tiquest: '\\u00BF',\n\tIscr: '\\u2110',\n\tiscr: '\\uD835\\uDCBE',\n\tisin: '\\u2208',\n\tisindot: '\\u22F5',\n\tisinE: '\\u22F9',\n\tisins: '\\u22F4',\n\tisinsv: '\\u22F3',\n\tisinv: '\\u2208',\n\tit: '\\u2062',\n\tItilde: '\\u0128',\n\titilde: '\\u0129',\n\tIukcy: '\\u0406',\n\tiukcy: '\\u0456',\n\tIuml: '\\u00CF',\n\tiuml: '\\u00EF',\n\tJcirc: '\\u0134',\n\tjcirc: '\\u0135',\n\tJcy: '\\u0419',\n\tjcy: '\\u0439',\n\tJfr: '\\uD835\\uDD0D',\n\tjfr: '\\uD835\\uDD27',\n\tjmath: '\\u0237',\n\tJopf: '\\uD835\\uDD41',\n\tjopf: '\\uD835\\uDD5B',\n\tJscr: '\\uD835\\uDCA5',\n\tjscr: '\\uD835\\uDCBF',\n\tJsercy: '\\u0408',\n\tjsercy: '\\u0458',\n\tJukcy: '\\u0404',\n\tjukcy: '\\u0454',\n\tKappa: '\\u039A',\n\tkappa: '\\u03BA',\n\tkappav: '\\u03F0',\n\tKcedil: '\\u0136',\n\tkcedil: '\\u0137',\n\tKcy: '\\u041A',\n\tkcy: '\\u043A',\n\tKfr: '\\uD835\\uDD0E',\n\tkfr: '\\uD835\\uDD28',\n\tkgreen: '\\u0138',\n\tKHcy: '\\u0425',\n\tkhcy: '\\u0445',\n\tKJcy: '\\u040C',\n\tkjcy: '\\u045C',\n\tKopf: '\\uD835\\uDD42',\n\tkopf: '\\uD835\\uDD5C',\n\tKscr: '\\uD835\\uDCA6',\n\tkscr: '\\uD835\\uDCC0',\n\tlAarr: '\\u21DA',\n\tLacute: '\\u0139',\n\tlacute: '\\u013A',\n\tlaemptyv: '\\u29B4',\n\tlagran: '\\u2112',\n\tLambda: '\\u039B',\n\tlambda: '\\u03BB',\n\tLang: '\\u27EA',\n\tlang: '\\u27E8',\n\tlangd: '\\u2991',\n\tlangle: '\\u27E8',\n\tlap: '\\u2A85',\n\tLaplacetrf: '\\u2112',\n\tlaquo: '\\u00AB',\n\tLarr: '\\u219E',\n\tlArr: '\\u21D0',\n\tlarr: '\\u2190',\n\tlarrb: '\\u21E4',\n\tlarrbfs: '\\u291F',\n\tlarrfs: '\\u291D',\n\tlarrhk: '\\u21A9',\n\tlarrlp: '\\u21AB',\n\tlarrpl: '\\u2939',\n\tlarrsim: '\\u2973',\n\tlarrtl: '\\u21A2',\n\tlat: '\\u2AAB',\n\tlAtail: '\\u291B',\n\tlatail: '\\u2919',\n\tlate: '\\u2AAD',\n\tlates: '\\u2AAD\\uFE00',\n\tlBarr: '\\u290E',\n\tlbarr: '\\u290C',\n\tlbbrk: '\\u2772',\n\tlbrace: '\\u007B',\n\tlbrack: '\\u005B',\n\tlbrke: '\\u298B',\n\tlbrksld: '\\u298F',\n\tlbrkslu: '\\u298D',\n\tLcaron: '\\u013D',\n\tlcaron: '\\u013E',\n\tLcedil: '\\u013B',\n\tlcedil: '\\u013C',\n\tlceil: '\\u2308',\n\tlcub: '\\u007B',\n\tLcy: '\\u041B',\n\tlcy: '\\u043B',\n\tldca: '\\u2936',\n\tldquo: '\\u201C',\n\tldquor: '\\u201E',\n\tldrdhar: '\\u2967',\n\tldrushar: '\\u294B',\n\tldsh: '\\u21B2',\n\tlE: '\\u2266',\n\tle: '\\u2264',\n\tLeftAngleBracket: '\\u27E8',\n\tLeftArrow: '\\u2190',\n\tLeftarrow: '\\u21D0',\n\tleftarrow: '\\u2190',\n\tLeftArrowBar: '\\u21E4',\n\tLeftArrowRightArrow: '\\u21C6',\n\tleftarrowtail: '\\u21A2',\n\tLeftCeiling: '\\u2308',\n\tLeftDoubleBracket: '\\u27E6',\n\tLeftDownTeeVector: '\\u2961',\n\tLeftDownVector: '\\u21C3',\n\tLeftDownVectorBar: '\\u2959',\n\tLeftFloor: '\\u230A',\n\tleftharpoondown: '\\u21BD',\n\tleftharpoonup: '\\u21BC',\n\tleftleftarrows: '\\u21C7',\n\tLeftRightArrow: '\\u2194',\n\tLeftrightarrow: '\\u21D4',\n\tleftrightarrow: '\\u2194',\n\tleftrightarrows: '\\u21C6',\n\tleftrightharpoons: '\\u21CB',\n\tleftrightsquigarrow: '\\u21AD',\n\tLeftRightVector: '\\u294E',\n\tLeftTee: '\\u22A3',\n\tLeftTeeArrow: '\\u21A4',\n\tLeftTeeVector: '\\u295A',\n\tleftthreetimes: '\\u22CB',\n\tLeftTriangle: '\\u22B2',\n\tLeftTriangleBar: '\\u29CF',\n\tLeftTriangleEqual: '\\u22B4',\n\tLeftUpDownVector: '\\u2951',\n\tLeftUpTeeVector: '\\u2960',\n\tLeftUpVector: '\\u21BF',\n\tLeftUpVectorBar: '\\u2958',\n\tLeftVector: '\\u21BC',\n\tLeftVectorBar: '\\u2952',\n\tlEg: '\\u2A8B',\n\tleg: '\\u22DA',\n\tleq: '\\u2264',\n\tleqq: '\\u2266',\n\tleqslant: '\\u2A7D',\n\tles: '\\u2A7D',\n\tlescc: '\\u2AA8',\n\tlesdot: '\\u2A7F',\n\tlesdoto: '\\u2A81',\n\tlesdotor: '\\u2A83',\n\tlesg: '\\u22DA\\uFE00',\n\tlesges: '\\u2A93',\n\tlessapprox: '\\u2A85',\n\tlessdot: '\\u22D6',\n\tlesseqgtr: '\\u22DA',\n\tlesseqqgtr: '\\u2A8B',\n\tLessEqualGreater: '\\u22DA',\n\tLessFullEqual: '\\u2266',\n\tLessGreater: '\\u2276',\n\tlessgtr: '\\u2276',\n\tLessLess: '\\u2AA1',\n\tlesssim: '\\u2272',\n\tLessSlantEqual: '\\u2A7D',\n\tLessTilde: '\\u2272',\n\tlfisht: '\\u297C',\n\tlfloor: '\\u230A',\n\tLfr: '\\uD835\\uDD0F',\n\tlfr: '\\uD835\\uDD29',\n\tlg: '\\u2276',\n\tlgE: '\\u2A91',\n\tlHar: '\\u2962',\n\tlhard: '\\u21BD',\n\tlharu: '\\u21BC',\n\tlharul: '\\u296A',\n\tlhblk: '\\u2584',\n\tLJcy: '\\u0409',\n\tljcy: '\\u0459',\n\tLl: '\\u22D8',\n\tll: '\\u226A',\n\tllarr: '\\u21C7',\n\tllcorner: '\\u231E',\n\tLleftarrow: '\\u21DA',\n\tllhard: '\\u296B',\n\tlltri: '\\u25FA',\n\tLmidot: '\\u013F',\n\tlmidot: '\\u0140',\n\tlmoust: '\\u23B0',\n\tlmoustache: '\\u23B0',\n\tlnap: '\\u2A89',\n\tlnapprox: '\\u2A89',\n\tlnE: '\\u2268',\n\tlne: '\\u2A87',\n\tlneq: '\\u2A87',\n\tlneqq: '\\u2268',\n\tlnsim: '\\u22E6',\n\tloang: '\\u27EC',\n\tloarr: '\\u21FD',\n\tlobrk: '\\u27E6',\n\tLongLeftArrow: '\\u27F5',\n\tLongleftarrow: '\\u27F8',\n\tlongleftarrow: '\\u27F5',\n\tLongLeftRightArrow: '\\u27F7',\n\tLongleftrightarrow: '\\u27FA',\n\tlongleftrightarrow: '\\u27F7',\n\tlongmapsto: '\\u27FC',\n\tLongRightArrow: '\\u27F6',\n\tLongrightarrow: '\\u27F9',\n\tlongrightarrow: '\\u27F6',\n\tlooparrowleft: '\\u21AB',\n\tlooparrowright: '\\u21AC',\n\tlopar: '\\u2985',\n\tLopf: '\\uD835\\uDD43',\n\tlopf: '\\uD835\\uDD5D',\n\tloplus: '\\u2A2D',\n\tlotimes: '\\u2A34',\n\tlowast: '\\u2217',\n\tlowbar: '\\u005F',\n\tLowerLeftArrow: '\\u2199',\n\tLowerRightArrow: '\\u2198',\n\tloz: '\\u25CA',\n\tlozenge: '\\u25CA',\n\tlozf: '\\u29EB',\n\tlpar: '\\u0028',\n\tlparlt: '\\u2993',\n\tlrarr: '\\u21C6',\n\tlrcorner: '\\u231F',\n\tlrhar: '\\u21CB',\n\tlrhard: '\\u296D',\n\tlrm: '\\u200E',\n\tlrtri: '\\u22BF',\n\tlsaquo: '\\u2039',\n\tLscr: '\\u2112',\n\tlscr: '\\uD835\\uDCC1',\n\tLsh: '\\u21B0',\n\tlsh: '\\u21B0',\n\tlsim: '\\u2272',\n\tlsime: '\\u2A8D',\n\tlsimg: '\\u2A8F',\n\tlsqb: '\\u005B',\n\tlsquo: '\\u2018',\n\tlsquor: '\\u201A',\n\tLstrok: '\\u0141',\n\tlstrok: '\\u0142',\n\tLt: '\\u226A',\n\tLT: '\\u003C',\n\tlt: '\\u003C',\n\tltcc: '\\u2AA6',\n\tltcir: '\\u2A79',\n\tltdot: '\\u22D6',\n\tlthree: '\\u22CB',\n\tltimes: '\\u22C9',\n\tltlarr: '\\u2976',\n\tltquest: '\\u2A7B',\n\tltri: '\\u25C3',\n\tltrie: '\\u22B4',\n\tltrif: '\\u25C2',\n\tltrPar: '\\u2996',\n\tlurdshar: '\\u294A',\n\tluruhar: '\\u2966',\n\tlvertneqq: '\\u2268\\uFE00',\n\tlvnE: '\\u2268\\uFE00',\n\tmacr: '\\u00AF',\n\tmale: '\\u2642',\n\tmalt: '\\u2720',\n\tmaltese: '\\u2720',\n\tMap: '\\u2905',\n\tmap: '\\u21A6',\n\tmapsto: '\\u21A6',\n\tmapstodown: '\\u21A7',\n\tmapstoleft: '\\u21A4',\n\tmapstoup: '\\u21A5',\n\tmarker: '\\u25AE',\n\tmcomma: '\\u2A29',\n\tMcy: '\\u041C',\n\tmcy: '\\u043C',\n\tmdash: '\\u2014',\n\tmDDot: '\\u223A',\n\tmeasuredangle: '\\u2221',\n\tMediumSpace: '\\u205F',\n\tMellintrf: '\\u2133',\n\tMfr: '\\uD835\\uDD10',\n\tmfr: '\\uD835\\uDD2A',\n\tmho: '\\u2127',\n\tmicro: '\\u00B5',\n\tmid: '\\u2223',\n\tmidast: '\\u002A',\n\tmidcir: '\\u2AF0',\n\tmiddot: '\\u00B7',\n\tminus: '\\u2212',\n\tminusb: '\\u229F',\n\tminusd: '\\u2238',\n\tminusdu: '\\u2A2A',\n\tMinusPlus: '\\u2213',\n\tmlcp: '\\u2ADB',\n\tmldr: '\\u2026',\n\tmnplus: '\\u2213',\n\tmodels: '\\u22A7',\n\tMopf: '\\uD835\\uDD44',\n\tmopf: '\\uD835\\uDD5E',\n\tmp: '\\u2213',\n\tMscr: '\\u2133',\n\tmscr: '\\uD835\\uDCC2',\n\tmstpos: '\\u223E',\n\tMu: '\\u039C',\n\tmu: '\\u03BC',\n\tmultimap: '\\u22B8',\n\tmumap: '\\u22B8',\n\tnabla: '\\u2207',\n\tNacute: '\\u0143',\n\tnacute: '\\u0144',\n\tnang: '\\u2220\\u20D2',\n\tnap: '\\u2249',\n\tnapE: '\\u2A70\\u0338',\n\tnapid: '\\u224B\\u0338',\n\tnapos: '\\u0149',\n\tnapprox: '\\u2249',\n\tnatur: '\\u266E',\n\tnatural: '\\u266E',\n\tnaturals: '\\u2115',\n\tnbsp: '\\u00A0',\n\tnbump: '\\u224E\\u0338',\n\tnbumpe: '\\u224F\\u0338',\n\tncap: '\\u2A43',\n\tNcaron: '\\u0147',\n\tncaron: '\\u0148',\n\tNcedil: '\\u0145',\n\tncedil: '\\u0146',\n\tncong: '\\u2247',\n\tncongdot: '\\u2A6D\\u0338',\n\tncup: '\\u2A42',\n\tNcy: '\\u041D',\n\tncy: '\\u043D',\n\tndash: '\\u2013',\n\tne: '\\u2260',\n\tnearhk: '\\u2924',\n\tneArr: '\\u21D7',\n\tnearr: '\\u2197',\n\tnearrow: '\\u2197',\n\tnedot: '\\u2250\\u0338',\n\tNegativeMediumSpace: '\\u200B',\n\tNegativeThickSpace: '\\u200B',\n\tNegativeThinSpace: '\\u200B',\n\tNegativeVeryThinSpace: '\\u200B',\n\tnequiv: '\\u2262',\n\tnesear: '\\u2928',\n\tnesim: '\\u2242\\u0338',\n\tNestedGreaterGreater: '\\u226B',\n\tNestedLessLess: '\\u226A',\n\tNewLine: '\\u000A',\n\tnexist: '\\u2204',\n\tnexists: '\\u2204',\n\tNfr: '\\uD835\\uDD11',\n\tnfr: '\\uD835\\uDD2B',\n\tngE: '\\u2267\\u0338',\n\tnge: '\\u2271',\n\tngeq: '\\u2271',\n\tngeqq: '\\u2267\\u0338',\n\tngeqslant: '\\u2A7E\\u0338',\n\tnges: '\\u2A7E\\u0338',\n\tnGg: '\\u22D9\\u0338',\n\tngsim: '\\u2275',\n\tnGt: '\\u226B\\u20D2',\n\tngt: '\\u226F',\n\tngtr: '\\u226F',\n\tnGtv: '\\u226B\\u0338',\n\tnhArr: '\\u21CE',\n\tnharr: '\\u21AE',\n\tnhpar: '\\u2AF2',\n\tni: '\\u220B',\n\tnis: '\\u22FC',\n\tnisd: '\\u22FA',\n\tniv: '\\u220B',\n\tNJcy: '\\u040A',\n\tnjcy: '\\u045A',\n\tnlArr: '\\u21CD',\n\tnlarr: '\\u219A',\n\tnldr: '\\u2025',\n\tnlE: '\\u2266\\u0338',\n\tnle: '\\u2270',\n\tnLeftarrow: '\\u21CD',\n\tnleftarrow: '\\u219A',\n\tnLeftrightarrow: '\\u21CE',\n\tnleftrightarrow: '\\u21AE',\n\tnleq: '\\u2270',\n\tnleqq: '\\u2266\\u0338',\n\tnleqslant: '\\u2A7D\\u0338',\n\tnles: '\\u2A7D\\u0338',\n\tnless: '\\u226E',\n\tnLl: '\\u22D8\\u0338',\n\tnlsim: '\\u2274',\n\tnLt: '\\u226A\\u20D2',\n\tnlt: '\\u226E',\n\tnltri: '\\u22EA',\n\tnltrie: '\\u22EC',\n\tnLtv: '\\u226A\\u0338',\n\tnmid: '\\u2224',\n\tNoBreak: '\\u2060',\n\tNonBreakingSpace: '\\u00A0',\n\tNopf: '\\u2115',\n\tnopf: '\\uD835\\uDD5F',\n\tNot: '\\u2AEC',\n\tnot: '\\u00AC',\n\tNotCongruent: '\\u2262',\n\tNotCupCap: '\\u226D',\n\tNotDoubleVerticalBar: '\\u2226',\n\tNotElement: '\\u2209',\n\tNotEqual: '\\u2260',\n\tNotEqualTilde: '\\u2242\\u0338',\n\tNotExists: '\\u2204',\n\tNotGreater: '\\u226F',\n\tNotGreaterEqual: '\\u2271',\n\tNotGreaterFullEqual: '\\u2267\\u0338',\n\tNotGreaterGreater: '\\u226B\\u0338',\n\tNotGreaterLess: '\\u2279',\n\tNotGreaterSlantEqual: '\\u2A7E\\u0338',\n\tNotGreaterTilde: '\\u2275',\n\tNotHumpDownHump: '\\u224E\\u0338',\n\tNotHumpEqual: '\\u224F\\u0338',\n\tnotin: '\\u2209',\n\tnotindot: '\\u22F5\\u0338',\n\tnotinE: '\\u22F9\\u0338',\n\tnotinva: '\\u2209',\n\tnotinvb: '\\u22F7',\n\tnotinvc: '\\u22F6',\n\tNotLeftTriangle: '\\u22EA',\n\tNotLeftTriangleBar: '\\u29CF\\u0338',\n\tNotLeftTriangleEqual: '\\u22EC',\n\tNotLess: '\\u226E',\n\tNotLessEqual: '\\u2270',\n\tNotLessGreater: '\\u2278',\n\tNotLessLess: '\\u226A\\u0338',\n\tNotLessSlantEqual: '\\u2A7D\\u0338',\n\tNotLessTilde: '\\u2274',\n\tNotNestedGreaterGreater: '\\u2AA2\\u0338',\n\tNotNestedLessLess: '\\u2AA1\\u0338',\n\tnotni: '\\u220C',\n\tnotniva: '\\u220C',\n\tnotnivb: '\\u22FE',\n\tnotnivc: '\\u22FD',\n\tNotPrecedes: '\\u2280',\n\tNotPrecedesEqual: '\\u2AAF\\u0338',\n\tNotPrecedesSlantEqual: '\\u22E0',\n\tNotReverseElement: '\\u220C',\n\tNotRightTriangle: '\\u22EB',\n\tNotRightTriangleBar: '\\u29D0\\u0338',\n\tNotRightTriangleEqual: '\\u22ED',\n\tNotSquareSubset: '\\u228F\\u0338',\n\tNotSquareSubsetEqual: '\\u22E2',\n\tNotSquareSuperset: '\\u2290\\u0338',\n\tNotSquareSupersetEqual: '\\u22E3',\n\tNotSubset: '\\u2282\\u20D2',\n\tNotSubsetEqual: '\\u2288',\n\tNotSucceeds: '\\u2281',\n\tNotSucceedsEqual: '\\u2AB0\\u0338',\n\tNotSucceedsSlantEqual: '\\u22E1',\n\tNotSucceedsTilde: '\\u227F\\u0338',\n\tNotSuperset: '\\u2283\\u20D2',\n\tNotSupersetEqual: '\\u2289',\n\tNotTilde: '\\u2241',\n\tNotTildeEqual: '\\u2244',\n\tNotTildeFullEqual: '\\u2247',\n\tNotTildeTilde: '\\u2249',\n\tNotVerticalBar: '\\u2224',\n\tnpar: '\\u2226',\n\tnparallel: '\\u2226',\n\tnparsl: '\\u2AFD\\u20E5',\n\tnpart: '\\u2202\\u0338',\n\tnpolint: '\\u2A14',\n\tnpr: '\\u2280',\n\tnprcue: '\\u22E0',\n\tnpre: '\\u2AAF\\u0338',\n\tnprec: '\\u2280',\n\tnpreceq: '\\u2AAF\\u0338',\n\tnrArr: '\\u21CF',\n\tnrarr: '\\u219B',\n\tnrarrc: '\\u2933\\u0338',\n\tnrarrw: '\\u219D\\u0338',\n\tnRightarrow: '\\u21CF',\n\tnrightarrow: '\\u219B',\n\tnrtri: '\\u22EB',\n\tnrtrie: '\\u22ED',\n\tnsc: '\\u2281',\n\tnsccue: '\\u22E1',\n\tnsce: '\\u2AB0\\u0338',\n\tNscr: '\\uD835\\uDCA9',\n\tnscr: '\\uD835\\uDCC3',\n\tnshortmid: '\\u2224',\n\tnshortparallel: '\\u2226',\n\tnsim: '\\u2241',\n\tnsime: '\\u2244',\n\tnsimeq: '\\u2244',\n\tnsmid: '\\u2224',\n\tnspar: '\\u2226',\n\tnsqsube: '\\u22E2',\n\tnsqsupe: '\\u22E3',\n\tnsub: '\\u2284',\n\tnsubE: '\\u2AC5\\u0338',\n\tnsube: '\\u2288',\n\tnsubset: '\\u2282\\u20D2',\n\tnsubseteq: '\\u2288',\n\tnsubseteqq: '\\u2AC5\\u0338',\n\tnsucc: '\\u2281',\n\tnsucceq: '\\u2AB0\\u0338',\n\tnsup: '\\u2285',\n\tnsupE: '\\u2AC6\\u0338',\n\tnsupe: '\\u2289',\n\tnsupset: '\\u2283\\u20D2',\n\tnsupseteq: '\\u2289',\n\tnsupseteqq: '\\u2AC6\\u0338',\n\tntgl: '\\u2279',\n\tNtilde: '\\u00D1',\n\tntilde: '\\u00F1',\n\tntlg: '\\u2278',\n\tntriangleleft: '\\u22EA',\n\tntrianglelefteq: '\\u22EC',\n\tntriangleright: '\\u22EB',\n\tntrianglerighteq: '\\u22ED',\n\tNu: '\\u039D',\n\tnu: '\\u03BD',\n\tnum: '\\u0023',\n\tnumero: '\\u2116',\n\tnumsp: '\\u2007',\n\tnvap: '\\u224D\\u20D2',\n\tnVDash: '\\u22AF',\n\tnVdash: '\\u22AE',\n\tnvDash: '\\u22AD',\n\tnvdash: '\\u22AC',\n\tnvge: '\\u2265\\u20D2',\n\tnvgt: '\\u003E\\u20D2',\n\tnvHarr: '\\u2904',\n\tnvinfin: '\\u29DE',\n\tnvlArr: '\\u2902',\n\tnvle: '\\u2264\\u20D2',\n\tnvlt: '\\u003C\\u20D2',\n\tnvltrie: '\\u22B4\\u20D2',\n\tnvrArr: '\\u2903',\n\tnvrtrie: '\\u22B5\\u20D2',\n\tnvsim: '\\u223C\\u20D2',\n\tnwarhk: '\\u2923',\n\tnwArr: '\\u21D6',\n\tnwarr: '\\u2196',\n\tnwarrow: '\\u2196',\n\tnwnear: '\\u2927',\n\tOacute: '\\u00D3',\n\toacute: '\\u00F3',\n\toast: '\\u229B',\n\tocir: '\\u229A',\n\tOcirc: '\\u00D4',\n\tocirc: '\\u00F4',\n\tOcy: '\\u041E',\n\tocy: '\\u043E',\n\todash: '\\u229D',\n\tOdblac: '\\u0150',\n\todblac: '\\u0151',\n\todiv: '\\u2A38',\n\todot: '\\u2299',\n\todsold: '\\u29BC',\n\tOElig: '\\u0152',\n\toelig: '\\u0153',\n\tofcir: '\\u29BF',\n\tOfr: '\\uD835\\uDD12',\n\tofr: '\\uD835\\uDD2C',\n\togon: '\\u02DB',\n\tOgrave: '\\u00D2',\n\tograve: '\\u00F2',\n\togt: '\\u29C1',\n\tohbar: '\\u29B5',\n\tohm: '\\u03A9',\n\toint: '\\u222E',\n\tolarr: '\\u21BA',\n\tolcir: '\\u29BE',\n\tolcross: '\\u29BB',\n\toline: '\\u203E',\n\tolt: '\\u29C0',\n\tOmacr: '\\u014C',\n\tomacr: '\\u014D',\n\tOmega: '\\u03A9',\n\tomega: '\\u03C9',\n\tOmicron: '\\u039F',\n\tomicron: '\\u03BF',\n\tomid: '\\u29B6',\n\tominus: '\\u2296',\n\tOopf: '\\uD835\\uDD46',\n\toopf: '\\uD835\\uDD60',\n\topar: '\\u29B7',\n\tOpenCurlyDoubleQuote: '\\u201C',\n\tOpenCurlyQuote: '\\u2018',\n\toperp: '\\u29B9',\n\toplus: '\\u2295',\n\tOr: '\\u2A54',\n\tor: '\\u2228',\n\torarr: '\\u21BB',\n\tord: '\\u2A5D',\n\torder: '\\u2134',\n\torderof: '\\u2134',\n\tordf: '\\u00AA',\n\tordm: '\\u00BA',\n\torigof: '\\u22B6',\n\toror: '\\u2A56',\n\torslope: '\\u2A57',\n\torv: '\\u2A5B',\n\toS: '\\u24C8',\n\tOscr: '\\uD835\\uDCAA',\n\toscr: '\\u2134',\n\tOslash: '\\u00D8',\n\toslash: '\\u00F8',\n\tosol: '\\u2298',\n\tOtilde: '\\u00D5',\n\totilde: '\\u00F5',\n\tOtimes: '\\u2A37',\n\totimes: '\\u2297',\n\totimesas: '\\u2A36',\n\tOuml: '\\u00D6',\n\touml: '\\u00F6',\n\tovbar: '\\u233D',\n\tOverBar: '\\u203E',\n\tOverBrace: '\\u23DE',\n\tOverBracket: '\\u23B4',\n\tOverParenthesis: '\\u23DC',\n\tpar: '\\u2225',\n\tpara: '\\u00B6',\n\tparallel: '\\u2225',\n\tparsim: '\\u2AF3',\n\tparsl: '\\u2AFD',\n\tpart: '\\u2202',\n\tPartialD: '\\u2202',\n\tPcy: '\\u041F',\n\tpcy: '\\u043F',\n\tpercnt: '\\u0025',\n\tperiod: '\\u002E',\n\tpermil: '\\u2030',\n\tperp: '\\u22A5',\n\tpertenk: '\\u2031',\n\tPfr: '\\uD835\\uDD13',\n\tpfr: '\\uD835\\uDD2D',\n\tPhi: '\\u03A6',\n\tphi: '\\u03C6',\n\tphiv: '\\u03D5',\n\tphmmat: '\\u2133',\n\tphone: '\\u260E',\n\tPi: '\\u03A0',\n\tpi: '\\u03C0',\n\tpitchfork: '\\u22D4',\n\tpiv: '\\u03D6',\n\tplanck: '\\u210F',\n\tplanckh: '\\u210E',\n\tplankv: '\\u210F',\n\tplus: '\\u002B',\n\tplusacir: '\\u2A23',\n\tplusb: '\\u229E',\n\tpluscir: '\\u2A22',\n\tplusdo: '\\u2214',\n\tplusdu: '\\u2A25',\n\tpluse: '\\u2A72',\n\tPlusMinus: '\\u00B1',\n\tplusmn: '\\u00B1',\n\tplussim: '\\u2A26',\n\tplustwo: '\\u2A27',\n\tpm: '\\u00B1',\n\tPoincareplane: '\\u210C',\n\tpointint: '\\u2A15',\n\tPopf: '\\u2119',\n\tpopf: '\\uD835\\uDD61',\n\tpound: '\\u00A3',\n\tPr: '\\u2ABB',\n\tpr: '\\u227A',\n\tprap: '\\u2AB7',\n\tprcue: '\\u227C',\n\tprE: '\\u2AB3',\n\tpre: '\\u2AAF',\n\tprec: '\\u227A',\n\tprecapprox: '\\u2AB7',\n\tpreccurlyeq: '\\u227C',\n\tPrecedes: '\\u227A',\n\tPrecedesEqual: '\\u2AAF',\n\tPrecedesSlantEqual: '\\u227C',\n\tPrecedesTilde: '\\u227E',\n\tpreceq: '\\u2AAF',\n\tprecnapprox: '\\u2AB9',\n\tprecneqq: '\\u2AB5',\n\tprecnsim: '\\u22E8',\n\tprecsim: '\\u227E',\n\tPrime: '\\u2033',\n\tprime: '\\u2032',\n\tprimes: '\\u2119',\n\tprnap: '\\u2AB9',\n\tprnE: '\\u2AB5',\n\tprnsim: '\\u22E8',\n\tprod: '\\u220F',\n\tProduct: '\\u220F',\n\tprofalar: '\\u232E',\n\tprofline: '\\u2312',\n\tprofsurf: '\\u2313',\n\tprop: '\\u221D',\n\tProportion: '\\u2237',\n\tProportional: '\\u221D',\n\tpropto: '\\u221D',\n\tprsim: '\\u227E',\n\tprurel: '\\u22B0',\n\tPscr: '\\uD835\\uDCAB',\n\tpscr: '\\uD835\\uDCC5',\n\tPsi: '\\u03A8',\n\tpsi: '\\u03C8',\n\tpuncsp: '\\u2008',\n\tQfr: '\\uD835\\uDD14',\n\tqfr: '\\uD835\\uDD2E',\n\tqint: '\\u2A0C',\n\tQopf: '\\u211A',\n\tqopf: '\\uD835\\uDD62',\n\tqprime: '\\u2057',\n\tQscr: '\\uD835\\uDCAC',\n\tqscr: '\\uD835\\uDCC6',\n\tquaternions: '\\u210D',\n\tquatint: '\\u2A16',\n\tquest: '\\u003F',\n\tquesteq: '\\u225F',\n\tQUOT: '\\u0022',\n\tquot: '\\u0022',\n\trAarr: '\\u21DB',\n\trace: '\\u223D\\u0331',\n\tRacute: '\\u0154',\n\tracute: '\\u0155',\n\tradic: '\\u221A',\n\traemptyv: '\\u29B3',\n\tRang: '\\u27EB',\n\trang: '\\u27E9',\n\trangd: '\\u2992',\n\trange: '\\u29A5',\n\trangle: '\\u27E9',\n\traquo: '\\u00BB',\n\tRarr: '\\u21A0',\n\trArr: '\\u21D2',\n\trarr: '\\u2192',\n\trarrap: '\\u2975',\n\trarrb: '\\u21E5',\n\trarrbfs: '\\u2920',\n\trarrc: '\\u2933',\n\trarrfs: '\\u291E',\n\trarrhk: '\\u21AA',\n\trarrlp: '\\u21AC',\n\trarrpl: '\\u2945',\n\trarrsim: '\\u2974',\n\tRarrtl: '\\u2916',\n\trarrtl: '\\u21A3',\n\trarrw: '\\u219D',\n\trAtail: '\\u291C',\n\tratail: '\\u291A',\n\tratio: '\\u2236',\n\trationals: '\\u211A',\n\tRBarr: '\\u2910',\n\trBarr: '\\u290F',\n\trbarr: '\\u290D',\n\trbbrk: '\\u2773',\n\trbrace: '\\u007D',\n\trbrack: '\\u005D',\n\trbrke: '\\u298C',\n\trbrksld: '\\u298E',\n\trbrkslu: '\\u2990',\n\tRcaron: '\\u0158',\n\trcaron: '\\u0159',\n\tRcedil: '\\u0156',\n\trcedil: '\\u0157',\n\trceil: '\\u2309',\n\trcub: '\\u007D',\n\tRcy: '\\u0420',\n\trcy: '\\u0440',\n\trdca: '\\u2937',\n\trdldhar: '\\u2969',\n\trdquo: '\\u201D',\n\trdquor: '\\u201D',\n\trdsh: '\\u21B3',\n\tRe: '\\u211C',\n\treal: '\\u211C',\n\trealine: '\\u211B',\n\trealpart: '\\u211C',\n\treals: '\\u211D',\n\trect: '\\u25AD',\n\tREG: '\\u00AE',\n\treg: '\\u00AE',\n\tReverseElement: '\\u220B',\n\tReverseEquilibrium: '\\u21CB',\n\tReverseUpEquilibrium: '\\u296F',\n\trfisht: '\\u297D',\n\trfloor: '\\u230B',\n\tRfr: '\\u211C',\n\trfr: '\\uD835\\uDD2F',\n\trHar: '\\u2964',\n\trhard: '\\u21C1',\n\trharu: '\\u21C0',\n\trharul: '\\u296C',\n\tRho: '\\u03A1',\n\trho: '\\u03C1',\n\trhov: '\\u03F1',\n\tRightAngleBracket: '\\u27E9',\n\tRightArrow: '\\u2192',\n\tRightarrow: '\\u21D2',\n\trightarrow: '\\u2192',\n\tRightArrowBar: '\\u21E5',\n\tRightArrowLeftArrow: '\\u21C4',\n\trightarrowtail: '\\u21A3',\n\tRightCeiling: '\\u2309',\n\tRightDoubleBracket: '\\u27E7',\n\tRightDownTeeVector: '\\u295D',\n\tRightDownVector: '\\u21C2',\n\tRightDownVectorBar: '\\u2955',\n\tRightFloor: '\\u230B',\n\trightharpoondown: '\\u21C1',\n\trightharpoonup: '\\u21C0',\n\trightleftarrows: '\\u21C4',\n\trightleftharpoons: '\\u21CC',\n\trightrightarrows: '\\u21C9',\n\trightsquigarrow: '\\u219D',\n\tRightTee: '\\u22A2',\n\tRightTeeArrow: '\\u21A6',\n\tRightTeeVector: '\\u295B',\n\trightthreetimes: '\\u22CC',\n\tRightTriangle: '\\u22B3',\n\tRightTriangleBar: '\\u29D0',\n\tRightTriangleEqual: '\\u22B5',\n\tRightUpDownVector: '\\u294F',\n\tRightUpTeeVector: '\\u295C',\n\tRightUpVector: '\\u21BE',\n\tRightUpVectorBar: '\\u2954',\n\tRightVector: '\\u21C0',\n\tRightVectorBar: '\\u2953',\n\tring: '\\u02DA',\n\trisingdotseq: '\\u2253',\n\trlarr: '\\u21C4',\n\trlhar: '\\u21CC',\n\trlm: '\\u200F',\n\trmoust: '\\u23B1',\n\trmoustache: '\\u23B1',\n\trnmid: '\\u2AEE',\n\troang: '\\u27ED',\n\troarr: '\\u21FE',\n\trobrk: '\\u27E7',\n\tropar: '\\u2986',\n\tRopf: '\\u211D',\n\tropf: '\\uD835\\uDD63',\n\troplus: '\\u2A2E',\n\trotimes: '\\u2A35',\n\tRoundImplies: '\\u2970',\n\trpar: '\\u0029',\n\trpargt: '\\u2994',\n\trppolint: '\\u2A12',\n\trrarr: '\\u21C9',\n\tRrightarrow: '\\u21DB',\n\trsaquo: '\\u203A',\n\tRscr: '\\u211B',\n\trscr: '\\uD835\\uDCC7',\n\tRsh: '\\u21B1',\n\trsh: '\\u21B1',\n\trsqb: '\\u005D',\n\trsquo: '\\u2019',\n\trsquor: '\\u2019',\n\trthree: '\\u22CC',\n\trtimes: '\\u22CA',\n\trtri: '\\u25B9',\n\trtrie: '\\u22B5',\n\trtrif: '\\u25B8',\n\trtriltri: '\\u29CE',\n\tRuleDelayed: '\\u29F4',\n\truluhar: '\\u2968',\n\trx: '\\u211E',\n\tSacute: '\\u015A',\n\tsacute: '\\u015B',\n\tsbquo: '\\u201A',\n\tSc: '\\u2ABC',\n\tsc: '\\u227B',\n\tscap: '\\u2AB8',\n\tScaron: '\\u0160',\n\tscaron: '\\u0161',\n\tsccue: '\\u227D',\n\tscE: '\\u2AB4',\n\tsce: '\\u2AB0',\n\tScedil: '\\u015E',\n\tscedil: '\\u015F',\n\tScirc: '\\u015C',\n\tscirc: '\\u015D',\n\tscnap: '\\u2ABA',\n\tscnE: '\\u2AB6',\n\tscnsim: '\\u22E9',\n\tscpolint: '\\u2A13',\n\tscsim: '\\u227F',\n\tScy: '\\u0421',\n\tscy: '\\u0441',\n\tsdot: '\\u22C5',\n\tsdotb: '\\u22A1',\n\tsdote: '\\u2A66',\n\tsearhk: '\\u2925',\n\tseArr: '\\u21D8',\n\tsearr: '\\u2198',\n\tsearrow: '\\u2198',\n\tsect: '\\u00A7',\n\tsemi: '\\u003B',\n\tseswar: '\\u2929',\n\tsetminus: '\\u2216',\n\tsetmn: '\\u2216',\n\tsext: '\\u2736',\n\tSfr: '\\uD835\\uDD16',\n\tsfr: '\\uD835\\uDD30',\n\tsfrown: '\\u2322',\n\tsharp: '\\u266F',\n\tSHCHcy: '\\u0429',\n\tshchcy: '\\u0449',\n\tSHcy: '\\u0428',\n\tshcy: '\\u0448',\n\tShortDownArrow: '\\u2193',\n\tShortLeftArrow: '\\u2190',\n\tshortmid: '\\u2223',\n\tshortparallel: '\\u2225',\n\tShortRightArrow: '\\u2192',\n\tShortUpArrow: '\\u2191',\n\tshy: '\\u00AD',\n\tSigma: '\\u03A3',\n\tsigma: '\\u03C3',\n\tsigmaf: '\\u03C2',\n\tsigmav: '\\u03C2',\n\tsim: '\\u223C',\n\tsimdot: '\\u2A6A',\n\tsime: '\\u2243',\n\tsimeq: '\\u2243',\n\tsimg: '\\u2A9E',\n\tsimgE: '\\u2AA0',\n\tsiml: '\\u2A9D',\n\tsimlE: '\\u2A9F',\n\tsimne: '\\u2246',\n\tsimplus: '\\u2A24',\n\tsimrarr: '\\u2972',\n\tslarr: '\\u2190',\n\tSmallCircle: '\\u2218',\n\tsmallsetminus: '\\u2216',\n\tsmashp: '\\u2A33',\n\tsmeparsl: '\\u29E4',\n\tsmid: '\\u2223',\n\tsmile: '\\u2323',\n\tsmt: '\\u2AAA',\n\tsmte: '\\u2AAC',\n\tsmtes: '\\u2AAC\\uFE00',\n\tSOFTcy: '\\u042C',\n\tsoftcy: '\\u044C',\n\tsol: '\\u002F',\n\tsolb: '\\u29C4',\n\tsolbar: '\\u233F',\n\tSopf: '\\uD835\\uDD4A',\n\tsopf: '\\uD835\\uDD64',\n\tspades: '\\u2660',\n\tspadesuit: '\\u2660',\n\tspar: '\\u2225',\n\tsqcap: '\\u2293',\n\tsqcaps: '\\u2293\\uFE00',\n\tsqcup: '\\u2294',\n\tsqcups: '\\u2294\\uFE00',\n\tSqrt: '\\u221A',\n\tsqsub: '\\u228F',\n\tsqsube: '\\u2291',\n\tsqsubset: '\\u228F',\n\tsqsubseteq: '\\u2291',\n\tsqsup: '\\u2290',\n\tsqsupe: '\\u2292',\n\tsqsupset: '\\u2290',\n\tsqsupseteq: '\\u2292',\n\tsqu: '\\u25A1',\n\tSquare: '\\u25A1',\n\tsquare: '\\u25A1',\n\tSquareIntersection: '\\u2293',\n\tSquareSubset: '\\u228F',\n\tSquareSubsetEqual: '\\u2291',\n\tSquareSuperset: '\\u2290',\n\tSquareSupersetEqual: '\\u2292',\n\tSquareUnion: '\\u2294',\n\tsquarf: '\\u25AA',\n\tsquf: '\\u25AA',\n\tsrarr: '\\u2192',\n\tSscr: '\\uD835\\uDCAE',\n\tsscr: '\\uD835\\uDCC8',\n\tssetmn: '\\u2216',\n\tssmile: '\\u2323',\n\tsstarf: '\\u22C6',\n\tStar: '\\u22C6',\n\tstar: '\\u2606',\n\tstarf: '\\u2605',\n\tstraightepsilon: '\\u03F5',\n\tstraightphi: '\\u03D5',\n\tstrns: '\\u00AF',\n\tSub: '\\u22D0',\n\tsub: '\\u2282',\n\tsubdot: '\\u2ABD',\n\tsubE: '\\u2AC5',\n\tsube: '\\u2286',\n\tsubedot: '\\u2AC3',\n\tsubmult: '\\u2AC1',\n\tsubnE: '\\u2ACB',\n\tsubne: '\\u228A',\n\tsubplus: '\\u2ABF',\n\tsubrarr: '\\u2979',\n\tSubset: '\\u22D0',\n\tsubset: '\\u2282',\n\tsubseteq: '\\u2286',\n\tsubseteqq: '\\u2AC5',\n\tSubsetEqual: '\\u2286',\n\tsubsetneq: '\\u228A',\n\tsubsetneqq: '\\u2ACB',\n\tsubsim: '\\u2AC7',\n\tsubsub: '\\u2AD5',\n\tsubsup: '\\u2AD3',\n\tsucc: '\\u227B',\n\tsuccapprox: '\\u2AB8',\n\tsucccurlyeq: '\\u227D',\n\tSucceeds: '\\u227B',\n\tSucceedsEqual: '\\u2AB0',\n\tSucceedsSlantEqual: '\\u227D',\n\tSucceedsTilde: '\\u227F',\n\tsucceq: '\\u2AB0',\n\tsuccnapprox: '\\u2ABA',\n\tsuccneqq: '\\u2AB6',\n\tsuccnsim: '\\u22E9',\n\tsuccsim: '\\u227F',\n\tSuchThat: '\\u220B',\n\tSum: '\\u2211',\n\tsum: '\\u2211',\n\tsung: '\\u266A',\n\tSup: '\\u22D1',\n\tsup: '\\u2283',\n\tsup1: '\\u00B9',\n\tsup2: '\\u00B2',\n\tsup3: '\\u00B3',\n\tsupdot: '\\u2ABE',\n\tsupdsub: '\\u2AD8',\n\tsupE: '\\u2AC6',\n\tsupe: '\\u2287',\n\tsupedot: '\\u2AC4',\n\tSuperset: '\\u2283',\n\tSupersetEqual: '\\u2287',\n\tsuphsol: '\\u27C9',\n\tsuphsub: '\\u2AD7',\n\tsuplarr: '\\u297B',\n\tsupmult: '\\u2AC2',\n\tsupnE: '\\u2ACC',\n\tsupne: '\\u228B',\n\tsupplus: '\\u2AC0',\n\tSupset: '\\u22D1',\n\tsupset: '\\u2283',\n\tsupseteq: '\\u2287',\n\tsupseteqq: '\\u2AC6',\n\tsupsetneq: '\\u228B',\n\tsupsetneqq: '\\u2ACC',\n\tsupsim: '\\u2AC8',\n\tsupsub: '\\u2AD4',\n\tsupsup: '\\u2AD6',\n\tswarhk: '\\u2926',\n\tswArr: '\\u21D9',\n\tswarr: '\\u2199',\n\tswarrow: '\\u2199',\n\tswnwar: '\\u292A',\n\tszlig: '\\u00DF',\n\tTab: '\\u0009',\n\ttarget: '\\u2316',\n\tTau: '\\u03A4',\n\ttau: '\\u03C4',\n\ttbrk: '\\u23B4',\n\tTcaron: '\\u0164',\n\ttcaron: '\\u0165',\n\tTcedil: '\\u0162',\n\ttcedil: '\\u0163',\n\tTcy: '\\u0422',\n\ttcy: '\\u0442',\n\ttdot: '\\u20DB',\n\ttelrec: '\\u2315',\n\tTfr: '\\uD835\\uDD17',\n\ttfr: '\\uD835\\uDD31',\n\tthere4: '\\u2234',\n\tTherefore: '\\u2234',\n\ttherefore: '\\u2234',\n\tTheta: '\\u0398',\n\ttheta: '\\u03B8',\n\tthetasym: '\\u03D1',\n\tthetav: '\\u03D1',\n\tthickapprox: '\\u2248',\n\tthicksim: '\\u223C',\n\tThickSpace: '\\u205F\\u200A',\n\tthinsp: '\\u2009',\n\tThinSpace: '\\u2009',\n\tthkap: '\\u2248',\n\tthksim: '\\u223C',\n\tTHORN: '\\u00DE',\n\tthorn: '\\u00FE',\n\tTilde: '\\u223C',\n\ttilde: '\\u02DC',\n\tTildeEqual: '\\u2243',\n\tTildeFullEqual: '\\u2245',\n\tTildeTilde: '\\u2248',\n\ttimes: '\\u00D7',\n\ttimesb: '\\u22A0',\n\ttimesbar: '\\u2A31',\n\ttimesd: '\\u2A30',\n\ttint: '\\u222D',\n\ttoea: '\\u2928',\n\ttop: '\\u22A4',\n\ttopbot: '\\u2336',\n\ttopcir: '\\u2AF1',\n\tTopf: '\\uD835\\uDD4B',\n\ttopf: '\\uD835\\uDD65',\n\ttopfork: '\\u2ADA',\n\ttosa: '\\u2929',\n\ttprime: '\\u2034',\n\tTRADE: '\\u2122',\n\ttrade: '\\u2122',\n\ttriangle: '\\u25B5',\n\ttriangledown: '\\u25BF',\n\ttriangleleft: '\\u25C3',\n\ttrianglelefteq: '\\u22B4',\n\ttriangleq: '\\u225C',\n\ttriangleright: '\\u25B9',\n\ttrianglerighteq: '\\u22B5',\n\ttridot: '\\u25EC',\n\ttrie: '\\u225C',\n\ttriminus: '\\u2A3A',\n\tTripleDot: '\\u20DB',\n\ttriplus: '\\u2A39',\n\ttrisb: '\\u29CD',\n\ttritime: '\\u2A3B',\n\ttrpezium: '\\u23E2',\n\tTscr: '\\uD835\\uDCAF',\n\ttscr: '\\uD835\\uDCC9',\n\tTScy: '\\u0426',\n\ttscy: '\\u0446',\n\tTSHcy: '\\u040B',\n\ttshcy: '\\u045B',\n\tTstrok: '\\u0166',\n\ttstrok: '\\u0167',\n\ttwixt: '\\u226C',\n\ttwoheadleftarrow: '\\u219E',\n\ttwoheadrightarrow: '\\u21A0',\n\tUacute: '\\u00DA',\n\tuacute: '\\u00FA',\n\tUarr: '\\u219F',\n\tuArr: '\\u21D1',\n\tuarr: '\\u2191',\n\tUarrocir: '\\u2949',\n\tUbrcy: '\\u040E',\n\tubrcy: '\\u045E',\n\tUbreve: '\\u016C',\n\tubreve: '\\u016D',\n\tUcirc: '\\u00DB',\n\tucirc: '\\u00FB',\n\tUcy: '\\u0423',\n\tucy: '\\u0443',\n\tudarr: '\\u21C5',\n\tUdblac: '\\u0170',\n\tudblac: '\\u0171',\n\tudhar: '\\u296E',\n\tufisht: '\\u297E',\n\tUfr: '\\uD835\\uDD18',\n\tufr: '\\uD835\\uDD32',\n\tUgrave: '\\u00D9',\n\tugrave: '\\u00F9',\n\tuHar: '\\u2963',\n\tuharl: '\\u21BF',\n\tuharr: '\\u21BE',\n\tuhblk: '\\u2580',\n\tulcorn: '\\u231C',\n\tulcorner: '\\u231C',\n\tulcrop: '\\u230F',\n\tultri: '\\u25F8',\n\tUmacr: '\\u016A',\n\tumacr: '\\u016B',\n\tuml: '\\u00A8',\n\tUnderBar: '\\u005F',\n\tUnderBrace: '\\u23DF',\n\tUnderBracket: '\\u23B5',\n\tUnderParenthesis: '\\u23DD',\n\tUnion: '\\u22C3',\n\tUnionPlus: '\\u228E',\n\tUogon: '\\u0172',\n\tuogon: '\\u0173',\n\tUopf: '\\uD835\\uDD4C',\n\tuopf: '\\uD835\\uDD66',\n\tUpArrow: '\\u2191',\n\tUparrow: '\\u21D1',\n\tuparrow: '\\u2191',\n\tUpArrowBar: '\\u2912',\n\tUpArrowDownArrow: '\\u21C5',\n\tUpDownArrow: '\\u2195',\n\tUpdownarrow: '\\u21D5',\n\tupdownarrow: '\\u2195',\n\tUpEquilibrium: '\\u296E',\n\tupharpoonleft: '\\u21BF',\n\tupharpoonright: '\\u21BE',\n\tuplus: '\\u228E',\n\tUpperLeftArrow: '\\u2196',\n\tUpperRightArrow: '\\u2197',\n\tUpsi: '\\u03D2',\n\tupsi: '\\u03C5',\n\tupsih: '\\u03D2',\n\tUpsilon: '\\u03A5',\n\tupsilon: '\\u03C5',\n\tUpTee: '\\u22A5',\n\tUpTeeArrow: '\\u21A5',\n\tupuparrows: '\\u21C8',\n\turcorn: '\\u231D',\n\turcorner: '\\u231D',\n\turcrop: '\\u230E',\n\tUring: '\\u016E',\n\turing: '\\u016F',\n\turtri: '\\u25F9',\n\tUscr: '\\uD835\\uDCB0',\n\tuscr: '\\uD835\\uDCCA',\n\tutdot: '\\u22F0',\n\tUtilde: '\\u0168',\n\tutilde: '\\u0169',\n\tutri: '\\u25B5',\n\tutrif: '\\u25B4',\n\tuuarr: '\\u21C8',\n\tUuml: '\\u00DC',\n\tuuml: '\\u00FC',\n\tuwangle: '\\u29A7',\n\tvangrt: '\\u299C',\n\tvarepsilon: '\\u03F5',\n\tvarkappa: '\\u03F0',\n\tvarnothing: '\\u2205',\n\tvarphi: '\\u03D5',\n\tvarpi: '\\u03D6',\n\tvarpropto: '\\u221D',\n\tvArr: '\\u21D5',\n\tvarr: '\\u2195',\n\tvarrho: '\\u03F1',\n\tvarsigma: '\\u03C2',\n\tvarsubsetneq: '\\u228A\\uFE00',\n\tvarsubsetneqq: '\\u2ACB\\uFE00',\n\tvarsupsetneq: '\\u228B\\uFE00',\n\tvarsupsetneqq: '\\u2ACC\\uFE00',\n\tvartheta: '\\u03D1',\n\tvartriangleleft: '\\u22B2',\n\tvartriangleright: '\\u22B3',\n\tVbar: '\\u2AEB',\n\tvBar: '\\u2AE8',\n\tvBarv: '\\u2AE9',\n\tVcy: '\\u0412',\n\tvcy: '\\u0432',\n\tVDash: '\\u22AB',\n\tVdash: '\\u22A9',\n\tvDash: '\\u22A8',\n\tvdash: '\\u22A2',\n\tVdashl: '\\u2AE6',\n\tVee: '\\u22C1',\n\tvee: '\\u2228',\n\tveebar: '\\u22BB',\n\tveeeq: '\\u225A',\n\tvellip: '\\u22EE',\n\tVerbar: '\\u2016',\n\tverbar: '\\u007C',\n\tVert: '\\u2016',\n\tvert: '\\u007C',\n\tVerticalBar: '\\u2223',\n\tVerticalLine: '\\u007C',\n\tVerticalSeparator: '\\u2758',\n\tVerticalTilde: '\\u2240',\n\tVeryThinSpace: '\\u200A',\n\tVfr: '\\uD835\\uDD19',\n\tvfr: '\\uD835\\uDD33',\n\tvltri: '\\u22B2',\n\tvnsub: '\\u2282\\u20D2',\n\tvnsup: '\\u2283\\u20D2',\n\tVopf: '\\uD835\\uDD4D',\n\tvopf: '\\uD835\\uDD67',\n\tvprop: '\\u221D',\n\tvrtri: '\\u22B3',\n\tVscr: '\\uD835\\uDCB1',\n\tvscr: '\\uD835\\uDCCB',\n\tvsubnE: '\\u2ACB\\uFE00',\n\tvsubne: '\\u228A\\uFE00',\n\tvsupnE: '\\u2ACC\\uFE00',\n\tvsupne: '\\u228B\\uFE00',\n\tVvdash: '\\u22AA',\n\tvzigzag: '\\u299A',\n\tWcirc: '\\u0174',\n\twcirc: '\\u0175',\n\twedbar: '\\u2A5F',\n\tWedge: '\\u22C0',\n\twedge: '\\u2227',\n\twedgeq: '\\u2259',\n\tweierp: '\\u2118',\n\tWfr: '\\uD835\\uDD1A',\n\twfr: '\\uD835\\uDD34',\n\tWopf: '\\uD835\\uDD4E',\n\twopf: '\\uD835\\uDD68',\n\twp: '\\u2118',\n\twr: '\\u2240',\n\twreath: '\\u2240',\n\tWscr: '\\uD835\\uDCB2',\n\twscr: '\\uD835\\uDCCC',\n\txcap: '\\u22C2',\n\txcirc: '\\u25EF',\n\txcup: '\\u22C3',\n\txdtri: '\\u25BD',\n\tXfr: '\\uD835\\uDD1B',\n\txfr: '\\uD835\\uDD35',\n\txhArr: '\\u27FA',\n\txharr: '\\u27F7',\n\tXi: '\\u039E',\n\txi: '\\u03BE',\n\txlArr: '\\u27F8',\n\txlarr: '\\u27F5',\n\txmap: '\\u27FC',\n\txnis: '\\u22FB',\n\txodot: '\\u2A00',\n\tXopf: '\\uD835\\uDD4F',\n\txopf: '\\uD835\\uDD69',\n\txoplus: '\\u2A01',\n\txotime: '\\u2A02',\n\txrArr: '\\u27F9',\n\txrarr: '\\u27F6',\n\tXscr: '\\uD835\\uDCB3',\n\txscr: '\\uD835\\uDCCD',\n\txsqcup: '\\u2A06',\n\txuplus: '\\u2A04',\n\txutri: '\\u25B3',\n\txvee: '\\u22C1',\n\txwedge: '\\u22C0',\n\tYacute: '\\u00DD',\n\tyacute: '\\u00FD',\n\tYAcy: '\\u042F',\n\tyacy: '\\u044F',\n\tYcirc: '\\u0176',\n\tycirc: '\\u0177',\n\tYcy: '\\u042B',\n\tycy: '\\u044B',\n\tyen: '\\u00A5',\n\tYfr: '\\uD835\\uDD1C',\n\tyfr: '\\uD835\\uDD36',\n\tYIcy: '\\u0407',\n\tyicy: '\\u0457',\n\tYopf: '\\uD835\\uDD50',\n\tyopf: '\\uD835\\uDD6A',\n\tYscr: '\\uD835\\uDCB4',\n\tyscr: '\\uD835\\uDCCE',\n\tYUcy: '\\u042E',\n\tyucy: '\\u044E',\n\tYuml: '\\u0178',\n\tyuml: '\\u00FF',\n\tZacute: '\\u0179',\n\tzacute: '\\u017A',\n\tZcaron: '\\u017D',\n\tzcaron: '\\u017E',\n\tZcy: '\\u0417',\n\tzcy: '\\u0437',\n\tZdot: '\\u017B',\n\tzdot: '\\u017C',\n\tzeetrf: '\\u2128',\n\tZeroWidthSpace: '\\u200B',\n\tZeta: '\\u0396',\n\tzeta: '\\u03B6',\n\tZfr: '\\u2128',\n\tzfr: '\\uD835\\uDD37',\n\tZHcy: '\\u0416',\n\tzhcy: '\\u0436',\n\tzigrarr: '\\u21DD',\n\tZopf: '\\u2124',\n\tzopf: '\\uD835\\uDD6B',\n\tZscr: '\\uD835\\uDCB5',\n\tzscr: '\\uD835\\uDCCF',\n\tzwj: '\\u200D',\n\tzwnj: '\\u200C',\n});\n\n/**\n * @deprecated use `HTML_ENTITIES` instead\n * @see HTML_ENTITIES\n */\nexports.entityMap = exports.HTML_ENTITIES;\n","var NAMESPACE = require(\"./conventions\").NAMESPACE;\n\n//[4]   \tNameStartChar\t   ::=   \t\":\" | [A-Z] | \"_\" | [a-z] | [#xC0-#xD6] | [#xD8-#xF6] | [#xF8-#x2FF] | [#x370-#x37D] | [#x37F-#x1FFF] | [#x200C-#x200D] | [#x2070-#x218F] | [#x2C00-#x2FEF] | [#x3001-#xD7FF] | [#xF900-#xFDCF] | [#xFDF0-#xFFFD] | [#x10000-#xEFFFF]\n//[4a]   \tNameChar\t   ::=   \tNameStartChar | \"-\" | \".\" | [0-9] | #xB7 | [#x0300-#x036F] | [#x203F-#x2040]\n//[5]   \tName\t   ::=   \tNameStartChar (NameChar)*\nvar nameStartChar = /[A-Z_a-z\\xC0-\\xD6\\xD8-\\xF6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD]///\\u10000-\\uEFFFF\nvar nameChar = new RegExp(\"[\\\\-\\\\.0-9\"+nameStartChar.source.slice(1,-1)+\"\\\\u00B7\\\\u0300-\\\\u036F\\\\u203F-\\\\u2040]\");\nvar tagNamePattern = new RegExp('^'+nameStartChar.source+nameChar.source+'*(?:\\:'+nameStartChar.source+nameChar.source+'*)?$');\n//var tagNamePattern = /^[a-zA-Z_][\\w\\-\\.]*(?:\\:[a-zA-Z_][\\w\\-\\.]*)?$/\n//var handlers = 'resolveEntity,getExternalSubset,characters,endDocument,endElement,endPrefixMapping,ignorableWhitespace,processingInstruction,setDocumentLocator,skippedEntity,startDocument,startElement,startPrefixMapping,notationDecl,unparsedEntityDecl,error,fatalError,warning,attributeDecl,elementDecl,externalEntityDecl,internalEntityDecl,comment,endCDATA,endDTD,endEntity,startCDATA,startDTD,startEntity'.split(',')\n\n//S_TAG,\tS_ATTR,\tS_EQ,\tS_ATTR_NOQUOT_VALUE\n//S_ATTR_SPACE,\tS_ATTR_END,\tS_TAG_SPACE, S_TAG_CLOSE\nvar S_TAG = 0;//tag name offerring\nvar S_ATTR = 1;//attr name offerring\nvar S_ATTR_SPACE=2;//attr name end and space offer\nvar S_EQ = 3;//=space?\nvar S_ATTR_NOQUOT_VALUE = 4;//attr value(no quot value only)\nvar S_ATTR_END = 5;//attr value end and no space(quot end)\nvar S_TAG_SPACE = 6;//(attr value end || tag end ) && (space offer)\nvar S_TAG_CLOSE = 7;//closed el<el />\n\n/**\n * Creates an error that will not be caught by XMLReader aka the SAX parser.\n *\n * @param {string} message\n * @param {any?} locator Optional, can provide details about the location in the source\n * @constructor\n */\nfunction ParseError(message, locator) {\n\tthis.message = message\n\tthis.locator = locator\n\tif(Error.captureStackTrace) Error.captureStackTrace(this, ParseError);\n}\nParseError.prototype = new Error();\nParseError.prototype.name = ParseError.name\n\nfunction XMLReader(){\n\n}\n\nXMLReader.prototype = {\n\tparse:function(source,defaultNSMap,entityMap){\n\t\tvar domBuilder = this.domBuilder;\n\t\tdomBuilder.startDocument();\n\t\t_copy(defaultNSMap ,defaultNSMap = {})\n\t\tparse(source,defaultNSMap,entityMap,\n\t\t\t\tdomBuilder,this.errorHandler);\n\t\tdomBuilder.endDocument();\n\t}\n}\nfunction parse(source,defaultNSMapCopy,entityMap,domBuilder,errorHandler){\n\tfunction fixedFromCharCode(code) {\n\t\t// String.prototype.fromCharCode does not supports\n\t\t// > 2 bytes unicode chars directly\n\t\tif (code > 0xffff) {\n\t\t\tcode -= 0x10000;\n\t\t\tvar surrogate1 = 0xd800 + (code >> 10)\n\t\t\t\t, surrogate2 = 0xdc00 + (code & 0x3ff);\n\n\t\t\treturn String.fromCharCode(surrogate1, surrogate2);\n\t\t} else {\n\t\t\treturn String.fromCharCode(code);\n\t\t}\n\t}\n\tfunction entityReplacer(a){\n\t\tvar k = a.slice(1,-1);\n\t\tif (Object.hasOwnProperty.call(entityMap, k)) {\n\t\t\treturn entityMap[k];\n\t\t}else if(k.charAt(0) === '#'){\n\t\t\treturn fixedFromCharCode(parseInt(k.substr(1).replace('x','0x')))\n\t\t}else{\n\t\t\terrorHandler.error('entity not found:'+a);\n\t\t\treturn a;\n\t\t}\n\t}\n\tfunction appendText(end){//has some bugs\n\t\tif(end>start){\n\t\t\tvar xt = source.substring(start,end).replace(/&#?\\w+;/g,entityReplacer);\n\t\t\tlocator&&position(start);\n\t\t\tdomBuilder.characters(xt,0,end-start);\n\t\t\tstart = end\n\t\t}\n\t}\n\tfunction position(p,m){\n\t\twhile(p>=lineEnd && (m = linePattern.exec(source))){\n\t\t\tlineStart = m.index;\n\t\t\tlineEnd = lineStart + m[0].length;\n\t\t\tlocator.lineNumber++;\n\t\t\t//console.log('line++:',locator,startPos,endPos)\n\t\t}\n\t\tlocator.columnNumber = p-lineStart+1;\n\t}\n\tvar lineStart = 0;\n\tvar lineEnd = 0;\n\tvar linePattern = /.*(?:\\r\\n?|\\n)|.*$/g\n\tvar locator = domBuilder.locator;\n\n\tvar parseStack = [{currentNSMap:defaultNSMapCopy}]\n\tvar closeMap = {};\n\tvar start = 0;\n\twhile(true){\n\t\ttry{\n\t\t\tvar tagStart = source.indexOf('<',start);\n\t\t\tif(tagStart<0){\n\t\t\t\tif(!source.substr(start).match(/^\\s*$/)){\n\t\t\t\t\tvar doc = domBuilder.doc;\n\t    \t\t\tvar text = doc.createTextNode(source.substr(start));\n\t    \t\t\tdoc.appendChild(text);\n\t    \t\t\tdomBuilder.currentElement = text;\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif(tagStart>start){\n\t\t\t\tappendText(tagStart);\n\t\t\t}\n\t\t\tswitch(source.charAt(tagStart+1)){\n\t\t\tcase '/':\n\t\t\t\tvar end = source.indexOf('>',tagStart+3);\n\t\t\t\tvar tagName = source.substring(tagStart + 2, end).replace(/[ \\t\\n\\r]+$/g, '');\n\t\t\t\tvar config = parseStack.pop();\n\t\t\t\tif(end<0){\n\n\t        \t\ttagName = source.substring(tagStart+2).replace(/[\\s<].*/,'');\n\t        \t\terrorHandler.error(\"end tag name: \"+tagName+' is not complete:'+config.tagName);\n\t        \t\tend = tagStart+1+tagName.length;\n\t        \t}else if(tagName.match(/\\s</)){\n\t        \t\ttagName = tagName.replace(/[\\s<].*/,'');\n\t        \t\terrorHandler.error(\"end tag name: \"+tagName+' maybe not complete');\n\t        \t\tend = tagStart+1+tagName.length;\n\t\t\t\t}\n\t\t\t\tvar localNSMap = config.localNSMap;\n\t\t\t\tvar endMatch = config.tagName == tagName;\n\t\t\t\tvar endIgnoreCaseMach = endMatch || config.tagName&&config.tagName.toLowerCase() == tagName.toLowerCase()\n\t\t        if(endIgnoreCaseMach){\n\t\t        \tdomBuilder.endElement(config.uri,config.localName,tagName);\n\t\t\t\t\tif(localNSMap){\n\t\t\t\t\t\tfor (var prefix in localNSMap) {\n\t\t\t\t\t\t\tif (Object.prototype.hasOwnProperty.call(localNSMap, prefix)) {\n\t\t\t\t\t\t\t\tdomBuilder.endPrefixMapping(prefix);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif(!endMatch){\n\t\t            \terrorHandler.fatalError(\"end tag name: \"+tagName+' is not match the current start tagName:'+config.tagName ); // No known test case\n\t\t\t\t\t}\n\t\t        }else{\n\t\t        \tparseStack.push(config)\n\t\t        }\n\n\t\t\t\tend++;\n\t\t\t\tbreak;\n\t\t\t\t// end elment\n\t\t\tcase '?':// <?...?>\n\t\t\t\tlocator&&position(tagStart);\n\t\t\t\tend = parseInstruction(source,tagStart,domBuilder);\n\t\t\t\tbreak;\n\t\t\tcase '!':// <!doctype,<![CDATA,<!--\n\t\t\t\tlocator&&position(tagStart);\n\t\t\t\tend = parseDCC(source,tagStart,domBuilder,errorHandler);\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tlocator&&position(tagStart);\n\t\t\t\tvar el = new ElementAttributes();\n\t\t\t\tvar currentNSMap = parseStack[parseStack.length-1].currentNSMap;\n\t\t\t\t//elStartEnd\n\t\t\t\tvar end = parseElementStartPart(source,tagStart,el,currentNSMap,entityReplacer,errorHandler);\n\t\t\t\tvar len = el.length;\n\n\n\t\t\t\tif(!el.closed && fixSelfClosed(source,end,el.tagName,closeMap)){\n\t\t\t\t\tel.closed = true;\n\t\t\t\t\tif(!entityMap.nbsp){\n\t\t\t\t\t\terrorHandler.warning('unclosed xml attribute');\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif(locator && len){\n\t\t\t\t\tvar locator2 = copyLocator(locator,{});\n\t\t\t\t\t//try{//attribute position fixed\n\t\t\t\t\tfor(var i = 0;i<len;i++){\n\t\t\t\t\t\tvar a = el[i];\n\t\t\t\t\t\tposition(a.offset);\n\t\t\t\t\t\ta.locator = copyLocator(locator,{});\n\t\t\t\t\t}\n\t\t\t\t\tdomBuilder.locator = locator2\n\t\t\t\t\tif(appendElement(el,domBuilder,currentNSMap)){\n\t\t\t\t\t\tparseStack.push(el)\n\t\t\t\t\t}\n\t\t\t\t\tdomBuilder.locator = locator;\n\t\t\t\t}else{\n\t\t\t\t\tif(appendElement(el,domBuilder,currentNSMap)){\n\t\t\t\t\t\tparseStack.push(el)\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (NAMESPACE.isHTML(el.uri) && !el.closed) {\n\t\t\t\t\tend = parseHtmlSpecialContent(source,end,el.tagName,entityReplacer,domBuilder)\n\t\t\t\t} else {\n\t\t\t\t\tend++;\n\t\t\t\t}\n\t\t\t}\n\t\t}catch(e){\n\t\t\tif (e instanceof ParseError) {\n\t\t\t\tthrow e;\n\t\t\t}\n\t\t\terrorHandler.error('element parse error: '+e)\n\t\t\tend = -1;\n\t\t}\n\t\tif(end>start){\n\t\t\tstart = end;\n\t\t}else{\n\t\t\t//TODO: 这里有可能sax回退，有位置错误风险\n\t\t\tappendText(Math.max(tagStart,start)+1);\n\t\t}\n\t}\n}\nfunction copyLocator(f,t){\n\tt.lineNumber = f.lineNumber;\n\tt.columnNumber = f.columnNumber;\n\treturn t;\n}\n\n/**\n * @see #appendElement(source,elStartEnd,el,selfClosed,entityReplacer,domBuilder,parseStack);\n * @return end of the elementStartPart(end of elementEndPart for selfClosed el)\n */\nfunction parseElementStartPart(source,start,el,currentNSMap,entityReplacer,errorHandler){\n\n\t/**\n\t * @param {string} qname\n\t * @param {string} value\n\t * @param {number} startIndex\n\t */\n\tfunction addAttribute(qname, value, startIndex) {\n\t\tif (el.attributeNames.hasOwnProperty(qname)) {\n\t\t\terrorHandler.fatalError('Attribute ' + qname + ' redefined')\n\t\t}\n\t\tel.addValue(\n\t\t\tqname,\n\t\t\t// @see https://www.w3.org/TR/xml/#AVNormalize\n\t\t\t// since the xmldom sax parser does not \"interpret\" DTD the following is not implemented:\n\t\t\t// - recursive replacement of (DTD) entity references\n\t\t\t// - trimming and collapsing multiple spaces into a single one for attributes that are not of type CDATA\n\t\t\tvalue.replace(/[\\t\\n\\r]/g, ' ').replace(/&#?\\w+;/g, entityReplacer),\n\t\t\tstartIndex\n\t\t)\n\t}\n\tvar attrName;\n\tvar value;\n\tvar p = ++start;\n\tvar s = S_TAG;//status\n\twhile(true){\n\t\tvar c = source.charAt(p);\n\t\tswitch(c){\n\t\tcase '=':\n\t\t\tif(s === S_ATTR){//attrName\n\t\t\t\tattrName = source.slice(start,p);\n\t\t\t\ts = S_EQ;\n\t\t\t}else if(s === S_ATTR_SPACE){\n\t\t\t\ts = S_EQ;\n\t\t\t}else{\n\t\t\t\t//fatalError: equal must after attrName or space after attrName\n\t\t\t\tthrow new Error('attribute equal must after attrName'); // No known test case\n\t\t\t}\n\t\t\tbreak;\n\t\tcase '\\'':\n\t\tcase '\"':\n\t\t\tif(s === S_EQ || s === S_ATTR //|| s == S_ATTR_SPACE\n\t\t\t\t){//equal\n\t\t\t\tif(s === S_ATTR){\n\t\t\t\t\terrorHandler.warning('attribute value must after \"=\"')\n\t\t\t\t\tattrName = source.slice(start,p)\n\t\t\t\t}\n\t\t\t\tstart = p+1;\n\t\t\t\tp = source.indexOf(c,start)\n\t\t\t\tif(p>0){\n\t\t\t\t\tvalue = source.slice(start, p);\n\t\t\t\t\taddAttribute(attrName, value, start-1);\n\t\t\t\t\ts = S_ATTR_END;\n\t\t\t\t}else{\n\t\t\t\t\t//fatalError: no end quot match\n\t\t\t\t\tthrow new Error('attribute value no end \\''+c+'\\' match');\n\t\t\t\t}\n\t\t\t}else if(s == S_ATTR_NOQUOT_VALUE){\n\t\t\t\tvalue = source.slice(start, p);\n\t\t\t\taddAttribute(attrName, value, start);\n\t\t\t\terrorHandler.warning('attribute \"'+attrName+'\" missed start quot('+c+')!!');\n\t\t\t\tstart = p+1;\n\t\t\t\ts = S_ATTR_END\n\t\t\t}else{\n\t\t\t\t//fatalError: no equal before\n\t\t\t\tthrow new Error('attribute value must after \"=\"'); // No known test case\n\t\t\t}\n\t\t\tbreak;\n\t\tcase '/':\n\t\t\tswitch(s){\n\t\t\tcase S_TAG:\n\t\t\t\tel.setTagName(source.slice(start,p));\n\t\t\tcase S_ATTR_END:\n\t\t\tcase S_TAG_SPACE:\n\t\t\tcase S_TAG_CLOSE:\n\t\t\t\ts =S_TAG_CLOSE;\n\t\t\t\tel.closed = true;\n\t\t\tcase S_ATTR_NOQUOT_VALUE:\n\t\t\tcase S_ATTR:\n\t\t\t\tbreak;\n\t\t\t\tcase S_ATTR_SPACE:\n\t\t\t\t\tel.closed = true;\n\t\t\t\tbreak;\n\t\t\t//case S_EQ:\n\t\t\tdefault:\n\t\t\t\tthrow new Error(\"attribute invalid close char('/')\") // No known test case\n\t\t\t}\n\t\t\tbreak;\n\t\tcase ''://end document\n\t\t\terrorHandler.error('unexpected end of input');\n\t\t\tif(s == S_TAG){\n\t\t\t\tel.setTagName(source.slice(start,p));\n\t\t\t}\n\t\t\treturn p;\n\t\tcase '>':\n\t\t\tswitch(s){\n\t\t\tcase S_TAG:\n\t\t\t\tel.setTagName(source.slice(start,p));\n\t\t\tcase S_ATTR_END:\n\t\t\tcase S_TAG_SPACE:\n\t\t\tcase S_TAG_CLOSE:\n\t\t\t\tbreak;//normal\n\t\t\tcase S_ATTR_NOQUOT_VALUE://Compatible state\n\t\t\tcase S_ATTR:\n\t\t\t\tvalue = source.slice(start,p);\n\t\t\t\tif(value.slice(-1) === '/'){\n\t\t\t\t\tel.closed  = true;\n\t\t\t\t\tvalue = value.slice(0,-1)\n\t\t\t\t}\n\t\t\tcase S_ATTR_SPACE:\n\t\t\t\tif(s === S_ATTR_SPACE){\n\t\t\t\t\tvalue = attrName;\n\t\t\t\t}\n\t\t\t\tif(s == S_ATTR_NOQUOT_VALUE){\n\t\t\t\t\terrorHandler.warning('attribute \"'+value+'\" missed quot(\")!');\n\t\t\t\t\taddAttribute(attrName, value, start)\n\t\t\t\t}else{\n\t\t\t\t\tif(!NAMESPACE.isHTML(currentNSMap['']) || !value.match(/^(?:disabled|checked|selected)$/i)){\n\t\t\t\t\t\terrorHandler.warning('attribute \"'+value+'\" missed value!! \"'+value+'\" instead!!')\n\t\t\t\t\t}\n\t\t\t\t\taddAttribute(value, value, start)\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase S_EQ:\n\t\t\t\tthrow new Error('attribute value missed!!');\n\t\t\t}\n//\t\t\tconsole.log(tagName,tagNamePattern,tagNamePattern.test(tagName))\n\t\t\treturn p;\n\t\t/*xml space '\\x20' | #x9 | #xD | #xA; */\n\t\tcase '\\u0080':\n\t\t\tc = ' ';\n\t\tdefault:\n\t\t\tif(c<= ' '){//space\n\t\t\t\tswitch(s){\n\t\t\t\tcase S_TAG:\n\t\t\t\t\tel.setTagName(source.slice(start,p));//tagName\n\t\t\t\t\ts = S_TAG_SPACE;\n\t\t\t\t\tbreak;\n\t\t\t\tcase S_ATTR:\n\t\t\t\t\tattrName = source.slice(start,p)\n\t\t\t\t\ts = S_ATTR_SPACE;\n\t\t\t\t\tbreak;\n\t\t\t\tcase S_ATTR_NOQUOT_VALUE:\n\t\t\t\t\tvar value = source.slice(start, p);\n\t\t\t\t\terrorHandler.warning('attribute \"'+value+'\" missed quot(\")!!');\n\t\t\t\t\taddAttribute(attrName, value, start)\n\t\t\t\tcase S_ATTR_END:\n\t\t\t\t\ts = S_TAG_SPACE;\n\t\t\t\t\tbreak;\n\t\t\t\t//case S_TAG_SPACE:\n\t\t\t\t//case S_EQ:\n\t\t\t\t//case S_ATTR_SPACE:\n\t\t\t\t//\tvoid();break;\n\t\t\t\t//case S_TAG_CLOSE:\n\t\t\t\t\t//ignore warning\n\t\t\t\t}\n\t\t\t}else{//not space\n//S_TAG,\tS_ATTR,\tS_EQ,\tS_ATTR_NOQUOT_VALUE\n//S_ATTR_SPACE,\tS_ATTR_END,\tS_TAG_SPACE, S_TAG_CLOSE\n\t\t\t\tswitch(s){\n\t\t\t\t//case S_TAG:void();break;\n\t\t\t\t//case S_ATTR:void();break;\n\t\t\t\t//case S_ATTR_NOQUOT_VALUE:void();break;\n\t\t\t\tcase S_ATTR_SPACE:\n\t\t\t\t\tvar tagName =  el.tagName;\n\t\t\t\t\tif (!NAMESPACE.isHTML(currentNSMap['']) || !attrName.match(/^(?:disabled|checked|selected)$/i)) {\n\t\t\t\t\t\terrorHandler.warning('attribute \"'+attrName+'\" missed value!! \"'+attrName+'\" instead2!!')\n\t\t\t\t\t}\n\t\t\t\t\taddAttribute(attrName, attrName, start);\n\t\t\t\t\tstart = p;\n\t\t\t\t\ts = S_ATTR;\n\t\t\t\t\tbreak;\n\t\t\t\tcase S_ATTR_END:\n\t\t\t\t\terrorHandler.warning('attribute space is required\"'+attrName+'\"!!')\n\t\t\t\tcase S_TAG_SPACE:\n\t\t\t\t\ts = S_ATTR;\n\t\t\t\t\tstart = p;\n\t\t\t\t\tbreak;\n\t\t\t\tcase S_EQ:\n\t\t\t\t\ts = S_ATTR_NOQUOT_VALUE;\n\t\t\t\t\tstart = p;\n\t\t\t\t\tbreak;\n\t\t\t\tcase S_TAG_CLOSE:\n\t\t\t\t\tthrow new Error(\"elements closed character '/' and '>' must be connected to\");\n\t\t\t\t}\n\t\t\t}\n\t\t}//end outer switch\n\t\t//console.log('p++',p)\n\t\tp++;\n\t}\n}\n/**\n * @return true if has new namespace define\n */\nfunction appendElement(el,domBuilder,currentNSMap){\n\tvar tagName = el.tagName;\n\tvar localNSMap = null;\n\t//var currentNSMap = parseStack[parseStack.length-1].currentNSMap;\n\tvar i = el.length;\n\twhile(i--){\n\t\tvar a = el[i];\n\t\tvar qName = a.qName;\n\t\tvar value = a.value;\n\t\tvar nsp = qName.indexOf(':');\n\t\tif(nsp>0){\n\t\t\tvar prefix = a.prefix = qName.slice(0,nsp);\n\t\t\tvar localName = qName.slice(nsp+1);\n\t\t\tvar nsPrefix = prefix === 'xmlns' && localName\n\t\t}else{\n\t\t\tlocalName = qName;\n\t\t\tprefix = null\n\t\t\tnsPrefix = qName === 'xmlns' && ''\n\t\t}\n\t\t//can not set prefix,because prefix !== ''\n\t\ta.localName = localName ;\n\t\t//prefix == null for no ns prefix attribute\n\t\tif(nsPrefix !== false){//hack!!\n\t\t\tif(localNSMap == null){\n\t\t\t\tlocalNSMap = {}\n\t\t\t\t//console.log(currentNSMap,0)\n\t\t\t\t_copy(currentNSMap,currentNSMap={})\n\t\t\t\t//console.log(currentNSMap,1)\n\t\t\t}\n\t\t\tcurrentNSMap[nsPrefix] = localNSMap[nsPrefix] = value;\n\t\t\ta.uri = NAMESPACE.XMLNS\n\t\t\tdomBuilder.startPrefixMapping(nsPrefix, value)\n\t\t}\n\t}\n\tvar i = el.length;\n\twhile(i--){\n\t\ta = el[i];\n\t\tvar prefix = a.prefix;\n\t\tif(prefix){//no prefix attribute has no namespace\n\t\t\tif(prefix === 'xml'){\n\t\t\t\ta.uri = NAMESPACE.XML;\n\t\t\t}if(prefix !== 'xmlns'){\n\t\t\t\ta.uri = currentNSMap[prefix || '']\n\n\t\t\t\t//{console.log('###'+a.qName,domBuilder.locator.systemId+'',currentNSMap,a.uri)}\n\t\t\t}\n\t\t}\n\t}\n\tvar nsp = tagName.indexOf(':');\n\tif(nsp>0){\n\t\tprefix = el.prefix = tagName.slice(0,nsp);\n\t\tlocalName = el.localName = tagName.slice(nsp+1);\n\t}else{\n\t\tprefix = null;//important!!\n\t\tlocalName = el.localName = tagName;\n\t}\n\t//no prefix element has default namespace\n\tvar ns = el.uri = currentNSMap[prefix || ''];\n\tdomBuilder.startElement(ns,localName,tagName,el);\n\t//endPrefixMapping and startPrefixMapping have not any help for dom builder\n\t//localNSMap = null\n\tif(el.closed){\n\t\tdomBuilder.endElement(ns,localName,tagName);\n\t\tif(localNSMap){\n\t\t\tfor (prefix in localNSMap) {\n\t\t\t\tif (Object.prototype.hasOwnProperty.call(localNSMap, prefix)) {\n\t\t\t\t\tdomBuilder.endPrefixMapping(prefix);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}else{\n\t\tel.currentNSMap = currentNSMap;\n\t\tel.localNSMap = localNSMap;\n\t\t//parseStack.push(el);\n\t\treturn true;\n\t}\n}\nfunction parseHtmlSpecialContent(source,elStartEnd,tagName,entityReplacer,domBuilder){\n\tif(/^(?:script|textarea)$/i.test(tagName)){\n\t\tvar elEndStart =  source.indexOf('</'+tagName+'>',elStartEnd);\n\t\tvar text = source.substring(elStartEnd+1,elEndStart);\n\t\tif(/[&<]/.test(text)){\n\t\t\tif(/^script$/i.test(tagName)){\n\t\t\t\t//if(!/\\]\\]>/.test(text)){\n\t\t\t\t\t//lexHandler.startCDATA();\n\t\t\t\t\tdomBuilder.characters(text,0,text.length);\n\t\t\t\t\t//lexHandler.endCDATA();\n\t\t\t\t\treturn elEndStart;\n\t\t\t\t//}\n\t\t\t}//}else{//text area\n\t\t\t\ttext = text.replace(/&#?\\w+;/g,entityReplacer);\n\t\t\t\tdomBuilder.characters(text,0,text.length);\n\t\t\t\treturn elEndStart;\n\t\t\t//}\n\n\t\t}\n\t}\n\treturn elStartEnd+1;\n}\nfunction fixSelfClosed(source,elStartEnd,tagName,closeMap){\n\t//if(tagName in closeMap){\n\tvar pos = closeMap[tagName];\n\tif(pos == null){\n\t\t//console.log(tagName)\n\t\tpos =  source.lastIndexOf('</'+tagName+'>')\n\t\tif(pos<elStartEnd){//忘记闭合\n\t\t\tpos = source.lastIndexOf('</'+tagName)\n\t\t}\n\t\tcloseMap[tagName] =pos\n\t}\n\treturn pos<elStartEnd;\n\t//}\n}\n\nfunction _copy (source, target) {\n\tfor (var n in source) {\n\t\tif (Object.prototype.hasOwnProperty.call(source, n)) {\n\t\t\ttarget[n] = source[n];\n\t\t}\n\t}\n}\n\nfunction parseDCC(source,start,domBuilder,errorHandler){//sure start with '<!'\n\tvar next= source.charAt(start+2)\n\tswitch(next){\n\tcase '-':\n\t\tif(source.charAt(start + 3) === '-'){\n\t\t\tvar end = source.indexOf('-->',start+4);\n\t\t\t//append comment source.substring(4,end)//<!--\n\t\t\tif(end>start){\n\t\t\t\tdomBuilder.comment(source,start+4,end-start-4);\n\t\t\t\treturn end+3;\n\t\t\t}else{\n\t\t\t\terrorHandler.error(\"Unclosed comment\");\n\t\t\t\treturn -1;\n\t\t\t}\n\t\t}else{\n\t\t\t//error\n\t\t\treturn -1;\n\t\t}\n\tdefault:\n\t\tif(source.substr(start+3,6) == 'CDATA['){\n\t\t\tvar end = source.indexOf(']]>',start+9);\n\t\t\tdomBuilder.startCDATA();\n\t\t\tdomBuilder.characters(source,start+9,end-start-9);\n\t\t\tdomBuilder.endCDATA()\n\t\t\treturn end+3;\n\t\t}\n\t\t//<!DOCTYPE\n\t\t//startDTD(java.lang.String name, java.lang.String publicId, java.lang.String systemId)\n\t\tvar matchs = split(source,start);\n\t\tvar len = matchs.length;\n\t\tif(len>1 && /!doctype/i.test(matchs[0][0])){\n\t\t\tvar name = matchs[1][0];\n\t\t\tvar pubid = false;\n\t\t\tvar sysid = false;\n\t\t\tif(len>3){\n\t\t\t\tif(/^public$/i.test(matchs[2][0])){\n\t\t\t\t\tpubid = matchs[3][0];\n\t\t\t\t\tsysid = len>4 && matchs[4][0];\n\t\t\t\t}else if(/^system$/i.test(matchs[2][0])){\n\t\t\t\t\tsysid = matchs[3][0];\n\t\t\t\t}\n\t\t\t}\n\t\t\tvar lastMatch = matchs[len-1]\n\t\t\tdomBuilder.startDTD(name, pubid, sysid);\n\t\t\tdomBuilder.endDTD();\n\n\t\t\treturn lastMatch.index+lastMatch[0].length\n\t\t}\n\t}\n\treturn -1;\n}\n\n\n\nfunction parseInstruction(source,start,domBuilder){\n\tvar end = source.indexOf('?>',start);\n\tif(end){\n\t\tvar match = source.substring(start,end).match(/^<\\?(\\S*)\\s*([\\s\\S]*?)\\s*$/);\n\t\tif(match){\n\t\t\tvar len = match[0].length;\n\t\t\tdomBuilder.processingInstruction(match[1], match[2]) ;\n\t\t\treturn end+2;\n\t\t}else{//error\n\t\t\treturn -1;\n\t\t}\n\t}\n\treturn -1;\n}\n\nfunction ElementAttributes(){\n\tthis.attributeNames = {}\n}\nElementAttributes.prototype = {\n\tsetTagName:function(tagName){\n\t\tif(!tagNamePattern.test(tagName)){\n\t\t\tthrow new Error('invalid tagName:'+tagName)\n\t\t}\n\t\tthis.tagName = tagName\n\t},\n\taddValue:function(qName, value, offset) {\n\t\tif(!tagNamePattern.test(qName)){\n\t\t\tthrow new Error('invalid attribute:'+qName)\n\t\t}\n\t\tthis.attributeNames[qName] = this.length;\n\t\tthis[this.length++] = {qName:qName,value:value,offset:offset}\n\t},\n\tlength:0,\n\tgetLocalName:function(i){return this[i].localName},\n\tgetLocator:function(i){return this[i].locator},\n\tgetQName:function(i){return this[i].qName},\n\tgetURI:function(i){return this[i].uri},\n\tgetValue:function(i){return this[i].value}\n//\t,getIndex:function(uri, localName)){\n//\t\tif(localName){\n//\n//\t\t}else{\n//\t\t\tvar qName = uri\n//\t\t}\n//\t},\n//\tgetValue:function(){return this.getValue(this.getIndex.apply(this,arguments))},\n//\tgetType:function(uri,localName){}\n//\tgetType:function(i){},\n}\n\n\n\nfunction split(source,start){\n\tvar match;\n\tvar buf = [];\n\tvar reg = /'[^']+'|\"[^\"]+\"|[^\\s<>\\/=]+=?|(\\/?\\s*>|<)/g;\n\treg.lastIndex = start;\n\treg.exec(source);//skip <\n\twhile(match = reg.exec(source)){\n\t\tbuf.push(match);\n\t\tif(match[1])return buf;\n\t}\n}\n\nexports.XMLReader = XMLReader;\nexports.ParseError = ParseError;\n","var conventions = require(\"./conventions\");\nvar dom = require('./dom')\nvar entities = require('./entities');\nvar sax = require('./sax');\n\nvar DOMImplementation = dom.DOMImplementation;\n\nvar NAMESPACE = conventions.NAMESPACE;\n\nvar ParseError = sax.ParseError;\nvar XMLReader = sax.XMLReader;\n\n/**\n * Normalizes line ending according to https://www.w3.org/TR/xml11/#sec-line-ends:\n *\n * > XML parsed entities are often stored in computer files which,\n * > for editing convenience, are organized into lines.\n * > These lines are typically separated by some combination\n * > of the characters CARRIAGE RETURN (#xD) and LINE FEED (#xA).\n * >\n * > To simplify the tasks of applications, the XML processor must behave\n * > as if it normalized all line breaks in external parsed entities (including the document entity)\n * > on input, before parsing, by translating all of the following to a single #xA character:\n * >\n * > 1. the two-character sequence #xD #xA\n * > 2. the two-character sequence #xD #x85\n * > 3. the single character #x85\n * > 4. the single character #x2028\n * > 5. any #xD character that is not immediately followed by #xA or #x85.\n *\n * @param {string} input\n * @returns {string}\n */\nfunction normalizeLineEndings(input) {\n\treturn input\n\t\t.replace(/\\r[\\n\\u0085]/g, '\\n')\n\t\t.replace(/[\\r\\u0085\\u2028]/g, '\\n')\n}\n\n/**\n * @typedef Locator\n * @property {number} [columnNumber]\n * @property {number} [lineNumber]\n */\n\n/**\n * @typedef DOMParserOptions\n * @property {DOMHandler} [domBuilder]\n * @property {Function} [errorHandler]\n * @property {(string) => string} [normalizeLineEndings] used to replace line endings before parsing\n * \t\t\t\t\t\tdefaults to `normalizeLineEndings`\n * @property {Locator} [locator]\n * @property {Record<string, string>} [xmlns]\n *\n * @see normalizeLineEndings\n */\n\n/**\n * The DOMParser interface provides the ability to parse XML or HTML source code\n * from a string into a DOM `Document`.\n *\n * _xmldom is different from the spec in that it allows an `options` parameter,\n * to override the default behavior._\n *\n * @param {DOMParserOptions} [options]\n * @constructor\n *\n * @see https://developer.mozilla.org/en-US/docs/Web/API/DOMParser\n * @see https://html.spec.whatwg.org/multipage/dynamic-markup-insertion.html#dom-parsing-and-serialization\n */\nfunction DOMParser(options){\n\tthis.options = options ||{locator:{}};\n}\n\nDOMParser.prototype.parseFromString = function(source,mimeType){\n\tvar options = this.options;\n\tvar sax =  new XMLReader();\n\tvar domBuilder = options.domBuilder || new DOMHandler();//contentHandler and LexicalHandler\n\tvar errorHandler = options.errorHandler;\n\tvar locator = options.locator;\n\tvar defaultNSMap = options.xmlns||{};\n\tvar isHTML = /\\/x?html?$/.test(mimeType);//mimeType.toLowerCase().indexOf('html') > -1;\n  \tvar entityMap = isHTML ? entities.HTML_ENTITIES : entities.XML_ENTITIES;\n\tif(locator){\n\t\tdomBuilder.setDocumentLocator(locator)\n\t}\n\n\tsax.errorHandler = buildErrorHandler(errorHandler,domBuilder,locator);\n\tsax.domBuilder = options.domBuilder || domBuilder;\n\tif(isHTML){\n\t\tdefaultNSMap[''] = NAMESPACE.HTML;\n\t}\n\tdefaultNSMap.xml = defaultNSMap.xml || NAMESPACE.XML;\n\tvar normalize = options.normalizeLineEndings || normalizeLineEndings;\n\tif (source && typeof source === 'string') {\n\t\tsax.parse(\n\t\t\tnormalize(source),\n\t\t\tdefaultNSMap,\n\t\t\tentityMap\n\t\t)\n\t} else {\n\t\tsax.errorHandler.error('invalid doc source')\n\t}\n\treturn domBuilder.doc;\n}\nfunction buildErrorHandler(errorImpl,domBuilder,locator){\n\tif(!errorImpl){\n\t\tif(domBuilder instanceof DOMHandler){\n\t\t\treturn domBuilder;\n\t\t}\n\t\terrorImpl = domBuilder ;\n\t}\n\tvar errorHandler = {}\n\tvar isCallback = errorImpl instanceof Function;\n\tlocator = locator||{}\n\tfunction build(key){\n\t\tvar fn = errorImpl[key];\n\t\tif(!fn && isCallback){\n\t\t\tfn = errorImpl.length == 2?function(msg){errorImpl(key,msg)}:errorImpl;\n\t\t}\n\t\terrorHandler[key] = fn && function(msg){\n\t\t\tfn('[xmldom '+key+']\\t'+msg+_locator(locator));\n\t\t}||function(){};\n\t}\n\tbuild('warning');\n\tbuild('error');\n\tbuild('fatalError');\n\treturn errorHandler;\n}\n\n//console.log('#\\n\\n\\n\\n\\n\\n\\n####')\n/**\n * +ContentHandler+ErrorHandler\n * +LexicalHandler+EntityResolver2\n * -DeclHandler-DTDHandler\n *\n * DefaultHandler:EntityResolver, DTDHandler, ContentHandler, ErrorHandler\n * DefaultHandler2:DefaultHandler,LexicalHandler, DeclHandler, EntityResolver2\n * @link http://www.saxproject.org/apidoc/org/xml/sax/helpers/DefaultHandler.html\n */\nfunction DOMHandler() {\n    this.cdata = false;\n}\nfunction position(locator,node){\n\tnode.lineNumber = locator.lineNumber;\n\tnode.columnNumber = locator.columnNumber;\n}\n/**\n * @see org.xml.sax.ContentHandler#startDocument\n * @link http://www.saxproject.org/apidoc/org/xml/sax/ContentHandler.html\n */\nDOMHandler.prototype = {\n\tstartDocument : function() {\n    \tthis.doc = new DOMImplementation().createDocument(null, null, null);\n    \tif (this.locator) {\n        \tthis.doc.documentURI = this.locator.systemId;\n    \t}\n\t},\n\tstartElement:function(namespaceURI, localName, qName, attrs) {\n\t\tvar doc = this.doc;\n\t    var el = doc.createElementNS(namespaceURI, qName||localName);\n\t    var len = attrs.length;\n\t    appendElement(this, el);\n\t    this.currentElement = el;\n\n\t\tthis.locator && position(this.locator,el)\n\t    for (var i = 0 ; i < len; i++) {\n\t        var namespaceURI = attrs.getURI(i);\n\t        var value = attrs.getValue(i);\n\t        var qName = attrs.getQName(i);\n\t\t\tvar attr = doc.createAttributeNS(namespaceURI, qName);\n\t\t\tthis.locator &&position(attrs.getLocator(i),attr);\n\t\t\tattr.value = attr.nodeValue = value;\n\t\t\tel.setAttributeNode(attr)\n\t    }\n\t},\n\tendElement:function(namespaceURI, localName, qName) {\n\t\tvar current = this.currentElement\n\t\tvar tagName = current.tagName;\n\t\tthis.currentElement = current.parentNode;\n\t},\n\tstartPrefixMapping:function(prefix, uri) {\n\t},\n\tendPrefixMapping:function(prefix) {\n\t},\n\tprocessingInstruction:function(target, data) {\n\t    var ins = this.doc.createProcessingInstruction(target, data);\n\t    this.locator && position(this.locator,ins)\n\t    appendElement(this, ins);\n\t},\n\tignorableWhitespace:function(ch, start, length) {\n\t},\n\tcharacters:function(chars, start, length) {\n\t\tchars = _toString.apply(this,arguments)\n\t\t//console.log(chars)\n\t\tif(chars){\n\t\t\tif (this.cdata) {\n\t\t\t\tvar charNode = this.doc.createCDATASection(chars);\n\t\t\t} else {\n\t\t\t\tvar charNode = this.doc.createTextNode(chars);\n\t\t\t}\n\t\t\tif(this.currentElement){\n\t\t\t\tthis.currentElement.appendChild(charNode);\n\t\t\t}else if(/^\\s*$/.test(chars)){\n\t\t\t\tthis.doc.appendChild(charNode);\n\t\t\t\t//process xml\n\t\t\t}\n\t\t\tthis.locator && position(this.locator,charNode)\n\t\t}\n\t},\n\tskippedEntity:function(name) {\n\t},\n\tendDocument:function() {\n\t\tthis.doc.normalize();\n\t},\n\tsetDocumentLocator:function (locator) {\n\t    if(this.locator = locator){// && !('lineNumber' in locator)){\n\t    \tlocator.lineNumber = 0;\n\t    }\n\t},\n\t//LexicalHandler\n\tcomment:function(chars, start, length) {\n\t\tchars = _toString.apply(this,arguments)\n\t    var comm = this.doc.createComment(chars);\n\t    this.locator && position(this.locator,comm)\n\t    appendElement(this, comm);\n\t},\n\n\tstartCDATA:function() {\n\t    //used in characters() methods\n\t    this.cdata = true;\n\t},\n\tendCDATA:function() {\n\t    this.cdata = false;\n\t},\n\n\tstartDTD:function(name, publicId, systemId) {\n\t\tvar impl = this.doc.implementation;\n\t    if (impl && impl.createDocumentType) {\n\t        var dt = impl.createDocumentType(name, publicId, systemId);\n\t        this.locator && position(this.locator,dt)\n\t        appendElement(this, dt);\n\t\t\t\t\tthis.doc.doctype = dt;\n\t    }\n\t},\n\t/**\n\t * @see org.xml.sax.ErrorHandler\n\t * @link http://www.saxproject.org/apidoc/org/xml/sax/ErrorHandler.html\n\t */\n\twarning:function(error) {\n\t\tconsole.warn('[xmldom warning]\\t'+error,_locator(this.locator));\n\t},\n\terror:function(error) {\n\t\tconsole.error('[xmldom error]\\t'+error,_locator(this.locator));\n\t},\n\tfatalError:function(error) {\n\t\tthrow new ParseError(error, this.locator);\n\t}\n}\nfunction _locator(l){\n\tif(l){\n\t\treturn '\\n@'+(l.systemId ||'')+'#[line:'+l.lineNumber+',col:'+l.columnNumber+']'\n\t}\n}\nfunction _toString(chars,start,length){\n\tif(typeof chars == 'string'){\n\t\treturn chars.substr(start,length)\n\t}else{//java sax connect width xmldom on rhino(what about: \"? && !(chars instanceof String)\")\n\t\tif(chars.length >= start+length || start){\n\t\t\treturn new java.lang.String(chars,start,length)+'';\n\t\t}\n\t\treturn chars;\n\t}\n}\n\n/*\n * @link http://www.saxproject.org/apidoc/org/xml/sax/ext/LexicalHandler.html\n * used method of org.xml.sax.ext.LexicalHandler:\n *  #comment(chars, start, length)\n *  #startCDATA()\n *  #endCDATA()\n *  #startDTD(name, publicId, systemId)\n *\n *\n * IGNORED method of org.xml.sax.ext.LexicalHandler:\n *  #endDTD()\n *  #startEntity(name)\n *  #endEntity(name)\n *\n *\n * @link http://www.saxproject.org/apidoc/org/xml/sax/ext/DeclHandler.html\n * IGNORED method of org.xml.sax.ext.DeclHandler\n * \t#attributeDecl(eName, aName, type, mode, value)\n *  #elementDecl(name, model)\n *  #externalEntityDecl(name, publicId, systemId)\n *  #internalEntityDecl(name, value)\n * @link http://www.saxproject.org/apidoc/org/xml/sax/ext/EntityResolver2.html\n * IGNORED method of org.xml.sax.EntityResolver2\n *  #resolveEntity(String name,String publicId,String baseURI,String systemId)\n *  #resolveEntity(publicId, systemId)\n *  #getExternalSubset(name, baseURI)\n * @link http://www.saxproject.org/apidoc/org/xml/sax/DTDHandler.html\n * IGNORED method of org.xml.sax.DTDHandler\n *  #notationDecl(name, publicId, systemId) {};\n *  #unparsedEntityDecl(name, publicId, systemId, notationName) {};\n */\n\"endDTD,startEntity,endEntity,attributeDecl,elementDecl,externalEntityDecl,internalEntityDecl,resolveEntity,getExternalSubset,notationDecl,unparsedEntityDecl\".replace(/\\w+/g,function(key){\n\tDOMHandler.prototype[key] = function(){return null}\n})\n\n/* Private static helpers treated below as private instance methods, so don't need to add these to the public API; we might use a Relator to also get rid of non-standard public properties */\nfunction appendElement (hander,node) {\n    if (!hander.currentElement) {\n        hander.doc.appendChild(node);\n    } else {\n        hander.currentElement.appendChild(node);\n    }\n}//appendChild and setAttributeNS are preformance key\n\nexports.__DOMHandler = DOMHandler;\nexports.normalizeLineEndings = normalizeLineEndings;\nexports.DOMParser = DOMParser;\n","var dom = require('./dom')\nexports.DOMImplementation = dom.DOMImplementation\nexports.XMLSerializer = dom.XMLSerializer\nexports.DOMParser = require('./dom-parser').DOMParser\n","/*! @name mpd-parser @version 1.3.1 @license Apache-2.0 */\nimport resolveUrl from '@videojs/vhs-utils/es/resolve-url';\nimport window from 'global/window';\nimport { forEachMediaGroup } from '@videojs/vhs-utils/es/media-groups';\nimport decodeB64ToUint8Array from '@videojs/vhs-utils/es/decode-b64-to-uint8-array';\nimport { DOMParser } from '@xmldom/xmldom';\n\nvar version = \"1.3.1\";\n\nconst isObject = obj => {\n  return !!obj && typeof obj === 'object';\n};\n\nconst merge = (...objects) => {\n  return objects.reduce((result, source) => {\n    if (typeof source !== 'object') {\n      return result;\n    }\n\n    Object.keys(source).forEach(key => {\n      if (Array.isArray(result[key]) && Array.isArray(source[key])) {\n        result[key] = result[key].concat(source[key]);\n      } else if (isObject(result[key]) && isObject(source[key])) {\n        result[key] = merge(result[key], source[key]);\n      } else {\n        result[key] = source[key];\n      }\n    });\n    return result;\n  }, {});\n};\nconst values = o => Object.keys(o).map(k => o[k]);\n\nconst range = (start, end) => {\n  const result = [];\n\n  for (let i = start; i < end; i++) {\n    result.push(i);\n  }\n\n  return result;\n};\nconst flatten = lists => lists.reduce((x, y) => x.concat(y), []);\nconst from = list => {\n  if (!list.length) {\n    return [];\n  }\n\n  const result = [];\n\n  for (let i = 0; i < list.length; i++) {\n    result.push(list[i]);\n  }\n\n  return result;\n};\nconst findIndexes = (l, key) => l.reduce((a, e, i) => {\n  if (e[key]) {\n    a.push(i);\n  }\n\n  return a;\n}, []);\n/**\n * Returns a union of the included lists provided each element can be identified by a key.\n *\n * @param {Array} list - list of lists to get the union of\n * @param {Function} keyFunction - the function to use as a key for each element\n *\n * @return {Array} the union of the arrays\n */\n\nconst union = (lists, keyFunction) => {\n  return values(lists.reduce((acc, list) => {\n    list.forEach(el => {\n      acc[keyFunction(el)] = el;\n    });\n    return acc;\n  }, {}));\n};\n\nvar errors = {\n  INVALID_NUMBER_OF_PERIOD: 'INVALID_NUMBER_OF_PERIOD',\n  INVALID_NUMBER_OF_CONTENT_STEERING: 'INVALID_NUMBER_OF_CONTENT_STEERING',\n  DASH_EMPTY_MANIFEST: 'DASH_EMPTY_MANIFEST',\n  DASH_INVALID_XML: 'DASH_INVALID_XML',\n  NO_BASE_URL: 'NO_BASE_URL',\n  MISSING_SEGMENT_INFORMATION: 'MISSING_SEGMENT_INFORMATION',\n  SEGMENT_TIME_UNSPECIFIED: 'SEGMENT_TIME_UNSPECIFIED',\n  UNSUPPORTED_UTC_TIMING_SCHEME: 'UNSUPPORTED_UTC_TIMING_SCHEME'\n};\n\n/**\n * @typedef {Object} SingleUri\n * @property {string} uri - relative location of segment\n * @property {string} resolvedUri - resolved location of segment\n * @property {Object} byterange - Object containing information on how to make byte range\n *   requests following byte-range-spec per RFC2616.\n * @property {String} byterange.length - length of range request\n * @property {String} byterange.offset - byte offset of range request\n *\n * @see https://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.35.1\n */\n\n/**\n * Converts a URLType node (5.3.9.2.3 Table 13) to a segment object\n * that conforms to how m3u8-parser is structured\n *\n * @see https://github.com/videojs/m3u8-parser\n *\n * @param {string} baseUrl - baseUrl provided by <BaseUrl> nodes\n * @param {string} source - source url for segment\n * @param {string} range - optional range used for range calls,\n *   follows  RFC 2616, Clause 14.35.1\n * @return {SingleUri} full segment information transformed into a format similar\n *   to m3u8-parser\n */\n\nconst urlTypeToSegment = ({\n  baseUrl = '',\n  source = '',\n  range = '',\n  indexRange = ''\n}) => {\n  const segment = {\n    uri: source,\n    resolvedUri: resolveUrl(baseUrl || '', source)\n  };\n\n  if (range || indexRange) {\n    const rangeStr = range ? range : indexRange;\n    const ranges = rangeStr.split('-'); // default to parsing this as a BigInt if possible\n\n    let startRange = window.BigInt ? window.BigInt(ranges[0]) : parseInt(ranges[0], 10);\n    let endRange = window.BigInt ? window.BigInt(ranges[1]) : parseInt(ranges[1], 10); // convert back to a number if less than MAX_SAFE_INTEGER\n\n    if (startRange < Number.MAX_SAFE_INTEGER && typeof startRange === 'bigint') {\n      startRange = Number(startRange);\n    }\n\n    if (endRange < Number.MAX_SAFE_INTEGER && typeof endRange === 'bigint') {\n      endRange = Number(endRange);\n    }\n\n    let length;\n\n    if (typeof endRange === 'bigint' || typeof startRange === 'bigint') {\n      length = window.BigInt(endRange) - window.BigInt(startRange) + window.BigInt(1);\n    } else {\n      length = endRange - startRange + 1;\n    }\n\n    if (typeof length === 'bigint' && length < Number.MAX_SAFE_INTEGER) {\n      length = Number(length);\n    } // byterange should be inclusive according to\n    // RFC 2616, Clause 14.35.1\n\n\n    segment.byterange = {\n      length,\n      offset: startRange\n    };\n  }\n\n  return segment;\n};\nconst byteRangeToString = byterange => {\n  // `endRange` is one less than `offset + length` because the HTTP range\n  // header uses inclusive ranges\n  let endRange;\n\n  if (typeof byterange.offset === 'bigint' || typeof byterange.length === 'bigint') {\n    endRange = window.BigInt(byterange.offset) + window.BigInt(byterange.length) - window.BigInt(1);\n  } else {\n    endRange = byterange.offset + byterange.length - 1;\n  }\n\n  return `${byterange.offset}-${endRange}`;\n};\n\n/**\n * parse the end number attribue that can be a string\n * number, or undefined.\n *\n * @param {string|number|undefined} endNumber\n *        The end number attribute.\n *\n * @return {number|null}\n *          The result of parsing the end number.\n */\n\nconst parseEndNumber = endNumber => {\n  if (endNumber && typeof endNumber !== 'number') {\n    endNumber = parseInt(endNumber, 10);\n  }\n\n  if (isNaN(endNumber)) {\n    return null;\n  }\n\n  return endNumber;\n};\n/**\n * Functions for calculating the range of available segments in static and dynamic\n * manifests.\n */\n\n\nconst segmentRange = {\n  /**\n   * Returns the entire range of available segments for a static MPD\n   *\n   * @param {Object} attributes\n   *        Inheritied MPD attributes\n   * @return {{ start: number, end: number }}\n   *         The start and end numbers for available segments\n   */\n  static(attributes) {\n    const {\n      duration,\n      timescale = 1,\n      sourceDuration,\n      periodDuration\n    } = attributes;\n    const endNumber = parseEndNumber(attributes.endNumber);\n    const segmentDuration = duration / timescale;\n\n    if (typeof endNumber === 'number') {\n      return {\n        start: 0,\n        end: endNumber\n      };\n    }\n\n    if (typeof periodDuration === 'number') {\n      return {\n        start: 0,\n        end: periodDuration / segmentDuration\n      };\n    }\n\n    return {\n      start: 0,\n      end: sourceDuration / segmentDuration\n    };\n  },\n\n  /**\n   * Returns the current live window range of available segments for a dynamic MPD\n   *\n   * @param {Object} attributes\n   *        Inheritied MPD attributes\n   * @return {{ start: number, end: number }}\n   *         The start and end numbers for available segments\n   */\n  dynamic(attributes) {\n    const {\n      NOW,\n      clientOffset,\n      availabilityStartTime,\n      timescale = 1,\n      duration,\n      periodStart = 0,\n      minimumUpdatePeriod = 0,\n      timeShiftBufferDepth = Infinity\n    } = attributes;\n    const endNumber = parseEndNumber(attributes.endNumber); // clientOffset is passed in at the top level of mpd-parser and is an offset calculated\n    // after retrieving UTC server time.\n\n    const now = (NOW + clientOffset) / 1000; // WC stands for Wall Clock.\n    // Convert the period start time to EPOCH.\n\n    const periodStartWC = availabilityStartTime + periodStart; // Period end in EPOCH is manifest's retrieval time + time until next update.\n\n    const periodEndWC = now + minimumUpdatePeriod;\n    const periodDuration = periodEndWC - periodStartWC;\n    const segmentCount = Math.ceil(periodDuration * timescale / duration);\n    const availableStart = Math.floor((now - periodStartWC - timeShiftBufferDepth) * timescale / duration);\n    const availableEnd = Math.floor((now - periodStartWC) * timescale / duration);\n    return {\n      start: Math.max(0, availableStart),\n      end: typeof endNumber === 'number' ? endNumber : Math.min(segmentCount, availableEnd)\n    };\n  }\n\n};\n/**\n * Maps a range of numbers to objects with information needed to build the corresponding\n * segment list\n *\n * @name toSegmentsCallback\n * @function\n * @param {number} number\n *        Number of the segment\n * @param {number} index\n *        Index of the number in the range list\n * @return {{ number: Number, duration: Number, timeline: Number, time: Number }}\n *         Object with segment timing and duration info\n */\n\n/**\n * Returns a callback for Array.prototype.map for mapping a range of numbers to\n * information needed to build the segment list.\n *\n * @param {Object} attributes\n *        Inherited MPD attributes\n * @return {toSegmentsCallback}\n *         Callback map function\n */\n\nconst toSegments = attributes => number => {\n  const {\n    duration,\n    timescale = 1,\n    periodStart,\n    startNumber = 1\n  } = attributes;\n  return {\n    number: startNumber + number,\n    duration: duration / timescale,\n    timeline: periodStart,\n    time: number * duration\n  };\n};\n/**\n * Returns a list of objects containing segment timing and duration info used for\n * building the list of segments. This uses the @duration attribute specified\n * in the MPD manifest to derive the range of segments.\n *\n * @param {Object} attributes\n *        Inherited MPD attributes\n * @return {{number: number, duration: number, time: number, timeline: number}[]}\n *         List of Objects with segment timing and duration info\n */\n\nconst parseByDuration = attributes => {\n  const {\n    type,\n    duration,\n    timescale = 1,\n    periodDuration,\n    sourceDuration\n  } = attributes;\n  const {\n    start,\n    end\n  } = segmentRange[type](attributes);\n  const segments = range(start, end).map(toSegments(attributes));\n\n  if (type === 'static') {\n    const index = segments.length - 1; // section is either a period or the full source\n\n    const sectionDuration = typeof periodDuration === 'number' ? periodDuration : sourceDuration; // final segment may be less than full segment duration\n\n    segments[index].duration = sectionDuration - duration / timescale * index;\n  }\n\n  return segments;\n};\n\n/**\n * Translates SegmentBase into a set of segments.\n * (DASH SPEC Section 5.3.9.3.2) contains a set of <SegmentURL> nodes.  Each\n * node should be translated into segment.\n *\n * @param {Object} attributes\n *   Object containing all inherited attributes from parent elements with attribute\n *   names as keys\n * @return {Object.<Array>} list of segments\n */\n\nconst segmentsFromBase = attributes => {\n  const {\n    baseUrl,\n    initialization = {},\n    sourceDuration,\n    indexRange = '',\n    periodStart,\n    presentationTime,\n    number = 0,\n    duration\n  } = attributes; // base url is required for SegmentBase to work, per spec (Section 5.3.9.2.1)\n\n  if (!baseUrl) {\n    throw new Error(errors.NO_BASE_URL);\n  }\n\n  const initSegment = urlTypeToSegment({\n    baseUrl,\n    source: initialization.sourceURL,\n    range: initialization.range\n  });\n  const segment = urlTypeToSegment({\n    baseUrl,\n    source: baseUrl,\n    indexRange\n  });\n  segment.map = initSegment; // If there is a duration, use it, otherwise use the given duration of the source\n  // (since SegmentBase is only for one total segment)\n\n  if (duration) {\n    const segmentTimeInfo = parseByDuration(attributes);\n\n    if (segmentTimeInfo.length) {\n      segment.duration = segmentTimeInfo[0].duration;\n      segment.timeline = segmentTimeInfo[0].timeline;\n    }\n  } else if (sourceDuration) {\n    segment.duration = sourceDuration;\n    segment.timeline = periodStart;\n  } // If presentation time is provided, these segments are being generated by SIDX\n  // references, and should use the time provided. For the general case of SegmentBase,\n  // there should only be one segment in the period, so its presentation time is the same\n  // as its period start.\n\n\n  segment.presentationTime = presentationTime || periodStart;\n  segment.number = number;\n  return [segment];\n};\n/**\n * Given a playlist, a sidx box, and a baseUrl, update the segment list of the playlist\n * according to the sidx information given.\n *\n * playlist.sidx has metadadata about the sidx where-as the sidx param\n * is the parsed sidx box itself.\n *\n * @param {Object} playlist the playlist to update the sidx information for\n * @param {Object} sidx the parsed sidx box\n * @return {Object} the playlist object with the updated sidx information\n */\n\nconst addSidxSegmentsToPlaylist$1 = (playlist, sidx, baseUrl) => {\n  // Retain init segment information\n  const initSegment = playlist.sidx.map ? playlist.sidx.map : null; // Retain source duration from initial main manifest parsing\n\n  const sourceDuration = playlist.sidx.duration; // Retain source timeline\n\n  const timeline = playlist.timeline || 0;\n  const sidxByteRange = playlist.sidx.byterange;\n  const sidxEnd = sidxByteRange.offset + sidxByteRange.length; // Retain timescale of the parsed sidx\n\n  const timescale = sidx.timescale; // referenceType 1 refers to other sidx boxes\n\n  const mediaReferences = sidx.references.filter(r => r.referenceType !== 1);\n  const segments = [];\n  const type = playlist.endList ? 'static' : 'dynamic';\n  const periodStart = playlist.sidx.timeline;\n  let presentationTime = periodStart;\n  let number = playlist.mediaSequence || 0; // firstOffset is the offset from the end of the sidx box\n\n  let startIndex; // eslint-disable-next-line\n\n  if (typeof sidx.firstOffset === 'bigint') {\n    startIndex = window.BigInt(sidxEnd) + sidx.firstOffset;\n  } else {\n    startIndex = sidxEnd + sidx.firstOffset;\n  }\n\n  for (let i = 0; i < mediaReferences.length; i++) {\n    const reference = sidx.references[i]; // size of the referenced (sub)segment\n\n    const size = reference.referencedSize; // duration of the referenced (sub)segment, in  the  timescale\n    // this will be converted to seconds when generating segments\n\n    const duration = reference.subsegmentDuration; // should be an inclusive range\n\n    let endIndex; // eslint-disable-next-line\n\n    if (typeof startIndex === 'bigint') {\n      endIndex = startIndex + window.BigInt(size) - window.BigInt(1);\n    } else {\n      endIndex = startIndex + size - 1;\n    }\n\n    const indexRange = `${startIndex}-${endIndex}`;\n    const attributes = {\n      baseUrl,\n      timescale,\n      timeline,\n      periodStart,\n      presentationTime,\n      number,\n      duration,\n      sourceDuration,\n      indexRange,\n      type\n    };\n    const segment = segmentsFromBase(attributes)[0];\n\n    if (initSegment) {\n      segment.map = initSegment;\n    }\n\n    segments.push(segment);\n\n    if (typeof startIndex === 'bigint') {\n      startIndex += window.BigInt(size);\n    } else {\n      startIndex += size;\n    }\n\n    presentationTime += duration / timescale;\n    number++;\n  }\n\n  playlist.segments = segments;\n  return playlist;\n};\n\nconst SUPPORTED_MEDIA_TYPES = ['AUDIO', 'SUBTITLES']; // allow one 60fps frame as leniency (arbitrarily chosen)\n\nconst TIME_FUDGE = 1 / 60;\n/**\n * Given a list of timelineStarts, combines, dedupes, and sorts them.\n *\n * @param {TimelineStart[]} timelineStarts - list of timeline starts\n *\n * @return {TimelineStart[]} the combined and deduped timeline starts\n */\n\nconst getUniqueTimelineStarts = timelineStarts => {\n  return union(timelineStarts, ({\n    timeline\n  }) => timeline).sort((a, b) => a.timeline > b.timeline ? 1 : -1);\n};\n/**\n * Finds the playlist with the matching NAME attribute.\n *\n * @param {Array} playlists - playlists to search through\n * @param {string} name - the NAME attribute to search for\n *\n * @return {Object|null} the matching playlist object, or null\n */\n\nconst findPlaylistWithName = (playlists, name) => {\n  for (let i = 0; i < playlists.length; i++) {\n    if (playlists[i].attributes.NAME === name) {\n      return playlists[i];\n    }\n  }\n\n  return null;\n};\n/**\n * Gets a flattened array of media group playlists.\n *\n * @param {Object} manifest - the main manifest object\n *\n * @return {Array} the media group playlists\n */\n\nconst getMediaGroupPlaylists = manifest => {\n  let mediaGroupPlaylists = [];\n  forEachMediaGroup(manifest, SUPPORTED_MEDIA_TYPES, (properties, type, group, label) => {\n    mediaGroupPlaylists = mediaGroupPlaylists.concat(properties.playlists || []);\n  });\n  return mediaGroupPlaylists;\n};\n/**\n * Updates the playlist's media sequence numbers.\n *\n * @param {Object} config - options object\n * @param {Object} config.playlist - the playlist to update\n * @param {number} config.mediaSequence - the mediaSequence number to start with\n */\n\nconst updateMediaSequenceForPlaylist = ({\n  playlist,\n  mediaSequence\n}) => {\n  playlist.mediaSequence = mediaSequence;\n  playlist.segments.forEach((segment, index) => {\n    segment.number = playlist.mediaSequence + index;\n  });\n};\n/**\n * Updates the media and discontinuity sequence numbers of newPlaylists given oldPlaylists\n * and a complete list of timeline starts.\n *\n * If no matching playlist is found, only the discontinuity sequence number of the playlist\n * will be updated.\n *\n * Since early available timelines are not supported, at least one segment must be present.\n *\n * @param {Object} config - options object\n * @param {Object[]} oldPlaylists - the old playlists to use as a reference\n * @param {Object[]} newPlaylists - the new playlists to update\n * @param {Object} timelineStarts - all timelineStarts seen in the stream to this point\n */\n\nconst updateSequenceNumbers = ({\n  oldPlaylists,\n  newPlaylists,\n  timelineStarts\n}) => {\n  newPlaylists.forEach(playlist => {\n    playlist.discontinuitySequence = timelineStarts.findIndex(function ({\n      timeline\n    }) {\n      return timeline === playlist.timeline;\n    }); // Playlists NAMEs come from DASH Representation IDs, which are mandatory\n    // (see ISO_23009-1-2012 5.3.5.2).\n    //\n    // If the same Representation existed in a prior Period, it will retain the same NAME.\n\n    const oldPlaylist = findPlaylistWithName(oldPlaylists, playlist.attributes.NAME);\n\n    if (!oldPlaylist) {\n      // Since this is a new playlist, the media sequence values can start from 0 without\n      // consequence.\n      return;\n    } // TODO better support for live SIDX\n    //\n    // As of this writing, mpd-parser does not support multiperiod SIDX (in live or VOD).\n    // This is evident by a playlist only having a single SIDX reference. In a multiperiod\n    // playlist there would need to be multiple SIDX references. In addition, live SIDX is\n    // not supported when the SIDX properties change on refreshes.\n    //\n    // In the future, if support needs to be added, the merging logic here can be called\n    // after SIDX references are resolved. For now, exit early to prevent exceptions being\n    // thrown due to undefined references.\n\n\n    if (playlist.sidx) {\n      return;\n    } // Since we don't yet support early available timelines, we don't need to support\n    // playlists with no segments.\n\n\n    const firstNewSegment = playlist.segments[0];\n    const oldMatchingSegmentIndex = oldPlaylist.segments.findIndex(function (oldSegment) {\n      return Math.abs(oldSegment.presentationTime - firstNewSegment.presentationTime) < TIME_FUDGE;\n    }); // No matching segment from the old playlist means the entire playlist was refreshed.\n    // In this case the media sequence should account for this update, and the new segments\n    // should be marked as discontinuous from the prior content, since the last prior\n    // timeline was removed.\n\n    if (oldMatchingSegmentIndex === -1) {\n      updateMediaSequenceForPlaylist({\n        playlist,\n        mediaSequence: oldPlaylist.mediaSequence + oldPlaylist.segments.length\n      });\n      playlist.segments[0].discontinuity = true;\n      playlist.discontinuityStarts.unshift(0); // No matching segment does not necessarily mean there's missing content.\n      //\n      // If the new playlist's timeline is the same as the last seen segment's timeline,\n      // then a discontinuity can be added to identify that there's potentially missing\n      // content. If there's no missing content, the discontinuity should still be rather\n      // harmless. It's possible that if segment durations are accurate enough, that the\n      // existence of a gap can be determined using the presentation times and durations,\n      // but if the segment timing info is off, it may introduce more problems than simply\n      // adding the discontinuity.\n      //\n      // If the new playlist's timeline is different from the last seen segment's timeline,\n      // then a discontinuity can be added to identify that this is the first seen segment\n      // of a new timeline. However, the logic at the start of this function that\n      // determined the disconinuity sequence by timeline index is now off by one (the\n      // discontinuity of the newest timeline hasn't yet fallen off the manifest...since\n      // we added it), so the disconinuity sequence must be decremented.\n      //\n      // A period may also have a duration of zero, so the case of no segments is handled\n      // here even though we don't yet support early available periods.\n\n      if (!oldPlaylist.segments.length && playlist.timeline > oldPlaylist.timeline || oldPlaylist.segments.length && playlist.timeline > oldPlaylist.segments[oldPlaylist.segments.length - 1].timeline) {\n        playlist.discontinuitySequence--;\n      }\n\n      return;\n    } // If the first segment matched with a prior segment on a discontinuity (it's matching\n    // on the first segment of a period), then the discontinuitySequence shouldn't be the\n    // timeline's matching one, but instead should be the one prior, and the first segment\n    // of the new manifest should be marked with a discontinuity.\n    //\n    // The reason for this special case is that discontinuity sequence shows how many\n    // discontinuities have fallen off of the playlist, and discontinuities are marked on\n    // the first segment of a new \"timeline.\" Because of this, while DASH will retain that\n    // Period while the \"timeline\" exists, HLS keeps track of it via the discontinuity\n    // sequence, and that first segment is an indicator, but can be removed before that\n    // timeline is gone.\n\n\n    const oldMatchingSegment = oldPlaylist.segments[oldMatchingSegmentIndex];\n\n    if (oldMatchingSegment.discontinuity && !firstNewSegment.discontinuity) {\n      firstNewSegment.discontinuity = true;\n      playlist.discontinuityStarts.unshift(0);\n      playlist.discontinuitySequence--;\n    }\n\n    updateMediaSequenceForPlaylist({\n      playlist,\n      mediaSequence: oldPlaylist.segments[oldMatchingSegmentIndex].number\n    });\n  });\n};\n/**\n * Given an old parsed manifest object and a new parsed manifest object, updates the\n * sequence and timing values within the new manifest to ensure that it lines up with the\n * old.\n *\n * @param {Array} oldManifest - the old main manifest object\n * @param {Array} newManifest - the new main manifest object\n *\n * @return {Object} the updated new manifest object\n */\n\nconst positionManifestOnTimeline = ({\n  oldManifest,\n  newManifest\n}) => {\n  // Starting from v4.1.2 of the IOP, section 4.4.3.3 states:\n  //\n  // \"MPD@availabilityStartTime and Period@start shall not be changed over MPD updates.\"\n  //\n  // This was added from https://github.com/Dash-Industry-Forum/DASH-IF-IOP/issues/160\n  //\n  // Because of this change, and the difficulty of supporting periods with changing start\n  // times, periods with changing start times are not supported. This makes the logic much\n  // simpler, since periods with the same start time can be considerred the same period\n  // across refreshes.\n  //\n  // To give an example as to the difficulty of handling periods where the start time may\n  // change, if a single period manifest is refreshed with another manifest with a single\n  // period, and both the start and end times are increased, then the only way to determine\n  // if it's a new period or an old one that has changed is to look through the segments of\n  // each playlist and determine the presentation time bounds to find a match. In addition,\n  // if the period start changed to exceed the old period end, then there would be no\n  // match, and it would not be possible to determine whether the refreshed period is a new\n  // one or the old one.\n  const oldPlaylists = oldManifest.playlists.concat(getMediaGroupPlaylists(oldManifest));\n  const newPlaylists = newManifest.playlists.concat(getMediaGroupPlaylists(newManifest)); // Save all seen timelineStarts to the new manifest. Although this potentially means that\n  // there's a \"memory leak\" in that it will never stop growing, in reality, only a couple\n  // of properties are saved for each seen Period. Even long running live streams won't\n  // generate too many Periods, unless the stream is watched for decades. In the future,\n  // this can be optimized by mapping to discontinuity sequence numbers for each timeline,\n  // but it may not become an issue, and the additional info can be useful for debugging.\n\n  newManifest.timelineStarts = getUniqueTimelineStarts([oldManifest.timelineStarts, newManifest.timelineStarts]);\n  updateSequenceNumbers({\n    oldPlaylists,\n    newPlaylists,\n    timelineStarts: newManifest.timelineStarts\n  });\n  return newManifest;\n};\n\nconst generateSidxKey = sidx => sidx && sidx.uri + '-' + byteRangeToString(sidx.byterange);\n\nconst mergeDiscontiguousPlaylists = playlists => {\n  // Break out playlists into groups based on their baseUrl\n  const playlistsByBaseUrl = playlists.reduce(function (acc, cur) {\n    if (!acc[cur.attributes.baseUrl]) {\n      acc[cur.attributes.baseUrl] = [];\n    }\n\n    acc[cur.attributes.baseUrl].push(cur);\n    return acc;\n  }, {});\n  let allPlaylists = [];\n  Object.values(playlistsByBaseUrl).forEach(playlistGroup => {\n    const mergedPlaylists = values(playlistGroup.reduce((acc, playlist) => {\n      // assuming playlist IDs are the same across periods\n      // TODO: handle multiperiod where representation sets are not the same\n      // across periods\n      const name = playlist.attributes.id + (playlist.attributes.lang || '');\n\n      if (!acc[name]) {\n        // First Period\n        acc[name] = playlist;\n        acc[name].attributes.timelineStarts = [];\n      } else {\n        // Subsequent Periods\n        if (playlist.segments) {\n          // first segment of subsequent periods signal a discontinuity\n          if (playlist.segments[0]) {\n            playlist.segments[0].discontinuity = true;\n          }\n\n          acc[name].segments.push(...playlist.segments);\n        } // bubble up contentProtection, this assumes all DRM content\n        // has the same contentProtection\n\n\n        if (playlist.attributes.contentProtection) {\n          acc[name].attributes.contentProtection = playlist.attributes.contentProtection;\n        }\n      }\n\n      acc[name].attributes.timelineStarts.push({\n        // Although they represent the same number, it's important to have both to make it\n        // compatible with HLS potentially having a similar attribute.\n        start: playlist.attributes.periodStart,\n        timeline: playlist.attributes.periodStart\n      });\n      return acc;\n    }, {}));\n    allPlaylists = allPlaylists.concat(mergedPlaylists);\n  });\n  return allPlaylists.map(playlist => {\n    playlist.discontinuityStarts = findIndexes(playlist.segments || [], 'discontinuity');\n    return playlist;\n  });\n};\n\nconst addSidxSegmentsToPlaylist = (playlist, sidxMapping) => {\n  const sidxKey = generateSidxKey(playlist.sidx);\n  const sidxMatch = sidxKey && sidxMapping[sidxKey] && sidxMapping[sidxKey].sidx;\n\n  if (sidxMatch) {\n    addSidxSegmentsToPlaylist$1(playlist, sidxMatch, playlist.sidx.resolvedUri);\n  }\n\n  return playlist;\n};\nconst addSidxSegmentsToPlaylists = (playlists, sidxMapping = {}) => {\n  if (!Object.keys(sidxMapping).length) {\n    return playlists;\n  }\n\n  for (const i in playlists) {\n    playlists[i] = addSidxSegmentsToPlaylist(playlists[i], sidxMapping);\n  }\n\n  return playlists;\n};\nconst formatAudioPlaylist = ({\n  attributes,\n  segments,\n  sidx,\n  mediaSequence,\n  discontinuitySequence,\n  discontinuityStarts\n}, isAudioOnly) => {\n  const playlist = {\n    attributes: {\n      NAME: attributes.id,\n      BANDWIDTH: attributes.bandwidth,\n      CODECS: attributes.codecs,\n      ['PROGRAM-ID']: 1\n    },\n    uri: '',\n    endList: attributes.type === 'static',\n    timeline: attributes.periodStart,\n    resolvedUri: attributes.baseUrl || '',\n    targetDuration: attributes.duration,\n    discontinuitySequence,\n    discontinuityStarts,\n    timelineStarts: attributes.timelineStarts,\n    mediaSequence,\n    segments\n  };\n\n  if (attributes.contentProtection) {\n    playlist.contentProtection = attributes.contentProtection;\n  }\n\n  if (attributes.serviceLocation) {\n    playlist.attributes.serviceLocation = attributes.serviceLocation;\n  }\n\n  if (sidx) {\n    playlist.sidx = sidx;\n  }\n\n  if (isAudioOnly) {\n    playlist.attributes.AUDIO = 'audio';\n    playlist.attributes.SUBTITLES = 'subs';\n  }\n\n  return playlist;\n};\nconst formatVttPlaylist = ({\n  attributes,\n  segments,\n  mediaSequence,\n  discontinuityStarts,\n  discontinuitySequence\n}) => {\n  if (typeof segments === 'undefined') {\n    // vtt tracks may use single file in BaseURL\n    segments = [{\n      uri: attributes.baseUrl,\n      timeline: attributes.periodStart,\n      resolvedUri: attributes.baseUrl || '',\n      duration: attributes.sourceDuration,\n      number: 0\n    }]; // targetDuration should be the same duration as the only segment\n\n    attributes.duration = attributes.sourceDuration;\n  }\n\n  const m3u8Attributes = {\n    NAME: attributes.id,\n    BANDWIDTH: attributes.bandwidth,\n    ['PROGRAM-ID']: 1\n  };\n\n  if (attributes.codecs) {\n    m3u8Attributes.CODECS = attributes.codecs;\n  }\n\n  const vttPlaylist = {\n    attributes: m3u8Attributes,\n    uri: '',\n    endList: attributes.type === 'static',\n    timeline: attributes.periodStart,\n    resolvedUri: attributes.baseUrl || '',\n    targetDuration: attributes.duration,\n    timelineStarts: attributes.timelineStarts,\n    discontinuityStarts,\n    discontinuitySequence,\n    mediaSequence,\n    segments\n  };\n\n  if (attributes.serviceLocation) {\n    vttPlaylist.attributes.serviceLocation = attributes.serviceLocation;\n  }\n\n  return vttPlaylist;\n};\nconst organizeAudioPlaylists = (playlists, sidxMapping = {}, isAudioOnly = false) => {\n  let mainPlaylist;\n  const formattedPlaylists = playlists.reduce((a, playlist) => {\n    const role = playlist.attributes.role && playlist.attributes.role.value || '';\n    const language = playlist.attributes.lang || '';\n    let label = playlist.attributes.label || 'main';\n\n    if (language && !playlist.attributes.label) {\n      const roleLabel = role ? ` (${role})` : '';\n      label = `${playlist.attributes.lang}${roleLabel}`;\n    }\n\n    if (!a[label]) {\n      a[label] = {\n        language,\n        autoselect: true,\n        default: role === 'main',\n        playlists: [],\n        uri: ''\n      };\n    }\n\n    const formatted = addSidxSegmentsToPlaylist(formatAudioPlaylist(playlist, isAudioOnly), sidxMapping);\n    a[label].playlists.push(formatted);\n\n    if (typeof mainPlaylist === 'undefined' && role === 'main') {\n      mainPlaylist = playlist;\n      mainPlaylist.default = true;\n    }\n\n    return a;\n  }, {}); // if no playlists have role \"main\", mark the first as main\n\n  if (!mainPlaylist) {\n    const firstLabel = Object.keys(formattedPlaylists)[0];\n    formattedPlaylists[firstLabel].default = true;\n  }\n\n  return formattedPlaylists;\n};\nconst organizeVttPlaylists = (playlists, sidxMapping = {}) => {\n  return playlists.reduce((a, playlist) => {\n    const label = playlist.attributes.label || playlist.attributes.lang || 'text';\n    const language = playlist.attributes.lang || 'und';\n\n    if (!a[label]) {\n      a[label] = {\n        language,\n        default: false,\n        autoselect: false,\n        playlists: [],\n        uri: ''\n      };\n    }\n\n    a[label].playlists.push(addSidxSegmentsToPlaylist(formatVttPlaylist(playlist), sidxMapping));\n    return a;\n  }, {});\n};\n\nconst organizeCaptionServices = captionServices => captionServices.reduce((svcObj, svc) => {\n  if (!svc) {\n    return svcObj;\n  }\n\n  svc.forEach(service => {\n    const {\n      channel,\n      language\n    } = service;\n    svcObj[language] = {\n      autoselect: false,\n      default: false,\n      instreamId: channel,\n      language\n    };\n\n    if (service.hasOwnProperty('aspectRatio')) {\n      svcObj[language].aspectRatio = service.aspectRatio;\n    }\n\n    if (service.hasOwnProperty('easyReader')) {\n      svcObj[language].easyReader = service.easyReader;\n    }\n\n    if (service.hasOwnProperty('3D')) {\n      svcObj[language]['3D'] = service['3D'];\n    }\n  });\n  return svcObj;\n}, {});\n\nconst formatVideoPlaylist = ({\n  attributes,\n  segments,\n  sidx,\n  discontinuityStarts\n}) => {\n  const playlist = {\n    attributes: {\n      NAME: attributes.id,\n      AUDIO: 'audio',\n      SUBTITLES: 'subs',\n      RESOLUTION: {\n        width: attributes.width,\n        height: attributes.height\n      },\n      CODECS: attributes.codecs,\n      BANDWIDTH: attributes.bandwidth,\n      ['PROGRAM-ID']: 1\n    },\n    uri: '',\n    endList: attributes.type === 'static',\n    timeline: attributes.periodStart,\n    resolvedUri: attributes.baseUrl || '',\n    targetDuration: attributes.duration,\n    discontinuityStarts,\n    timelineStarts: attributes.timelineStarts,\n    segments\n  };\n\n  if (attributes.frameRate) {\n    playlist.attributes['FRAME-RATE'] = attributes.frameRate;\n  }\n\n  if (attributes.contentProtection) {\n    playlist.contentProtection = attributes.contentProtection;\n  }\n\n  if (attributes.serviceLocation) {\n    playlist.attributes.serviceLocation = attributes.serviceLocation;\n  }\n\n  if (sidx) {\n    playlist.sidx = sidx;\n  }\n\n  return playlist;\n};\n\nconst videoOnly = ({\n  attributes\n}) => attributes.mimeType === 'video/mp4' || attributes.mimeType === 'video/webm' || attributes.contentType === 'video';\n\nconst audioOnly = ({\n  attributes\n}) => attributes.mimeType === 'audio/mp4' || attributes.mimeType === 'audio/webm' || attributes.contentType === 'audio';\n\nconst vttOnly = ({\n  attributes\n}) => attributes.mimeType === 'text/vtt' || attributes.contentType === 'text';\n/**\n * Contains start and timeline properties denoting a timeline start. For DASH, these will\n * be the same number.\n *\n * @typedef {Object} TimelineStart\n * @property {number} start - the start time of the timeline\n * @property {number} timeline - the timeline number\n */\n\n/**\n * Adds appropriate media and discontinuity sequence values to the segments and playlists.\n *\n * Throughout mpd-parser, the `number` attribute is used in relation to `startNumber`, a\n * DASH specific attribute used in constructing segment URI's from templates. However, from\n * an HLS perspective, the `number` attribute on a segment would be its `mediaSequence`\n * value, which should start at the original media sequence value (or 0) and increment by 1\n * for each segment thereafter. Since DASH's `startNumber` values are independent per\n * period, it doesn't make sense to use it for `number`. Instead, assume everything starts\n * from a 0 mediaSequence value and increment from there.\n *\n * Note that VHS currently doesn't use the `number` property, but it can be helpful for\n * debugging and making sense of the manifest.\n *\n * For live playlists, to account for values increasing in manifests when periods are\n * removed on refreshes, merging logic should be used to update the numbers to their\n * appropriate values (to ensure they're sequential and increasing).\n *\n * @param {Object[]} playlists - the playlists to update\n * @param {TimelineStart[]} timelineStarts - the timeline starts for the manifest\n */\n\n\nconst addMediaSequenceValues = (playlists, timelineStarts) => {\n  // increment all segments sequentially\n  playlists.forEach(playlist => {\n    playlist.mediaSequence = 0;\n    playlist.discontinuitySequence = timelineStarts.findIndex(function ({\n      timeline\n    }) {\n      return timeline === playlist.timeline;\n    });\n\n    if (!playlist.segments) {\n      return;\n    }\n\n    playlist.segments.forEach((segment, index) => {\n      segment.number = index;\n    });\n  });\n};\n/**\n * Given a media group object, flattens all playlists within the media group into a single\n * array.\n *\n * @param {Object} mediaGroupObject - the media group object\n *\n * @return {Object[]}\n *         The media group playlists\n */\n\nconst flattenMediaGroupPlaylists = mediaGroupObject => {\n  if (!mediaGroupObject) {\n    return [];\n  }\n\n  return Object.keys(mediaGroupObject).reduce((acc, label) => {\n    const labelContents = mediaGroupObject[label];\n    return acc.concat(labelContents.playlists);\n  }, []);\n};\nconst toM3u8 = ({\n  dashPlaylists,\n  locations,\n  contentSteering,\n  sidxMapping = {},\n  previousManifest,\n  eventStream\n}) => {\n  if (!dashPlaylists.length) {\n    return {};\n  } // grab all main manifest attributes\n\n\n  const {\n    sourceDuration: duration,\n    type,\n    suggestedPresentationDelay,\n    minimumUpdatePeriod\n  } = dashPlaylists[0].attributes;\n  const videoPlaylists = mergeDiscontiguousPlaylists(dashPlaylists.filter(videoOnly)).map(formatVideoPlaylist);\n  const audioPlaylists = mergeDiscontiguousPlaylists(dashPlaylists.filter(audioOnly));\n  const vttPlaylists = mergeDiscontiguousPlaylists(dashPlaylists.filter(vttOnly));\n  const captions = dashPlaylists.map(playlist => playlist.attributes.captionServices).filter(Boolean);\n  const manifest = {\n    allowCache: true,\n    discontinuityStarts: [],\n    segments: [],\n    endList: true,\n    mediaGroups: {\n      AUDIO: {},\n      VIDEO: {},\n      ['CLOSED-CAPTIONS']: {},\n      SUBTITLES: {}\n    },\n    uri: '',\n    duration,\n    playlists: addSidxSegmentsToPlaylists(videoPlaylists, sidxMapping)\n  };\n\n  if (minimumUpdatePeriod >= 0) {\n    manifest.minimumUpdatePeriod = minimumUpdatePeriod * 1000;\n  }\n\n  if (locations) {\n    manifest.locations = locations;\n  }\n\n  if (contentSteering) {\n    manifest.contentSteering = contentSteering;\n  }\n\n  if (type === 'dynamic') {\n    manifest.suggestedPresentationDelay = suggestedPresentationDelay;\n  }\n\n  if (eventStream && eventStream.length > 0) {\n    manifest.eventStream = eventStream;\n  }\n\n  const isAudioOnly = manifest.playlists.length === 0;\n  const organizedAudioGroup = audioPlaylists.length ? organizeAudioPlaylists(audioPlaylists, sidxMapping, isAudioOnly) : null;\n  const organizedVttGroup = vttPlaylists.length ? organizeVttPlaylists(vttPlaylists, sidxMapping) : null;\n  const formattedPlaylists = videoPlaylists.concat(flattenMediaGroupPlaylists(organizedAudioGroup), flattenMediaGroupPlaylists(organizedVttGroup));\n  const playlistTimelineStarts = formattedPlaylists.map(({\n    timelineStarts\n  }) => timelineStarts);\n  manifest.timelineStarts = getUniqueTimelineStarts(playlistTimelineStarts);\n  addMediaSequenceValues(formattedPlaylists, manifest.timelineStarts);\n\n  if (organizedAudioGroup) {\n    manifest.mediaGroups.AUDIO.audio = organizedAudioGroup;\n  }\n\n  if (organizedVttGroup) {\n    manifest.mediaGroups.SUBTITLES.subs = organizedVttGroup;\n  }\n\n  if (captions.length) {\n    manifest.mediaGroups['CLOSED-CAPTIONS'].cc = organizeCaptionServices(captions);\n  }\n\n  if (previousManifest) {\n    return positionManifestOnTimeline({\n      oldManifest: previousManifest,\n      newManifest: manifest\n    });\n  }\n\n  return manifest;\n};\n\n/**\n * Calculates the R (repetition) value for a live stream (for the final segment\n * in a manifest where the r value is negative 1)\n *\n * @param {Object} attributes\n *        Object containing all inherited attributes from parent elements with attribute\n *        names as keys\n * @param {number} time\n *        current time (typically the total time up until the final segment)\n * @param {number} duration\n *        duration property for the given <S />\n *\n * @return {number}\n *        R value to reach the end of the given period\n */\nconst getLiveRValue = (attributes, time, duration) => {\n  const {\n    NOW,\n    clientOffset,\n    availabilityStartTime,\n    timescale = 1,\n    periodStart = 0,\n    minimumUpdatePeriod = 0\n  } = attributes;\n  const now = (NOW + clientOffset) / 1000;\n  const periodStartWC = availabilityStartTime + periodStart;\n  const periodEndWC = now + minimumUpdatePeriod;\n  const periodDuration = periodEndWC - periodStartWC;\n  return Math.ceil((periodDuration * timescale - time) / duration);\n};\n/**\n * Uses information provided by SegmentTemplate.SegmentTimeline to determine segment\n * timing and duration\n *\n * @param {Object} attributes\n *        Object containing all inherited attributes from parent elements with attribute\n *        names as keys\n * @param {Object[]} segmentTimeline\n *        List of objects representing the attributes of each S element contained within\n *\n * @return {{number: number, duration: number, time: number, timeline: number}[]}\n *         List of Objects with segment timing and duration info\n */\n\n\nconst parseByTimeline = (attributes, segmentTimeline) => {\n  const {\n    type,\n    minimumUpdatePeriod = 0,\n    media = '',\n    sourceDuration,\n    timescale = 1,\n    startNumber = 1,\n    periodStart: timeline\n  } = attributes;\n  const segments = [];\n  let time = -1;\n\n  for (let sIndex = 0; sIndex < segmentTimeline.length; sIndex++) {\n    const S = segmentTimeline[sIndex];\n    const duration = S.d;\n    const repeat = S.r || 0;\n    const segmentTime = S.t || 0;\n\n    if (time < 0) {\n      // first segment\n      time = segmentTime;\n    }\n\n    if (segmentTime && segmentTime > time) {\n      // discontinuity\n      // TODO: How to handle this type of discontinuity\n      // timeline++ here would treat it like HLS discontuity and content would\n      // get appended without gap\n      // E.G.\n      //  <S t=\"0\" d=\"1\" />\n      //  <S d=\"1\" />\n      //  <S d=\"1\" />\n      //  <S t=\"5\" d=\"1\" />\n      // would have $Time$ values of [0, 1, 2, 5]\n      // should this be appened at time positions [0, 1, 2, 3],(#EXT-X-DISCONTINUITY)\n      // or [0, 1, 2, gap, gap, 5]? (#EXT-X-GAP)\n      // does the value of sourceDuration consider this when calculating arbitrary\n      // negative @r repeat value?\n      // E.G. Same elements as above with this added at the end\n      //  <S d=\"1\" r=\"-1\" />\n      //  with a sourceDuration of 10\n      // Would the 2 gaps be included in the time duration calculations resulting in\n      // 8 segments with $Time$ values of [0, 1, 2, 5, 6, 7, 8, 9] or 10 segments\n      // with $Time$ values of [0, 1, 2, 5, 6, 7, 8, 9, 10, 11] ?\n      time = segmentTime;\n    }\n\n    let count;\n\n    if (repeat < 0) {\n      const nextS = sIndex + 1;\n\n      if (nextS === segmentTimeline.length) {\n        // last segment\n        if (type === 'dynamic' && minimumUpdatePeriod > 0 && media.indexOf('$Number$') > 0) {\n          count = getLiveRValue(attributes, time, duration);\n        } else {\n          // TODO: This may be incorrect depending on conclusion of TODO above\n          count = (sourceDuration * timescale - time) / duration;\n        }\n      } else {\n        count = (segmentTimeline[nextS].t - time) / duration;\n      }\n    } else {\n      count = repeat + 1;\n    }\n\n    const end = startNumber + segments.length + count;\n    let number = startNumber + segments.length;\n\n    while (number < end) {\n      segments.push({\n        number,\n        duration: duration / timescale,\n        time,\n        timeline\n      });\n      time += duration;\n      number++;\n    }\n  }\n\n  return segments;\n};\n\nconst identifierPattern = /\\$([A-z]*)(?:(%0)([0-9]+)d)?\\$/g;\n/**\n * Replaces template identifiers with corresponding values. To be used as the callback\n * for String.prototype.replace\n *\n * @name replaceCallback\n * @function\n * @param {string} match\n *        Entire match of identifier\n * @param {string} identifier\n *        Name of matched identifier\n * @param {string} format\n *        Format tag string. Its presence indicates that padding is expected\n * @param {string} width\n *        Desired length of the replaced value. Values less than this width shall be left\n *        zero padded\n * @return {string}\n *         Replacement for the matched identifier\n */\n\n/**\n * Returns a function to be used as a callback for String.prototype.replace to replace\n * template identifiers\n *\n * @param {Obect} values\n *        Object containing values that shall be used to replace known identifiers\n * @param {number} values.RepresentationID\n *        Value of the Representation@id attribute\n * @param {number} values.Number\n *        Number of the corresponding segment\n * @param {number} values.Bandwidth\n *        Value of the Representation@bandwidth attribute.\n * @param {number} values.Time\n *        Timestamp value of the corresponding segment\n * @return {replaceCallback}\n *         Callback to be used with String.prototype.replace to replace identifiers\n */\n\nconst identifierReplacement = values => (match, identifier, format, width) => {\n  if (match === '$$') {\n    // escape sequence\n    return '$';\n  }\n\n  if (typeof values[identifier] === 'undefined') {\n    return match;\n  }\n\n  const value = '' + values[identifier];\n\n  if (identifier === 'RepresentationID') {\n    // Format tag shall not be present with RepresentationID\n    return value;\n  }\n\n  if (!format) {\n    width = 1;\n  } else {\n    width = parseInt(width, 10);\n  }\n\n  if (value.length >= width) {\n    return value;\n  }\n\n  return `${new Array(width - value.length + 1).join('0')}${value}`;\n};\n/**\n * Constructs a segment url from a template string\n *\n * @param {string} url\n *        Template string to construct url from\n * @param {Obect} values\n *        Object containing values that shall be used to replace known identifiers\n * @param {number} values.RepresentationID\n *        Value of the Representation@id attribute\n * @param {number} values.Number\n *        Number of the corresponding segment\n * @param {number} values.Bandwidth\n *        Value of the Representation@bandwidth attribute.\n * @param {number} values.Time\n *        Timestamp value of the corresponding segment\n * @return {string}\n *         Segment url with identifiers replaced\n */\n\nconst constructTemplateUrl = (url, values) => url.replace(identifierPattern, identifierReplacement(values));\n/**\n * Generates a list of objects containing timing and duration information about each\n * segment needed to generate segment uris and the complete segment object\n *\n * @param {Object} attributes\n *        Object containing all inherited attributes from parent elements with attribute\n *        names as keys\n * @param {Object[]|undefined} segmentTimeline\n *        List of objects representing the attributes of each S element contained within\n *        the SegmentTimeline element\n * @return {{number: number, duration: number, time: number, timeline: number}[]}\n *         List of Objects with segment timing and duration info\n */\n\nconst parseTemplateInfo = (attributes, segmentTimeline) => {\n  if (!attributes.duration && !segmentTimeline) {\n    // if neither @duration or SegmentTimeline are present, then there shall be exactly\n    // one media segment\n    return [{\n      number: attributes.startNumber || 1,\n      duration: attributes.sourceDuration,\n      time: 0,\n      timeline: attributes.periodStart\n    }];\n  }\n\n  if (attributes.duration) {\n    return parseByDuration(attributes);\n  }\n\n  return parseByTimeline(attributes, segmentTimeline);\n};\n/**\n * Generates a list of segments using information provided by the SegmentTemplate element\n *\n * @param {Object} attributes\n *        Object containing all inherited attributes from parent elements with attribute\n *        names as keys\n * @param {Object[]|undefined} segmentTimeline\n *        List of objects representing the attributes of each S element contained within\n *        the SegmentTimeline element\n * @return {Object[]}\n *         List of segment objects\n */\n\nconst segmentsFromTemplate = (attributes, segmentTimeline) => {\n  const templateValues = {\n    RepresentationID: attributes.id,\n    Bandwidth: attributes.bandwidth || 0\n  };\n  const {\n    initialization = {\n      sourceURL: '',\n      range: ''\n    }\n  } = attributes;\n  const mapSegment = urlTypeToSegment({\n    baseUrl: attributes.baseUrl,\n    source: constructTemplateUrl(initialization.sourceURL, templateValues),\n    range: initialization.range\n  });\n  const segments = parseTemplateInfo(attributes, segmentTimeline);\n  return segments.map(segment => {\n    templateValues.Number = segment.number;\n    templateValues.Time = segment.time;\n    const uri = constructTemplateUrl(attributes.media || '', templateValues); // See DASH spec section 5.3.9.2.2\n    // - if timescale isn't present on any level, default to 1.\n\n    const timescale = attributes.timescale || 1; // - if presentationTimeOffset isn't present on any level, default to 0\n\n    const presentationTimeOffset = attributes.presentationTimeOffset || 0;\n    const presentationTime = // Even if the @t attribute is not specified for the segment, segment.time is\n    // calculated in mpd-parser prior to this, so it's assumed to be available.\n    attributes.periodStart + (segment.time - presentationTimeOffset) / timescale;\n    const map = {\n      uri,\n      timeline: segment.timeline,\n      duration: segment.duration,\n      resolvedUri: resolveUrl(attributes.baseUrl || '', uri),\n      map: mapSegment,\n      number: segment.number,\n      presentationTime\n    };\n    return map;\n  });\n};\n\n/**\n * Converts a <SegmentUrl> (of type URLType from the DASH spec 5.3.9.2 Table 14)\n * to an object that matches the output of a segment in videojs/mpd-parser\n *\n * @param {Object} attributes\n *   Object containing all inherited attributes from parent elements with attribute\n *   names as keys\n * @param {Object} segmentUrl\n *   <SegmentURL> node to translate into a segment object\n * @return {Object} translated segment object\n */\n\nconst SegmentURLToSegmentObject = (attributes, segmentUrl) => {\n  const {\n    baseUrl,\n    initialization = {}\n  } = attributes;\n  const initSegment = urlTypeToSegment({\n    baseUrl,\n    source: initialization.sourceURL,\n    range: initialization.range\n  });\n  const segment = urlTypeToSegment({\n    baseUrl,\n    source: segmentUrl.media,\n    range: segmentUrl.mediaRange\n  });\n  segment.map = initSegment;\n  return segment;\n};\n/**\n * Generates a list of segments using information provided by the SegmentList element\n * SegmentList (DASH SPEC Section 5.3.9.3.2) contains a set of <SegmentURL> nodes.  Each\n * node should be translated into segment.\n *\n * @param {Object} attributes\n *   Object containing all inherited attributes from parent elements with attribute\n *   names as keys\n * @param {Object[]|undefined} segmentTimeline\n *        List of objects representing the attributes of each S element contained within\n *        the SegmentTimeline element\n * @return {Object.<Array>} list of segments\n */\n\n\nconst segmentsFromList = (attributes, segmentTimeline) => {\n  const {\n    duration,\n    segmentUrls = [],\n    periodStart\n  } = attributes; // Per spec (5.3.9.2.1) no way to determine segment duration OR\n  // if both SegmentTimeline and @duration are defined, it is outside of spec.\n\n  if (!duration && !segmentTimeline || duration && segmentTimeline) {\n    throw new Error(errors.SEGMENT_TIME_UNSPECIFIED);\n  }\n\n  const segmentUrlMap = segmentUrls.map(segmentUrlObject => SegmentURLToSegmentObject(attributes, segmentUrlObject));\n  let segmentTimeInfo;\n\n  if (duration) {\n    segmentTimeInfo = parseByDuration(attributes);\n  }\n\n  if (segmentTimeline) {\n    segmentTimeInfo = parseByTimeline(attributes, segmentTimeline);\n  }\n\n  const segments = segmentTimeInfo.map((segmentTime, index) => {\n    if (segmentUrlMap[index]) {\n      const segment = segmentUrlMap[index]; // See DASH spec section 5.3.9.2.2\n      // - if timescale isn't present on any level, default to 1.\n\n      const timescale = attributes.timescale || 1; // - if presentationTimeOffset isn't present on any level, default to 0\n\n      const presentationTimeOffset = attributes.presentationTimeOffset || 0;\n      segment.timeline = segmentTime.timeline;\n      segment.duration = segmentTime.duration;\n      segment.number = segmentTime.number;\n      segment.presentationTime = periodStart + (segmentTime.time - presentationTimeOffset) / timescale;\n      return segment;\n    } // Since we're mapping we should get rid of any blank segments (in case\n    // the given SegmentTimeline is handling for more elements than we have\n    // SegmentURLs for).\n\n  }).filter(segment => segment);\n  return segments;\n};\n\nconst generateSegments = ({\n  attributes,\n  segmentInfo\n}) => {\n  let segmentAttributes;\n  let segmentsFn;\n\n  if (segmentInfo.template) {\n    segmentsFn = segmentsFromTemplate;\n    segmentAttributes = merge(attributes, segmentInfo.template);\n  } else if (segmentInfo.base) {\n    segmentsFn = segmentsFromBase;\n    segmentAttributes = merge(attributes, segmentInfo.base);\n  } else if (segmentInfo.list) {\n    segmentsFn = segmentsFromList;\n    segmentAttributes = merge(attributes, segmentInfo.list);\n  }\n\n  const segmentsInfo = {\n    attributes\n  };\n\n  if (!segmentsFn) {\n    return segmentsInfo;\n  }\n\n  const segments = segmentsFn(segmentAttributes, segmentInfo.segmentTimeline); // The @duration attribute will be used to determin the playlist's targetDuration which\n  // must be in seconds. Since we've generated the segment list, we no longer need\n  // @duration to be in @timescale units, so we can convert it here.\n\n  if (segmentAttributes.duration) {\n    const {\n      duration,\n      timescale = 1\n    } = segmentAttributes;\n    segmentAttributes.duration = duration / timescale;\n  } else if (segments.length) {\n    // if there is no @duration attribute, use the largest segment duration as\n    // as target duration\n    segmentAttributes.duration = segments.reduce((max, segment) => {\n      return Math.max(max, Math.ceil(segment.duration));\n    }, 0);\n  } else {\n    segmentAttributes.duration = 0;\n  }\n\n  segmentsInfo.attributes = segmentAttributes;\n  segmentsInfo.segments = segments; // This is a sidx box without actual segment information\n\n  if (segmentInfo.base && segmentAttributes.indexRange) {\n    segmentsInfo.sidx = segments[0];\n    segmentsInfo.segments = [];\n  }\n\n  return segmentsInfo;\n};\nconst toPlaylists = representations => representations.map(generateSegments);\n\nconst findChildren = (element, name) => from(element.childNodes).filter(({\n  tagName\n}) => tagName === name);\nconst getContent = element => element.textContent.trim();\n\n/**\n * Converts the provided string that may contain a division operation to a number.\n *\n * @param {string} value - the provided string value\n *\n * @return {number} the parsed string value\n */\nconst parseDivisionValue = value => {\n  return parseFloat(value.split('/').reduce((prev, current) => prev / current));\n};\n\nconst parseDuration = str => {\n  const SECONDS_IN_YEAR = 365 * 24 * 60 * 60;\n  const SECONDS_IN_MONTH = 30 * 24 * 60 * 60;\n  const SECONDS_IN_DAY = 24 * 60 * 60;\n  const SECONDS_IN_HOUR = 60 * 60;\n  const SECONDS_IN_MIN = 60; // P10Y10M10DT10H10M10.1S\n\n  const durationRegex = /P(?:(\\d*)Y)?(?:(\\d*)M)?(?:(\\d*)D)?(?:T(?:(\\d*)H)?(?:(\\d*)M)?(?:([\\d.]*)S)?)?/;\n  const match = durationRegex.exec(str);\n\n  if (!match) {\n    return 0;\n  }\n\n  const [year, month, day, hour, minute, second] = match.slice(1);\n  return parseFloat(year || 0) * SECONDS_IN_YEAR + parseFloat(month || 0) * SECONDS_IN_MONTH + parseFloat(day || 0) * SECONDS_IN_DAY + parseFloat(hour || 0) * SECONDS_IN_HOUR + parseFloat(minute || 0) * SECONDS_IN_MIN + parseFloat(second || 0);\n};\nconst parseDate = str => {\n  // Date format without timezone according to ISO 8601\n  // YYY-MM-DDThh:mm:ss.ssssss\n  const dateRegex = /^\\d+-\\d+-\\d+T\\d+:\\d+:\\d+(\\.\\d+)?$/; // If the date string does not specifiy a timezone, we must specifiy UTC. This is\n  // expressed by ending with 'Z'\n\n  if (dateRegex.test(str)) {\n    str += 'Z';\n  }\n\n  return Date.parse(str);\n};\n\nconst parsers = {\n  /**\n   * Specifies the duration of the entire Media Presentation. Format is a duration string\n   * as specified in ISO 8601\n   *\n   * @param {string} value\n   *        value of attribute as a string\n   * @return {number}\n   *         The duration in seconds\n   */\n  mediaPresentationDuration(value) {\n    return parseDuration(value);\n  },\n\n  /**\n   * Specifies the Segment availability start time for all Segments referred to in this\n   * MPD. For a dynamic manifest, it specifies the anchor for the earliest availability\n   * time. Format is a date string as specified in ISO 8601\n   *\n   * @param {string} value\n   *        value of attribute as a string\n   * @return {number}\n   *         The date as seconds from unix epoch\n   */\n  availabilityStartTime(value) {\n    return parseDate(value) / 1000;\n  },\n\n  /**\n   * Specifies the smallest period between potential changes to the MPD. Format is a\n   * duration string as specified in ISO 8601\n   *\n   * @param {string} value\n   *        value of attribute as a string\n   * @return {number}\n   *         The duration in seconds\n   */\n  minimumUpdatePeriod(value) {\n    return parseDuration(value);\n  },\n\n  /**\n   * Specifies the suggested presentation delay. Format is a\n   * duration string as specified in ISO 8601\n   *\n   * @param {string} value\n   *        value of attribute as a string\n   * @return {number}\n   *         The duration in seconds\n   */\n  suggestedPresentationDelay(value) {\n    return parseDuration(value);\n  },\n\n  /**\n   * specifices the type of mpd. Can be either \"static\" or \"dynamic\"\n   *\n   * @param {string} value\n   *        value of attribute as a string\n   *\n   * @return {string}\n   *         The type as a string\n   */\n  type(value) {\n    return value;\n  },\n\n  /**\n   * Specifies the duration of the smallest time shifting buffer for any Representation\n   * in the MPD. Format is a duration string as specified in ISO 8601\n   *\n   * @param {string} value\n   *        value of attribute as a string\n   * @return {number}\n   *         The duration in seconds\n   */\n  timeShiftBufferDepth(value) {\n    return parseDuration(value);\n  },\n\n  /**\n   * Specifies the PeriodStart time of the Period relative to the availabilityStarttime.\n   * Format is a duration string as specified in ISO 8601\n   *\n   * @param {string} value\n   *        value of attribute as a string\n   * @return {number}\n   *         The duration in seconds\n   */\n  start(value) {\n    return parseDuration(value);\n  },\n\n  /**\n   * Specifies the width of the visual presentation\n   *\n   * @param {string} value\n   *        value of attribute as a string\n   * @return {number}\n   *         The parsed width\n   */\n  width(value) {\n    return parseInt(value, 10);\n  },\n\n  /**\n   * Specifies the height of the visual presentation\n   *\n   * @param {string} value\n   *        value of attribute as a string\n   * @return {number}\n   *         The parsed height\n   */\n  height(value) {\n    return parseInt(value, 10);\n  },\n\n  /**\n   * Specifies the bitrate of the representation\n   *\n   * @param {string} value\n   *        value of attribute as a string\n   * @return {number}\n   *         The parsed bandwidth\n   */\n  bandwidth(value) {\n    return parseInt(value, 10);\n  },\n\n  /**\n   * Specifies the frame rate of the representation\n   *\n   * @param {string} value\n   *        value of attribute as a string\n   * @return {number}\n   *         The parsed frame rate\n   */\n  frameRate(value) {\n    return parseDivisionValue(value);\n  },\n\n  /**\n   * Specifies the number of the first Media Segment in this Representation in the Period\n   *\n   * @param {string} value\n   *        value of attribute as a string\n   * @return {number}\n   *         The parsed number\n   */\n  startNumber(value) {\n    return parseInt(value, 10);\n  },\n\n  /**\n   * Specifies the timescale in units per seconds\n   *\n   * @param {string} value\n   *        value of attribute as a string\n   * @return {number}\n   *         The parsed timescale\n   */\n  timescale(value) {\n    return parseInt(value, 10);\n  },\n\n  /**\n   * Specifies the presentationTimeOffset.\n   *\n   * @param {string} value\n   *        value of the attribute as a string\n   *\n   * @return {number}\n   *         The parsed presentationTimeOffset\n   */\n  presentationTimeOffset(value) {\n    return parseInt(value, 10);\n  },\n\n  /**\n   * Specifies the constant approximate Segment duration\n   * NOTE: The <Period> element also contains an @duration attribute. This duration\n   *       specifies the duration of the Period. This attribute is currently not\n   *       supported by the rest of the parser, however we still check for it to prevent\n   *       errors.\n   *\n   * @param {string} value\n   *        value of attribute as a string\n   * @return {number}\n   *         The parsed duration\n   */\n  duration(value) {\n    const parsedValue = parseInt(value, 10);\n\n    if (isNaN(parsedValue)) {\n      return parseDuration(value);\n    }\n\n    return parsedValue;\n  },\n\n  /**\n   * Specifies the Segment duration, in units of the value of the @timescale.\n   *\n   * @param {string} value\n   *        value of attribute as a string\n   * @return {number}\n   *         The parsed duration\n   */\n  d(value) {\n    return parseInt(value, 10);\n  },\n\n  /**\n   * Specifies the MPD start time, in @timescale units, the first Segment in the series\n   * starts relative to the beginning of the Period\n   *\n   * @param {string} value\n   *        value of attribute as a string\n   * @return {number}\n   *         The parsed time\n   */\n  t(value) {\n    return parseInt(value, 10);\n  },\n\n  /**\n   * Specifies the repeat count of the number of following contiguous Segments with the\n   * same duration expressed by the value of @d\n   *\n   * @param {string} value\n   *        value of attribute as a string\n   * @return {number}\n   *         The parsed number\n   */\n  r(value) {\n    return parseInt(value, 10);\n  },\n\n  /**\n   * Specifies the presentationTime.\n   *\n   * @param {string} value\n   *        value of the attribute as a string\n   *\n   * @return {number}\n   *         The parsed presentationTime\n   */\n  presentationTime(value) {\n    return parseInt(value, 10);\n  },\n\n  /**\n   * Default parser for all other attributes. Acts as a no-op and just returns the value\n   * as a string\n   *\n   * @param {string} value\n   *        value of attribute as a string\n   * @return {string}\n   *         Unparsed value\n   */\n  DEFAULT(value) {\n    return value;\n  }\n\n};\n/**\n * Gets all the attributes and values of the provided node, parses attributes with known\n * types, and returns an object with attribute names mapped to values.\n *\n * @param {Node} el\n *        The node to parse attributes from\n * @return {Object}\n *         Object with all attributes of el parsed\n */\n\nconst parseAttributes = el => {\n  if (!(el && el.attributes)) {\n    return {};\n  }\n\n  return from(el.attributes).reduce((a, e) => {\n    const parseFn = parsers[e.name] || parsers.DEFAULT;\n    a[e.name] = parseFn(e.value);\n    return a;\n  }, {});\n};\n\nconst keySystemsMap = {\n  'urn:uuid:1077efec-c0b2-4d02-ace3-3c1e52e2fb4b': 'org.w3.clearkey',\n  'urn:uuid:edef8ba9-79d6-4ace-a3c8-27dcd51d21ed': 'com.widevine.alpha',\n  'urn:uuid:9a04f079-9840-4286-ab92-e65be0885f95': 'com.microsoft.playready',\n  'urn:uuid:f239e769-efa3-4850-9c16-a903c6932efb': 'com.adobe.primetime',\n  // ISO_IEC 23009-1_2022 5.8.5.2.2 The mp4 Protection Scheme\n  'urn:mpeg:dash:mp4protection:2011': 'mp4protection'\n};\n/**\n * Builds a list of urls that is the product of the reference urls and BaseURL values\n *\n * @param {Object[]} references\n *        List of objects containing the reference URL as well as its attributes\n * @param {Node[]} baseUrlElements\n *        List of BaseURL nodes from the mpd\n * @return {Object[]}\n *         List of objects with resolved urls and attributes\n */\n\nconst buildBaseUrls = (references, baseUrlElements) => {\n  if (!baseUrlElements.length) {\n    return references;\n  }\n\n  return flatten(references.map(function (reference) {\n    return baseUrlElements.map(function (baseUrlElement) {\n      const initialBaseUrl = getContent(baseUrlElement);\n      const resolvedBaseUrl = resolveUrl(reference.baseUrl, initialBaseUrl);\n      const finalBaseUrl = merge(parseAttributes(baseUrlElement), {\n        baseUrl: resolvedBaseUrl\n      }); // If the URL is resolved, we want to get the serviceLocation from the reference\n      // assuming there is no serviceLocation on the initialBaseUrl\n\n      if (resolvedBaseUrl !== initialBaseUrl && !finalBaseUrl.serviceLocation && reference.serviceLocation) {\n        finalBaseUrl.serviceLocation = reference.serviceLocation;\n      }\n\n      return finalBaseUrl;\n    });\n  }));\n};\n/**\n * Contains all Segment information for its containing AdaptationSet\n *\n * @typedef {Object} SegmentInformation\n * @property {Object|undefined} template\n *           Contains the attributes for the SegmentTemplate node\n * @property {Object[]|undefined} segmentTimeline\n *           Contains a list of atrributes for each S node within the SegmentTimeline node\n * @property {Object|undefined} list\n *           Contains the attributes for the SegmentList node\n * @property {Object|undefined} base\n *           Contains the attributes for the SegmentBase node\n */\n\n/**\n * Returns all available Segment information contained within the AdaptationSet node\n *\n * @param {Node} adaptationSet\n *        The AdaptationSet node to get Segment information from\n * @return {SegmentInformation}\n *         The Segment information contained within the provided AdaptationSet\n */\n\nconst getSegmentInformation = adaptationSet => {\n  const segmentTemplate = findChildren(adaptationSet, 'SegmentTemplate')[0];\n  const segmentList = findChildren(adaptationSet, 'SegmentList')[0];\n  const segmentUrls = segmentList && findChildren(segmentList, 'SegmentURL').map(s => merge({\n    tag: 'SegmentURL'\n  }, parseAttributes(s)));\n  const segmentBase = findChildren(adaptationSet, 'SegmentBase')[0];\n  const segmentTimelineParentNode = segmentList || segmentTemplate;\n  const segmentTimeline = segmentTimelineParentNode && findChildren(segmentTimelineParentNode, 'SegmentTimeline')[0];\n  const segmentInitializationParentNode = segmentList || segmentBase || segmentTemplate;\n  const segmentInitialization = segmentInitializationParentNode && findChildren(segmentInitializationParentNode, 'Initialization')[0]; // SegmentTemplate is handled slightly differently, since it can have both\n  // @initialization and an <Initialization> node.  @initialization can be templated,\n  // while the node can have a url and range specified.  If the <SegmentTemplate> has\n  // both @initialization and an <Initialization> subelement we opt to override with\n  // the node, as this interaction is not defined in the spec.\n\n  const template = segmentTemplate && parseAttributes(segmentTemplate);\n\n  if (template && segmentInitialization) {\n    template.initialization = segmentInitialization && parseAttributes(segmentInitialization);\n  } else if (template && template.initialization) {\n    // If it is @initialization we convert it to an object since this is the format that\n    // later functions will rely on for the initialization segment.  This is only valid\n    // for <SegmentTemplate>\n    template.initialization = {\n      sourceURL: template.initialization\n    };\n  }\n\n  const segmentInfo = {\n    template,\n    segmentTimeline: segmentTimeline && findChildren(segmentTimeline, 'S').map(s => parseAttributes(s)),\n    list: segmentList && merge(parseAttributes(segmentList), {\n      segmentUrls,\n      initialization: parseAttributes(segmentInitialization)\n    }),\n    base: segmentBase && merge(parseAttributes(segmentBase), {\n      initialization: parseAttributes(segmentInitialization)\n    })\n  };\n  Object.keys(segmentInfo).forEach(key => {\n    if (!segmentInfo[key]) {\n      delete segmentInfo[key];\n    }\n  });\n  return segmentInfo;\n};\n/**\n * Contains Segment information and attributes needed to construct a Playlist object\n * from a Representation\n *\n * @typedef {Object} RepresentationInformation\n * @property {SegmentInformation} segmentInfo\n *           Segment information for this Representation\n * @property {Object} attributes\n *           Inherited attributes for this Representation\n */\n\n/**\n * Maps a Representation node to an object containing Segment information and attributes\n *\n * @name inheritBaseUrlsCallback\n * @function\n * @param {Node} representation\n *        Representation node from the mpd\n * @return {RepresentationInformation}\n *         Representation information needed to construct a Playlist object\n */\n\n/**\n * Returns a callback for Array.prototype.map for mapping Representation nodes to\n * Segment information and attributes using inherited BaseURL nodes.\n *\n * @param {Object} adaptationSetAttributes\n *        Contains attributes inherited by the AdaptationSet\n * @param {Object[]} adaptationSetBaseUrls\n *        List of objects containing resolved base URLs and attributes\n *        inherited by the AdaptationSet\n * @param {SegmentInformation} adaptationSetSegmentInfo\n *        Contains Segment information for the AdaptationSet\n * @return {inheritBaseUrlsCallback}\n *         Callback map function\n */\n\nconst inheritBaseUrls = (adaptationSetAttributes, adaptationSetBaseUrls, adaptationSetSegmentInfo) => representation => {\n  const repBaseUrlElements = findChildren(representation, 'BaseURL');\n  const repBaseUrls = buildBaseUrls(adaptationSetBaseUrls, repBaseUrlElements);\n  const attributes = merge(adaptationSetAttributes, parseAttributes(representation));\n  const representationSegmentInfo = getSegmentInformation(representation);\n  return repBaseUrls.map(baseUrl => {\n    return {\n      segmentInfo: merge(adaptationSetSegmentInfo, representationSegmentInfo),\n      attributes: merge(attributes, baseUrl)\n    };\n  });\n};\n/**\n * Tranforms a series of content protection nodes to\n * an object containing pssh data by key system\n *\n * @param {Node[]} contentProtectionNodes\n *        Content protection nodes\n * @return {Object}\n *        Object containing pssh data by key system\n */\n\nconst generateKeySystemInformation = contentProtectionNodes => {\n  return contentProtectionNodes.reduce((acc, node) => {\n    const attributes = parseAttributes(node); // Although it could be argued that according to the UUID RFC spec the UUID string (a-f chars) should be generated\n    // as a lowercase string it also mentions it should be treated as case-insensitive on input. Since the key system\n    // UUIDs in the keySystemsMap are hardcoded as lowercase in the codebase there isn't any reason not to do\n    // .toLowerCase() on the input UUID string from the manifest (at least I could not think of one).\n\n    if (attributes.schemeIdUri) {\n      attributes.schemeIdUri = attributes.schemeIdUri.toLowerCase();\n    }\n\n    const keySystem = keySystemsMap[attributes.schemeIdUri];\n\n    if (keySystem) {\n      acc[keySystem] = {\n        attributes\n      };\n      const psshNode = findChildren(node, 'cenc:pssh')[0];\n\n      if (psshNode) {\n        const pssh = getContent(psshNode);\n        acc[keySystem].pssh = pssh && decodeB64ToUint8Array(pssh);\n      }\n    }\n\n    return acc;\n  }, {});\n}; // defined in ANSI_SCTE 214-1 2016\n\n\nconst parseCaptionServiceMetadata = service => {\n  // 608 captions\n  if (service.schemeIdUri === 'urn:scte:dash:cc:cea-608:2015') {\n    const values = typeof service.value !== 'string' ? [] : service.value.split(';');\n    return values.map(value => {\n      let channel;\n      let language; // default language to value\n\n      language = value;\n\n      if (/^CC\\d=/.test(value)) {\n        [channel, language] = value.split('=');\n      } else if (/^CC\\d$/.test(value)) {\n        channel = value;\n      }\n\n      return {\n        channel,\n        language\n      };\n    });\n  } else if (service.schemeIdUri === 'urn:scte:dash:cc:cea-708:2015') {\n    const values = typeof service.value !== 'string' ? [] : service.value.split(';');\n    return values.map(value => {\n      const flags = {\n        // service or channel number 1-63\n        'channel': undefined,\n        // language is a 3ALPHA per ISO 639.2/B\n        // field is required\n        'language': undefined,\n        // BIT 1/0 or ?\n        // default value is 1, meaning 16:9 aspect ratio, 0 is 4:3, ? is unknown\n        'aspectRatio': 1,\n        // BIT 1/0\n        // easy reader flag indicated the text is tailed to the needs of beginning readers\n        // default 0, or off\n        'easyReader': 0,\n        // BIT 1/0\n        // If 3d metadata is present (CEA-708.1) then 1\n        // default 0\n        '3D': 0\n      };\n\n      if (/=/.test(value)) {\n        const [channel, opts = ''] = value.split('=');\n        flags.channel = channel;\n        flags.language = value;\n        opts.split(',').forEach(opt => {\n          const [name, val] = opt.split(':');\n\n          if (name === 'lang') {\n            flags.language = val; // er for easyReadery\n          } else if (name === 'er') {\n            flags.easyReader = Number(val); // war for wide aspect ratio\n          } else if (name === 'war') {\n            flags.aspectRatio = Number(val);\n          } else if (name === '3D') {\n            flags['3D'] = Number(val);\n          }\n        });\n      } else {\n        flags.language = value;\n      }\n\n      if (flags.channel) {\n        flags.channel = 'SERVICE' + flags.channel;\n      }\n\n      return flags;\n    });\n  }\n};\n/**\n * A map callback that will parse all event stream data for a collection of periods\n * DASH ISO_IEC_23009 5.10.2.2\n * https://dashif-documents.azurewebsites.net/Events/master/event.html#mpd-event-timing\n *\n * @param {PeriodInformation} period object containing necessary period information\n * @return a collection of parsed eventstream event objects\n */\n\nconst toEventStream = period => {\n  // get and flatten all EventStreams tags and parse attributes and children\n  return flatten(findChildren(period.node, 'EventStream').map(eventStream => {\n    const eventStreamAttributes = parseAttributes(eventStream);\n    const schemeIdUri = eventStreamAttributes.schemeIdUri; // find all Events per EventStream tag and map to return objects\n\n    return findChildren(eventStream, 'Event').map(event => {\n      const eventAttributes = parseAttributes(event);\n      const presentationTime = eventAttributes.presentationTime || 0;\n      const timescale = eventStreamAttributes.timescale || 1;\n      const duration = eventAttributes.duration || 0;\n      const start = presentationTime / timescale + period.attributes.start;\n      return {\n        schemeIdUri,\n        value: eventStreamAttributes.value,\n        id: eventAttributes.id,\n        start,\n        end: start + duration / timescale,\n        messageData: getContent(event) || eventAttributes.messageData,\n        contentEncoding: eventStreamAttributes.contentEncoding,\n        presentationTimeOffset: eventStreamAttributes.presentationTimeOffset || 0\n      };\n    });\n  }));\n};\n/**\n * Maps an AdaptationSet node to a list of Representation information objects\n *\n * @name toRepresentationsCallback\n * @function\n * @param {Node} adaptationSet\n *        AdaptationSet node from the mpd\n * @return {RepresentationInformation[]}\n *         List of objects containing Representaion information\n */\n\n/**\n * Returns a callback for Array.prototype.map for mapping AdaptationSet nodes to a list of\n * Representation information objects\n *\n * @param {Object} periodAttributes\n *        Contains attributes inherited by the Period\n * @param {Object[]} periodBaseUrls\n *        Contains list of objects with resolved base urls and attributes\n *        inherited by the Period\n * @param {string[]} periodSegmentInfo\n *        Contains Segment Information at the period level\n * @return {toRepresentationsCallback}\n *         Callback map function\n */\n\nconst toRepresentations = (periodAttributes, periodBaseUrls, periodSegmentInfo) => adaptationSet => {\n  const adaptationSetAttributes = parseAttributes(adaptationSet);\n  const adaptationSetBaseUrls = buildBaseUrls(periodBaseUrls, findChildren(adaptationSet, 'BaseURL'));\n  const role = findChildren(adaptationSet, 'Role')[0];\n  const roleAttributes = {\n    role: parseAttributes(role)\n  };\n  let attrs = merge(periodAttributes, adaptationSetAttributes, roleAttributes);\n  const accessibility = findChildren(adaptationSet, 'Accessibility')[0];\n  const captionServices = parseCaptionServiceMetadata(parseAttributes(accessibility));\n\n  if (captionServices) {\n    attrs = merge(attrs, {\n      captionServices\n    });\n  }\n\n  const label = findChildren(adaptationSet, 'Label')[0];\n\n  if (label && label.childNodes.length) {\n    const labelVal = label.childNodes[0].nodeValue.trim();\n    attrs = merge(attrs, {\n      label: labelVal\n    });\n  }\n\n  const contentProtection = generateKeySystemInformation(findChildren(adaptationSet, 'ContentProtection'));\n\n  if (Object.keys(contentProtection).length) {\n    attrs = merge(attrs, {\n      contentProtection\n    });\n  }\n\n  const segmentInfo = getSegmentInformation(adaptationSet);\n  const representations = findChildren(adaptationSet, 'Representation');\n  const adaptationSetSegmentInfo = merge(periodSegmentInfo, segmentInfo);\n  return flatten(representations.map(inheritBaseUrls(attrs, adaptationSetBaseUrls, adaptationSetSegmentInfo)));\n};\n/**\n * Contains all period information for mapping nodes onto adaptation sets.\n *\n * @typedef {Object} PeriodInformation\n * @property {Node} period.node\n *           Period node from the mpd\n * @property {Object} period.attributes\n *           Parsed period attributes from node plus any added\n */\n\n/**\n * Maps a PeriodInformation object to a list of Representation information objects for all\n * AdaptationSet nodes contained within the Period.\n *\n * @name toAdaptationSetsCallback\n * @function\n * @param {PeriodInformation} period\n *        Period object containing necessary period information\n * @param {number} periodStart\n *        Start time of the Period within the mpd\n * @return {RepresentationInformation[]}\n *         List of objects containing Representaion information\n */\n\n/**\n * Returns a callback for Array.prototype.map for mapping Period nodes to a list of\n * Representation information objects\n *\n * @param {Object} mpdAttributes\n *        Contains attributes inherited by the mpd\n  * @param {Object[]} mpdBaseUrls\n *        Contains list of objects with resolved base urls and attributes\n *        inherited by the mpd\n * @return {toAdaptationSetsCallback}\n *         Callback map function\n */\n\nconst toAdaptationSets = (mpdAttributes, mpdBaseUrls) => (period, index) => {\n  const periodBaseUrls = buildBaseUrls(mpdBaseUrls, findChildren(period.node, 'BaseURL'));\n  const periodAttributes = merge(mpdAttributes, {\n    periodStart: period.attributes.start\n  });\n\n  if (typeof period.attributes.duration === 'number') {\n    periodAttributes.periodDuration = period.attributes.duration;\n  }\n\n  const adaptationSets = findChildren(period.node, 'AdaptationSet');\n  const periodSegmentInfo = getSegmentInformation(period.node);\n  return flatten(adaptationSets.map(toRepresentations(periodAttributes, periodBaseUrls, periodSegmentInfo)));\n};\n/**\n * Tranforms an array of content steering nodes into an object\n * containing CDN content steering information from the MPD manifest.\n *\n * For more information on the DASH spec for Content Steering parsing, see:\n * https://dashif.org/docs/DASH-IF-CTS-00XX-Content-Steering-Community-Review.pdf\n *\n * @param {Node[]} contentSteeringNodes\n *        Content steering nodes\n * @param {Function} eventHandler\n *        The event handler passed into the parser options to handle warnings\n * @return {Object}\n *        Object containing content steering data\n */\n\nconst generateContentSteeringInformation = (contentSteeringNodes, eventHandler) => {\n  // If there are more than one ContentSteering tags, throw an error\n  if (contentSteeringNodes.length > 1) {\n    eventHandler({\n      type: 'warn',\n      message: 'The MPD manifest should contain no more than one ContentSteering tag'\n    });\n  } // Return a null value if there are no ContentSteering tags\n\n\n  if (!contentSteeringNodes.length) {\n    return null;\n  }\n\n  const infoFromContentSteeringTag = merge({\n    serverURL: getContent(contentSteeringNodes[0])\n  }, parseAttributes(contentSteeringNodes[0])); // Converts `queryBeforeStart` to a boolean, as well as setting the default value\n  // to `false` if it doesn't exist\n\n  infoFromContentSteeringTag.queryBeforeStart = infoFromContentSteeringTag.queryBeforeStart === 'true';\n  return infoFromContentSteeringTag;\n};\n/**\n * Gets Period@start property for a given period.\n *\n * @param {Object} options\n *        Options object\n * @param {Object} options.attributes\n *        Period attributes\n * @param {Object} [options.priorPeriodAttributes]\n *        Prior period attributes (if prior period is available)\n * @param {string} options.mpdType\n *        The MPD@type these periods came from\n * @return {number|null}\n *         The period start, or null if it's an early available period or error\n */\n\nconst getPeriodStart = ({\n  attributes,\n  priorPeriodAttributes,\n  mpdType\n}) => {\n  // Summary of period start time calculation from DASH spec section 5.3.2.1\n  //\n  // A period's start is the first period's start + time elapsed after playing all\n  // prior periods to this one. Periods continue one after the other in time (without\n  // gaps) until the end of the presentation.\n  //\n  // The value of Period@start should be:\n  // 1. if Period@start is present: value of Period@start\n  // 2. if previous period exists and it has @duration: previous Period@start +\n  //    previous Period@duration\n  // 3. if this is first period and MPD@type is 'static': 0\n  // 4. in all other cases, consider the period an \"early available period\" (note: not\n  //    currently supported)\n  // (1)\n  if (typeof attributes.start === 'number') {\n    return attributes.start;\n  } // (2)\n\n\n  if (priorPeriodAttributes && typeof priorPeriodAttributes.start === 'number' && typeof priorPeriodAttributes.duration === 'number') {\n    return priorPeriodAttributes.start + priorPeriodAttributes.duration;\n  } // (3)\n\n\n  if (!priorPeriodAttributes && mpdType === 'static') {\n    return 0;\n  } // (4)\n  // There is currently no logic for calculating the Period@start value if there is\n  // no Period@start or prior Period@start and Period@duration available. This is not made\n  // explicit by the DASH interop guidelines or the DASH spec, however, since there's\n  // nothing about any other resolution strategies, it's implied. Thus, this case should\n  // be considered an early available period, or error, and null should suffice for both\n  // of those cases.\n\n\n  return null;\n};\n/**\n * Traverses the mpd xml tree to generate a list of Representation information objects\n * that have inherited attributes from parent nodes\n *\n * @param {Node} mpd\n *        The root node of the mpd\n * @param {Object} options\n *        Available options for inheritAttributes\n * @param {string} options.manifestUri\n *        The uri source of the mpd\n * @param {number} options.NOW\n *        Current time per DASH IOP.  Default is current time in ms since epoch\n * @param {number} options.clientOffset\n *        Client time difference from NOW (in milliseconds)\n * @return {RepresentationInformation[]}\n *         List of objects containing Representation information\n */\n\nconst inheritAttributes = (mpd, options = {}) => {\n  const {\n    manifestUri = '',\n    NOW = Date.now(),\n    clientOffset = 0,\n    // TODO: For now, we are expecting an eventHandler callback function\n    // to be passed into the mpd parser as an option.\n    // In the future, we should enable stream parsing by using the Stream class from vhs-utils.\n    // This will support new features including a standardized event handler.\n    // See the m3u8 parser for examples of how stream parsing is currently used for HLS parsing.\n    // https://github.com/videojs/vhs-utils/blob/88d6e10c631e57a5af02c5a62bc7376cd456b4f5/src/stream.js#L9\n    eventHandler = function () {}\n  } = options;\n  const periodNodes = findChildren(mpd, 'Period');\n\n  if (!periodNodes.length) {\n    throw new Error(errors.INVALID_NUMBER_OF_PERIOD);\n  }\n\n  const locations = findChildren(mpd, 'Location');\n  const mpdAttributes = parseAttributes(mpd);\n  const mpdBaseUrls = buildBaseUrls([{\n    baseUrl: manifestUri\n  }], findChildren(mpd, 'BaseURL'));\n  const contentSteeringNodes = findChildren(mpd, 'ContentSteering'); // See DASH spec section 5.3.1.2, Semantics of MPD element. Default type to 'static'.\n\n  mpdAttributes.type = mpdAttributes.type || 'static';\n  mpdAttributes.sourceDuration = mpdAttributes.mediaPresentationDuration || 0;\n  mpdAttributes.NOW = NOW;\n  mpdAttributes.clientOffset = clientOffset;\n\n  if (locations.length) {\n    mpdAttributes.locations = locations.map(getContent);\n  }\n\n  const periods = []; // Since toAdaptationSets acts on individual periods right now, the simplest approach to\n  // adding properties that require looking at prior periods is to parse attributes and add\n  // missing ones before toAdaptationSets is called. If more such properties are added, it\n  // may be better to refactor toAdaptationSets.\n\n  periodNodes.forEach((node, index) => {\n    const attributes = parseAttributes(node); // Use the last modified prior period, as it may contain added information necessary\n    // for this period.\n\n    const priorPeriod = periods[index - 1];\n    attributes.start = getPeriodStart({\n      attributes,\n      priorPeriodAttributes: priorPeriod ? priorPeriod.attributes : null,\n      mpdType: mpdAttributes.type\n    });\n    periods.push({\n      node,\n      attributes\n    });\n  });\n  return {\n    locations: mpdAttributes.locations,\n    contentSteeringInfo: generateContentSteeringInformation(contentSteeringNodes, eventHandler),\n    // TODO: There are occurences where this `representationInfo` array contains undesired\n    // duplicates. This generally occurs when there are multiple BaseURL nodes that are\n    // direct children of the MPD node. When we attempt to resolve URLs from a combination of the\n    // parent BaseURL and a child BaseURL, and the value does not resolve,\n    // we end up returning the child BaseURL multiple times.\n    // We need to determine a way to remove these duplicates in a safe way.\n    // See: https://github.com/videojs/mpd-parser/pull/17#discussion_r162750527\n    representationInfo: flatten(periods.map(toAdaptationSets(mpdAttributes, mpdBaseUrls))),\n    eventStream: flatten(periods.map(toEventStream))\n  };\n};\n\nconst stringToMpdXml = manifestString => {\n  if (manifestString === '') {\n    throw new Error(errors.DASH_EMPTY_MANIFEST);\n  }\n\n  const parser = new DOMParser();\n  let xml;\n  let mpd;\n\n  try {\n    xml = parser.parseFromString(manifestString, 'application/xml');\n    mpd = xml && xml.documentElement.tagName === 'MPD' ? xml.documentElement : null;\n  } catch (e) {// ie 11 throws on invalid xml\n  }\n\n  if (!mpd || mpd && mpd.getElementsByTagName('parsererror').length > 0) {\n    throw new Error(errors.DASH_INVALID_XML);\n  }\n\n  return mpd;\n};\n\n/**\n * Parses the manifest for a UTCTiming node, returning the nodes attributes if found\n *\n * @param {string} mpd\n *        XML string of the MPD manifest\n * @return {Object|null}\n *         Attributes of UTCTiming node specified in the manifest. Null if none found\n */\n\nconst parseUTCTimingScheme = mpd => {\n  const UTCTimingNode = findChildren(mpd, 'UTCTiming')[0];\n\n  if (!UTCTimingNode) {\n    return null;\n  }\n\n  const attributes = parseAttributes(UTCTimingNode);\n\n  switch (attributes.schemeIdUri) {\n    case 'urn:mpeg:dash:utc:http-head:2014':\n    case 'urn:mpeg:dash:utc:http-head:2012':\n      attributes.method = 'HEAD';\n      break;\n\n    case 'urn:mpeg:dash:utc:http-xsdate:2014':\n    case 'urn:mpeg:dash:utc:http-iso:2014':\n    case 'urn:mpeg:dash:utc:http-xsdate:2012':\n    case 'urn:mpeg:dash:utc:http-iso:2012':\n      attributes.method = 'GET';\n      break;\n\n    case 'urn:mpeg:dash:utc:direct:2014':\n    case 'urn:mpeg:dash:utc:direct:2012':\n      attributes.method = 'DIRECT';\n      attributes.value = Date.parse(attributes.value);\n      break;\n\n    case 'urn:mpeg:dash:utc:http-ntp:2014':\n    case 'urn:mpeg:dash:utc:ntp:2014':\n    case 'urn:mpeg:dash:utc:sntp:2014':\n    default:\n      throw new Error(errors.UNSUPPORTED_UTC_TIMING_SCHEME);\n  }\n\n  return attributes;\n};\n\nconst VERSION = version;\n/*\n * Given a DASH manifest string and options, parses the DASH manifest into an object in the\n * form outputed by m3u8-parser and accepted by videojs/http-streaming.\n *\n * For live DASH manifests, if `previousManifest` is provided in options, then the newly\n * parsed DASH manifest will have its media sequence and discontinuity sequence values\n * updated to reflect its position relative to the prior manifest.\n *\n * @param {string} manifestString - the DASH manifest as a string\n * @param {options} [options] - any options\n *\n * @return {Object} the manifest object\n */\n\nconst parse = (manifestString, options = {}) => {\n  const parsedManifestInfo = inheritAttributes(stringToMpdXml(manifestString), options);\n  const playlists = toPlaylists(parsedManifestInfo.representationInfo);\n  return toM3u8({\n    dashPlaylists: playlists,\n    locations: parsedManifestInfo.locations,\n    contentSteering: parsedManifestInfo.contentSteeringInfo,\n    sidxMapping: options.sidxMapping,\n    previousManifest: options.previousManifest,\n    eventStream: parsedManifestInfo.eventStream\n  });\n};\n/**\n * Parses the manifest for a UTCTiming node, returning the nodes attributes if found\n *\n * @param {string} manifestString\n *        XML string of the MPD manifest\n * @return {Object|null}\n *         Attributes of UTCTiming node specified in the manifest. Null if none found\n */\n\n\nconst parseUTCTiming = manifestString => parseUTCTimingScheme(stringToMpdXml(manifestString));\n\nexport { VERSION, addSidxSegmentsToPlaylist$1 as addSidxSegmentsToPlaylist, generateSidxKey, inheritAttributes, parse, parseUTCTiming, stringToMpdXml, toM3u8, toPlaylists };\n"],"names":["Stream","_proto","type","listener","index","callbacks","length","i","args","_length","_i","destination","data","atob","s","window","decodeB64ToUint8Array","b64Text","decodedString","array","LineStream","nextNewline","TAB","parseByterange","byterangeString","match","result","attributeSeparator","keyvalue","parseAttributes","attributes","attrs","attr","parseResolution","resolution","split","ParseStream","line","event","acc","mapper","mappedLine","newLine","_extends","key","subkey","clientAttributePattern","isHexaDecimal","isDecimalFloating","expression","customType","dataParser","segment","map","mapFn","camelCase","str","a","camelCaseKeys","setHoldBack","manifest","serverControl","targetDuration","partTargetDuration","tag","hb","phb","minTargetDuration","minPartDuration","Parser","opts","self","uris","currentUri","currentMap","hasParts","noop","defaultMediaGroups","widevineUuid","currentTimeline","lastByterangeEnd","lastPartByterangeEnd","dateRangeTags","entry","mediaGroup","rendition","def","byterange","mediaGroupType","lastProgramDateTime","programDateTime","segmentIndex","part","partIndex","r","hint","isPart","otherHint","report","required","dateRange","endOnNextYes","newDateInSeconds","attribute","dateRangeWithSameId","dateRangeToFind","addDef","n","v","val","currentVersion","targetVersion","identifier","missing","chunk","options","forEachMediaGroup","master","groups","callback","mediaType","groupKey","labelKey","mediaProperties","find","list","predicate","ac","item","freeze","object","oc","assign","target","source","MIME_TYPE","value","NAMESPACE","uri","conventions","require$$0","notEmptyString","input","splitOnASCIIWhitespace","orderedSetReducer","current","element","toOrderedSet","arrayIncludes","copy","src","dest","p","Class","Super","pt","t","NodeType","ELEMENT_NODE","ATTRIBUTE_NODE","TEXT_NODE","CDATA_SECTION_NODE","ENTITY_REFERENCE_NODE","ENTITY_NODE","PROCESSING_INSTRUCTION_NODE","COMMENT_NODE","DOCUMENT_NODE","DOCUMENT_TYPE_NODE","DOCUMENT_FRAGMENT_NODE","NOTATION_NODE","ExceptionCode","ExceptionMessage","HIERARCHY_REQUEST_ERR","NOT_FOUND_ERR","INUSE_ATTRIBUTE_ERR","DOMException","code","message","error","NodeList","isHTML","nodeFilter","buf","serializeToString","LiveNodeList","node","refresh","_updateLiveList","inc","ls","__set__","NamedNodeMap","_findNodeIndex","_addNamedNode","el","newAttr","oldAttr","doc","_onRemoveAttribute","_onAddAttribute","_removeNamedNode","lastIndex","namespaceURI","localName","DOMImplementation","feature","version","qualifiedName","doctype","Document","root","publicId","systemId","DocumentType","Node","newChild","refChild","_insertBefore","oldChild","assertPreReplacementValidityInDocument","_removeChild","deep","cloneNode","child","next","prefix","_xmlEncoder","c","_visitNode","ns","remove","_onUpdateChild","cs","parentNode","previous","hasValidParentNodeType","hasInsertableNodeType","isElementNode","isTextNode","isDocTypeNode","isElementInsertionPossible","parentChildNodes","docTypeNode","isElementReplacementPossible","hasElementChildThatIsNotChild","assertPreInsertionValidity1to5","parent","assertPreInsertionValidityInDocument","nodeChildNodes","nodeChildElements","parentElementChild","_inDocumentAssertion","cp","newFirst","newLast","pre","targetDoc","_updateOwnerDocument","newOwnerDocument","_appendSingleChild","importedNode","importNode","id","rtv","classNames","classNamesSet","base","nodeClassNames","matches","nodeClassNamesSet","tagName","Element","DocumentFragment","Text","Comment","CDATASection","ProcessingInstruction","name","Attr","EntityReference","pl","old","CharacterData","offset","count","text","start","end","newText","newNode","Notation","Entity","XMLSerializer","isHtml","nodeSerializeToString","refNode","visibleNamespaces","needNamespaceDefine","addSerializedAttribute","len","nodeName","prefixedNodeName","defaultNS","ai","nsi","namespace","pubid","sysid","sub","node2","attrs2","getTextContent","dom","exports","nameStartChar","nameChar","tagNamePattern","S_TAG","S_ATTR","S_ATTR_SPACE","S_EQ","S_ATTR_NOQUOT_VALUE","S_ATTR_END","S_TAG_SPACE","S_TAG_CLOSE","ParseError","locator","XMLReader","defaultNSMap","entityMap","domBuilder","_copy","parse","defaultNSMapCopy","errorHandler","fixedFromCharCode","surrogate1","surrogate2","entityReplacer","k","appendText","xt","position","m","lineEnd","linePattern","lineStart","parseStack","closeMap","tagStart","config","localNSMap","endMatch","endIgnoreCaseMach","parseInstruction","parseDCC","ElementAttributes","currentNSMap","parseElementStartPart","fixSelfClosed","locator2","copyLocator","appendElement","parseHtmlSpecialContent","e","f","addAttribute","qname","startIndex","attrName","qName","nsp","nsPrefix","elStartEnd","elEndStart","pos","matchs","lastMatch","reg","sax","require$$1","entities","require$$2","require$$3","normalizeLineEndings","DOMParser","mimeType","DOMHandler","buildErrorHandler","normalize","errorImpl","isCallback","build","fn","msg","_locator","ins","ch","chars","_toString","charNode","comm","impl","dt","l","hander","domParser","isObject","obj","merge","objects","values","o","range","flatten","lists","x","y","from","findIndexes","union","keyFunction","errors","urlTypeToSegment","baseUrl","indexRange","resolveUrl","ranges","startRange","endRange","byteRangeToString","parseEndNumber","endNumber","segmentRange","duration","timescale","sourceDuration","periodDuration","segmentDuration","NOW","clientOffset","availabilityStartTime","periodStart","minimumUpdatePeriod","timeShiftBufferDepth","now","periodStartWC","segmentCount","availableStart","availableEnd","toSegments","number","startNumber","parseByDuration","segments","sectionDuration","segmentsFromBase","initialization","presentationTime","initSegment","segmentTimeInfo","addSidxSegmentsToPlaylist$1","playlist","sidx","timeline","sidxByteRange","sidxEnd","mediaReferences","reference","size","endIndex","SUPPORTED_MEDIA_TYPES","TIME_FUDGE","getUniqueTimelineStarts","timelineStarts","b","findPlaylistWithName","playlists","getMediaGroupPlaylists","mediaGroupPlaylists","properties","group","label","updateMediaSequenceForPlaylist","mediaSequence","updateSequenceNumbers","oldPlaylists","newPlaylists","oldPlaylist","firstNewSegment","oldMatchingSegmentIndex","oldSegment","positionManifestOnTimeline","oldManifest","newManifest","generateSidxKey","mergeDiscontiguousPlaylists","playlistsByBaseUrl","cur","allPlaylists","playlistGroup","mergedPlaylists","addSidxSegmentsToPlaylist","sidxMapping","sidxKey","sidxMatch","addSidxSegmentsToPlaylists","formatAudioPlaylist","discontinuitySequence","discontinuityStarts","isAudioOnly","formatVttPlaylist","m3u8Attributes","vttPlaylist","organizeAudioPlaylists","mainPlaylist","formattedPlaylists","role","language","roleLabel","formatted","firstLabel","organizeVttPlaylists","organizeCaptionServices","captionServices","svcObj","svc","service","channel","formatVideoPlaylist","videoOnly","audioOnly","vttOnly","addMediaSequenceValues","flattenMediaGroupPlaylists","mediaGroupObject","labelContents","toM3u8","dashPlaylists","locations","contentSteering","previousManifest","eventStream","suggestedPresentationDelay","videoPlaylists","audioPlaylists","vttPlaylists","captions","organizedAudioGroup","organizedVttGroup","playlistTimelineStarts","getLiveRValue","time","parseByTimeline","segmentTimeline","media","sIndex","S","repeat","segmentTime","nextS","identifierPattern","identifierReplacement","format","width","constructTemplateUrl","url","parseTemplateInfo","segmentsFromTemplate","templateValues","mapSegment","presentationTimeOffset","SegmentURLToSegmentObject","segmentUrl","segmentsFromList","segmentUrls","segmentUrlMap","segmentUrlObject","generateSegments","segmentInfo","segmentAttributes","segmentsFn","segmentsInfo","max","toPlaylists","representations","findChildren","getContent","parseDivisionValue","prev","parseDuration","year","month","day","hour","minute","second","parseDate","parsers","parsedValue","parseFn","keySystemsMap","buildBaseUrls","references","baseUrlElements","baseUrlElement","initialBaseUrl","resolvedBaseUrl","finalBaseUrl","getSegmentInformation","adaptationSet","segmentTemplate","segmentList","segmentBase","segmentTimelineParentNode","segmentInitializationParentNode","segmentInitialization","template","inheritBaseUrls","adaptationSetAttributes","adaptationSetBaseUrls","adaptationSetSegmentInfo","representation","repBaseUrlElements","repBaseUrls","representationSegmentInfo","generateKeySystemInformation","contentProtectionNodes","keySystem","psshNode","pssh","parseCaptionServiceMetadata","flags","opt","toEventStream","period","eventStreamAttributes","schemeIdUri","eventAttributes","toRepresentations","periodAttributes","periodBaseUrls","periodSegmentInfo","roleAttributes","accessibility","labelVal","contentProtection","toAdaptationSets","mpdAttributes","mpdBaseUrls","adaptationSets","generateContentSteeringInformation","contentSteeringNodes","eventHandler","infoFromContentSteeringTag","getPeriodStart","priorPeriodAttributes","mpdType","inheritAttributes","mpd","manifestUri","periodNodes","periods","priorPeriod","stringToMpdXml","manifestString","parser","xml","parseUTCTimingScheme","UTCTimingNode","parsedManifestInfo","parseUTCTiming"],"mappings":"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","x_google_ignoreList":[0,1,2,3,4,5,6,7,8,9,10]}