You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@unomi.apache.org by jk...@apache.org on 2023/03/31 09:23:38 UTC

[unomi] 02/02: fix cherry-pick

This is an automated email from the ASF dual-hosted git repository.

jkevan pushed a commit to branch backport-UNOMI-758
in repository https://gitbox.apache.org/repos/asf/unomi.git

commit edff92fde5578016a62f0483c1d48264cd7e1375
Author: Kevan <ke...@jahia.com>
AuthorDate: Fri Mar 31 11:23:21 2023 +0200

    fix cherry-pick
---
 .../web-tracker/wab/dist/unomi-web-tracker.js      | 3867 --------------------
 .../web-tracker/wab/dist/unomi-web-tracker.js.map  |    1 -
 .../web-tracker/wab/dist/unomi-web-tracker.min.js  |    1 -
 3 files changed, 3869 deletions(-)

diff --git a/extensions/web-tracker/wab/dist/unomi-web-tracker.js b/extensions/web-tracker/wab/dist/unomi-web-tracker.js
deleted file mode 100644
index 334517d2b..000000000
--- a/extensions/web-tracker/wab/dist/unomi-web-tracker.js
+++ /dev/null
@@ -1,3867 +0,0 @@
-(function () {
-  'use strict';
-
-  function _typeof(obj) {
-    "@babel/helpers - typeof";
-
-    return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) {
-      return typeof obj;
-    } : function (obj) {
-      return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj;
-    }, _typeof(obj);
-  }
-
-  var global$1 = (typeof global !== "undefined" ? global :
-    typeof self !== "undefined" ? self :
-    typeof window !== "undefined" ? window : {});
-
-  var lookup = [];
-  var revLookup = [];
-  var Arr = typeof Uint8Array !== 'undefined' ? Uint8Array : Array;
-  var inited = false;
-  function init () {
-    inited = true;
-    var code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
-    for (var i = 0, len = code.length; i < len; ++i) {
-      lookup[i] = code[i];
-      revLookup[code.charCodeAt(i)] = i;
-    }
-
-    revLookup['-'.charCodeAt(0)] = 62;
-    revLookup['_'.charCodeAt(0)] = 63;
-  }
-
-  function toByteArray (b64) {
-    if (!inited) {
-      init();
-    }
-    var i, j, l, tmp, placeHolders, arr;
-    var len = b64.length;
-
-    if (len % 4 > 0) {
-      throw new Error('Invalid string. Length must be a multiple of 4')
-    }
-
-    // the number of equal signs (place holders)
-    // if there are two placeholders, than the two characters before it
-    // represent one byte
-    // if there is only one, then the three characters before it represent 2 bytes
-    // this is just a cheap hack to not do indexOf twice
-    placeHolders = b64[len - 2] === '=' ? 2 : b64[len - 1] === '=' ? 1 : 0;
-
-    // base64 is 4/3 + up to two characters of the original data
-    arr = new Arr(len * 3 / 4 - placeHolders);
-
-    // if there are placeholders, only get up to the last complete 4 chars
-    l = placeHolders > 0 ? len - 4 : len;
-
-    var L = 0;
-
-    for (i = 0, j = 0; i < l; i += 4, j += 3) {
-      tmp = (revLookup[b64.charCodeAt(i)] << 18) | (revLookup[b64.charCodeAt(i + 1)] << 12) | (revLookup[b64.charCodeAt(i + 2)] << 6) | revLookup[b64.charCodeAt(i + 3)];
-      arr[L++] = (tmp >> 16) & 0xFF;
-      arr[L++] = (tmp >> 8) & 0xFF;
-      arr[L++] = tmp & 0xFF;
-    }
-
-    if (placeHolders === 2) {
-      tmp = (revLookup[b64.charCodeAt(i)] << 2) | (revLookup[b64.charCodeAt(i + 1)] >> 4);
-      arr[L++] = tmp & 0xFF;
-    } else if (placeHolders === 1) {
-      tmp = (revLookup[b64.charCodeAt(i)] << 10) | (revLookup[b64.charCodeAt(i + 1)] << 4) | (revLookup[b64.charCodeAt(i + 2)] >> 2);
-      arr[L++] = (tmp >> 8) & 0xFF;
-      arr[L++] = tmp & 0xFF;
-    }
-
-    return arr
-  }
-
-  function tripletToBase64 (num) {
-    return lookup[num >> 18 & 0x3F] + lookup[num >> 12 & 0x3F] + lookup[num >> 6 & 0x3F] + lookup[num & 0x3F]
-  }
-
-  function encodeChunk (uint8, start, end) {
-    var tmp;
-    var output = [];
-    for (var i = start; i < end; i += 3) {
-      tmp = (uint8[i] << 16) + (uint8[i + 1] << 8) + (uint8[i + 2]);
-      output.push(tripletToBase64(tmp));
-    }
-    return output.join('')
-  }
-
-  function fromByteArray (uint8) {
-    if (!inited) {
-      init();
-    }
-    var tmp;
-    var len = uint8.length;
-    var extraBytes = len % 3; // if we have 1 byte left, pad 2 bytes
-    var output = '';
-    var parts = [];
-    var maxChunkLength = 16383; // must be multiple of 3
-
-    // go through the array every three bytes, we'll deal with trailing stuff later
-    for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) {
-      parts.push(encodeChunk(uint8, i, (i + maxChunkLength) > len2 ? len2 : (i + maxChunkLength)));
-    }
-
-    // pad the end with zeros, but make sure to not forget the extra bytes
-    if (extraBytes === 1) {
-      tmp = uint8[len - 1];
-      output += lookup[tmp >> 2];
-      output += lookup[(tmp << 4) & 0x3F];
-      output += '==';
-    } else if (extraBytes === 2) {
-      tmp = (uint8[len - 2] << 8) + (uint8[len - 1]);
-      output += lookup[tmp >> 10];
-      output += lookup[(tmp >> 4) & 0x3F];
-      output += lookup[(tmp << 2) & 0x3F];
-      output += '=';
-    }
-
-    parts.push(output);
-
-    return parts.join('')
-  }
-
-  function read (buffer, offset, isLE, mLen, nBytes) {
-    var e, m;
-    var eLen = nBytes * 8 - mLen - 1;
-    var eMax = (1 << eLen) - 1;
-    var eBias = eMax >> 1;
-    var nBits = -7;
-    var i = isLE ? (nBytes - 1) : 0;
-    var d = isLE ? -1 : 1;
-    var s = buffer[offset + i];
-
-    i += d;
-
-    e = s & ((1 << (-nBits)) - 1);
-    s >>= (-nBits);
-    nBits += eLen;
-    for (; nBits > 0; e = e * 256 + buffer[offset + i], i += d, nBits -= 8) {}
-
-    m = e & ((1 << (-nBits)) - 1);
-    e >>= (-nBits);
-    nBits += mLen;
-    for (; nBits > 0; m = m * 256 + buffer[offset + i], i += d, nBits -= 8) {}
-
-    if (e === 0) {
-      e = 1 - eBias;
-    } else if (e === eMax) {
-      return m ? NaN : ((s ? -1 : 1) * Infinity)
-    } else {
-      m = m + Math.pow(2, mLen);
-      e = e - eBias;
-    }
-    return (s ? -1 : 1) * m * Math.pow(2, e - mLen)
-  }
-
-  function write (buffer, value, offset, isLE, mLen, nBytes) {
-    var e, m, c;
-    var eLen = nBytes * 8 - mLen - 1;
-    var eMax = (1 << eLen) - 1;
-    var eBias = eMax >> 1;
-    var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0);
-    var i = isLE ? 0 : (nBytes - 1);
-    var d = isLE ? 1 : -1;
-    var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0;
-
-    value = Math.abs(value);
-
-    if (isNaN(value) || value === Infinity) {
-      m = isNaN(value) ? 1 : 0;
-      e = eMax;
-    } else {
-      e = Math.floor(Math.log(value) / Math.LN2);
-      if (value * (c = Math.pow(2, -e)) < 1) {
-        e--;
-        c *= 2;
-      }
-      if (e + eBias >= 1) {
-        value += rt / c;
-      } else {
-        value += rt * Math.pow(2, 1 - eBias);
-      }
-      if (value * c >= 2) {
-        e++;
-        c /= 2;
-      }
-
-      if (e + eBias >= eMax) {
-        m = 0;
-        e = eMax;
-      } else if (e + eBias >= 1) {
-        m = (value * c - 1) * Math.pow(2, mLen);
-        e = e + eBias;
-      } else {
-        m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen);
-        e = 0;
-      }
-    }
-
-    for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {}
-
-    e = (e << mLen) | m;
-    eLen += mLen;
-    for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {}
-
-    buffer[offset + i - d] |= s * 128;
-  }
-
-  var toString = {}.toString;
-
-  var isArray = Array.isArray || function (arr) {
-    return toString.call(arr) == '[object Array]';
-  };
-
-  /*!
-   * The buffer module from node.js, for the browser.
-   *
-   * @author   Feross Aboukhadijeh <fe...@feross.org> <http://feross.org>
-   * @license  MIT
-   */
-
-  var INSPECT_MAX_BYTES = 50;
-
-  /**
-   * If `Buffer.TYPED_ARRAY_SUPPORT`:
-   *   === true    Use Uint8Array implementation (fastest)
-   *   === false   Use Object implementation (most compatible, even IE6)
-   *
-   * Browsers that support typed arrays are IE 10+, Firefox 4+, Chrome 7+, Safari 5.1+,
-   * Opera 11.6+, iOS 4.2+.
-   *
-   * Due to various browser bugs, sometimes the Object implementation will be used even
-   * when the browser supports typed arrays.
-   *
-   * Note:
-   *
-   *   - Firefox 4-29 lacks support for adding new properties to `Uint8Array` instances,
-   *     See: https://bugzilla.mozilla.org/show_bug.cgi?id=695438.
-   *
-   *   - Chrome 9-10 is missing the `TypedArray.prototype.subarray` function.
-   *
-   *   - IE10 has a broken `TypedArray.prototype.subarray` function which returns arrays of
-   *     incorrect length in some situations.
-
-   * We detect these buggy browsers and set `Buffer.TYPED_ARRAY_SUPPORT` to `false` so they
-   * get the Object implementation, which is slower but behaves correctly.
-   */
-  Buffer.TYPED_ARRAY_SUPPORT = global$1.TYPED_ARRAY_SUPPORT !== undefined
-    ? global$1.TYPED_ARRAY_SUPPORT
-    : true;
-
-  /*
-   * Export kMaxLength after typed array support is determined.
-   */
-  kMaxLength();
-
-  function kMaxLength () {
-    return Buffer.TYPED_ARRAY_SUPPORT
-      ? 0x7fffffff
-      : 0x3fffffff
-  }
-
-  function createBuffer (that, length) {
-    if (kMaxLength() < length) {
-      throw new RangeError('Invalid typed array length')
-    }
-    if (Buffer.TYPED_ARRAY_SUPPORT) {
-      // Return an augmented `Uint8Array` instance, for best performance
-      that = new Uint8Array(length);
-      that.__proto__ = Buffer.prototype;
-    } else {
-      // Fallback: Return an object instance of the Buffer class
-      if (that === null) {
-        that = new Buffer(length);
-      }
-      that.length = length;
-    }
-
-    return that
-  }
-
-  /**
-   * The Buffer constructor returns instances of `Uint8Array` that have their
-   * prototype changed to `Buffer.prototype`. Furthermore, `Buffer` is a subclass of
-   * `Uint8Array`, so the returned instances will have all the node `Buffer` methods
-   * and the `Uint8Array` methods. Square bracket notation works as expected -- it
-   * returns a single octet.
-   *
-   * The `Uint8Array` prototype remains unmodified.
-   */
-
-  function Buffer (arg, encodingOrOffset, length) {
-    if (!Buffer.TYPED_ARRAY_SUPPORT && !(this instanceof Buffer)) {
-      return new Buffer(arg, encodingOrOffset, length)
-    }
-
-    // Common case.
-    if (typeof arg === 'number') {
-      if (typeof encodingOrOffset === 'string') {
-        throw new Error(
-          'If encoding is specified then the first argument must be a string'
-        )
-      }
-      return allocUnsafe(this, arg)
-    }
-    return from(this, arg, encodingOrOffset, length)
-  }
-
-  Buffer.poolSize = 8192; // not used by this implementation
-
-  // TODO: Legacy, not needed anymore. Remove in next major version.
-  Buffer._augment = function (arr) {
-    arr.__proto__ = Buffer.prototype;
-    return arr
-  };
-
-  function from (that, value, encodingOrOffset, length) {
-    if (typeof value === 'number') {
-      throw new TypeError('"value" argument must not be a number')
-    }
-
-    if (typeof ArrayBuffer !== 'undefined' && value instanceof ArrayBuffer) {
-      return fromArrayBuffer(that, value, encodingOrOffset, length)
-    }
-
-    if (typeof value === 'string') {
-      return fromString(that, value, encodingOrOffset)
-    }
-
-    return fromObject(that, value)
-  }
-
-  /**
-   * Functionally equivalent to Buffer(arg, encoding) but throws a TypeError
-   * if value is a number.
-   * Buffer.from(str[, encoding])
-   * Buffer.from(array)
-   * Buffer.from(buffer)
-   * Buffer.from(arrayBuffer[, byteOffset[, length]])
-   **/
-  Buffer.from = function (value, encodingOrOffset, length) {
-    return from(null, value, encodingOrOffset, length)
-  };
-
-  if (Buffer.TYPED_ARRAY_SUPPORT) {
-    Buffer.prototype.__proto__ = Uint8Array.prototype;
-    Buffer.__proto__ = Uint8Array;
-  }
-
-  function assertSize (size) {
-    if (typeof size !== 'number') {
-      throw new TypeError('"size" argument must be a number')
-    } else if (size < 0) {
-      throw new RangeError('"size" argument must not be negative')
-    }
-  }
-
-  function alloc (that, size, fill, encoding) {
-    assertSize(size);
-    if (size <= 0) {
-      return createBuffer(that, size)
-    }
-    if (fill !== undefined) {
-      // Only pay attention to encoding if it's a string. This
-      // prevents accidentally sending in a number that would
-      // be interpretted as a start offset.
-      return typeof encoding === 'string'
-        ? createBuffer(that, size).fill(fill, encoding)
-        : createBuffer(that, size).fill(fill)
-    }
-    return createBuffer(that, size)
-  }
-
-  /**
-   * Creates a new filled Buffer instance.
-   * alloc(size[, fill[, encoding]])
-   **/
-  Buffer.alloc = function (size, fill, encoding) {
-    return alloc(null, size, fill, encoding)
-  };
-
-  function allocUnsafe (that, size) {
-    assertSize(size);
-    that = createBuffer(that, size < 0 ? 0 : checked(size) | 0);
-    if (!Buffer.TYPED_ARRAY_SUPPORT) {
-      for (var i = 0; i < size; ++i) {
-        that[i] = 0;
-      }
-    }
-    return that
-  }
-
-  /**
-   * Equivalent to Buffer(num), by default creates a non-zero-filled Buffer instance.
-   * */
-  Buffer.allocUnsafe = function (size) {
-    return allocUnsafe(null, size)
-  };
-  /**
-   * Equivalent to SlowBuffer(num), by default creates a non-zero-filled Buffer instance.
-   */
-  Buffer.allocUnsafeSlow = function (size) {
-    return allocUnsafe(null, size)
-  };
-
-  function fromString (that, string, encoding) {
-    if (typeof encoding !== 'string' || encoding === '') {
-      encoding = 'utf8';
-    }
-
-    if (!Buffer.isEncoding(encoding)) {
-      throw new TypeError('"encoding" must be a valid string encoding')
-    }
-
-    var length = byteLength(string, encoding) | 0;
-    that = createBuffer(that, length);
-
-    var actual = that.write(string, encoding);
-
-    if (actual !== length) {
-      // Writing a hex string, for example, that contains invalid characters will
-      // cause everything after the first invalid character to be ignored. (e.g.
-      // 'abxxcd' will be treated as 'ab')
-      that = that.slice(0, actual);
-    }
-
-    return that
-  }
-
-  function fromArrayLike (that, array) {
-    var length = array.length < 0 ? 0 : checked(array.length) | 0;
-    that = createBuffer(that, length);
-    for (var i = 0; i < length; i += 1) {
-      that[i] = array[i] & 255;
-    }
-    return that
-  }
-
-  function fromArrayBuffer (that, array, byteOffset, length) {
-    array.byteLength; // this throws if `array` is not a valid ArrayBuffer
-
-    if (byteOffset < 0 || array.byteLength < byteOffset) {
-      throw new RangeError('\'offset\' is out of bounds')
-    }
-
-    if (array.byteLength < byteOffset + (length || 0)) {
-      throw new RangeError('\'length\' is out of bounds')
-    }
-
-    if (byteOffset === undefined && length === undefined) {
-      array = new Uint8Array(array);
-    } else if (length === undefined) {
-      array = new Uint8Array(array, byteOffset);
-    } else {
-      array = new Uint8Array(array, byteOffset, length);
-    }
-
-    if (Buffer.TYPED_ARRAY_SUPPORT) {
-      // Return an augmented `Uint8Array` instance, for best performance
-      that = array;
-      that.__proto__ = Buffer.prototype;
-    } else {
-      // Fallback: Return an object instance of the Buffer class
-      that = fromArrayLike(that, array);
-    }
-    return that
-  }
-
-  function fromObject (that, obj) {
-    if (internalIsBuffer(obj)) {
-      var len = checked(obj.length) | 0;
-      that = createBuffer(that, len);
-
-      if (that.length === 0) {
-        return that
-      }
-
-      obj.copy(that, 0, 0, len);
-      return that
-    }
-
-    if (obj) {
-      if ((typeof ArrayBuffer !== 'undefined' &&
-          obj.buffer instanceof ArrayBuffer) || 'length' in obj) {
-        if (typeof obj.length !== 'number' || isnan(obj.length)) {
-          return createBuffer(that, 0)
-        }
-        return fromArrayLike(that, obj)
-      }
-
-      if (obj.type === 'Buffer' && isArray(obj.data)) {
-        return fromArrayLike(that, obj.data)
-      }
-    }
-
-    throw new TypeError('First argument must be a string, Buffer, ArrayBuffer, Array, or array-like object.')
-  }
-
-  function checked (length) {
-    // Note: cannot use `length < kMaxLength()` here because that fails when
-    // length is NaN (which is otherwise coerced to zero.)
-    if (length >= kMaxLength()) {
-      throw new RangeError('Attempt to allocate Buffer larger than maximum ' +
-                           'size: 0x' + kMaxLength().toString(16) + ' bytes')
-    }
-    return length | 0
-  }
-  Buffer.isBuffer = isBuffer;
-  function internalIsBuffer (b) {
-    return !!(b != null && b._isBuffer)
-  }
-
-  Buffer.compare = function compare (a, b) {
-    if (!internalIsBuffer(a) || !internalIsBuffer(b)) {
-      throw new TypeError('Arguments must be Buffers')
-    }
-
-    if (a === b) return 0
-
-    var x = a.length;
-    var y = b.length;
-
-    for (var i = 0, len = Math.min(x, y); i < len; ++i) {
-      if (a[i] !== b[i]) {
-        x = a[i];
-        y = b[i];
-        break
-      }
-    }
-
-    if (x < y) return -1
-    if (y < x) return 1
-    return 0
-  };
-
-  Buffer.isEncoding = function isEncoding (encoding) {
-    switch (String(encoding).toLowerCase()) {
-      case 'hex':
-      case 'utf8':
-      case 'utf-8':
-      case 'ascii':
-      case 'latin1':
-      case 'binary':
-      case 'base64':
-      case 'ucs2':
-      case 'ucs-2':
-      case 'utf16le':
-      case 'utf-16le':
-        return true
-      default:
-        return false
-    }
-  };
-
-  Buffer.concat = function concat (list, length) {
-    if (!isArray(list)) {
-      throw new TypeError('"list" argument must be an Array of Buffers')
-    }
-
-    if (list.length === 0) {
-      return Buffer.alloc(0)
-    }
-
-    var i;
-    if (length === undefined) {
-      length = 0;
-      for (i = 0; i < list.length; ++i) {
-        length += list[i].length;
-      }
-    }
-
-    var buffer = Buffer.allocUnsafe(length);
-    var pos = 0;
-    for (i = 0; i < list.length; ++i) {
-      var buf = list[i];
-      if (!internalIsBuffer(buf)) {
-        throw new TypeError('"list" argument must be an Array of Buffers')
-      }
-      buf.copy(buffer, pos);
-      pos += buf.length;
-    }
-    return buffer
-  };
-
-  function byteLength (string, encoding) {
-    if (internalIsBuffer(string)) {
-      return string.length
-    }
-    if (typeof ArrayBuffer !== 'undefined' && typeof ArrayBuffer.isView === 'function' &&
-        (ArrayBuffer.isView(string) || string instanceof ArrayBuffer)) {
-      return string.byteLength
-    }
-    if (typeof string !== 'string') {
-      string = '' + string;
-    }
-
-    var len = string.length;
-    if (len === 0) return 0
-
-    // Use a for loop to avoid recursion
-    var loweredCase = false;
-    for (;;) {
-      switch (encoding) {
-        case 'ascii':
-        case 'latin1':
-        case 'binary':
-          return len
-        case 'utf8':
-        case 'utf-8':
-        case undefined:
-          return utf8ToBytes(string).length
-        case 'ucs2':
-        case 'ucs-2':
-        case 'utf16le':
-        case 'utf-16le':
-          return len * 2
-        case 'hex':
-          return len >>> 1
-        case 'base64':
-          return base64ToBytes(string).length
-        default:
-          if (loweredCase) return utf8ToBytes(string).length // assume utf8
-          encoding = ('' + encoding).toLowerCase();
-          loweredCase = true;
-      }
-    }
-  }
-  Buffer.byteLength = byteLength;
-
-  function slowToString (encoding, start, end) {
-    var loweredCase = false;
-
-    // No need to verify that "this.length <= MAX_UINT32" since it's a read-only
-    // property of a typed array.
-
-    // This behaves neither like String nor Uint8Array in that we set start/end
-    // to their upper/lower bounds if the value passed is out of range.
-    // undefined is handled specially as per ECMA-262 6th Edition,
-    // Section 13.3.3.7 Runtime Semantics: KeyedBindingInitialization.
-    if (start === undefined || start < 0) {
-      start = 0;
-    }
-    // Return early if start > this.length. Done here to prevent potential uint32
-    // coercion fail below.
-    if (start > this.length) {
-      return ''
-    }
-
-    if (end === undefined || end > this.length) {
-      end = this.length;
-    }
-
-    if (end <= 0) {
-      return ''
-    }
-
-    // Force coersion to uint32. This will also coerce falsey/NaN values to 0.
-    end >>>= 0;
-    start >>>= 0;
-
-    if (end <= start) {
-      return ''
-    }
-
-    if (!encoding) encoding = 'utf8';
-
-    while (true) {
-      switch (encoding) {
-        case 'hex':
-          return hexSlice(this, start, end)
-
-        case 'utf8':
-        case 'utf-8':
-          return utf8Slice(this, start, end)
-
-        case 'ascii':
-          return asciiSlice(this, start, end)
-
-        case 'latin1':
-        case 'binary':
-          return latin1Slice(this, start, end)
-
-        case 'base64':
-          return base64Slice(this, start, end)
-
-        case 'ucs2':
-        case 'ucs-2':
-        case 'utf16le':
-        case 'utf-16le':
-          return utf16leSlice(this, start, end)
-
-        default:
-          if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)
-          encoding = (encoding + '').toLowerCase();
-          loweredCase = true;
-      }
-    }
-  }
-
-  // The property is used by `Buffer.isBuffer` and `is-buffer` (in Safari 5-7) to detect
-  // Buffer instances.
-  Buffer.prototype._isBuffer = true;
-
-  function swap (b, n, m) {
-    var i = b[n];
-    b[n] = b[m];
-    b[m] = i;
-  }
-
-  Buffer.prototype.swap16 = function swap16 () {
-    var len = this.length;
-    if (len % 2 !== 0) {
-      throw new RangeError('Buffer size must be a multiple of 16-bits')
-    }
-    for (var i = 0; i < len; i += 2) {
-      swap(this, i, i + 1);
-    }
-    return this
-  };
-
-  Buffer.prototype.swap32 = function swap32 () {
-    var len = this.length;
-    if (len % 4 !== 0) {
-      throw new RangeError('Buffer size must be a multiple of 32-bits')
-    }
-    for (var i = 0; i < len; i += 4) {
-      swap(this, i, i + 3);
-      swap(this, i + 1, i + 2);
-    }
-    return this
-  };
-
-  Buffer.prototype.swap64 = function swap64 () {
-    var len = this.length;
-    if (len % 8 !== 0) {
-      throw new RangeError('Buffer size must be a multiple of 64-bits')
-    }
-    for (var i = 0; i < len; i += 8) {
-      swap(this, i, i + 7);
-      swap(this, i + 1, i + 6);
-      swap(this, i + 2, i + 5);
-      swap(this, i + 3, i + 4);
-    }
-    return this
-  };
-
-  Buffer.prototype.toString = function toString () {
-    var length = this.length | 0;
-    if (length === 0) return ''
-    if (arguments.length === 0) return utf8Slice(this, 0, length)
-    return slowToString.apply(this, arguments)
-  };
-
-  Buffer.prototype.equals = function equals (b) {
-    if (!internalIsBuffer(b)) throw new TypeError('Argument must be a Buffer')
-    if (this === b) return true
-    return Buffer.compare(this, b) === 0
-  };
-
-  Buffer.prototype.inspect = function inspect () {
-    var str = '';
-    var max = INSPECT_MAX_BYTES;
-    if (this.length > 0) {
-      str = this.toString('hex', 0, max).match(/.{2}/g).join(' ');
-      if (this.length > max) str += ' ... ';
-    }
-    return '<Buffer ' + str + '>'
-  };
-
-  Buffer.prototype.compare = function compare (target, start, end, thisStart, thisEnd) {
-    if (!internalIsBuffer(target)) {
-      throw new TypeError('Argument must be a Buffer')
-    }
-
-    if (start === undefined) {
-      start = 0;
-    }
-    if (end === undefined) {
-      end = target ? target.length : 0;
-    }
-    if (thisStart === undefined) {
-      thisStart = 0;
-    }
-    if (thisEnd === undefined) {
-      thisEnd = this.length;
-    }
-
-    if (start < 0 || end > target.length || thisStart < 0 || thisEnd > this.length) {
-      throw new RangeError('out of range index')
-    }
-
-    if (thisStart >= thisEnd && start >= end) {
-      return 0
-    }
-    if (thisStart >= thisEnd) {
-      return -1
-    }
-    if (start >= end) {
-      return 1
-    }
-
-    start >>>= 0;
-    end >>>= 0;
-    thisStart >>>= 0;
-    thisEnd >>>= 0;
-
-    if (this === target) return 0
-
-    var x = thisEnd - thisStart;
-    var y = end - start;
-    var len = Math.min(x, y);
-
-    var thisCopy = this.slice(thisStart, thisEnd);
-    var targetCopy = target.slice(start, end);
-
-    for (var i = 0; i < len; ++i) {
-      if (thisCopy[i] !== targetCopy[i]) {
-        x = thisCopy[i];
-        y = targetCopy[i];
-        break
-      }
-    }
-
-    if (x < y) return -1
-    if (y < x) return 1
-    return 0
-  };
-
-  // Finds either the first index of `val` in `buffer` at offset >= `byteOffset`,
-  // OR the last index of `val` in `buffer` at offset <= `byteOffset`.
-  //
-  // Arguments:
-  // - buffer - a Buffer to search
-  // - val - a string, Buffer, or number
-  // - byteOffset - an index into `buffer`; will be clamped to an int32
-  // - encoding - an optional encoding, relevant is val is a string
-  // - dir - true for indexOf, false for lastIndexOf
-  function bidirectionalIndexOf (buffer, val, byteOffset, encoding, dir) {
-    // Empty buffer means no match
-    if (buffer.length === 0) return -1
-
-    // Normalize byteOffset
-    if (typeof byteOffset === 'string') {
-      encoding = byteOffset;
-      byteOffset = 0;
-    } else if (byteOffset > 0x7fffffff) {
-      byteOffset = 0x7fffffff;
-    } else if (byteOffset < -0x80000000) {
-      byteOffset = -0x80000000;
-    }
-    byteOffset = +byteOffset;  // Coerce to Number.
-    if (isNaN(byteOffset)) {
-      // byteOffset: it it's undefined, null, NaN, "foo", etc, search whole buffer
-      byteOffset = dir ? 0 : (buffer.length - 1);
-    }
-
-    // Normalize byteOffset: negative offsets start from the end of the buffer
-    if (byteOffset < 0) byteOffset = buffer.length + byteOffset;
-    if (byteOffset >= buffer.length) {
-      if (dir) return -1
-      else byteOffset = buffer.length - 1;
-    } else if (byteOffset < 0) {
-      if (dir) byteOffset = 0;
-      else return -1
-    }
-
-    // Normalize val
-    if (typeof val === 'string') {
-      val = Buffer.from(val, encoding);
-    }
-
-    // Finally, search either indexOf (if dir is true) or lastIndexOf
-    if (internalIsBuffer(val)) {
-      // Special case: looking for empty string/buffer always fails
-      if (val.length === 0) {
-        return -1
-      }
-      return arrayIndexOf(buffer, val, byteOffset, encoding, dir)
-    } else if (typeof val === 'number') {
-      val = val & 0xFF; // Search for a byte value [0-255]
-      if (Buffer.TYPED_ARRAY_SUPPORT &&
-          typeof Uint8Array.prototype.indexOf === 'function') {
-        if (dir) {
-          return Uint8Array.prototype.indexOf.call(buffer, val, byteOffset)
-        } else {
-          return Uint8Array.prototype.lastIndexOf.call(buffer, val, byteOffset)
-        }
-      }
-      return arrayIndexOf(buffer, [ val ], byteOffset, encoding, dir)
-    }
-
-    throw new TypeError('val must be string, number or Buffer')
-  }
-
-  function arrayIndexOf (arr, val, byteOffset, encoding, dir) {
-    var indexSize = 1;
-    var arrLength = arr.length;
-    var valLength = val.length;
-
-    if (encoding !== undefined) {
-      encoding = String(encoding).toLowerCase();
-      if (encoding === 'ucs2' || encoding === 'ucs-2' ||
-          encoding === 'utf16le' || encoding === 'utf-16le') {
-        if (arr.length < 2 || val.length < 2) {
-          return -1
-        }
-        indexSize = 2;
-        arrLength /= 2;
-        valLength /= 2;
-        byteOffset /= 2;
-      }
-    }
-
-    function read (buf, i) {
-      if (indexSize === 1) {
-        return buf[i]
-      } else {
-        return buf.readUInt16BE(i * indexSize)
-      }
-    }
-
-    var i;
-    if (dir) {
-      var foundIndex = -1;
-      for (i = byteOffset; i < arrLength; i++) {
-        if (read(arr, i) === read(val, foundIndex === -1 ? 0 : i - foundIndex)) {
-          if (foundIndex === -1) foundIndex = i;
-          if (i - foundIndex + 1 === valLength) return foundIndex * indexSize
-        } else {
-          if (foundIndex !== -1) i -= i - foundIndex;
-          foundIndex = -1;
-        }
-      }
-    } else {
-      if (byteOffset + valLength > arrLength) byteOffset = arrLength - valLength;
-      for (i = byteOffset; i >= 0; i--) {
-        var found = true;
-        for (var j = 0; j < valLength; j++) {
-          if (read(arr, i + j) !== read(val, j)) {
-            found = false;
-            break
-          }
-        }
-        if (found) return i
-      }
-    }
-
-    return -1
-  }
-
-  Buffer.prototype.includes = function includes (val, byteOffset, encoding) {
-    return this.indexOf(val, byteOffset, encoding) !== -1
-  };
-
-  Buffer.prototype.indexOf = function indexOf (val, byteOffset, encoding) {
-    return bidirectionalIndexOf(this, val, byteOffset, encoding, true)
-  };
-
-  Buffer.prototype.lastIndexOf = function lastIndexOf (val, byteOffset, encoding) {
-    return bidirectionalIndexOf(this, val, byteOffset, encoding, false)
-  };
-
-  function hexWrite (buf, string, offset, length) {
-    offset = Number(offset) || 0;
-    var remaining = buf.length - offset;
-    if (!length) {
-      length = remaining;
-    } else {
-      length = Number(length);
-      if (length > remaining) {
-        length = remaining;
-      }
-    }
-
-    // must be an even number of digits
-    var strLen = string.length;
-    if (strLen % 2 !== 0) throw new TypeError('Invalid hex string')
-
-    if (length > strLen / 2) {
-      length = strLen / 2;
-    }
-    for (var i = 0; i < length; ++i) {
-      var parsed = parseInt(string.substr(i * 2, 2), 16);
-      if (isNaN(parsed)) return i
-      buf[offset + i] = parsed;
-    }
-    return i
-  }
-
-  function utf8Write (buf, string, offset, length) {
-    return blitBuffer(utf8ToBytes(string, buf.length - offset), buf, offset, length)
-  }
-
-  function asciiWrite (buf, string, offset, length) {
-    return blitBuffer(asciiToBytes(string), buf, offset, length)
-  }
-
-  function latin1Write (buf, string, offset, length) {
-    return asciiWrite(buf, string, offset, length)
-  }
-
-  function base64Write (buf, string, offset, length) {
-    return blitBuffer(base64ToBytes(string), buf, offset, length)
-  }
-
-  function ucs2Write (buf, string, offset, length) {
-    return blitBuffer(utf16leToBytes(string, buf.length - offset), buf, offset, length)
-  }
-
-  Buffer.prototype.write = function write (string, offset, length, encoding) {
-    // Buffer#write(string)
-    if (offset === undefined) {
-      encoding = 'utf8';
-      length = this.length;
-      offset = 0;
-    // Buffer#write(string, encoding)
-    } else if (length === undefined && typeof offset === 'string') {
-      encoding = offset;
-      length = this.length;
-      offset = 0;
-    // Buffer#write(string, offset[, length][, encoding])
-    } else if (isFinite(offset)) {
-      offset = offset | 0;
-      if (isFinite(length)) {
-        length = length | 0;
-        if (encoding === undefined) encoding = 'utf8';
-      } else {
-        encoding = length;
-        length = undefined;
-      }
-    // legacy write(string, encoding, offset, length) - remove in v0.13
-    } else {
-      throw new Error(
-        'Buffer.write(string, encoding, offset[, length]) is no longer supported'
-      )
-    }
-
-    var remaining = this.length - offset;
-    if (length === undefined || length > remaining) length = remaining;
-
-    if ((string.length > 0 && (length < 0 || offset < 0)) || offset > this.length) {
-      throw new RangeError('Attempt to write outside buffer bounds')
-    }
-
-    if (!encoding) encoding = 'utf8';
-
-    var loweredCase = false;
-    for (;;) {
-      switch (encoding) {
-        case 'hex':
-          return hexWrite(this, string, offset, length)
-
-        case 'utf8':
-        case 'utf-8':
-          return utf8Write(this, string, offset, length)
-
-        case 'ascii':
-          return asciiWrite(this, string, offset, length)
-
-        case 'latin1':
-        case 'binary':
-          return latin1Write(this, string, offset, length)
-
-        case 'base64':
-          // Warning: maxLength not taken into account in base64Write
-          return base64Write(this, string, offset, length)
-
-        case 'ucs2':
-        case 'ucs-2':
-        case 'utf16le':
-        case 'utf-16le':
-          return ucs2Write(this, string, offset, length)
-
-        default:
-          if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)
-          encoding = ('' + encoding).toLowerCase();
-          loweredCase = true;
-      }
-    }
-  };
-
-  Buffer.prototype.toJSON = function toJSON () {
-    return {
-      type: 'Buffer',
-      data: Array.prototype.slice.call(this._arr || this, 0)
-    }
-  };
-
-  function base64Slice (buf, start, end) {
-    if (start === 0 && end === buf.length) {
-      return fromByteArray(buf)
-    } else {
-      return fromByteArray(buf.slice(start, end))
-    }
-  }
-
-  function utf8Slice (buf, start, end) {
-    end = Math.min(buf.length, end);
-    var res = [];
-
-    var i = start;
-    while (i < end) {
-      var firstByte = buf[i];
-      var codePoint = null;
-      var bytesPerSequence = (firstByte > 0xEF) ? 4
-        : (firstByte > 0xDF) ? 3
-        : (firstByte > 0xBF) ? 2
-        : 1;
-
-      if (i + bytesPerSequence <= end) {
-        var secondByte, thirdByte, fourthByte, tempCodePoint;
-
-        switch (bytesPerSequence) {
-          case 1:
-            if (firstByte < 0x80) {
-              codePoint = firstByte;
-            }
-            break
-          case 2:
-            secondByte = buf[i + 1];
-            if ((secondByte & 0xC0) === 0x80) {
-              tempCodePoint = (firstByte & 0x1F) << 0x6 | (secondByte & 0x3F);
-              if (tempCodePoint > 0x7F) {
-                codePoint = tempCodePoint;
-              }
-            }
-            break
-          case 3:
-            secondByte = buf[i + 1];
-            thirdByte = buf[i + 2];
-            if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80) {
-              tempCodePoint = (firstByte & 0xF) << 0xC | (secondByte & 0x3F) << 0x6 | (thirdByte & 0x3F);
-              if (tempCodePoint > 0x7FF && (tempCodePoint < 0xD800 || tempCodePoint > 0xDFFF)) {
-                codePoint = tempCodePoint;
-              }
-            }
-            break
-          case 4:
-            secondByte = buf[i + 1];
-            thirdByte = buf[i + 2];
-            fourthByte = buf[i + 3];
-            if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80 && (fourthByte & 0xC0) === 0x80) {
-              tempCodePoint = (firstByte & 0xF) << 0x12 | (secondByte & 0x3F) << 0xC | (thirdByte & 0x3F) << 0x6 | (fourthByte & 0x3F);
-              if (tempCodePoint > 0xFFFF && tempCodePoint < 0x110000) {
-                codePoint = tempCodePoint;
-              }
-            }
-        }
-      }
-
-      if (codePoint === null) {
-        // we did not generate a valid codePoint so insert a
-        // replacement char (U+FFFD) and advance only 1 byte
-        codePoint = 0xFFFD;
-        bytesPerSequence = 1;
-      } else if (codePoint > 0xFFFF) {
-        // encode to utf16 (surrogate pair dance)
-        codePoint -= 0x10000;
-        res.push(codePoint >>> 10 & 0x3FF | 0xD800);
-        codePoint = 0xDC00 | codePoint & 0x3FF;
-      }
-
-      res.push(codePoint);
-      i += bytesPerSequence;
-    }
-
-    return decodeCodePointsArray(res)
-  }
-
-  // Based on http://stackoverflow.com/a/22747272/680742, the browser with
-  // the lowest limit is Chrome, with 0x10000 args.
-  // We go 1 magnitude less, for safety
-  var MAX_ARGUMENTS_LENGTH = 0x1000;
-
-  function decodeCodePointsArray (codePoints) {
-    var len = codePoints.length;
-    if (len <= MAX_ARGUMENTS_LENGTH) {
-      return String.fromCharCode.apply(String, codePoints) // avoid extra slice()
-    }
-
-    // Decode in chunks to avoid "call stack size exceeded".
-    var res = '';
-    var i = 0;
-    while (i < len) {
-      res += String.fromCharCode.apply(
-        String,
-        codePoints.slice(i, i += MAX_ARGUMENTS_LENGTH)
-      );
-    }
-    return res
-  }
-
-  function asciiSlice (buf, start, end) {
-    var ret = '';
-    end = Math.min(buf.length, end);
-
-    for (var i = start; i < end; ++i) {
-      ret += String.fromCharCode(buf[i] & 0x7F);
-    }
-    return ret
-  }
-
-  function latin1Slice (buf, start, end) {
-    var ret = '';
-    end = Math.min(buf.length, end);
-
-    for (var i = start; i < end; ++i) {
-      ret += String.fromCharCode(buf[i]);
-    }
-    return ret
-  }
-
-  function hexSlice (buf, start, end) {
-    var len = buf.length;
-
-    if (!start || start < 0) start = 0;
-    if (!end || end < 0 || end > len) end = len;
-
-    var out = '';
-    for (var i = start; i < end; ++i) {
-      out += toHex(buf[i]);
-    }
-    return out
-  }
-
-  function utf16leSlice (buf, start, end) {
-    var bytes = buf.slice(start, end);
-    var res = '';
-    for (var i = 0; i < bytes.length; i += 2) {
-      res += String.fromCharCode(bytes[i] + bytes[i + 1] * 256);
-    }
-    return res
-  }
-
-  Buffer.prototype.slice = function slice (start, end) {
-    var len = this.length;
-    start = ~~start;
-    end = end === undefined ? len : ~~end;
-
-    if (start < 0) {
-      start += len;
-      if (start < 0) start = 0;
-    } else if (start > len) {
-      start = len;
-    }
-
-    if (end < 0) {
-      end += len;
-      if (end < 0) end = 0;
-    } else if (end > len) {
-      end = len;
-    }
-
-    if (end < start) end = start;
-
-    var newBuf;
-    if (Buffer.TYPED_ARRAY_SUPPORT) {
-      newBuf = this.subarray(start, end);
-      newBuf.__proto__ = Buffer.prototype;
-    } else {
-      var sliceLen = end - start;
-      newBuf = new Buffer(sliceLen, undefined);
-      for (var i = 0; i < sliceLen; ++i) {
-        newBuf[i] = this[i + start];
-      }
-    }
-
-    return newBuf
-  };
-
-  /*
-   * Need to make sure that buffer isn't trying to write out of bounds.
-   */
-  function checkOffset (offset, ext, length) {
-    if ((offset % 1) !== 0 || offset < 0) throw new RangeError('offset is not uint')
-    if (offset + ext > length) throw new RangeError('Trying to access beyond buffer length')
-  }
-
-  Buffer.prototype.readUIntLE = function readUIntLE (offset, byteLength, noAssert) {
-    offset = offset | 0;
-    byteLength = byteLength | 0;
-    if (!noAssert) checkOffset(offset, byteLength, this.length);
-
-    var val = this[offset];
-    var mul = 1;
-    var i = 0;
-    while (++i < byteLength && (mul *= 0x100)) {
-      val += this[offset + i] * mul;
-    }
-
-    return val
-  };
-
-  Buffer.prototype.readUIntBE = function readUIntBE (offset, byteLength, noAssert) {
-    offset = offset | 0;
-    byteLength = byteLength | 0;
-    if (!noAssert) {
-      checkOffset(offset, byteLength, this.length);
-    }
-
-    var val = this[offset + --byteLength];
-    var mul = 1;
-    while (byteLength > 0 && (mul *= 0x100)) {
-      val += this[offset + --byteLength] * mul;
-    }
-
-    return val
-  };
-
-  Buffer.prototype.readUInt8 = function readUInt8 (offset, noAssert) {
-    if (!noAssert) checkOffset(offset, 1, this.length);
-    return this[offset]
-  };
-
-  Buffer.prototype.readUInt16LE = function readUInt16LE (offset, noAssert) {
-    if (!noAssert) checkOffset(offset, 2, this.length);
-    return this[offset] | (this[offset + 1] << 8)
-  };
-
-  Buffer.prototype.readUInt16BE = function readUInt16BE (offset, noAssert) {
-    if (!noAssert) checkOffset(offset, 2, this.length);
-    return (this[offset] << 8) | this[offset + 1]
-  };
-
-  Buffer.prototype.readUInt32LE = function readUInt32LE (offset, noAssert) {
-    if (!noAssert) checkOffset(offset, 4, this.length);
-
-    return ((this[offset]) |
-        (this[offset + 1] << 8) |
-        (this[offset + 2] << 16)) +
-        (this[offset + 3] * 0x1000000)
-  };
-
-  Buffer.prototype.readUInt32BE = function readUInt32BE (offset, noAssert) {
-    if (!noAssert) checkOffset(offset, 4, this.length);
-
-    return (this[offset] * 0x1000000) +
-      ((this[offset + 1] << 16) |
-      (this[offset + 2] << 8) |
-      this[offset + 3])
-  };
-
-  Buffer.prototype.readIntLE = function readIntLE (offset, byteLength, noAssert) {
-    offset = offset | 0;
-    byteLength = byteLength | 0;
-    if (!noAssert) checkOffset(offset, byteLength, this.length);
-
-    var val = this[offset];
-    var mul = 1;
-    var i = 0;
-    while (++i < byteLength && (mul *= 0x100)) {
-      val += this[offset + i] * mul;
-    }
-    mul *= 0x80;
-
-    if (val >= mul) val -= Math.pow(2, 8 * byteLength);
-
-    return val
-  };
-
-  Buffer.prototype.readIntBE = function readIntBE (offset, byteLength, noAssert) {
-    offset = offset | 0;
-    byteLength = byteLength | 0;
-    if (!noAssert) checkOffset(offset, byteLength, this.length);
-
-    var i = byteLength;
-    var mul = 1;
-    var val = this[offset + --i];
-    while (i > 0 && (mul *= 0x100)) {
-      val += this[offset + --i] * mul;
-    }
-    mul *= 0x80;
-
-    if (val >= mul) val -= Math.pow(2, 8 * byteLength);
-
-    return val
-  };
-
-  Buffer.prototype.readInt8 = function readInt8 (offset, noAssert) {
-    if (!noAssert) checkOffset(offset, 1, this.length);
-    if (!(this[offset] & 0x80)) return (this[offset])
-    return ((0xff - this[offset] + 1) * -1)
-  };
-
-  Buffer.prototype.readInt16LE = function readInt16LE (offset, noAssert) {
-    if (!noAssert) checkOffset(offset, 2, this.length);
-    var val = this[offset] | (this[offset + 1] << 8);
-    return (val & 0x8000) ? val | 0xFFFF0000 : val
-  };
-
-  Buffer.prototype.readInt16BE = function readInt16BE (offset, noAssert) {
-    if (!noAssert) checkOffset(offset, 2, this.length);
-    var val = this[offset + 1] | (this[offset] << 8);
-    return (val & 0x8000) ? val | 0xFFFF0000 : val
-  };
-
-  Buffer.prototype.readInt32LE = function readInt32LE (offset, noAssert) {
-    if (!noAssert) checkOffset(offset, 4, this.length);
-
-    return (this[offset]) |
-      (this[offset + 1] << 8) |
-      (this[offset + 2] << 16) |
-      (this[offset + 3] << 24)
-  };
-
-  Buffer.prototype.readInt32BE = function readInt32BE (offset, noAssert) {
-    if (!noAssert) checkOffset(offset, 4, this.length);
-
-    return (this[offset] << 24) |
-      (this[offset + 1] << 16) |
-      (this[offset + 2] << 8) |
-      (this[offset + 3])
-  };
-
-  Buffer.prototype.readFloatLE = function readFloatLE (offset, noAssert) {
-    if (!noAssert) checkOffset(offset, 4, this.length);
-    return read(this, offset, true, 23, 4)
-  };
-
-  Buffer.prototype.readFloatBE = function readFloatBE (offset, noAssert) {
-    if (!noAssert) checkOffset(offset, 4, this.length);
-    return read(this, offset, false, 23, 4)
-  };
-
-  Buffer.prototype.readDoubleLE = function readDoubleLE (offset, noAssert) {
-    if (!noAssert) checkOffset(offset, 8, this.length);
-    return read(this, offset, true, 52, 8)
-  };
-
-  Buffer.prototype.readDoubleBE = function readDoubleBE (offset, noAssert) {
-    if (!noAssert) checkOffset(offset, 8, this.length);
-    return read(this, offset, false, 52, 8)
-  };
-
-  function checkInt (buf, value, offset, ext, max, min) {
-    if (!internalIsBuffer(buf)) throw new TypeError('"buffer" argument must be a Buffer instance')
-    if (value > max || value < min) throw new RangeError('"value" argument is out of bounds')
-    if (offset + ext > buf.length) throw new RangeError('Index out of range')
-  }
-
-  Buffer.prototype.writeUIntLE = function writeUIntLE (value, offset, byteLength, noAssert) {
-    value = +value;
-    offset = offset | 0;
-    byteLength = byteLength | 0;
-    if (!noAssert) {
-      var maxBytes = Math.pow(2, 8 * byteLength) - 1;
-      checkInt(this, value, offset, byteLength, maxBytes, 0);
-    }
-
-    var mul = 1;
-    var i = 0;
-    this[offset] = value & 0xFF;
-    while (++i < byteLength && (mul *= 0x100)) {
-      this[offset + i] = (value / mul) & 0xFF;
-    }
-
-    return offset + byteLength
-  };
-
-  Buffer.prototype.writeUIntBE = function writeUIntBE (value, offset, byteLength, noAssert) {
-    value = +value;
-    offset = offset | 0;
-    byteLength = byteLength | 0;
-    if (!noAssert) {
-      var maxBytes = Math.pow(2, 8 * byteLength) - 1;
-      checkInt(this, value, offset, byteLength, maxBytes, 0);
-    }
-
-    var i = byteLength - 1;
-    var mul = 1;
-    this[offset + i] = value & 0xFF;
-    while (--i >= 0 && (mul *= 0x100)) {
-      this[offset + i] = (value / mul) & 0xFF;
-    }
-
-    return offset + byteLength
-  };
-
-  Buffer.prototype.writeUInt8 = function writeUInt8 (value, offset, noAssert) {
-    value = +value;
-    offset = offset | 0;
-    if (!noAssert) checkInt(this, value, offset, 1, 0xff, 0);
-    if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value);
-    this[offset] = (value & 0xff);
-    return offset + 1
-  };
-
-  function objectWriteUInt16 (buf, value, offset, littleEndian) {
-    if (value < 0) value = 0xffff + value + 1;
-    for (var i = 0, j = Math.min(buf.length - offset, 2); i < j; ++i) {
-      buf[offset + i] = (value & (0xff << (8 * (littleEndian ? i : 1 - i)))) >>>
-        (littleEndian ? i : 1 - i) * 8;
-    }
-  }
-
-  Buffer.prototype.writeUInt16LE = function writeUInt16LE (value, offset, noAssert) {
-    value = +value;
-    offset = offset | 0;
-    if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0);
-    if (Buffer.TYPED_ARRAY_SUPPORT) {
-      this[offset] = (value & 0xff);
-      this[offset + 1] = (value >>> 8);
-    } else {
-      objectWriteUInt16(this, value, offset, true);
-    }
-    return offset + 2
-  };
-
-  Buffer.prototype.writeUInt16BE = function writeUInt16BE (value, offset, noAssert) {
-    value = +value;
-    offset = offset | 0;
-    if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0);
-    if (Buffer.TYPED_ARRAY_SUPPORT) {
-      this[offset] = (value >>> 8);
-      this[offset + 1] = (value & 0xff);
-    } else {
-      objectWriteUInt16(this, value, offset, false);
-    }
-    return offset + 2
-  };
-
-  function objectWriteUInt32 (buf, value, offset, littleEndian) {
-    if (value < 0) value = 0xffffffff + value + 1;
-    for (var i = 0, j = Math.min(buf.length - offset, 4); i < j; ++i) {
-      buf[offset + i] = (value >>> (littleEndian ? i : 3 - i) * 8) & 0xff;
-    }
-  }
-
-  Buffer.prototype.writeUInt32LE = function writeUInt32LE (value, offset, noAssert) {
-    value = +value;
-    offset = offset | 0;
-    if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0);
-    if (Buffer.TYPED_ARRAY_SUPPORT) {
-      this[offset + 3] = (value >>> 24);
-      this[offset + 2] = (value >>> 16);
-      this[offset + 1] = (value >>> 8);
-      this[offset] = (value & 0xff);
-    } else {
-      objectWriteUInt32(this, value, offset, true);
-    }
-    return offset + 4
-  };
-
-  Buffer.prototype.writeUInt32BE = function writeUInt32BE (value, offset, noAssert) {
-    value = +value;
-    offset = offset | 0;
-    if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0);
-    if (Buffer.TYPED_ARRAY_SUPPORT) {
-      this[offset] = (value >>> 24);
-      this[offset + 1] = (value >>> 16);
-      this[offset + 2] = (value >>> 8);
-      this[offset + 3] = (value & 0xff);
-    } else {
-      objectWriteUInt32(this, value, offset, false);
-    }
-    return offset + 4
-  };
-
-  Buffer.prototype.writeIntLE = function writeIntLE (value, offset, byteLength, noAssert) {
-    value = +value;
-    offset = offset | 0;
-    if (!noAssert) {
-      var limit = Math.pow(2, 8 * byteLength - 1);
-
-      checkInt(this, value, offset, byteLength, limit - 1, -limit);
-    }
-
-    var i = 0;
-    var mul = 1;
-    var sub = 0;
-    this[offset] = value & 0xFF;
-    while (++i < byteLength && (mul *= 0x100)) {
-      if (value < 0 && sub === 0 && this[offset + i - 1] !== 0) {
-        sub = 1;
-      }
-      this[offset + i] = ((value / mul) >> 0) - sub & 0xFF;
-    }
-
-    return offset + byteLength
-  };
-
-  Buffer.prototype.writeIntBE = function writeIntBE (value, offset, byteLength, noAssert) {
-    value = +value;
-    offset = offset | 0;
-    if (!noAssert) {
-      var limit = Math.pow(2, 8 * byteLength - 1);
-
-      checkInt(this, value, offset, byteLength, limit - 1, -limit);
-    }
-
-    var i = byteLength - 1;
-    var mul = 1;
-    var sub = 0;
-    this[offset + i] = value & 0xFF;
-    while (--i >= 0 && (mul *= 0x100)) {
-      if (value < 0 && sub === 0 && this[offset + i + 1] !== 0) {
-        sub = 1;
-      }
-      this[offset + i] = ((value / mul) >> 0) - sub & 0xFF;
-    }
-
-    return offset + byteLength
-  };
-
-  Buffer.prototype.writeInt8 = function writeInt8 (value, offset, noAssert) {
-    value = +value;
-    offset = offset | 0;
-    if (!noAssert) checkInt(this, value, offset, 1, 0x7f, -0x80);
-    if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value);
-    if (value < 0) value = 0xff + value + 1;
-    this[offset] = (value & 0xff);
-    return offset + 1
-  };
-
-  Buffer.prototype.writeInt16LE = function writeInt16LE (value, offset, noAssert) {
-    value = +value;
-    offset = offset | 0;
-    if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000);
-    if (Buffer.TYPED_ARRAY_SUPPORT) {
-      this[offset] = (value & 0xff);
-      this[offset + 1] = (value >>> 8);
-    } else {
-      objectWriteUInt16(this, value, offset, true);
-    }
-    return offset + 2
-  };
-
-  Buffer.prototype.writeInt16BE = function writeInt16BE (value, offset, noAssert) {
-    value = +value;
-    offset = offset | 0;
-    if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000);
-    if (Buffer.TYPED_ARRAY_SUPPORT) {
-      this[offset] = (value >>> 8);
-      this[offset + 1] = (value & 0xff);
-    } else {
-      objectWriteUInt16(this, value, offset, false);
-    }
-    return offset + 2
-  };
-
-  Buffer.prototype.writeInt32LE = function writeInt32LE (value, offset, noAssert) {
-    value = +value;
-    offset = offset | 0;
-    if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000);
-    if (Buffer.TYPED_ARRAY_SUPPORT) {
-      this[offset] = (value & 0xff);
-      this[offset + 1] = (value >>> 8);
-      this[offset + 2] = (value >>> 16);
-      this[offset + 3] = (value >>> 24);
-    } else {
-      objectWriteUInt32(this, value, offset, true);
-    }
-    return offset + 4
-  };
-
-  Buffer.prototype.writeInt32BE = function writeInt32BE (value, offset, noAssert) {
-    value = +value;
-    offset = offset | 0;
-    if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000);
-    if (value < 0) value = 0xffffffff + value + 1;
-    if (Buffer.TYPED_ARRAY_SUPPORT) {
-      this[offset] = (value >>> 24);
-      this[offset + 1] = (value >>> 16);
-      this[offset + 2] = (value >>> 8);
-      this[offset + 3] = (value & 0xff);
-    } else {
-      objectWriteUInt32(this, value, offset, false);
-    }
-    return offset + 4
-  };
-
-  function checkIEEE754 (buf, value, offset, ext, max, min) {
-    if (offset + ext > buf.length) throw new RangeError('Index out of range')
-    if (offset < 0) throw new RangeError('Index out of range')
-  }
-
-  function writeFloat (buf, value, offset, littleEndian, noAssert) {
-    if (!noAssert) {
-      checkIEEE754(buf, value, offset, 4);
-    }
-    write(buf, value, offset, littleEndian, 23, 4);
-    return offset + 4
-  }
-
-  Buffer.prototype.writeFloatLE = function writeFloatLE (value, offset, noAssert) {
-    return writeFloat(this, value, offset, true, noAssert)
-  };
-
-  Buffer.prototype.writeFloatBE = function writeFloatBE (value, offset, noAssert) {
-    return writeFloat(this, value, offset, false, noAssert)
-  };
-
-  function writeDouble (buf, value, offset, littleEndian, noAssert) {
-    if (!noAssert) {
-      checkIEEE754(buf, value, offset, 8);
-    }
-    write(buf, value, offset, littleEndian, 52, 8);
-    return offset + 8
-  }
-
-  Buffer.prototype.writeDoubleLE = function writeDoubleLE (value, offset, noAssert) {
-    return writeDouble(this, value, offset, true, noAssert)
-  };
-
-  Buffer.prototype.writeDoubleBE = function writeDoubleBE (value, offset, noAssert) {
-    return writeDouble(this, value, offset, false, noAssert)
-  };
-
-  // copy(targetBuffer, targetStart=0, sourceStart=0, sourceEnd=buffer.length)
-  Buffer.prototype.copy = function copy (target, targetStart, start, end) {
-    if (!start) start = 0;
-    if (!end && end !== 0) end = this.length;
-    if (targetStart >= target.length) targetStart = target.length;
-    if (!targetStart) targetStart = 0;
-    if (end > 0 && end < start) end = start;
-
-    // Copy 0 bytes; we're done
-    if (end === start) return 0
-    if (target.length === 0 || this.length === 0) return 0
-
-    // Fatal error conditions
-    if (targetStart < 0) {
-      throw new RangeError('targetStart out of bounds')
-    }
-    if (start < 0 || start >= this.length) throw new RangeError('sourceStart out of bounds')
-    if (end < 0) throw new RangeError('sourceEnd out of bounds')
-
-    // Are we oob?
-    if (end > this.length) end = this.length;
-    if (target.length - targetStart < end - start) {
-      end = target.length - targetStart + start;
-    }
-
-    var len = end - start;
-    var i;
-
-    if (this === target && start < targetStart && targetStart < end) {
-      // descending copy from end
-      for (i = len - 1; i >= 0; --i) {
-        target[i + targetStart] = this[i + start];
-      }
-    } else if (len < 1000 || !Buffer.TYPED_ARRAY_SUPPORT) {
-      // ascending copy from start
-      for (i = 0; i < len; ++i) {
-        target[i + targetStart] = this[i + start];
-      }
-    } else {
-      Uint8Array.prototype.set.call(
-        target,
-        this.subarray(start, start + len),
-        targetStart
-      );
-    }
-
-    return len
-  };
-
-  // Usage:
-  //    buffer.fill(number[, offset[, end]])
-  //    buffer.fill(buffer[, offset[, end]])
-  //    buffer.fill(string[, offset[, end]][, encoding])
-  Buffer.prototype.fill = function fill (val, start, end, encoding) {
-    // Handle string cases:
-    if (typeof val === 'string') {
-      if (typeof start === 'string') {
-        encoding = start;
-        start = 0;
-        end = this.length;
-      } else if (typeof end === 'string') {
-        encoding = end;
-        end = this.length;
-      }
-      if (val.length === 1) {
-        var code = val.charCodeAt(0);
-        if (code < 256) {
-          val = code;
-        }
-      }
-      if (encoding !== undefined && typeof encoding !== 'string') {
-        throw new TypeError('encoding must be a string')
-      }
-      if (typeof encoding === 'string' && !Buffer.isEncoding(encoding)) {
-        throw new TypeError('Unknown encoding: ' + encoding)
-      }
-    } else if (typeof val === 'number') {
-      val = val & 255;
-    }
-
-    // Invalid ranges are not set to a default, so can range check early.
-    if (start < 0 || this.length < start || this.length < end) {
-      throw new RangeError('Out of range index')
-    }
-
-    if (end <= start) {
-      return this
-    }
-
-    start = start >>> 0;
-    end = end === undefined ? this.length : end >>> 0;
-
-    if (!val) val = 0;
-
-    var i;
-    if (typeof val === 'number') {
-      for (i = start; i < end; ++i) {
-        this[i] = val;
-      }
-    } else {
-      var bytes = internalIsBuffer(val)
-        ? val
-        : utf8ToBytes(new Buffer(val, encoding).toString());
-      var len = bytes.length;
-      for (i = 0; i < end - start; ++i) {
-        this[i + start] = bytes[i % len];
-      }
-    }
-
-    return this
-  };
-
-  // HELPER FUNCTIONS
-  // ================
-
-  var INVALID_BASE64_RE = /[^+\/0-9A-Za-z-_]/g;
-
-  function base64clean (str) {
-    // Node strips out invalid characters like \n and \t from the string, base64-js does not
-    str = stringtrim(str).replace(INVALID_BASE64_RE, '');
-    // Node converts strings with length < 2 to ''
-    if (str.length < 2) return ''
-    // Node allows for non-padded base64 strings (missing trailing ===), base64-js does not
-    while (str.length % 4 !== 0) {
-      str = str + '=';
-    }
-    return str
-  }
-
-  function stringtrim (str) {
-    if (str.trim) return str.trim()
-    return str.replace(/^\s+|\s+$/g, '')
-  }
-
-  function toHex (n) {
-    if (n < 16) return '0' + n.toString(16)
-    return n.toString(16)
-  }
-
-  function utf8ToBytes (string, units) {
-    units = units || Infinity;
-    var codePoint;
-    var length = string.length;
-    var leadSurrogate = null;
-    var bytes = [];
-
-    for (var i = 0; i < length; ++i) {
-      codePoint = string.charCodeAt(i);
-
-      // is surrogate component
-      if (codePoint > 0xD7FF && codePoint < 0xE000) {
-        // last char was a lead
-        if (!leadSurrogate) {
-          // no lead yet
-          if (codePoint > 0xDBFF) {
-            // unexpected trail
-            if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD);
-            continue
-          } else if (i + 1 === length) {
-            // unpaired lead
-            if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD);
-            continue
-          }
-
-          // valid lead
-          leadSurrogate = codePoint;
-
-          continue
-        }
-
-        // 2 leads in a row
-        if (codePoint < 0xDC00) {
-          if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD);
-          leadSurrogate = codePoint;
-          continue
-        }
-
-        // valid surrogate pair
-        codePoint = (leadSurrogate - 0xD800 << 10 | codePoint - 0xDC00) + 0x10000;
-      } else if (leadSurrogate) {
-        // valid bmp char, but last char was a lead
-        if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD);
-      }
-
-      leadSurrogate = null;
-
-      // encode utf8
-      if (codePoint < 0x80) {
-        if ((units -= 1) < 0) break
-        bytes.push(codePoint);
-      } else if (codePoint < 0x800) {
-        if ((units -= 2) < 0) break
-        bytes.push(
-          codePoint >> 0x6 | 0xC0,
-          codePoint & 0x3F | 0x80
-        );
-      } else if (codePoint < 0x10000) {
-        if ((units -= 3) < 0) break
-        bytes.push(
-          codePoint >> 0xC | 0xE0,
-          codePoint >> 0x6 & 0x3F | 0x80,
-          codePoint & 0x3F | 0x80
-        );
-      } else if (codePoint < 0x110000) {
-        if ((units -= 4) < 0) break
-        bytes.push(
-          codePoint >> 0x12 | 0xF0,
-          codePoint >> 0xC & 0x3F | 0x80,
-          codePoint >> 0x6 & 0x3F | 0x80,
-          codePoint & 0x3F | 0x80
-        );
-      } else {
-        throw new Error('Invalid code point')
-      }
-    }
-
-    return bytes
-  }
-
-  function asciiToBytes (str) {
-    var byteArray = [];
-    for (var i = 0; i < str.length; ++i) {
-      // Node's code seems to be doing this and not & 0x7F..
-      byteArray.push(str.charCodeAt(i) & 0xFF);
-    }
-    return byteArray
-  }
-
-  function utf16leToBytes (str, units) {
-    var c, hi, lo;
-    var byteArray = [];
-    for (var i = 0; i < str.length; ++i) {
-      if ((units -= 2) < 0) break
-
-      c = str.charCodeAt(i);
-      hi = c >> 8;
-      lo = c % 256;
-      byteArray.push(lo);
-      byteArray.push(hi);
-    }
-
-    return byteArray
-  }
-
-
-  function base64ToBytes (str) {
-    return toByteArray(base64clean(str))
-  }
-
-  function blitBuffer (src, dst, offset, length) {
-    for (var i = 0; i < length; ++i) {
-      if ((i + offset >= dst.length) || (i >= src.length)) break
-      dst[i + offset] = src[i];
-    }
-    return i
-  }
-
-  function isnan (val) {
-    return val !== val // eslint-disable-line no-self-compare
-  }
-
-
-  // the following is from is-buffer, also by Feross Aboukhadijeh and with same lisence
-  // The _isBuffer check is for Safari 5-7 support, because it's missing
-  // Object.prototype.constructor. Remove this eventually
-  function isBuffer(obj) {
-    return obj != null && (!!obj._isBuffer || isFastBuffer(obj) || isSlowBuffer(obj))
-  }
-
-  function isFastBuffer (obj) {
-    return !!obj.constructor && typeof obj.constructor.isBuffer === 'function' && obj.constructor.isBuffer(obj)
-  }
-
-  // For Node v0.10 support. Remove this eventually.
-  function isSlowBuffer (obj) {
-    return typeof obj.readFloatLE === 'function' && typeof obj.slice === 'function' && isFastBuffer(obj.slice(0, 0))
-  }
-
-  class Provider$3 {
-    constructor() {}
-
-    getAll() {
-      return this.data;
-    }
-
-  }
-
-  var provider = Provider$3;
-
-  const Provider$2 = provider;
-
-  class Crawlers$1 extends Provider$2 {
-    constructor() {
-      super();
-      this.data = [' YLT', '^Aether', '^Amazon Simple Notification Service Agent$', '^Amazon-Route53-Health-Check-Service', '^b0t$', '^bluefish ', '^Calypso v\\/', '^COMODO DCV', '^Corax', '^DangDang', '^DavClnt', '^DHSH', '^docker\\/[0-9]', '^Expanse', '^FDM ', '^git\\/', '^Goose\\/', '^Grabber', '^Gradle\\/', '^HTTPClient\\/', '^HTTPing', '^Java\\/', '^Jeode\\/', '^Jetty\\/', '^Mail\\/', '^Mget', '^Microsoft URL Control', '^Mikrotik\\/', '^Netlab360', '^NG\\/[0-9\\.]', '^NING\\/', '^np [...]
-    }
-
-  }
-
-  var crawlers = Crawlers$1;
-
-  const Provider$1 = provider;
-
-  class Exclusions$1 extends Provider$1 {
-    constructor() {
-      super();
-      this.data = ['Safari.[\\d\\.]*', 'Firefox.[\\d\\.]*', ' Chrome.[\\d\\.]*', 'Chromium.[\\d\\.]*', 'MSIE.[\\d\\.]', 'Opera\\/[\\d\\.]*', 'Mozilla.[\\d\\.]*', 'AppleWebKit.[\\d\\.]*', 'Trident.[\\d\\.]*', 'Windows NT.[\\d\\.]*', 'Android [\\d\\.]*', 'Macintosh.', 'Ubuntu', 'Linux', '[ ]Intel', 'Mac OS X [\\d_]*', '(like )?Gecko(.[\\d\\.]*)?', 'KHTML,', 'CriOS.[\\d\\.]*', 'CPU iPhone OS ([0-9_])* like Mac OS X', 'CPU OS ([0-9_])* like Mac OS X', 'iPod', 'compatible', 'x86_..', 'i686',  [...]
-    }
-
-  }
-
-  var exclusions = Exclusions$1;
-
-  const Provider = provider;
-
-  class Headers$1 extends Provider {
-    constructor() {
-      super();
-      this.data = ['USER-AGENT', 'X-OPERAMINI-PHONE-UA', 'X-DEVICE-USER-AGENT', 'X-ORIGINAL-USER-AGENT', 'X-SKYFIRE-PHONE', 'X-BOLT-PHONE-UA', 'DEVICE-STOCK-UA', 'X-UCBROWSER-DEVICE-UA', 'FROM', 'X-SCANNER'];
-    }
-
-  }
-
-  var headers = Headers$1;
-
-  const Crawlers = crawlers;
-  const Exclusions = exclusions;
-  const Headers = headers;
-
-  class Crawler$1 {
-    constructor(request, headers, userAgent) {
-      /**
-       * Init classes
-       */
-      this._init();
-      /**
-       * This request must be an object
-       */
-
-
-      this.request = typeof request === 'object' ? request : {}; // The regex-list must not be used with g-flag!
-      // See: https://stackoverflow.com/questions/1520800/why-does-a-regexp-with-global-flag-give-wrong-results
-
-      this.compiledRegexList = this.compileRegex(this.crawlers.getAll(), 'i'); // The exclusions should be used with g-flag in order to remove each value.
-
-      this.compiledExclusions = this.compileRegex(this.exclusions.getAll(), 'gi');
-      /**
-       * Set http headers
-       */
-
-      this.setHttpHeaders(headers);
-      /**
-       * Set userAgent
-       */
-
-      this.userAgent = this.setUserAgent(userAgent);
-    }
-    /**
-     * Init Classes Instances
-     */
-
-
-    _init() {
-      this.crawlers = new Crawlers();
-      this.headers = new Headers();
-      this.exclusions = new Exclusions();
-    }
-
-    compileRegex(patterns, flags) {
-      return new RegExp(patterns.join('|'), flags);
-    }
-    /**
-     * Set HTTP headers.
-     */
-
-
-    setHttpHeaders(headers) {
-      // Use the Request headers if httpHeaders is not defined
-      if (typeof headers === 'undefined' || Object.keys(headers).length === 0) {
-        headers = Object.keys(this.request).length ? this.request.headers : {};
-      } // Save the headers.
-
-
-      this.httpHeaders = headers;
-    }
-    /**
-     * Set user agent
-     */
-
-
-    setUserAgent(userAgent) {
-      if (typeof userAgent === 'undefined' || userAgent === null || !userAgent.length) {
-        for (const header of this.getUaHttpHeaders()) {
-          if (Object.keys(this.httpHeaders).indexOf(header.toLowerCase()) >= 0) {
-            userAgent += this.httpHeaders[header.toLowerCase()] + ' ';
-          }
-        }
-      }
-
-      return userAgent;
-    }
-    /**
-     * Get user agent headers
-     */
-
-
-    getUaHttpHeaders() {
-      return this.headers.getAll();
-    }
-    /**
-     * Check user agent string against the regex.
-     */
-
-
-    isCrawler(userAgent = undefined) {
-      if (Buffer.byteLength(userAgent || '', 'utf8') > 4096) {
-        return false;
-      }
-
-      var agent = typeof userAgent === 'undefined' || userAgent === null ? this.userAgent : userAgent; // test on compiled regx
-
-      agent = agent.replace(this.compiledExclusions, '');
-
-      if (agent.trim().length === 0) {
-        return false;
-      }
-
-      var matches = this.compiledRegexList.exec(agent);
-
-      if (matches) {
-        this.matches = matches;
-      }
-
-      return matches !== null ? matches.length ? true : false : false;
-    }
-    /**
-     * Return the matches.
-     */
-
-
-    getMatches() {
-      return this.matches !== undefined ? this.matches.length ? this.matches[0] : null : {};
-    }
-
-  }
-
-  var crawler = Crawler$1;
-
-  const Crawler = crawler;
-  var src = {
-    Crawler,
-
-    middleware(cb) {
-      return (req, res, next) => {
-        // If there is a cb, execute it
-        if (typeof cb === 'function') {
-          cb.call(req, res);
-        } // Initiate
-
-
-        req.Crawler = new Crawler(req);
-        next();
-      };
-    }
-
-  };
-
-  /**
-   * Licensed to the Apache Software Foundation (ASF) under one or more
-   * contributor license agreements.  See the NOTICE file distributed with
-   * this work for additional information regarding copyright ownership.
-   * The ASF licenses this file to You under the Apache License, Version 2.0
-   * (the "License"); you may not use this file except in compliance with
-   * the License.  You may obtain a copy of the License at
-   *
-   * http://www.apache.org/licenses/LICENSE-2.0
-   *
-   * Unless required by applicable law or agreed to in writing, software
-   * distributed under the License is distributed on an "AS IS" BASIS,
-   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   * See the License for the specific language governing permissions and
-   * limitations under the License.
-   */
-
-  function _createForOfIteratorHelper(o, allowArrayLike) {
-    var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"];
-
-    if (!it) {
-      if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") {
-        if (it) o = it;
-        var i = 0;
-
-        var F = function F() {};
-
-        return {
-          s: F,
-          n: function n() {
-            if (i >= o.length) return {
-              done: true
-            };
-            return {
-              done: false,
-              value: o[i++]
-            };
-          },
-          e: function e(_e) {
-            throw _e;
-          },
-          f: F
-        };
-      }
-
-      throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
-    }
-
-    var normalCompletion = true,
-        didErr = false,
-        err;
-    return {
-      s: function s() {
-        it = it.call(o);
-      },
-      n: function n() {
-        var step = it.next();
-        normalCompletion = step.done;
-        return step;
-      },
-      e: function e(_e2) {
-        didErr = true;
-        err = _e2;
-      },
-      f: function f() {
-        try {
-          if (!normalCompletion && it.return != null) it.return();
-        } finally {
-          if (didErr) throw err;
-        }
-      }
-    };
-  }
-
-  function _unsupportedIterableToArray(o, minLen) {
-    if (!o) return;
-    if (typeof o === "string") return _arrayLikeToArray(o, minLen);
-    var n = Object.prototype.toString.call(o).slice(8, -1);
-    if (n === "Object" && o.constructor) n = o.constructor.name;
-    if (n === "Map" || n === "Set") return Array.from(o);
-    if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);
-  }
-
-  function _arrayLikeToArray(arr, len) {
-    if (len == null || len > arr.length) len = arr.length;
-
-    for (var i = 0, arr2 = new Array(len); i < len; i++) {
-      arr2[i] = arr[i];
-    }
-
-    return arr2;
-  }
-
-  var newTracker = function newTracker() {
-    var wem = {
-      /**
-       * This function initialize the tracker
-       *
-       * @param {object} digitalData config of the tracker
-       * @returns {undefined}
-       */
-      initTracker: function initTracker(digitalData) {
-        wem.digitalData = digitalData;
-        wem.trackerProfileIdCookieName = wem.digitalData.wemInitConfig.trackerProfileIdCookieName ? wem.digitalData.wemInitConfig.trackerProfileIdCookieName : 'wem-profile-id';
-        wem.trackerSessionIdCookieName = wem.digitalData.wemInitConfig.trackerSessionIdCookieName ? wem.digitalData.wemInitConfig.trackerSessionIdCookieName : 'wem-session-id';
-        wem.browserGeneratedSessionSuffix = wem.digitalData.wemInitConfig.browserGeneratedSessionSuffix ? wem.digitalData.wemInitConfig.browserGeneratedSessionSuffix : '';
-        wem.disableTrackedConditionsListeners = wem.digitalData.wemInitConfig.disableTrackedConditionsListeners;
-        wem.activateWem = wem.digitalData.wemInitConfig.activateWem;
-        var _wem$digitalData$wemI = wem.digitalData.wemInitConfig,
-            contextServerUrl = _wem$digitalData$wemI.contextServerUrl,
-            timeoutInMilliseconds = _wem$digitalData$wemI.timeoutInMilliseconds,
-            contextServerCookieName = _wem$digitalData$wemI.contextServerCookieName;
-        wem.contextServerCookieName = contextServerCookieName;
-        wem.contextServerUrl = contextServerUrl;
-        wem.timeoutInMilliseconds = timeoutInMilliseconds;
-        wem.formNamesToWatch = [];
-        wem.eventsPrevented = [];
-        wem.sessionID = wem.getCookie(wem.trackerSessionIdCookieName);
-        wem.fallback = false;
-
-        if (wem.sessionID === null) {
-          console.warn('[WEM] sessionID is null !');
-        } else if (!wem.sessionID || wem.sessionID === '') {
-          console.warn('[WEM] empty sessionID, setting to null !');
-          wem.sessionID = null;
-        }
-      },
-
-      /**
-       * This function start the tracker by loading the context in the page
-       * Note: that the tracker will start once the current DOM is complete loaded, using listener on current document: DOMContentLoaded
-       *
-       * @param {object[]} digitalDataOverrides optional, list of digitalData extensions, they will be merged with original digitalData before context loading
-       * @returns {undefined}
-       */
-      startTracker: function startTracker() {
-        var digitalDataOverrides = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : undefined; // Check before start
-
-        var cookieDisabled = !navigator.cookieEnabled;
-        var noSessionID = !wem.sessionID || wem.sessionID === '';
-        var crawlerDetected = navigator.userAgent;
-
-        if (crawlerDetected) {
-          var browserDetector = new src.Crawler();
-          crawlerDetected = browserDetector.isCrawler(navigator.userAgent);
-        }
-
-        if (cookieDisabled || noSessionID || crawlerDetected) {
-          document.addEventListener('DOMContentLoaded', function () {
-            wem._executeFallback('navigator cookie disabled: ' + cookieDisabled + ', no sessionID: ' + noSessionID + ', web crawler detected: ' + crawlerDetected);
-          });
-          return;
-        } // Register base context callback
-
-
-        wem._registerCallback(function () {
-          if (wem.cxs.profileId) {
-            wem.setCookie(wem.trackerProfileIdCookieName, wem.cxs.profileId);
-          }
-
-          if (!wem.cxs.profileId) {
-            wem.removeCookie(wem.trackerProfileIdCookieName);
-          }
-
-          if (!wem.disableTrackedConditionsListeners) {
-            wem._registerListenersForTrackedConditions();
-          }
-        }, 'Default tracker', 0); // Load the context once document is ready
-
-
-        document.addEventListener('DOMContentLoaded', function () {
-          wem.DOMLoaded = true; // enrich digital data considering extensions
-
-          wem._handleDigitalDataOverrides(digitalDataOverrides); // complete already registered events
-
-
-          wem._checkUncompleteRegisteredEvents(); // Dispatch javascript events for the experience (perso/opti displayed from SSR, based on unomi events)
-
-
-          wem._dispatchJSExperienceDisplayedEvents(); // Some event may not need to be send to unomi, check for them and filter them out.
-
-
-          wem._filterUnomiEvents(); // Add referrer info into digitalData.page object.
-
-
-          wem._processReferrer(); // Build view event
-
-
-          var viewEvent = wem.buildEvent('view', wem.buildTargetPage(), wem.buildSource(wem.digitalData.site.siteInfo.siteID, 'site'));
-          viewEvent.flattenedProperties = {}; // Add URLParameters
-
-          if (location.search) {
-            viewEvent.flattenedProperties['URLParameters'] = wem.convertUrlParametersToObj(location.search);
-          } // Add interests
-
-
-          if (wem.digitalData.interests) {
-            viewEvent.flattenedProperties['interests'] = wem.digitalData.interests;
-          } // Register the page view event, it's unshift because it should be the first event, this is just for logical purpose. (page view comes before perso displayed event for example)
-
-
-          wem._registerEvent(viewEvent, true);
-
-          if (wem.activateWem) {
-            wem.loadContext();
-          } else {
-            wem._executeFallback('wem is not activated on current page');
-          }
-        });
-      },
-
-      /**
-       * get the current loaded context from Unomi, will be accessible only after loadContext() have been performed
-       * @returns {object} loaded context
-       */
-      getLoadedContext: function getLoadedContext() {
-        return wem.cxs;
-      },
-
-      /**
-       * In case Unomi contains rules related to HTML forms in the current page.
-       * The logic is simple, in case a rule exists in Unomi targeting a form event within the current webpage path
-       *  - then this form will be identified as form to be watched.
-       * You can reuse this function to get the list of concerned forms in order to attach listeners automatically for those form for example
-       * (not that current tracker is doing that by default, check function: _registerListenersForTrackedConditions())
-       * @returns {string[]} form names/ids in current web page
-       */
-      getFormNamesToWatch: function getFormNamesToWatch() {
-        return wem.formNamesToWatch;
-      },
-
-      /**
-       * Get current session id
-       * @returns {null|string} get current session id
-       */
-      getSessionId: function getSessionId() {
-        return wem.sessionID;
-      },
-
-      /**
-       * This function will register a personalization
-       *
-       * @param {object} personalization the personalization object
-       * @param {object} variants the variants
-       * @param {boolean} [ajax] Deprecated: Ajax rendering is not supported anymore
-       * @param {function} [resultCallback] the callback to be executed after personalization resolved
-       * @returns {undefined}
-       */
-      registerPersonalizationObject: function registerPersonalizationObject(personalization, variants, ajax, resultCallback) {
-        var target = personalization.id;
-
-        wem._registerPersonalizationCallback(personalization, function (result, additionalResultInfos) {
-          var selectedFilter = null;
-          var successfulFilters = [];
-          var inControlGroup = additionalResultInfos && additionalResultInfos.inControlGroup; // In case of control group Unomi is not resolving any strategy or fallback for us. So we have to do the fallback here.
-
-          if (inControlGroup && personalization.strategyOptions && personalization.strategyOptions.fallback) {
-            selectedFilter = variants[personalization.strategyOptions.fallback];
-            successfulFilters.push(selectedFilter);
-          } else {
-            for (var i = 0; i < result.length; i++) {
-              successfulFilters.push(variants[result[i]]);
-            }
-
-            if (successfulFilters.length > 0) {
-              selectedFilter = successfulFilters[0];
-              var minPos = successfulFilters[0].position;
-
-              if (minPos >= 0) {
-                for (var j = 1; j < successfulFilters.length; j++) {
-                  if (successfulFilters[j].position < minPos) {
-                    selectedFilter = successfulFilters[j];
-                  }
-                }
-              }
-            }
-          }
-
-          if (resultCallback) {
-            // execute callback
-            resultCallback(successfulFilters, selectedFilter);
-          } else {
-            if (selectedFilter) {
-              var targetFilters = document.getElementById(target).children;
-
-              for (var fIndex in targetFilters) {
-                var filter = targetFilters.item(fIndex);
-
-                if (filter) {
-                  filter.style.display = filter.id === selectedFilter.content ? '' : 'none';
-                }
-              } // we now add control group information to event if the user is in the control group.
-
-
-              if (inControlGroup) {
-                console.info('[WEM] Profile is in control group for target: ' + target + ', adding to personalization event...');
-                selectedFilter.event.target.properties.inControlGroup = true;
-
-                if (selectedFilter.event.target.properties.variants) {
-                  selectedFilter.event.target.properties.variants.forEach(function (variant) {
-                    return variant.inControlGroup = true;
-                  });
-                }
-              } // send event to unomi
-
-
-              wem.collectEvent(wem._completeEvent(selectedFilter.event), function () {
-                console.info('[WEM] Personalization event successfully collected.');
-              }, function () {
-                console.error('[WEM] Could not send personalization event.');
-              }); //Trigger variant display event for personalization
-
-              wem._dispatchJSExperienceDisplayedEvent(selectedFilter.event);
-            } else {
-              var elements = document.getElementById(target).children;
-
-              for (var eIndex in elements) {
-                var el = elements.item(eIndex);
-                el.style.display = 'none';
-              }
-            }
-          }
-        });
-      },
-
-      /**
-       * This function will register an optimization test or A/B test
-       *
-       * @param {string} optimizationTestNodeId the optimization test node id
-       * @param {string} goalId the associated goal Id
-       * @param {string} containerId the HTML container Id
-       * @param {object} variants the variants
-       * @param {boolean} [ajax] Deprecated: Ajax rendering is not supported anymore
-       * @param {object} [variantsTraffic] the associated traffic allocation
-       * @return {undefined}
-       */
-      registerOptimizationTest: function registerOptimizationTest(optimizationTestNodeId, goalId, containerId, variants, ajax, variantsTraffic) {
-        // check persona panel forced variant
-        var selectedVariantId = wem.getUrlParameter('wemSelectedVariantId-' + optimizationTestNodeId); // check already resolved variant stored in local
-
-        if (selectedVariantId === null) {
-          if (wem.storageAvailable('sessionStorage')) {
-            selectedVariantId = sessionStorage.getItem(optimizationTestNodeId);
-          } else {
-            selectedVariantId = wem.getCookie('selectedVariantId');
-
-            if (selectedVariantId != null && selectedVariantId === '') {
-              selectedVariantId = null;
-            }
-          }
-        } // select random variant and call unomi
-
-
-        if (!(selectedVariantId && variants[selectedVariantId])) {
-          var keys = Object.keys(variants);
-
-          if (variantsTraffic) {
-            var rand = 100 * Math.random() << 0;
-
-            for (var nodeIdentifier in variantsTraffic) {
-              if ((rand -= variantsTraffic[nodeIdentifier]) < 0 && selectedVariantId == null) {
-                selectedVariantId = nodeIdentifier;
-              }
-            }
-          } else {
-            selectedVariantId = keys[keys.length * Math.random() << 0];
-          }
-
-          if (wem.storageAvailable('sessionStorage')) {
-            sessionStorage.setItem(optimizationTestNodeId, selectedVariantId);
-          } else {
-            wem.setCookie('selectedVariantId', selectedVariantId, 1);
-          } // spread event to unomi
-
-
-          wem._registerEvent(wem._completeEvent(variants[selectedVariantId].event));
-        } //Trigger variant display event for optimization
-        // (Wrapped in DOMContentLoaded because opti are resulted synchronously at page load, so we dispatch the JS even after page load, to be sure that listeners are ready)
-
-
-        window.addEventListener('DOMContentLoaded', function () {
-          wem._dispatchJSExperienceDisplayedEvent(variants[selectedVariantId].event);
-        });
-
-        if (selectedVariantId) {
-          // update persona panel selected variant
-          if (window.optimizedContentAreas && window.optimizedContentAreas[optimizationTestNodeId]) {
-            window.optimizedContentAreas[optimizationTestNodeId].selectedVariant = selectedVariantId;
-          } // display the good variant
-
-
-          document.getElementById(variants[selectedVariantId].content).style.display = '';
-        }
-      },
-
-      /**
-       * This function is used to load the current context in the page
-       *
-       * @param {boolean} [skipEvents=false] Should we send the events
-       * @param {boolean} [invalidate=false] Should we invalidate the current context
-       * @param {boolean} [forceReload=false] This function contains an internal check to avoid loading of the context multiple times.
-       *                                      But in some rare cases, it could be useful to force the reloading of the context and bypass the check.
-       * @return {undefined}
-       */
-      loadContext: function loadContext() {
-        var skipEvents = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
-        var invalidate = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
-        var forceReload = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
-
-        if (wem.contextLoaded && !forceReload) {
-          console.log('Context already requested by', wem.contextLoaded);
-          return;
-        }
-
-        var jsonData = {
-          requiredProfileProperties: wem.digitalData.wemInitConfig.requiredProfileProperties,
-          requiredSessionProperties: wem.digitalData.wemInitConfig.requiredSessionProperties,
-          requireSegments: wem.digitalData.wemInitConfig.requireSegments,
-          requireScores: wem.digitalData.wemInitConfig.requireScores,
-          source: wem.buildSourcePage()
-        };
-
-        if (!skipEvents) {
-          jsonData.events = wem.digitalData.events;
-        }
-
-        if (wem.digitalData.personalizationCallback) {
-          jsonData.personalizations = wem.digitalData.personalizationCallback.map(function (x) {
-            return x.personalization;
-          });
-        }
-
-        jsonData.sessionId = wem.sessionID;
-        var contextUrl = wem.contextServerUrl + '/context.json';
-
-        if (invalidate) {
-          contextUrl += '?invalidateSession=true&invalidateProfile=true';
-        }
-
-        wem.ajax({
-          url: contextUrl,
-          type: 'POST',
-          async: true,
-          contentType: 'text/plain;charset=UTF-8',
-          // Use text/plain to avoid CORS preflight
-          jsonData: jsonData,
-          dataType: 'application/json',
-          invalidate: invalidate,
-          success: wem._onSuccess,
-          error: function error() {
-            wem._executeFallback('error during context loading');
-          }
-        });
-        wem.contextLoaded = Error().stack;
-        console.info('[WEM] context loading...');
-      },
-
-      /**
-       * This function will send an event to Apache Unomi
-       * @param {object} event The event object to send, you can build it using wem.buildEvent(eventType, target, source)
-       * @param {function} successCallback optional, will be executed in case of success
-       * @param {function} errorCallback optional, will be executed in case of error
-       * @return {undefined}
-       */
-      collectEvent: function collectEvent(event) {
-        var successCallback = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : undefined;
-        var errorCallback = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : undefined;
-        wem.collectEvents({
-          events: [event]
-        }, successCallback, errorCallback);
-      },
-
-      /**
-       * This function will send the events to Apache Unomi
-       *
-       * @param {object} events Javascript object { events: [event1, event2] }
-       * @param {function} successCallback optional, will be executed in case of success
-       * @param {function} errorCallback optional, will be executed in case of error
-       * @return {undefined}
-       */
-      collectEvents: function collectEvents(events) {
-        var successCallback = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : undefined;
-        var errorCallback = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : undefined;
-
-        if (wem.fallback) {
-          // in case of fallback we don't want to collect any events
-          return;
-        }
-
-        events.sessionId = wem.sessionID ? wem.sessionID : '';
-        var data = JSON.stringify(events);
-        wem.ajax({
-          url: wem.contextServerUrl + '/eventcollector',
-          type: 'POST',
-          async: true,
-          contentType: 'text/plain;charset=UTF-8',
-          // Use text/plain to avoid CORS preflight
-          data: data,
-          dataType: 'application/json',
-          success: successCallback,
-          error: errorCallback
-        });
-      },
-
-      /**
-       * This function will build an event of type click and send it to Apache Unomi
-       *
-       * @param {object} event javascript
-       * @param {function} [successCallback] optional, will be executed if case of success
-       * @param {function} [errorCallback] optional, will be executed if case of error
-       * @return {undefined}
-       */
-      sendClickEvent: function sendClickEvent(event) {
-        var successCallback = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : undefined;
-        var errorCallback = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : undefined;
-
-        if (event.target.id || event.target.name) {
-          console.info('[WEM] Send click event');
-          var targetId = event.target.id ? event.target.id : event.target.name;
-          var clickEvent = wem.buildEvent('click', wem.buildTarget(targetId, event.target.localName), wem.buildSourcePage());
-          var eventIndex = wem.eventsPrevented.indexOf(targetId);
-
-          if (eventIndex !== -1) {
-            wem.eventsPrevented.splice(eventIndex, 0);
-          } else {
-            wem.eventsPrevented.push(targetId);
-            event.preventDefault();
-            var target = event.target;
-            wem.collectEvent(clickEvent, function (xhr) {
-              console.info('[WEM] Click event successfully collected.');
-
-              if (successCallback) {
-                successCallback(xhr);
-              } else {
-                target.click();
-              }
-            }, function (xhr) {
-              console.error('[WEM] Could not send click event.');
-
-              if (errorCallback) {
-                errorCallback(xhr);
-              } else {
-                target.click();
-              }
-            });
-          }
-        }
-      },
-
-      /**
-       * This function will build an event of type video and send it to Apache Unomi
-       *
-       * @param {object} event javascript
-       * @param {function} [successCallback] optional, will be executed if case of success
-       * @param {function} [errorCallback] optional, will be executed if case of error
-       * @return {undefined}
-       */
-      sendVideoEvent: function sendVideoEvent(event) {
-        var successCallback = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : undefined;
-        var errorCallback = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : undefined;
-        console.info('[WEM] catching video event');
-        var videoEvent = wem.buildEvent('video', wem.buildTarget(event.target.id, 'video', {
-          action: event.type
-        }), wem.buildSourcePage());
-        wem.collectEvent(videoEvent, function (xhr) {
-          console.info('[WEM] Video event successfully collected.');
-
-          if (successCallback) {
-            successCallback(xhr);
-          }
-        }, function (xhr) {
-          console.error('[WEM] Could not send video event.');
-
-          if (errorCallback) {
-            errorCallback(xhr);
-          }
-        });
-      },
-
-      /**
-       * This function will invalidate the Apache Unomi session and profile,
-       * by removing the associated cookies, set the loaded context to undefined
-       * and set the session id cookie with a newly generated ID
-       * @return {undefined}
-       */
-      invalidateSessionAndProfile: function invalidateSessionAndProfile() {
-        wem.sessionID = wem.generateGuid() + wem.browserGeneratedSessionSuffix;
-        wem.setCookie(wem.trackerSessionIdCookieName, wem.sessionID, 1);
-        wem.removeCookie(wem.contextServerCookieName);
-        wem.removeCookie(wem.trackerProfileIdCookieName);
-        wem.cxs = undefined;
-      },
-
-      /**
-       * This function return the basic structure for an event, it must be adapted to your need
-       *
-       * @param {string} eventType The name of your event
-       * @param {object} [target] The target object for your event can be build with wem.buildTarget(targetId, targetType, targetProperties)
-       * @param {object} [source] The source object for your event can be build with wem.buildSource(sourceId, sourceType, sourceProperties)
-       * @returns {object} the event
-       */
-      buildEvent: function buildEvent(eventType, target, source) {
-        var event = {
-          eventType: eventType,
-          scope: wem.digitalData.scope
-        };
-
-        if (target) {
-          event.target = target;
-        }
-
-        if (source) {
-          event.source = source;
-        }
-
-        return event;
-      },
-
-      /**
-       * This function return an event of type form
-       *
-       * @param {string} formName The HTML name of id of the form to use in the target of the event
-       * @param {HTMLFormElement} form optional HTML form element, if provided will be used to extract the form fields and populate the form event
-       * @returns {object} the form event
-       */
-      buildFormEvent: function buildFormEvent(formName) {
-        var form = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : undefined;
-        var formEvent = wem.buildEvent('form', wem.buildTarget(formName, 'form'), wem.buildSourcePage());
-        formEvent.flattenedProperties = {
-          fields: form ? wem._extractFormData(form) : {}
-        };
-        return formEvent;
-      },
-
-      /**
-       * This function return the source object for a source of type page
-       *
-       * @returns {object} the target page
-       */
-      buildTargetPage: function buildTargetPage() {
-        return wem.buildTarget(wem.digitalData.page.pageInfo.pageID, 'page', wem.digitalData.page);
-      },
-
-      /**
-       * This function return the source object for a source of type page
-       *
-       * @returns {object} the source page
-       */
-      buildSourcePage: function buildSourcePage() {
-        return wem.buildSource(wem.digitalData.page.pageInfo.pageID, 'page', wem.digitalData.page);
-      },
-
-      /**
-       * This function return the basic structure for the target of your event
-       *
-       * @param {string} targetId The ID of the target
-       * @param {string} targetType The type of the target
-       * @param {object} [targetProperties] The optional properties of the target
-       * @returns {object} the target
-       */
-      buildTarget: function buildTarget(targetId, targetType) {
-        var targetProperties = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : undefined;
-        return wem._buildObject(targetId, targetType, targetProperties);
-      },
-
-      /**
-       * This function return the basic structure for the source of your event
-       *
-       * @param {string} sourceId The ID of the source
-       * @param {string} sourceType The type of the source
-       * @param {object} [sourceProperties] The optional properties of the source
-       * @returns {object} the source
-       */
-      buildSource: function buildSource(sourceId, sourceType) {
-        var sourceProperties = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : undefined;
-        return wem._buildObject(sourceId, sourceType, sourceProperties);
-      },
-
-      /*************************************/
-
-      /* Utility functions under this line */
-
-      /*************************************/
-
-      /**
-       * This is an utility function to set a cookie
-       *
-       * @param {string} cookieName name of the cookie
-       * @param {string} cookieValue value of the cookie
-       * @param {number} [expireDays] number of days to set the expire date
-       * @return {undefined}
-       */
-      setCookie: function setCookie(cookieName, cookieValue, expireDays) {
-        var expires = '';
-
-        if (expireDays) {
-          var d = new Date();
-          d.setTime(d.getTime() + expireDays * 24 * 60 * 60 * 1000);
-          expires = '; expires=' + d.toUTCString();
-        }
-
-        document.cookie = cookieName + '=' + cookieValue + expires + '; path=/; SameSite=Strict';
-      },
-
-      /**
-       * This is an utility function to get a cookie
-       *
-       * @param {string} cookieName name of the cookie to get
-       * @returns {string} the value of the first cookie with the corresponding name or null if not found
-       */
-      getCookie: function getCookie(cookieName) {
-        var name = cookieName + '=';
-        var ca = document.cookie.split(';');
-
-        for (var i = 0; i < ca.length; i++) {
-          var c = ca[i];
-
-          while (c.charAt(0) == ' ') {
-            c = c.substring(1);
-          }
-
-          if (c.indexOf(name) == 0) {
-            return c.substring(name.length, c.length);
-          }
-        }
-
-        return null;
-      },
-
-      /**
-       * This is an utility function to remove a cookie
-       *
-       * @param {string} cookieName the name of the cookie to rename
-       * @return {undefined}
-       */
-      removeCookie: function removeCookie(cookieName) {
-        wem.setCookie(cookieName, '', -1);
-      },
-
-      /**
-       * This is an utility function to execute AJAX call
-       *
-       * @param {object} options options of the request
-       * @return {undefined}
-       */
-      ajax: function ajax(options) {
-        var xhr = new XMLHttpRequest();
-
-        if ('withCredentials' in xhr) {
-          xhr.open(options.type, options.url, options.async);
-          xhr.withCredentials = true;
-        } else if (typeof XDomainRequest != 'undefined') {
-          /* global XDomainRequest */
-          xhr = new XDomainRequest();
-          xhr.open(options.type, options.url);
-        }
-
-        if (options.contentType) {
-          xhr.setRequestHeader('Content-Type', options.contentType);
-        }
-
-        if (options.dataType) {
-          xhr.setRequestHeader('Accept', options.dataType);
-        }
-
-        if (options.responseType) {
-          xhr.responseType = options.responseType;
-        }
-
-        var requestExecuted = false;
-
-        if (wem.timeoutInMilliseconds !== -1) {
-          setTimeout(function () {
-            if (!requestExecuted) {
-              console.error('[WEM] XML request timeout, url: ' + options.url);
-              requestExecuted = true;
-
-              if (options.error) {
-                options.error(xhr);
-              }
-            }
-          }, wem.timeoutInMilliseconds);
-        }
-
-        xhr.onreadystatechange = function () {
-          if (!requestExecuted) {
-            if (xhr.readyState === 4) {
-              if (xhr.status === 200 || xhr.status === 204 || xhr.status === 304) {
-                if (xhr.responseText != null) {
-                  requestExecuted = true;
-
-                  if (options.success) {
-                    options.success(xhr);
-                  }
-                }
-              } else {
-                requestExecuted = true;
-
-                if (options.error) {
-                  options.error(xhr);
-                }
-
-                console.error('[WEM] XML request error: ' + xhr.statusText + ' (' + xhr.status + ')');
-              }
-            }
-          }
-        };
-
-        if (options.jsonData) {
-          xhr.send(JSON.stringify(options.jsonData));
-        } else if (options.data) {
-          xhr.send(options.data);
-        } else {
-          xhr.send();
-        }
-      },
-
-      /**
-       * This is an utility function to generate a new UUID
-       *
-       * @returns {string} the newly generated UUID
-       */
-      generateGuid: function generateGuid() {
-        function s4() {
-          return Math.floor((1 + Math.random()) * 0x10000).toString(16).substring(1);
-        }
-
-        return s4() + s4() + '-' + s4() + '-' + s4() + '-' + s4() + '-' + s4() + s4() + s4();
-      },
-
-      /**
-       * This is an utility function to check if the local storage is available or not
-       * @param {string} type the type of storage to test
-       * @returns {boolean} true in case storage is available, false otherwise
-       */
-      storageAvailable: function storageAvailable(type) {
-        try {
-          var storage = window[type],
-              x = '__storage_test__';
-          storage.setItem(x, x);
-          storage.removeItem(x);
-          return true;
-        } catch (e) {
-          return false;
-        }
-      },
-
-      /**
-       * Dispatch a JavaScript event in current HTML document
-       *
-       * @param {string} name the name of the event
-       * @param {boolean} canBubble does the event can bubble ?
-       * @param {boolean} cancelable is the event cancelable ?
-       * @param {*} detail event details
-       * @return {undefined}
-       */
-      dispatchJSEvent: function dispatchJSEvent(name, canBubble, cancelable, detail) {
-        var event = document.createEvent('CustomEvent');
-        event.initCustomEvent(name, canBubble, cancelable, detail);
-        document.dispatchEvent(event);
-      },
-
-      /**
-       * Fill the wem.digitalData.displayedVariants with the javascript event passed as parameter
-       * @param {object} jsEvent javascript event
-       * @private
-       * @return {undefined}
-       */
-      _fillDisplayedVariants: function _fillDisplayedVariants(jsEvent) {
-        if (!wem.digitalData.displayedVariants) {
-          wem.digitalData.displayedVariants = [];
-        }
-
-        wem.digitalData.displayedVariants.push(jsEvent);
-      },
-
-      /**
-       * This is an utility function to get current url parameter value
-       *
-       * @param {string} name, the name of the parameter
-       * @returns {string} the value of the parameter
-       */
-      getUrlParameter: function getUrlParameter(name) {
-        name = name.replace(/[[]/, '\\[').replace(/[\]]/, '\\]');
-        var regex = new RegExp('[\\?&]' + name + '=([^&#]*)');
-        var results = regex.exec(window.location.search);
-        return results === null ? null : decodeURIComponent(results[1].replace(/\+/g, ' '));
-      },
-
-      /**
-       * convert the passed query string into JS object.
-       * @param {string} searchString The URL query string
-       * @returns {object} converted URL params
-       */
-      convertUrlParametersToObj: function convertUrlParametersToObj(searchString) {
-        if (!searchString) {
-          return null;
-        }
-
-        return searchString.replace(/^\?/, '') // Only trim off a single leading interrobang.
-        .split('&').reduce(function (result, next) {
-          if (next === '') {
-            return result;
-          }
-
-          var pair = next.split('=');
-          var key = decodeURIComponent(pair[0]);
-          var value = typeof pair[1] !== 'undefined' && decodeURIComponent(pair[1]) || undefined;
-
-          if (Object.prototype.hasOwnProperty.call(result, key)) {
-            // Check to see if this property has been met before.
-            if (Array.isArray(result[key])) {
-              // Is it already an array?
-              result[key].push(value);
-            } else {
-              // Make it an array.
-              result[key] = [result[key], value];
-            }
-          } else {
-            // First time seen, just add it.
-            result[key] = value;
-          }
-
-          return result;
-        }, {});
-      },
-
-      /*************************************/
-
-      /* Private functions under this line */
-
-      /*************************************/
-
-      /**
-       * Used to override the default digitalData values,
-       * the result will impact directly the current instance wem.digitalData
-       *
-       * @param {object[]} digitalDataOverrides list of overrides
-       * @private
-       * @return {undefined}
-       */
-      _handleDigitalDataOverrides: function _handleDigitalDataOverrides(digitalDataOverrides) {
-        if (digitalDataOverrides && digitalDataOverrides.length > 0) {
-          var _iterator = _createForOfIteratorHelper(digitalDataOverrides),
-              _step;
-
-          try {
-            for (_iterator.s(); !(_step = _iterator.n()).done;) {
-              var digitalDataOverride = _step.value;
-              wem.digitalData = wem._deepMergeObjects(digitalDataOverride, wem.digitalData);
-            }
-          } catch (err) {
-            _iterator.e(err);
-          } finally {
-            _iterator.f();
-          }
-        }
-      },
-
-      /**
-       * Check for tracked conditions in the current loaded context, and attach listeners for the known tracked condition types:
-       * - formEventCondition
-       * - videoViewEventCondition
-       * - clickOnLinkEventCondition
-       *
-       * @private
-       * @return {undefined}
-       */
-      _registerListenersForTrackedConditions: function _registerListenersForTrackedConditions() {
-        console.info('[WEM] Check for tracked conditions and attach related HTML listeners');
-        var videoNamesToWatch = [];
-        var clickToWatch = [];
-
-        if (wem.cxs.trackedConditions && wem.cxs.trackedConditions.length > 0) {
-          for (var i = 0; i < wem.cxs.trackedConditions.length; i++) {
-            switch (wem.cxs.trackedConditions[i].type) {
-              case 'formEventCondition':
-                if (wem.cxs.trackedConditions[i].parameterValues && wem.cxs.trackedConditions[i].parameterValues.formId) {
-                  wem.formNamesToWatch.push(wem.cxs.trackedConditions[i].parameterValues.formId);
-                }
-
-                break;
-
-              case 'videoViewEventCondition':
-                if (wem.cxs.trackedConditions[i].parameterValues && wem.cxs.trackedConditions[i].parameterValues.videoId) {
-                  videoNamesToWatch.push(wem.cxs.trackedConditions[i].parameterValues.videoId);
-                }
-
-                break;
-
-              case 'clickOnLinkEventCondition':
-                if (wem.cxs.trackedConditions[i].parameterValues && wem.cxs.trackedConditions[i].parameterValues.itemId) {
-                  clickToWatch.push(wem.cxs.trackedConditions[i].parameterValues.itemId);
-                }
-
-                break;
-            }
-          }
-        }
-
-        var forms = document.querySelectorAll('form');
-
-        for (var formIndex = 0; formIndex < forms.length; formIndex++) {
-          var form = forms.item(formIndex);
-          var formName = form.getAttribute('name') ? form.getAttribute('name') : form.getAttribute('id'); // test attribute data-form-id to not add a listener on FF form
-
-          if (formName && wem.formNamesToWatch.indexOf(formName) > -1 && form.getAttribute('data-form-id') == null) {
-            // add submit listener on form that we need to watch only
-            console.info('[WEM] Watching form ' + formName);
-            form.addEventListener('submit', wem._formSubmitEventListener, true);
-          }
-        }
-
-        for (var videoIndex = 0; videoIndex < videoNamesToWatch.length; videoIndex++) {
-          var videoName = videoNamesToWatch[videoIndex];
-          var video = document.getElementById(videoName) || document.getElementById(wem._resolveId(videoName));
-
-          if (video) {
-            video.addEventListener('play', wem.sendVideoEvent);
-            video.addEventListener('ended', wem.sendVideoEvent);
-            console.info('[WEM] Watching video ' + videoName);
-          } else {
-            console.warn('[WEM] Unable to watch video ' + videoName + ', video not found in the page');
-          }
-        }
-
-        for (var clickIndex = 0; clickIndex < clickToWatch.length; clickIndex++) {
-          var clickIdName = clickToWatch[clickIndex];
-          var click = document.getElementById(clickIdName) || document.getElementById(wem._resolveId(clickIdName)) ? document.getElementById(clickIdName) || document.getElementById(wem._resolveId(clickIdName)) : document.getElementsByName(clickIdName)[0];
-
-          if (click) {
-            click.addEventListener('click', wem.sendClickEvent);
-            console.info('[WEM] Watching click ' + clickIdName);
-          } else {
-            console.warn('[WEM] Unable to watch click ' + clickIdName + ', element not found in the page');
-          }
-        }
-      },
-
-      /**
-       * Check for currently registered events in wem.digitalData.events that would be incomplete:
-       * - autocomplete the event with the current digitalData page infos for the source
-       * @private
-       * @return {undefined}
-       */
-      _checkUncompleteRegisteredEvents: function _checkUncompleteRegisteredEvents() {
-        if (wem.digitalData && wem.digitalData.events) {
-          var _iterator2 = _createForOfIteratorHelper(wem.digitalData.events),
-              _step2;
-
-          try {
-            for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
-              var event = _step2.value;
-
-              wem._completeEvent(event);
-            }
-          } catch (err) {
-            _iterator2.e(err);
-          } finally {
-            _iterator2.f();
-          }
-        }
-      },
-
-      /**
-       * dispatch JavaScript event in current HTML document for perso and opti events contains in digitalData.events
-       * @private
-       * @return {undefined}
-       */
-      _dispatchJSExperienceDisplayedEvents: function _dispatchJSExperienceDisplayedEvents() {
-        if (wem.digitalData && wem.digitalData.events) {
-          var _iterator3 = _createForOfIteratorHelper(wem.digitalData.events),
-              _step3;
-
-          try {
-            for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
-              var event = _step3.value;
-
-              if (event.eventType === 'optimizationTestEvent' || event.eventType === 'personalizationEvent') {
-                wem._dispatchJSExperienceDisplayedEvent(event);
-              }
-            }
-          } catch (err) {
-            _iterator3.e(err);
-          } finally {
-            _iterator3.f();
-          }
-        }
-      },
-
-      /**
-       * build and dispatch JavaScript event in current HTML document for the given Unomi event (perso/opti)
-       * @private
-       * @param {object} experienceUnomiEvent perso/opti Unomi event
-       * @return {undefined}
-       */
-      _dispatchJSExperienceDisplayedEvent: function _dispatchJSExperienceDisplayedEvent(experienceUnomiEvent) {
-        if (!wem.fallback && experienceUnomiEvent && experienceUnomiEvent.target && experienceUnomiEvent.target.properties && experienceUnomiEvent.target.properties.variants && experienceUnomiEvent.target.properties.variants.length > 0) {
-          var typeMapper = {
-            optimizationTestEvent: 'optimization',
-            personalizationEvent: 'personalization'
-          };
-
-          var _iterator4 = _createForOfIteratorHelper(experienceUnomiEvent.target.properties.variants),
-              _step4;
-
-          try {
-            for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) {
-              var variant = _step4.value;
-              var jsEventDetail = {
-                id: variant.id,
-                name: variant.systemName,
-                displayableName: variant.displayableName,
-                path: variant.path,
-                type: typeMapper[experienceUnomiEvent.eventType],
-                variantType: experienceUnomiEvent.target.properties.type,
-                tags: variant.tags,
-                nodeType: variant.nodeType,
-                wrapper: {
-                  id: experienceUnomiEvent.target.itemId,
-                  name: experienceUnomiEvent.target.properties.systemName,
-                  displayableName: experienceUnomiEvent.target.properties.displayableName,
-                  path: experienceUnomiEvent.target.properties.path,
-                  tags: experienceUnomiEvent.target.properties.tags,
-                  nodeType: experienceUnomiEvent.target.properties.nodeType
-                }
-              };
-
-              if (experienceUnomiEvent.eventType === 'personalizationEvent') {
-                jsEventDetail.wrapper.inControlGroup = experienceUnomiEvent.target.properties.inControlGroup;
-              }
-
-              wem._fillDisplayedVariants(jsEventDetail);
-
-              wem.dispatchJSEvent('displayWemVariant', false, false, jsEventDetail);
-            }
-          } catch (err) {
-            _iterator4.e(err);
-          } finally {
-            _iterator4.f();
-          }
-        }
-      },
-
-      /**
-       * Filter events in digitalData.events that would have the property: event.properties.doNotSendToUnomi
-       * The effect is directly stored in a new version of wem.digitalData.events
-       * @private
-       * @return {undefined}
-       */
-      _filterUnomiEvents: function _filterUnomiEvents() {
-        if (wem.digitalData && wem.digitalData.events) {
-          wem.digitalData.events = wem.digitalData.events.filter(function (event) {
-            return !event.properties || !event.properties.doNotSendToUnomi;
-          }).map(function (event) {
-            if (event.properties) {
-              delete event.properties.doNotSendToUnomi;
-            }
-
-            return event;
-          });
-        }
-      },
-
-      /**
-       * Check if event is incomplete and complete what is missing:
-       * - source: if missing, use the current source page
-       * - scope: if missing, use the current scope
-       * @param {object} event, the event to be checked
-       * @private
-       * @return {object} the complete event
-       */
-      _completeEvent: function _completeEvent(event) {
-        if (!event.source) {
-          event.source = wem.buildSourcePage();
-        }
-
-        if (!event.scope) {
-          event.scope = wem.digitalData.scope;
-        }
-
-        if (event.target && !event.target.scope) {
-          event.target.scope = wem.digitalData.scope;
-        }
-
-        return event;
-      },
-
-      /**
-       * Register an event in the wem.digitalData.events.
-       * Registered event, will be sent automatically during the context loading process.
-       *
-       * Beware this function is useless in case the context is already loaded.
-       * in case the context is already loaded (check: wem.getLoadedContext()), then you should use: wem.collectEvent(s) functions
-       *
-       * @private
-       * @param {object} event the Unomi event to be registered
-       * @param {boolean} unshift optional, if true, the event will be added at the beginning of the list otherwise at the end of the list. (default: false)
-       * @return {undefined}
-       */
-      _registerEvent: function _registerEvent(event) {
-        var unshift = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
-
-        if (wem.digitalData) {
-          if (wem.cxs) {
-            console.error('[WEM] already loaded, too late...');
-            return;
-          }
-        } else {
-          wem.digitalData = {};
-        }
-
-        wem.digitalData.events = wem.digitalData.events || [];
-
-        if (unshift) {
-          wem.digitalData.events.unshift(event);
-        } else {
-          wem.digitalData.events.push(event);
-        }
-      },
-
-      /**
-       * This function allow for registering callback that will be executed once the context is loaded.
-       * @param {function} onLoadCallback the callback to be executed
-       * @param {string} name optional name for the call, used mostly for logging the execution
-       * @param {number} priority optional priority to execute the callbacks in a specific order
-       *                          (default: 5, to leave room for the tracker default callback(s))
-       * @private
-       * @return {undefined}
-       */
-      _registerCallback: function _registerCallback(onLoadCallback) {
-        var name = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : undefined;
-        var priority = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 5;
-
-        if (wem.digitalData) {
-          if (wem.cxs) {
-            console.info('[WEM] Trying to register context load callback, but context already loaded, executing now...');
-
-            if (onLoadCallback) {
-              console.info('[WEM] executing context load callback: ' + (name ? name : 'Callback without name'));
-              onLoadCallback(wem.digitalData);
-            }
-          } else {
-            console.info('[WEM] registering context load callback: ' + (name ? name : 'Callback without name'));
-
-            if (onLoadCallback) {
-              wem.digitalData.loadCallbacks = wem.digitalData.loadCallbacks || [];
-              wem.digitalData.loadCallbacks.push({
-                priority: priority,
-                name: name,
-                execute: onLoadCallback
-              });
-            }
-          }
-        } else {
-          console.info('[WEM] Trying to register context load callback, but no digitalData conf found, creating it and registering the callback: ' + (name ? name : 'Callback without name'));
-          wem.digitalData = {};
-
-          if (onLoadCallback) {
-            wem.digitalData.loadCallbacks = [];
-            wem.digitalData.loadCallbacks.push({
-              priority: priority,
-              name: name,
-              execute: onLoadCallback
-            });
-          }
-        }
-      },
-
-      /**
-       * Internal function for personalization specific callbacks (used for HTML dom manipulation once we get the context loaded)
-       * @param {object} personalization the personalization
-       * @param {function} callback the callback
-       * @private
-       * @return {undefined}
-       */
-      _registerPersonalizationCallback: function _registerPersonalizationCallback(personalization, callback) {
-        if (wem.digitalData) {
-          if (wem.cxs) {
-            console.error('[WEM] already loaded, too late...');
-          } else {
-            console.info('[WEM] digitalData object present but not loaded, registering sort callback...');
-            wem.digitalData.personalizationCallback = wem.digitalData.personalizationCallback || [];
-            wem.digitalData.personalizationCallback.push({
-              personalization: personalization,
-              callback: callback
-            });
-          }
-        } else {
-          wem.digitalData = {};
-          wem.digitalData.personalizationCallback = wem.digitalData.personalizationCallback || [];
-          wem.digitalData.personalizationCallback.push({
-            personalization: personalization,
-            callback: callback
-          });
-        }
-      },
-
-      /**
-       * Build a simple Unomi object
-       * @param {string} itemId the itemId of the object
-       * @param {string} itemType the itemType of the object
-       * @param {object} properties optional properties for the object
-       * @private
-       * @return {object} the built Unomi JSON object
-       */
-      _buildObject: function _buildObject(itemId, itemType) {
-        var properties = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : undefined;
-        var object = {
-          scope: wem.digitalData.scope,
-          itemId: itemId,
-          itemType: itemType
-        };
-
-        if (properties) {
-          object.properties = properties;
-        }
-
-        return object;
-      },
-
-      /**
-       * Main callback used once the Ajax context request succeed
-       * @param {XMLHttpRequest} xhr the request
-       * @private
-       * @return {undefined}
-       */
-      _onSuccess: function _onSuccess(xhr) {
-        wem.cxs = JSON.parse(xhr.responseText);
-
-        if (wem.digitalData.loadCallbacks && wem.digitalData.loadCallbacks.length > 0) {
-          console.info('[WEM] Found context server load callbacks, calling now...');
-
-          wem._executeLoadCallbacks(wem.digitalData);
-
-          if (wem.digitalData.personalizationCallback) {
-            for (var j = 0; j < wem.digitalData.personalizationCallback.length; j++) {
-              if (wem.cxs.personalizationResults) {
-                // Since Unomi 2.1.0 personalization results are available with more infos
-                var personalizationResult = wem.cxs.personalizationResults[wem.digitalData.personalizationCallback[j].personalization.id];
-                wem.digitalData.personalizationCallback[j].callback(personalizationResult.contentIds, personalizationResult.additionalResultInfos);
-              } else {
-                // probably a version older than Unomi 2.1.0, fallback to old personalization results
-                wem.digitalData.personalizationCallback[j].callback(wem.cxs.personalizations[wem.digitalData.personalizationCallback[j].personalization.id]);
-              }
-            }
-          }
-        }
-      },
-
-      /**
-       * Main callback used once the Ajax context request failed
-       * @param {string} logMessage the log message, to identify the place of failure
-       * @private
-       * @return {undefined}
-       */
-      _executeFallback: function _executeFallback(logMessage) {
-        console.warn('[WEM] execute fallback' + (logMessage ? ': ' + logMessage : '') + ', load fallback callbacks, calling now...');
-        wem.fallback = true;
-        wem.cxs = {};
-
-        wem._executeLoadCallbacks(undefined);
-
-        if (wem.digitalData.personalizationCallback) {
-          for (var i = 0; i < wem.digitalData.personalizationCallback.length; i++) {
-            wem.digitalData.personalizationCallback[i].callback([wem.digitalData.personalizationCallback[i].personalization.strategyOptions.fallback]);
-          }
-        }
-      },
-
-      /**
-       * Executed the registered context loaded callbacks
-       * @param {*} callbackParam param of the callbacks
-       * @private
-       * @return {undefined}
-       */
-      _executeLoadCallbacks: function _executeLoadCallbacks(callbackParam) {
-        if (wem.digitalData.loadCallbacks && wem.digitalData.loadCallbacks.length > 0) {
-          wem.digitalData.loadCallbacks.sort(function (a, b) {
-            return a.priority - b.priority;
-          }).forEach(function (loadCallback) {
-            console.info('[WEM] executing context load callback: ' + (loadCallback.name ? loadCallback.name : 'callback without name'));
-            loadCallback.execute(callbackParam);
-          });
-        }
-      },
-
-      /**
-       * Parse current HTML document referrer information to enrich the digitalData page infos
-       * @private
-       * @return {undefined}
-       */
-      _processReferrer: function _processReferrer() {
-        var referrerURL = wem.digitalData.page.pageInfo.referringURL || document.referrer;
-        var sameDomainReferrer = false;
-
-        if (referrerURL) {
-          // parse referrer URL
-          var referrer = new URL(referrerURL); // Set sameDomainReferrer property
-
-          sameDomainReferrer = referrer.host === window.location.host; // only process referrer if it's not coming from the same site as the current page
-
-          if (!sameDomainReferrer) {
-            // get search element if it exists and extract search query if available
-            var search = referrer.search;
-            var query = undefined;
-
-            if (search && search != '') {
-              // parse parameters
-              var queryParams = [],
-                  param;
-              var queryParamPairs = search.slice(1).split('&');
-
-              for (var i = 0; i < queryParamPairs.length; i++) {
-                param = queryParamPairs[i].split('=');
-                queryParams.push(param[0]);
-                queryParams[param[0]] = param[1];
-              } // try to extract query: q is Google-like (most search engines), p is Yahoo
-
-
-              query = queryParams.q || queryParams.p;
-              query = decodeURIComponent(query).replace(/\+/g, ' ');
-            } // register referrer event
-            // Create deep copy of wem.digitalData.page and add data to pageInfo sub object
-
-
-            if (wem.digitalData && wem.digitalData.page && wem.digitalData.page.pageInfo) {
-              wem.digitalData.page.pageInfo.referrerHost = referrer.host;
-              wem.digitalData.page.pageInfo.referrerQuery = query;
-            }
-          }
-        }
-
-        wem.digitalData.page.pageInfo.sameDomainReferrer = sameDomainReferrer;
-      },
-
-      /**
-       * Listener callback that can be attached to a specific HTML form,
-       * this listener will automatically send the form event to Unomi, by parsing the HTML form data.
-       * (NOTE: the form listener only work for know forms to be watch due to tracked conditions)
-       *
-       * @param {object} event the original HTML form submition event for the watch form.
-       * @private
-       * @return {undefined}
-       */
-      _formSubmitEventListener: function _formSubmitEventListener(event) {
-        console.info('[WEM] Registering form event callback');
-        var form = event.target;
-        var formName = form.getAttribute('name') ? form.getAttribute('name') : form.getAttribute('id');
-
-        if (formName && wem.formNamesToWatch.indexOf(formName) > -1) {
-          console.info('[WEM] catching form ' + formName);
-          var eventCopy = document.createEvent('Event'); // Define that the event name is 'build'.
-
-          eventCopy.initEvent('submit', event.bubbles, event.cancelable);
-          event.stopImmediatePropagation();
-          event.preventDefault();
-          wem.collectEvent(wem.buildFormEvent(formName, form), function () {
-            form.removeEventListener('submit', wem._formSubmitEventListener, true);
-            form.dispatchEvent(eventCopy);
-
-            if (!eventCopy.defaultPrevented && !eventCopy.cancelBubble) {
-              form.submit();
-            }
-
-            form.addEventListener('submit', wem._formSubmitEventListener, true);
-          }, function (xhr) {
-            console.error('[WEM] Error while collecting form event: ' + xhr.status + ' ' + xhr.statusText);
-            xhr.abort();
-            form.removeEventListener('submit', wem._formSubmitEventListener, true);
-            form.dispatchEvent(eventCopy);
-
-            if (!eventCopy.defaultPrevented && !eventCopy.cancelBubble) {
-              form.submit();
-            }
-
-            form.addEventListener('submit', wem._formSubmitEventListener, true);
-          });
-        }
-      },
-
-      /**
-       * Utility function to extract data from an HTML form.
-       *
-       * @param {HTMLFormElement} form the HTML form element
-       * @private
-       * @return {object} the form data as JSON
-       */
-      _extractFormData: function _extractFormData(form) {
-        var params = {};
-
-        for (var i = 0; i < form.elements.length; i++) {
-          var e = form.elements[i]; // ignore empty and undefined key (e.name)
-
-          if (e.name) {
-            switch (e.nodeName) {
-              case 'TEXTAREA':
-              case 'INPUT':
-                switch (e.type) {
-                  case 'checkbox':
-                    var checkboxes = document.querySelectorAll('input[name="' + e.name + '"]');
-
-                    if (checkboxes.length > 1) {
-                      if (!params[e.name]) {
-                        params[e.name] = [];
-                      }
-
-                      if (e.checked) {
-                        params[e.name].push(e.value);
-                      }
-                    }
-
-                    break;
-
-                  case 'radio':
-                    if (e.checked) {
-                      params[e.name] = e.value;
-                    }
-
-                    break;
-
-                  default:
-                    if (!e.value || e.value == '') {
-                      // ignore element if no value is provided
-                      break;
-                    }
-
-                    params[e.name] = e.value;
-                }
-
-                break;
-
-              case 'SELECT':
-                if (e.options && e.options[e.selectedIndex]) {
-                  if (e.multiple) {
-                    params[e.name] = [];
-
-                    for (var j = 0; j < e.options.length; j++) {
-                      if (e.options[j].selected) {
-                        params[e.name].push(e.options[j].value);
-                      }
-                    }
-                  } else {
-                    params[e.name] = e.options[e.selectedIndex].value;
-                  }
-                }
-
-                break;
-            }
-          }
-        }
-
-        return params;
-      },
-
-      /**
-       * Internal function used for mapping ids when current HTML document ids doesn't match ids stored in Unomi backend
-       * @param {string} id the id to resolve
-       * @return {string} the resolved id or the original id if not match found
-       * @private
-       */
-      _resolveId: function _resolveId(id) {
-        if (wem.digitalData.sourceLocalIdentifierMap) {
-          var source = Object.keys(wem.digitalData.sourceLocalIdentifierMap).filter(function (source) {
-            return id.indexOf(source) > 0;
-          });
-          return source ? id.replace(source, wem.digitalData.sourceLocalIdentifierMap[source]) : id;
-        }
-
-        return id;
-      },
-
-      /**
-       * Enable or disable tracking in current page
-       * @param {boolean} enable true will enable the tracking feature, otherwise they will be disabled
-       * @param {function} callback an optional callback that can be used to perform additional logic based on enabling/disabling results
-       * @private
-       * @return {undefined}
-       */
-      _enableWem: function _enableWem(enable) {
-        var callback = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : undefined; // display fallback if wem is not enable
-
-        wem.fallback = !enable; // remove cookies, reset cxs
-
-        if (!enable) {
-          wem.cxs = {};
-          document.cookie = wem.trackerProfileIdCookieName + '=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/;';
-          document.cookie = wem.contextServerCookieName + '=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/;';
-          delete wem.contextLoaded;
-        } else {
-          if (wem.DOMLoaded) {
-            wem.loadContext();
-          } else {
-            // As Dom loaded listener not triggered, enable global value.
-            wem.activateWem = true;
-          }
-        }
-
-        if (callback) {
-          callback(enable);
-        }
-
-        console.log("[WEM] successfully ".concat(enable ? 'enabled' : 'disabled', " tracking in current page"));
-      },
-
-      /**
-       * Utility function used to merge two JSON object together (arrays are concat for example)
-       * @param {object} source the source object for merge
-       * @param {object} target the target object for merge
-       * @private
-       * @return {object} the merged results
-       */
-      _deepMergeObjects: function _deepMergeObjects(source, target) {
-        if (!wem._isObject(target) || !wem._isObject(source)) {
-          return source;
-        }
-
-        Object.keys(source).forEach(function (key) {
-          var targetValue = target[key];
-          var sourceValue = source[key]; // concat arrays || merge objects || add new props
-
-          if (Array.isArray(targetValue) && Array.isArray(sourceValue)) {
-            target[key] = targetValue.concat(sourceValue);
-          } else if (wem._isObject(targetValue) && wem._isObject(sourceValue)) {
-            target[key] = wem._deepMergeObjects(sourceValue, Object.assign({}, targetValue));
-          } else {
-            target[key] = sourceValue;
-          }
-        });
-        return target;
-      },
-
-      /**
-       * Utility function used to check if the given variable is a JavaScript object.
-       * @param {*} obj the variable to check
-       * @private
-       * @return {boolean} true if the variable is an object, false otherwise
-       */
-      _isObject: function _isObject(obj) {
-        return obj && _typeof(obj) === 'object';
-      }
-    };
-    return wem;
-  };
-  /*
-   * Licensed to the Apache Software Foundation (ASF) under one or more
-   * contributor license agreements.  See the NOTICE file distributed with
-   * this work for additional information regarding copyright ownership.
-   * The ASF licenses this file to You under the Apache License, Version 2.0
-   * (the "License"); you may not use this file except in compliance with
-   * the License.  You may obtain a copy of the License at
-   *
-   *      http://www.apache.org/licenses/LICENSE-2.0
-   *
-   * Unless required by applicable law or agreed to in writing, software
-   * distributed under the License is distributed on an "AS IS" BASIS,
-   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   * See the License for the specific language governing permissions and
-   * limitations under the License.
-   */
-
-
-  var useTracker = function useTracker() {
-    return newTracker();
-  };
-
-  /*
-   * Licensed to the Apache Software Foundation (ASF) under one or more
-   * contributor license agreements.  See the NOTICE file distributed with
-   * this work for additional information regarding copyright ownership.
-   * The ASF licenses this file to You under the Apache License, Version 2.0
-   * (the "License"); you may not use this file except in compliance with
-   * the License.  You may obtain a copy of the License at
-   *
-   *      http://www.apache.org/licenses/LICENSE-2.0
-   *
-   * Unless required by applicable law or agreed to in writing, software
-   * distributed under the License is distributed on an "AS IS" BASIS,
-   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   * See the License for the specific language governing permissions and
-   * limitations under the License.
-   */
-  // we will store an instance in the current browser window to make it accessible
-
-  window.unomiWebTracker = useTracker();
-
-})();
-//# sourceMappingURL=unomi-web-tracker.js.map
diff --git a/extensions/web-tracker/wab/dist/unomi-web-tracker.js.map b/extensions/web-tracker/wab/dist/unomi-web-tracker.js.map
deleted file mode 100644
index d91fdebe4..000000000
--- a/extensions/web-tracker/wab/dist/unomi-web-tracker.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"unomi-web-tracker.js","sources":["../node_modules/@babel/runtime/helpers/esm/typeof.js","../node_modules/es6-crawler-detect/src/lib/crawler/provider.js","../node_modules/es6-crawler-detect/src/lib/crawler/crawlers.js","../node_modules/es6-crawler-detect/src/lib/crawler/exclusions.js","../node_modules/es6-crawler-detect/src/lib/crawler/headers.js","../node_modules/es6-crawler-detect/src/lib/crawler.js","../node_modules/es6-crawler-detect/src/index.js","../node_modules [...]
\ No newline at end of file
diff --git a/extensions/web-tracker/wab/dist/unomi-web-tracker.min.js b/extensions/web-tracker/wab/dist/unomi-web-tracker.min.js
deleted file mode 100644
index 5e1925a54..000000000
--- a/extensions/web-tracker/wab/dist/unomi-web-tracker.min.js
+++ /dev/null
@@ -1 +0,0 @@
-!function(){"use strict";function e(t){return e="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},e(t)}var t="undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{},r=[],n=[],o="undefined"!=typeof Uint8Array?Uint8Array:Array,i=!1;function a(){i=!0;for(var e="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghij [...]