// GENERATED FILE. DO NOT EDIT.
var utf8Codec = (function(exports) {
  "use strict";
  
  Object.defineProperty(exports, "__esModule", {
    value: true
  });
  exports.decode = decode;
  exports.encode = encode;
  exports.encodingLength = encodingLength;
  exports.name = void 0;
  const SURROGATE_A = 0b1101100000000000;
  const SURROGATE_B = 0b1101110000000000;
  const name = 'utf8';
  exports.name = name;
  
  function encodingLength(str) {
    let len = 0;
    const strLen = str.length;
  
    for (let i = 0; i < strLen; i += 1) {
      const code = str.charCodeAt(i);
  
      if (code <= 0x7F) {
        len += 1;
      } else if (code <= 0x07FF) {
        len += 2;
      } else if ((code & 0xF800) !== SURROGATE_A) {
        len += 3;
      } else {
        const next = i + 1;
  
        if (next === strLen || code >= SURROGATE_B) {
          len += 3;
        } else {
          const nextCode = str.charCodeAt(next);
  
          if ((nextCode & 0xFC00) !== SURROGATE_B) {
            len += 3;
          } else {
            i = next;
            len += 4;
          }
        }
      }
    }
  
    return len;
  }
  
  function encode(str, buf, offset) {
    const strLen = str.length;
  
    if (offset === undefined || offset === null) {
      offset = 0;
    }
  
    if (buf === undefined) {
      buf = new Uint8Array(encodingLength(str) + offset);
    }
  
    let off = offset;
  
    for (let i = 0; i < strLen; i += 1) {
      let code = str.charCodeAt(i);
  
      if (code <= 0x7F) {
        buf[off++] = code;
      } else if (code <= 0x07FF) {
        buf[off++] = 0b11000000 | (code & 0b11111000000) >> 6;
        buf[off++] = 0b10000000 | code & 0b00000111111;
      } else if ((code & 0xF800) !== SURROGATE_A) {
        buf[off++] = 0b11100000 | (code & 0b1111000000000000) >> 12;
        buf[off++] = 0b10000000 | (code & 0b0000111111000000) >> 6;
        buf[off++] = 0b10000000 | code & 0b0000000000111111;
      } else {
        const next = i + 1;
  
        if (next === strLen || code >= SURROGATE_B) {
          // Incorrectly started surrogate pair
          buf[off++] = 0xef;
          buf[off++] = 0xbf;
          buf[off++] = 0xbd;
        } else {
          const nextCode = str.charCodeAt(next);
  
          if ((nextCode & 0xFC00) !== SURROGATE_B) {
            // Incorrect surrogate pair
            buf[off++] = 0xef;
            buf[off++] = 0xbf;
            buf[off++] = 0xbd;
          } else {
            i = next;
            code = 0b000010000000000000000 | (code & 0b1111111111) << 10 | nextCode & 0b1111111111;
            buf[off++] = 0b11110000 | (code & 0b111000000000000000000) >> 18;
            buf[off++] = 0b10000000 | (code & 0b000111111000000000000) >> 12;
            buf[off++] = 0b10000000 | (code & 0b000000000111111000000) >> 6;
            buf[off++] = 0b10000000 | code & 0b000000000000000111111;
          }
        }
      }
    }
  
    encode.bytes = off - offset;
    return buf;
  }
  
  encode.bytes = 0;
  
  function decode(buf, start, end) {
    let result = '';
  
    if (start === undefined || start === null) {
      start = 0;
    }
  
    if (end === undefined || end === null) {
      end = buf.length;
    }
  
    for (let offset = start; offset < end;) {
      const code = buf[offset++];
      let num;
  
      if (code <= 128) {
        num = code;
      } else if (code > 191 && code < 224) {
        num = (code & 0b11111) << 6 | buf[offset++] & 0b111111;
      } else if (code > 239 && code < 365) {
        num = ((code & 0b111) << 18 | (buf[offset++] & 0b111111) << 12 | (buf[offset++] & 0b111111) << 6 | buf[offset++] & 0b111111) - 0x10000;
        const numA = SURROGATE_A | num >> 10 & 0b1111111111;
        result += String.fromCharCode(numA);
        num = SURROGATE_B | num & 0b1111111111;
      } else {
        num = (code & 0b1111) << 12 | (buf[offset++] & 0b111111) << 6 | buf[offset++] & 0b111111;
      }
  
      result += String.fromCharCode(num);
    }
  
    decode.bytes = end - start;
    return result;
  }
  
  decode.bytes = 0;
  return "default" in exports ? exports.default : exports;
})({});
if (typeof define === 'function' && define.amd) define([], function() { return utf8Codec; });
else if (typeof module === 'object' && typeof exports==='object') module.exports = utf8Codec;
