From b8ef453d88d7506bd35a8a311d66cde8e364f135 Mon Sep 17 00:00:00 2001 From: Shane Holloway Date: Sun, 8 Dec 2024 09:49:22 -0700 Subject: [PATCH] v3.0.5-esm.2 -- repackaged module, created standard .js ESM exports --- README.md | 25 +- docs/alea.md | 8 +- docs/arc4.md | 8 +- docs/tychei.md | 8 +- docs/xor128.md | 8 +- docs/xor4096.md | 8 +- docs/xorshift7.md | 8 +- docs/xorwow.md | 8 +- esm/index.mjs | 566 ---- index.html | 14 +- lib/{_common.mjs => _common.js} | 0 lib/{alea.mjs => alea.js} | 2 +- lib/{arc4.mjs => arc4.js} | 2 +- lib/{crypto.mjs => crypto.js} | 0 lib/{index.mjs => index.js} | 14 +- lib/{tychei.mjs => tychei.js} | 2 +- lib/{xor128.mjs => xor128.js} | 2 +- lib/{xor4096.mjs => xor4096.js} | 2 +- lib/{xorshift7.mjs => xorshift7.js} | 2 +- lib/{xorwow.mjs => xorwow.js} | 2 +- package-lock.json | 1622 ++++++++--- package.json | 21 +- rollup.config.js | 42 +- unittest.html | 2 +- unittest/{ => dist}/browser_unittest.iife.js | 344 ++- unittest/package-lock.json | 2430 ----------------- unittest/package.json | 10 +- unittest/rollup.config.js | 8 +- unittest/unit/{_common.mjs => _common.js} | 0 unittest/unit/{alea.mjs => alea.js} | 6 +- unittest/unit/{arc4.mjs => arc4.js} | 6 +- unittest/unit/{tychei.mjs => tychei.js} | 6 +- unittest/unit/{xor128.mjs => xor128.js} | 6 +- unittest/unit/{xor4096.mjs => xor4096.js} | 6 +- unittest/unit/{xorshift7.mjs => xorshift7.js} | 6 +- unittest/unit/{xorwow.mjs => xorwow.js} | 6 +- unittest/unittest.js | 7 + unittest/unittest.mjs | 7 - 38 files changed, 1590 insertions(+), 3634 deletions(-) delete mode 100644 esm/index.mjs rename lib/{_common.mjs => _common.js} (100%) rename lib/{alea.mjs => alea.js} (98%) rename lib/{arc4.mjs => arc4.js} (99%) rename lib/{crypto.mjs => crypto.js} (100%) rename lib/{index.mjs => index.js} (88%) rename lib/{tychei.mjs => tychei.js} (97%) rename lib/{xor128.mjs => xor128.js} (95%) rename lib/{xor4096.mjs => xor4096.js} (98%) rename lib/{xorshift7.mjs => xorshift7.js} (97%) rename lib/{xorwow.mjs => xorwow.js} (96%) rename unittest/{ => dist}/browser_unittest.iife.js (92%) delete mode 100644 unittest/package-lock.json rename unittest/unit/{_common.mjs => _common.js} (100%) rename unittest/unit/{alea.mjs => alea.js} (96%) rename unittest/unit/{arc4.mjs => arc4.js} (97%) rename unittest/unit/{tychei.mjs => tychei.js} (95%) rename unittest/unit/{xor128.mjs => xor128.js} (95%) rename unittest/unit/{xor4096.mjs => xor4096.js} (97%) rename unittest/unit/{xorshift7.mjs => xorshift7.js} (94%) rename unittest/unit/{xorwow.mjs => xorwow.js} (95%) create mode 100644 unittest/unittest.js delete mode 100644 unittest/unittest.mjs diff --git a/README.md b/README.md index 2b5328e..d5cf395 100644 --- a/README.md +++ b/README.md @@ -14,7 +14,7 @@ Unit tested for number generator compatability with original [seedrandom][] Comm ## Demo -GitHub Pages-based [Live demo](https://shanewholloway.github.io/js-esm-seedrandom/index.html) +[Live demo](https://shanewholloway.github.io/js-esm-seedrandom/index.html) ## Use @@ -63,7 +63,7 @@ or direclty from HTML, ```html ``` @@ -150,6 +150,7 @@ In NodeJS [unittests][gh-actions-unittests], validation of state snapshot compat [gh-actions-unittests]: https://github.com/shanewholloway/js-esm-seedrandom/actions?query=workflow%3A%22Node.js+CI%22 -## LICENSE (MIT) +## License (MIT) + +[MIT](./LICENSE) -[MIT LICENSE](./LICENSE) diff --git a/docs/alea.md b/docs/alea.md index 9c7689e..ee3e5ac 100644 --- a/docs/alea.md +++ b/docs/alea.md @@ -7,12 +7,12 @@ alea, a 53-bit multiply-with-carry generator by Johannes Baagøe. ```javascript import {prng_alea} from 'esm-seedrandom' -import {prng_alea} from 'esm-seedrandom/esm/alea.mjs' -import prng_alea from 'esm-seedrandom/esm/alea.mjs' +import {prng_alea} from 'esm-seedrandom/esm/alea.js' +import prng_alea from 'esm-seedrandom/esm/alea.js' // from a browser or deno environment -import {prng_alea} from '//cdn.jsdelivr.net/npm/esm-seedrandom/esm/index.min.mjs' -import {prng_alea} from '//cdn.jsdelivr.net/npm/esm-seedrandom/esm/alea.min.mjs' +import {prng_alea} from '//cdn.jsdelivr.net/npm/esm-seedrandom/esm/index.min.js' +import {prng_alea} from '//cdn.jsdelivr.net/npm/esm-seedrandom/esm/alea.min.js' let myrng = prng_alea('an example seed string', {state: true}) diff --git a/docs/arc4.md b/docs/arc4.md index c88527c..40e071f 100644 --- a/docs/arc4.md +++ b/docs/arc4.md @@ -8,12 +8,12 @@ The original ARC4-based prng included in the [seedrandom][] library. ```javascript import {prng_arc4} from 'esm-seedrandom' -import {prng_arc4} from 'esm-seedrandom/esm/arc4.mjs' -import prng_arc4 from 'esm-seedrandom/esm/arc4.mjs' +import {prng_arc4} from 'esm-seedrandom/esm/arc4.js' +import prng_arc4 from 'esm-seedrandom/esm/arc4.js' // from a browser or deno environment -import {prng_arc4} from '//cdn.jsdelivr.net/npm/esm-seedrandom/esm/index.min.mjs' -import {prng_arc4} from '//cdn.jsdelivr.net/npm/esm-seedrandom/esm/arc4.min.mjs' +import {prng_arc4} from '//cdn.jsdelivr.net/npm/esm-seedrandom/esm/index.min.js' +import {prng_arc4} from '//cdn.jsdelivr.net/npm/esm-seedrandom/esm/arc4.min.js' let myrng = prng_arc4('an example seed string', {state: true}) diff --git a/docs/tychei.md b/docs/tychei.md index e76bd51..351495a 100644 --- a/docs/tychei.md +++ b/docs/tychei.md @@ -11,12 +11,12 @@ number generator derived from ChaCha, a modern stream cipher. ```javascript import {prng_tychei} from 'esm-seedrandom' -import {prng_tychei} from 'esm-seedrandom/esm/tychei.mjs' -import prng_tychei from 'esm-seedrandom/esm/tychei.mjs' +import {prng_tychei} from 'esm-seedrandom/esm/tychei.js' +import prng_tychei from 'esm-seedrandom/esm/tychei.js' // from a browser or deno environment -import {prng_tychei} from '//cdn.jsdelivr.net/npm/esm-seedrandom/esm/index.min.mjs' -import {prng_tychei} from '//cdn.jsdelivr.net/npm/esm-seedrandom/esm/tychei.min.mjs' +import {prng_tychei} from '//cdn.jsdelivr.net/npm/esm-seedrandom/esm/index.min.js' +import {prng_tychei} from '//cdn.jsdelivr.net/npm/esm-seedrandom/esm/tychei.min.js' let myrng = prng_tychei('an example seed string', {state: true}) diff --git a/docs/xor128.md b/docs/xor128.md index 5e9405e..b85b182 100644 --- a/docs/xor128.md +++ b/docs/xor128.md @@ -7,12 +7,12 @@ xor128, a pure xor-shift generator by George Marsaglia. ```javascript import {prng_xor128} from 'esm-seedrandom' -import {prng_xor128} from 'esm-seedrandom/esm/index.mjs' -import prng_xor128 from 'esm-seedrandom/esm/index.mjs' +import {prng_xor128} from 'esm-seedrandom/esm/index.js' +import prng_xor128 from 'esm-seedrandom/esm/index.js' // from a browser or deno environment -import {prng_xor128} from '//cdn.jsdelivr.net/npm/esm-seedrandom/esm/index.min.mjs' -import {prng_xor128} from '//cdn.jsdelivr.net/npm/esm-seedrandom/esm/xor128.min.mjs' +import {prng_xor128} from '//cdn.jsdelivr.net/npm/esm-seedrandom/esm/index.min.js' +import {prng_xor128} from '//cdn.jsdelivr.net/npm/esm-seedrandom/esm/xor128.min.js' let myrng = prng_xor128('an example seed string', {state: true}) diff --git a/docs/xor4096.md b/docs/xor4096.md index 85cd5f2..690f358 100644 --- a/docs/xor4096.md +++ b/docs/xor4096.md @@ -11,12 +11,12 @@ collisions. ```javascript import {prng_xor4096} from 'esm-seedrandom' -import {prng_xor4096} from 'esm-seedrandom/esm/xor4096.mjs' -import prng_xor4096 from 'esm-seedrandom/esm/xor4096.mjs' +import {prng_xor4096} from 'esm-seedrandom/esm/xor4096.js' +import prng_xor4096 from 'esm-seedrandom/esm/xor4096.js' // from a browser or deno environment -import {prng_xor4096} from '//cdn.jsdelivr.net/npm/esm-seedrandom/esm/index.min.mjs' -import {prng_xor4096} from '//cdn.jsdelivr.net/npm/esm-seedrandom/esm/xor4096.min.mjs' +import {prng_xor4096} from '//cdn.jsdelivr.net/npm/esm-seedrandom/esm/index.min.js' +import {prng_xor4096} from '//cdn.jsdelivr.net/npm/esm-seedrandom/esm/xor4096.min.js' let myrng = prng_xor4096('an example seed string', {state: true}) diff --git a/docs/xorshift7.md b/docs/xorshift7.md index ef8e6bc..5d2e50f 100644 --- a/docs/xorshift7.md +++ b/docs/xorshift7.md @@ -10,12 +10,12 @@ with 256 bits, that passes BigCrush with no systmatic failures. ```javascript import {prng_xorshift7} from 'esm-seedrandom' -import {prng_xorshift7} from 'esm-seedrandom/esm/xorshift7.mjs' -import prng_xorshift7 from 'esm-seedrandom/esm/xorshift7.mjs' +import {prng_xorshift7} from 'esm-seedrandom/esm/xorshift7.js' +import prng_xorshift7 from 'esm-seedrandom/esm/xorshift7.js' // from a browser or deno environment -import {prng_xorshift7} from '//cdn.jsdelivr.net/npm/esm-seedrandom/esm/index.min.mjs' -import {prng_xorshift7} from '//cdn.jsdelivr.net/npm/esm-seedrandom/esm/xorshift7.min.mjs' +import {prng_xorshift7} from '//cdn.jsdelivr.net/npm/esm-seedrandom/esm/index.min.js' +import {prng_xorshift7} from '//cdn.jsdelivr.net/npm/esm-seedrandom/esm/xorshift7.min.js' let myrng = prng_xorshift7('an example seed string', {state: true}) diff --git a/docs/xorwow.md b/docs/xorwow.md index 2f76522..edae5c6 100644 --- a/docs/xorwow.md +++ b/docs/xorwow.md @@ -7,12 +7,12 @@ xorwow, George Marsaglia's 160-bit xor-shift combined plus weyl. ```javascript import {prng_xorwow} from 'esm-seedrandom' -import {prng_xorwow} from 'esm-seedrandom/esm/xorwow.mjs' -import prng_xorwow from 'esm-seedrandom/esm/xorwow.mjs' +import {prng_xorwow} from 'esm-seedrandom/esm/xorwow.js' +import prng_xorwow from 'esm-seedrandom/esm/xorwow.js' // from a browser or deno environment -import {prng_xorwow} from '//cdn.jsdelivr.net/npm/esm-seedrandom/esm/index.min.mjs' -import {prng_xorwow} from '//cdn.jsdelivr.net/npm/esm-seedrandom/esm/xorwow.min.mjs' +import {prng_xorwow} from '//cdn.jsdelivr.net/npm/esm-seedrandom/esm/index.min.js' +import {prng_xorwow} from '//cdn.jsdelivr.net/npm/esm-seedrandom/esm/xorwow.min.js' let myrng = prng_xorwow('an example seed string', {state: true}) diff --git a/esm/index.mjs b/esm/index.mjs deleted file mode 100644 index d59c41f..0000000 --- a/esm/index.mjs +++ /dev/null @@ -1,566 +0,0 @@ -function _prng_restore(prng, xg, opts) { - let state = opts && opts.state; - if (state) { - if (typeof(state) == 'object') xg.copy(state, xg); - prng.state = () => xg.copy(xg, {}); - } -} - -function _prng_xor_core(xg, opts) { - let prng = () => (xg.next() >>> 0) / 0x100000000; - - prng.double = () => { - let top, bot, result; - do { - top = xg.next() >>> 11; - bot = (xg.next() >>> 0) / 0x100000000; - result = (top + bot) / (1 << 21); - } while (result === 0); - return result; - }; - - prng.int32 = () => xg.next() | 0; - - prng.quick = prng; - - _prng_restore(prng, xg, opts); - return prng; -} - -// A port of an algorithm by Johannes Baagøe , 2010 -function prng_alea(seed, opts) { - let xg = new AleaGen(seed); - - let prng = () => xg.next(); - - prng.double = () => - prng() + (prng() * 0x200000 | 0) * 1.1102230246251565e-16; // 2^-53 - - prng.int32 = () => (xg.next() * 0x100000000) | 0; - - prng.quick = prng; - - _prng_restore(prng, xg, opts); - return prng -} - -class AleaGen { - constructor(seed) { - if (seed == null) seed = +(new Date); - - let n = 0xefc8249d; - - // Apply the seeding algorithm from Baagoe. - this.c = 1; - this.s0 = mash(' '); - this.s1 = mash(' '); - this.s2 = mash(' '); - this.s0 -= mash(seed); - if (this.s0 < 0) { this.s0 += 1; } - this.s1 -= mash(seed); - if (this.s1 < 0) { this.s1 += 1; } - this.s2 -= mash(seed); - if (this.s2 < 0) { this.s2 += 1; } - - function mash(data) { - data = String(data); - for (let i = 0; i < data.length; i++) { - n += data.charCodeAt(i); - let h = 0.02519603282416938 * n; - n = h >>> 0; - h -= n; - h *= n; - n = h >>> 0; - h -= n; - n += h * 0x100000000; // 2^32 - } - return (n >>> 0) * 2.3283064365386963e-10; // 2^-32 - } - } - - next() { - let {c,s0,s1,s2} = this; - let t = 2091639 * s0 + c * 2.3283064365386963e-10; // 2^-32 - this.s0 = s1; - this.s1 = s2; - return this.s2 = t - (this.c = t | 0); - } - - copy(f, t) { - t.c = f.c; - t.s0 = f.s0; - t.s1 = f.s1; - t.s2 = f.s2; - return t; - } -} - -// A Javascript implementaion of the "xor128" prng algorithm by -function prng_xor128(seed, opts) { - let xg = new Xor128Gen(seed); - return _prng_xor_core(xg, opts); -} - -class Xor128Gen { - constructor(seed) { - if (seed == null) seed = +(new Date); - - let strseed = ''; - - this.x = 0; - this.y = 0; - this.z = 0; - this.w = 0; - - if (seed === (seed | 0)) { - // Integer seed. - this.x = seed; - } else { - // String seed. - strseed += seed; - } - - // Mix in string seed, then discard an initial batch of 64 values. - for (let k = 0; k < strseed.length + 64; k++) { - this.x ^= strseed.charCodeAt(k) | 0; - this.next(); - } - } - - next() { - let {x,y,z,w} = this; - let t = x ^ (x << 11); - this.x = y; - this.y = z; - this.z = w; - return this.w = w ^ ((w >>> 19) ^ t ^ (t >>> 8)); - }; - - copy(f, t) { - t.x = f.x; - t.y = f.y; - t.z = f.z; - t.w = f.w; - return t; - } -} - -// A Javascript implementaion of the "xorwow" prng algorithm by -function prng_xorwow(seed, opts) { - let xg = new XorWowGen(seed); - return _prng_xor_core(xg, opts); -} - -class XorWowGen { - constructor(seed) { - if (seed == null) seed = +(new Date); - - let strseed = ''; - - this.x = 0; - this.y = 0; - this.z = 0; - this.w = 0; - this.v = 0; - - if (seed === (seed | 0)) { - // Integer seed. - this.x = seed; - } else { - // String seed. - strseed += seed; - } - - // Mix in string seed, then discard an initial batch of 64 values. - for (let k = 0; k < strseed.length + 64; k++) { - this.x ^= strseed.charCodeAt(k) | 0; - if (k == strseed.length) { - this.d = this.x << 10 ^ this.x >>> 4; - } - this.next(); - } - } - - next() { - let {x,y,z,w,v,d} = this; - let t = (x ^ (x >>> 2)); - this.x = y; - this.y = z; - this.z = w; - this.w = v; - return (this.d = (d + 362437 | 0)) + - (this.v = (v ^ (v << 4)) ^ (t ^ (t << 1))) | 0; - }; - - copy(f, t) { - t.x = f.x; - t.y = f.y; - t.z = f.z; - t.w = f.w; - t.v = f.v; - t.d = f.d; - return t; - } -} - -// A Javascript implementaion of the "xorshift7" algorithm by -function prng_xorshift7(seed, opts) { - let xg = new XorShift7Gen(seed); - return _prng_xor_core(xg, opts); -} - - -class XorShift7Gen { - constructor(seed) { - if (seed == null) seed = +(new Date); - - var j, w, x = []; - - if (seed === (seed | 0)) { - // Seed state array using a 32-bit integer. - w = x[0] = seed; - } else { - // Seed state using a string. - seed = '' + seed; - for (j = 0; j < seed.length; ++j) { - x[j & 7] = (x[j & 7] << 15) ^ - (seed.charCodeAt(j) + x[(j + 1) & 7] << 13); - } - } - - // Enforce an array length of 8, not all zeroes. - while (x.length < 8) x.push(0); - for (j = 0; j < 8 && x[j] === 0; ++j); - if (j == 8) w = x[7] = -1; else w = x[j]; - - this.x = x; - this.i = 0; - - // Discard an initial 256 values. - for (j = 256; j > 0; --j) { - this.next(); - } - } - - next() { - // Update xor generator. - let t, v, {x,i} = this; - t = x[i]; t ^= (t >>> 7); v = t ^ (t << 24); - t = x[(i + 1) & 7]; v ^= t ^ (t >>> 10); - t = x[(i + 3) & 7]; v ^= t ^ (t >>> 3); - t = x[(i + 4) & 7]; v ^= t ^ (t << 7); - t = x[(i + 7) & 7]; t = t ^ (t << 13); v ^= t ^ (t << 9); - x[i] = v; - this.i = (i + 1) & 7; - return v; - }; - - copy(f, t) { - t.x = [... f.x]; - t.i = f.i; - return t; - } -} - -// A Javascript implementaion of Richard Brent's Xorgens xor4096 algorithm. -function prng_xor4096(seed, opts) { - let xg = new Xor4096Gen(seed); - return _prng_xor_core(xg, opts); -} - - -class Xor4096Gen { - constructor(seed) { - if (seed == null) seed = +(new Date); - - let t, v, i, j, w, X = [], limit = 128; - if (seed === (seed | 0)) { - // Numeric seeds initialize v, which is used to generates X. - v = seed; - seed = null; - } else { - // String seeds are mixed into v and X one character at a time. - seed = seed + '\0'; - v = 0; - limit = Math.max(limit, seed.length); - } - // Initialize circular array and weyl value. - for (i = 0, j = -32; j < limit; ++j) { - // Put the unicode characters into the array, and shuffle them. - if (seed) v ^= seed.charCodeAt((j + 32) % seed.length); - // After 32 shuffles, take v as the starting w value. - if (j === 0) w = v; - v ^= v << 10; - v ^= v >>> 15; - v ^= v << 4; - v ^= v >>> 13; - if (j >= 0) { - w = (w + 0x61c88647) | 0; // Weyl. - t = (X[j & 127] ^= (v + w)); // Combine xor and weyl to init array. - i = (0 == t) ? i + 1 : 0; // Count zeroes. - } - } - // We have detected all zeroes; make the key nonzero. - if (i >= 128) { - X[(seed && seed.length || 0) & 127] = -1; - } - // Run the generator 512 times to further mix the state before using it. - // Factoring this as a function slows the main generator, so it is just - // unrolled here. The weyl generator is not advanced while warming up. - i = 127; - for (j = 4 * 128; j > 0; --j) { - v = X[(i + 34) & 127]; - t = X[i = ((i + 1) & 127)]; - v ^= v << 13; - t ^= t << 17; - v ^= v >>> 15; - t ^= t >>> 12; - X[i] = v ^ t; - } - // Storing state as object members is faster than using closure variables. - this.w = w; - this.X = X; - this.i = i; - } - - next() { - let t, v, {w, X, i} = this; - // Update Weyl generator. - this.w = w = (w + 0x61c88647) | 0; - // Update xor generator. - v = X[(i + 34) & 127]; - t = X[i = ((i + 1) & 127)]; - v ^= v << 13; - t ^= t << 17; - v ^= v >>> 15; - t ^= t >>> 12; - // Update Xor generator array state. - v = X[i] = v ^ t; - this.i = i; - // Result is the combination. - return (v + (w ^ (w >>> 16))) | 0; - } - - copy(f, t) { - t.i = f.i; - t.w = f.w; - t.X = [... f.X]; - return t; - } -} - -// A Javascript implementaion of the "Tyche-i" prng algorithm by -function prng_tychei(seed, opts) { - let xg = new TycheiGen(seed); - return _prng_xor_core(xg, opts); -} - -class TycheiGen { - constructor(seed) { - if (seed == null) seed = +(new Date); - - let strseed = ''; - - this.a = 0; - this.b = 0; - this.c = 2654435769 | 0; - this.d = 1367130551; - - if (seed === Math.floor(seed)) { - // Integer seed. - this.a = (seed / 0x100000000) | 0; - this.b = seed | 0; - } else { - // String seed. - strseed += seed; - } - - // Mix in string seed, then discard an initial batch of 64 values. - for (let k = 0; k < strseed.length + 20; k++) { - this.b ^= strseed.charCodeAt(k) | 0; - this.next(); - } - } - - next() { - let {a,b,c,d} = this; - b = (b << 25) ^ (b >>> 7) ^ c; - c = (c - d) | 0; - d = (d << 24) ^ (d >>> 8) ^ a; - a = (a - b) | 0; - this.b = b = (b << 20) ^ (b >>> 12) ^ c; - this.c = c = (c - d) | 0; - this.d = (d << 16) ^ (c >>> 16) ^ a; - return this.a = (a - b) | 0; - }; - - copy(f, t) { - t.a = f.a; - t.b = f.b; - t.c = f.c; - t.d = f.d; - return t; - } -} - - -/* The following is non-inverted tyche, which has better internal - * bit diffusion, but which is about 25% slower than tyche-i in JS. - * - -class TycheiGenAlt extends TycheiGen { - next() { - let {a,b,c,d} = this - a = (a + b | 0) >>> 0; - d = d ^ a; d = d << 16 ^ d >>> 16; - c = c + d | 0; - b = b ^ c; b = b << 12 ^ d >>> 20; - this.a = a = a + b | 0; - d = d ^ a; this.d = d = d << 8 ^ d >>> 24; - this.c = c = c + d | 0; - b = b ^ c; - return this.b = (b << 7 ^ b >>> 25); - } -} -*/ - -/* -Copyright 2019 David Bau. - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -*/ -function prng_arc4(seed, opts) { - let xg = new ARC4Gen(seed); - let prng = () => xg.next(); - - prng.double = prng; - - prng.int32 = () => xg.g(4) | 0; - - prng.quick = () => xg.g(4) / 0x100000000; - - _prng_restore(prng, xg, opts); - return prng -} - - -// -// ARC4 -// -// An ARC4 implementation. The constructor takes a key in the form of -// an array of at most (width) integers that should be 0 <= x < (width). -// -// The g(count) method returns a pseudorandom integer that concatenates -// the next (count) outputs from ARC4. Its return value is a number x -// that is in the range 0 <= x < (width ^ count). -// - -// -// The following constants are related to IEEE 754 limits. -// - -// const width = 256 // each RC4 output is 0 <= x < 256 -// const chunks = 6 // at least six RC4 outputs for each double -const _arc4_startdenom = 281474976710656; // 256 ** 6 == width ** chunks -const _arc4_significance = 4503599627370496; // 2 ** 52 significant digits in a double -const _arc4_overflow = 9007199254740992; // 2 ** 53 == significance * 2 - - -class ARC4Gen { - constructor(seed) { - if (seed == null) seed = +(new Date); - - let key = this.mixkey(seed, []); - let i,j,t, S=[], keylen = key.length; - this.i = this.j = i = j = 0; - this.S = S; - - // The empty key [] is treated as [0]. - if (!keylen) { key = [keylen++]; } - - // Set up S using the standard key scheduling algorithm. - while (i <= 0xff) { - S[i] = i++; - } - for (i = 0; i <= 0xff; i++) { - S[i] = S[j = 0xff & (j + key[i % keylen] + (t = S[i]))]; - S[j] = t; - } - - // For robust unpredictability, the function call below automatically - // discards an initial batch of values. This is called RC4-drop[256]. - // See http://google.com/search?q=rsa+fluhrer+response&btnI - this.g(256); - } - - next() { - // This function returns a random double in [0, 1) that contains - // randomness in every bit of the mantissa of the IEEE 754 value. - - let n = this.g(6); // Start with a numerator n < 2 ^ 48 - let d = _arc4_startdenom; // and denominator d = 2 ^ 48. - let x = 0; // and no 'extra last byte'. - - while (n < _arc4_significance) { // Fill up all significant digits (2 ** 52) - n = (n + x) * 256; // by shifting numerator and - d *= 256; // denominator and generating a - x = this.g(1); // new least-significant-byte. - } - while (n >= _arc4_overflow) { // To avoid rounding past overflow, before adding - n /= 2; // last byte, shift everything - d /= 2; // right using integer math until - x >>>= 1; // we have exactly the desired bits. - } - return (n + x) / d; // Form the number within [0, 1). - } - - g(count) { - // The "g" method returns the next (count) outputs as one number. - let t, r = 0, {i,j,S} = this; - while (count--) { - t = S[i = 0xff & (i + 1)]; - r = r * 256 + S[0xff & ((S[i] = S[j = 0xff & (j + t)]) + (S[j] = t))]; - } - this.i = i; - this.j = j; - return r; - } - - copy(f, t) { - t.i = f.i; - t.j = f.j; - t.S = [... f.S]; - return t; - } - - mixkey(seed, key) { - seed = seed + ''; - let smear=0, j=0; - while (j < seed.length) { - key[0xff & j] = - 0xff & ((smear ^= key[0xff & j] * 19) + seed.charCodeAt(j++)); - } - return key - } -} - -export { prng_alea, prng_arc4, prng_tychei, prng_xor128, prng_xor4096, prng_xorshift7, prng_xorwow }; -//# sourceMappingURL=index.mjs.map diff --git a/index.html b/index.html index 6931efc..9562355 100644 --- a/index.html +++ b/index.html @@ -34,13 +34,13 @@

esm-see

 
-
+
 
diff --git a/unittest/browser_unittest.iife.js b/unittest/dist/browser_unittest.iife.js
similarity index 92%
rename from unittest/browser_unittest.iife.js
rename to unittest/dist/browser_unittest.iife.js
index 0577c00..556d84b 100644
--- a/unittest/browser_unittest.iife.js
+++ b/unittest/dist/browser_unittest.iife.js
@@ -908,6 +908,66 @@
 		assert(val === exp, val, exp, 'snapshot', lines, 'Expected value to match snapshot:', msg);
 	}
 
+	// ---
+
+	function not(val, msg) {
+		assert(!val, true, false, 'not', false, 'Expected value to be falsey', msg);
+	}
+
+	not.ok = not;
+
+	not.equal = function (val, exp, msg) {
+		assert(!dequal(val, exp), val, exp, 'not.equal', false, 'Expected values not to be deeply equal', msg);
+	};
+
+	not.type = function (val, exp, msg) {
+		let tmp = typeof val;
+		assert(tmp !== exp, tmp, exp, 'not.type', false, `Expected "${tmp}" not to be "${exp}"`, msg);
+	};
+
+	not.instance = function (val, exp, msg) {
+		let name = '`' + (exp.name || exp.constructor.name) + '`';
+		assert(!(val instanceof exp), val, exp, 'not.instance', false, `Expected value not to be an instance of ${name}`, msg);
+	};
+
+	not.snapshot = function (val, exp, msg) {
+		val=dedent(val); exp=dedent(exp);
+		assert(val !== exp, val, exp, 'not.snapshot', false, 'Expected value not to match snapshot', msg);
+	};
+
+	not.fixture = function (val, exp, msg) {
+		val=dedent(val); exp=dedent(exp);
+		assert(val !== exp, val, exp, 'not.fixture', false, 'Expected value not to match fixture', msg);
+	};
+
+	not.match = function (val, exp, msg) {
+		if (typeof exp === 'string') {
+			assert(!val.includes(exp), val, exp, 'not.match', false, `Expected value not to include "${exp}" substring`, msg);
+		} else {
+			let tmp = '`' + String(exp) + '`';
+			assert(!exp.test(val), val, exp, 'not.match', false, `Expected value not to match ${tmp} pattern`, msg);
+		}
+	};
+
+	not.throws = function (blk, exp, msg) {
+		if (!msg && typeof exp === 'string') {
+			msg = exp; exp = null;
+		}
+
+		try {
+			blk();
+		} catch (err) {
+			if (typeof exp === 'function') {
+				assert(!exp(err), true, false, 'not.throws', false, 'Expected function not to throw matching exception', msg);
+			} else if (exp instanceof RegExp) {
+				let tmp = '`' + String(exp) + '`';
+				assert(!exp.test(err.message), true, false, 'not.throws', false, `Expected function not to throw exception matching ${tmp} pattern`, msg);
+			} else if (!exp) {
+				assert(false, true, false, 'not.throws', false, 'Expected function not to throw', msg);
+			}
+		}
+	};
+
 	function test_snap(actual, expected, snap_name) {
 	  let sz_actual = JSON.stringify(actual, null, 2);
 	  let sz_expected = JSON.stringify(expected, null, 2);
@@ -968,7 +1028,7 @@
 	  });
 	}
 
-	function _prng_restore(prng, xg, opts) {
+	function _prng_restore$7(prng, xg, opts) {
 	  let state = opts && opts.state;
 	  if (state) {
 	    if (typeof(state) == 'object') xg.copy(state, xg);
@@ -976,7 +1036,7 @@
 	  }
 	}
 
-	function _prng_xor_core(xg, opts) {
+	function _prng_xor_core$5(xg, opts) {
 	  let prng = () => (xg.next() >>> 0) / 0x100000000;
 
 	  prng.double = () => {
@@ -993,13 +1053,13 @@
 
 	  prng.quick = prng;
 
-	  _prng_restore(prng, xg, opts);
+	  _prng_restore$7(prng, xg, opts);
 	  return prng;
 	}
 
 	// A port of an algorithm by Johannes Baagøe , 2010
-	function prng_alea(seed, opts) {
-	  let xg = new AleaGen(seed);
+	function prng_alea$1(seed, opts) {
+	  let xg = new AleaGen$1(seed);
 
 	  let prng = () => xg.next();
 
@@ -1010,11 +1070,11 @@
 
 	  prng.quick = prng;
 
-	  _prng_restore(prng, xg, opts);
+	  _prng_restore$7(prng, xg, opts);
 	  return prng
 	}
 
-	class AleaGen {
+	class AleaGen$1 {
 	  constructor(seed) {
 	    if (seed == null) seed = +(new Date);
 
@@ -1066,12 +1126,12 @@
 	}
 
 	// A Javascript implementaion of the "xor128" prng algorithm by
-	function prng_xor128(seed, opts) {
-	  let xg = new Xor128Gen(seed);
-	  return _prng_xor_core(xg, opts);
+	function prng_xor128$1(seed, opts) {
+	  let xg = new Xor128Gen$1(seed);
+	  return _prng_xor_core$5(xg, opts);
 	}
 
-	class Xor128Gen {
+	class Xor128Gen$1 {
 	  constructor(seed) {
 	    if (seed == null) seed = +(new Date);
 
@@ -1116,12 +1176,12 @@
 	}
 
 	// A Javascript implementaion of the "xorwow" prng algorithm by
-	function prng_xorwow(seed, opts) {
-	  let xg = new XorWowGen(seed);
-	  return _prng_xor_core(xg, opts);
+	function prng_xorwow$1(seed, opts) {
+	  let xg = new XorWowGen$1(seed);
+	  return _prng_xor_core$5(xg, opts);
 	}
 
-	class XorWowGen {
+	class XorWowGen$1 {
 	  constructor(seed) {
 	    if (seed == null) seed = +(new Date);
 
@@ -1174,21 +1234,21 @@
 	}
 
 	// A Javascript implementaion of the "xorshift7" algorithm by
-	function prng_xorshift7(seed, opts) {
-	  let xg = new XorShift7Gen(seed);
-	  return _prng_xor_core(xg, opts);
+	function prng_xorshift7$1(seed, opts) {
+	  let xg = new XorShift7Gen$1(seed);
+	  return _prng_xor_core$5(xg, opts);
 	}
 
 
-	class XorShift7Gen {
+	class XorShift7Gen$1 {
 	  constructor(seed) {
 	    if (seed == null) seed = +(new Date);
 
-	    var j, w, x = [];
+	    var j, x = [];
 
 	    if (seed === (seed | 0)) {
 	      // Seed state array using a 32-bit integer.
-	      w = x[0] = seed;
+	      x[0] = seed;
 	    } else {
 	      // Seed state using a string.
 	      seed = '' + seed;
@@ -1201,7 +1261,7 @@
 	    // Enforce an array length of 8, not all zeroes.
 	    while (x.length < 8) x.push(0);
 	    for (j = 0; j < 8 && x[j] === 0; ++j);
-	    if (j == 8) w = x[7] = -1; else w = x[j];
+	    if (j == 8) x[7] = -1; else x[j];
 
 	    this.x = x;
 	    this.i = 0;
@@ -1233,13 +1293,13 @@
 	}
 
 	// A Javascript implementaion of Richard Brent's Xorgens xor4096 algorithm.
-	function prng_xor4096(seed, opts) {
-	  let xg = new Xor4096Gen(seed);
-	  return _prng_xor_core(xg, opts);
+	function prng_xor4096$1(seed, opts) {
+	  let xg = new Xor4096Gen$1(seed);
+	  return _prng_xor_core$5(xg, opts);
 	}
 
 
-	class Xor4096Gen {
+	class Xor4096Gen$1 {
 	  constructor(seed) {
 	    if (seed == null) seed = +(new Date);
 
@@ -1320,12 +1380,12 @@
 	}
 
 	// A Javascript implementaion of the "Tyche-i" prng algorithm by
-	function prng_tychei(seed, opts) {
-	  let xg = new TycheiGen(seed);
-	  return _prng_xor_core(xg, opts);
+	function prng_tychei$1(seed, opts) {
+	  let xg = new TycheiGen$1(seed);
+	  return _prng_xor_core$5(xg, opts);
 	}
 
-	class TycheiGen {
+	class TycheiGen$1 {
 	  constructor(seed) {
 	    if (seed == null) seed = +(new Date);
 
@@ -1417,8 +1477,8 @@
 	SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 
 	*/
-	function prng_arc4(seed, opts) {
-	  let xg = new ARC4Gen(seed);
+	function prng_arc4$1(seed, opts) {
+	  let xg = new ARC4Gen$1(seed);
 	  let prng = () => xg.next();
 
 	  prng.double = prng;
@@ -1427,7 +1487,7 @@
 
 	  prng.quick = () => xg.g(4) / 0x100000000;
 
-	  _prng_restore(prng, xg, opts);
+	  _prng_restore$7(prng, xg, opts);
 	  return prng
 	}
 
@@ -1449,12 +1509,12 @@
 
 	// const width = 256 // each RC4 output is 0 <= x < 256
 	// const chunks = 6 // at least six RC4 outputs for each double
-	const _arc4_startdenom = 281474976710656;     // 256 ** 6 == width ** chunks
-	const _arc4_significance = 4503599627370496;  // 2 ** 52 significant digits in a double
-	const _arc4_overflow = 9007199254740992;      // 2 ** 53 == significance * 2
+	const _arc4_startdenom$1 = 281474976710656;     // 256 ** 6 == width ** chunks
+	const _arc4_significance$1 = 4503599627370496;  // 2 ** 52 significant digits in a double
+	const _arc4_overflow$1 = 9007199254740992;      // 2 ** 53 == significance * 2
 
 
-	class ARC4Gen {
+	class ARC4Gen$1 {
 	  constructor(seed) {
 	    if (seed == null) seed = +(new Date);
 
@@ -1486,15 +1546,15 @@
 	    // randomness in every bit of the mantissa of the IEEE 754 value.
 
 	    let n = this.g(6);                  // Start with a numerator n < 2 ^ 48
-	    let d = _arc4_startdenom;           //   and denominator d = 2 ^ 48.
+	    let d = _arc4_startdenom$1;           //   and denominator d = 2 ^ 48.
 	    let x = 0;                          //   and no 'extra last byte'.
 
-	    while (n < _arc4_significance) {    // Fill up all significant digits (2 ** 52)
+	    while (n < _arc4_significance$1) {    // Fill up all significant digits (2 ** 52)
 	      n = (n + x) * 256;                //   by shifting numerator and
 	      d *= 256;                         //   denominator and generating a
 	      x = this.g(1);                    //   new least-significant-byte.
 	    }
-	    while (n >= _arc4_overflow) {       // To avoid rounding past overflow, before adding
+	    while (n >= _arc4_overflow$1) {       // To avoid rounding past overflow, before adding
 	      n /= 2;                           //   last byte, shift everything
 	      d /= 2;                           //   right using integer math until
 	      x >>>= 1;                         //   we have exactly the desired bits.
@@ -1532,7 +1592,7 @@
 	  }
 	}
 
-	function _prng_restore$1(prng, xg, opts) {
+	function _prng_restore$6(prng, xg, opts) {
 	  let state = opts && opts.state;
 	  if (state) {
 	    if (typeof(state) == 'object') xg.copy(state, xg);
@@ -1541,8 +1601,8 @@
 	}
 
 	// A port of an algorithm by Johannes Baagøe , 2010
-	function prng_alea$1(seed, opts) {
-	  let xg = new AleaGen$1(seed);
+	function prng_alea(seed, opts) {
+	  let xg = new AleaGen(seed);
 
 	  let prng = () => xg.next();
 
@@ -1553,11 +1613,11 @@
 
 	  prng.quick = prng;
 
-	  _prng_restore$1(prng, xg, opts);
+	  _prng_restore$6(prng, xg, opts);
 	  return prng
 	}
 
-	class AleaGen$1 {
+	class AleaGen {
 	  constructor(seed) {
 	    if (seed == null) seed = +(new Date);
 
@@ -1608,7 +1668,7 @@
 	  }
 	}
 
-	function t(t,e){let i=new s(t),h=()=>i.next();return h.double=()=>h()+11102230246251565e-32*(2097152*h()|0),h.int32=()=>4294967296*i.next()|0,h.quick=h,function(t,s,e){let i=e&&e.state;i&&("object"==typeof i&&s.copy(i,s),t.state=()=>s.copy(s,{}));}(h,i,e),h}class s{constructor(t){null==t&&(t=+new Date);let s=4022871197;function e(t){t=String(t);for(let e=0;e>>0,i-=s,i*=s,s=i>>>0,i-=s,s+=4294967296*i;}return 2.3283064365386963e-10*(s>>>0)}this.c=1,this.s0=e(" "),this.s1=e(" "),this.s2=e(" "),this.s0-=e(t),this.s0<0&&(this.s0+=1),this.s1-=e(t),this.s1<0&&(this.s1+=1),this.s2-=e(t),this.s2<0&&(this.s2+=1);}next(){let{c:t,s0:s,s1:e,s2:i}=this,h=2091639*s+2.3283064365386963e-10*t;return this.s0=e,this.s1=i,this.s2=h-(this.c=0|h)}copy(t,s){return s.c=t.c,s.s0=t.s0,s.s1=t.s1,s.s2=t.s2,s}}
+	function t$6(t,e){let i=new s(t),h=()=>i.next();return h.double=()=>h()+11102230246251565e-32*(2097152*h()|0),h.int32=()=>4294967296*i.next()|0,h.quick=h,function(t,s,e){let i=e&&e.state;i&&("object"==typeof i&&s.copy(i,s),t.state=()=>s.copy(s,{}));}(h,i,e),h}class s{constructor(t){null==t&&(t=+new Date);let s=4022871197;function e(t){t=String(t);for(let e=0;e>>0,i-=s,i*=s,s=i>>>0,i-=s,s+=4294967296*i;}return 2.3283064365386963e-10*(s>>>0)}this.c=1,this.s0=e(" "),this.s1=e(" "),this.s2=e(" "),this.s0-=e(t),this.s0<0&&(this.s0+=1),this.s1-=e(t),this.s1<0&&(this.s1+=1),this.s2-=e(t),this.s2<0&&(this.s2+=1);}next(){let{c:t,s0:s,s1:e,s2:i}=this,h=2091639*s+2.3283064365386963e-10*t;return this.s0=e,this.s1=i,this.s2=h-(this.c=0|h)}copy(t,s){return s.c=t.c,s.s0=t.s0,s.s1=t.s1,s.s2=t.s2,s}}
 
 	const cjs_prng_alea = require('seedrandom/lib/alea.js');
 
@@ -1623,13 +1683,13 @@
 	  };
 
 	  describe('shared', () =>
-	    test_prng_alg('alea', prng_alea, snap));
+	    test_prng_alg('alea', prng_alea$1, snap));
 
 	  describe('isolated', () =>
-	    test_prng_alg('alea', prng_alea$1, snap));
+	    test_prng_alg('alea', prng_alea, snap));
 
 	  describe('isolated minified', () =>
-	    test_prng_alg('alea', t, snap));
+	    test_prng_alg('alea', t$6, snap));
 
 	  if (cjs_prng_alea)
 	    describe('original seedrandom (CommonJS)', () =>
@@ -1648,20 +1708,20 @@
 	  };
 
 	  describe('shared', () =>
-	    test_prng_alg('alea', prng_alea, snap));
+	    test_prng_alg('alea', prng_alea$1, snap));
 
 	  describe('isolated', () =>
-	    test_prng_alg('alea', prng_alea$1, snap));
+	    test_prng_alg('alea', prng_alea, snap));
 
 	  describe('isolated minified', () =>
-	    test_prng_alg('alea', t, snap));
+	    test_prng_alg('alea', t$6, snap));
 
 	  if (cjs_prng_alea)
 	    describe('original seedrandom (CommonJS)', () =>
 	      test_prng_alg('alea', cjs_prng_alea, snap));
 	});
 
-	function _prng_restore$2(prng, xg, opts) {
+	function _prng_restore$5(prng, xg, opts) {
 	  let state = opts && opts.state;
 	  if (state) {
 	    if (typeof(state) == 'object') xg.copy(state, xg);
@@ -1669,7 +1729,7 @@
 	  }
 	}
 
-	function _prng_xor_core$1(xg, opts) {
+	function _prng_xor_core$4(xg, opts) {
 	  let prng = () => (xg.next() >>> 0) / 0x100000000;
 
 	  prng.double = () => {
@@ -1686,17 +1746,17 @@
 
 	  prng.quick = prng;
 
-	  _prng_restore$2(prng, xg, opts);
+	  _prng_restore$5(prng, xg, opts);
 	  return prng;
 	}
 
 	// A Javascript implementaion of the "xor128" prng algorithm by
-	function prng_xor128$1(seed, opts) {
-	  let xg = new Xor128Gen$1(seed);
-	  return _prng_xor_core$1(xg, opts);
+	function prng_xor128(seed, opts) {
+	  let xg = new Xor128Gen(seed);
+	  return _prng_xor_core$4(xg, opts);
 	}
 
-	class Xor128Gen$1 {
+	class Xor128Gen {
 	  constructor(seed) {
 	    if (seed == null) seed = +(new Date);
 
@@ -1740,7 +1800,7 @@
 	  }
 	}
 
-	function t$1(t,n){return function(t,e){let n=()=>(t.next()>>>0)/4294967296;return n.double=()=>{let e,n,i;do{e=t.next()>>>11,n=(t.next()>>>0)/4294967296,i=(e+n)/(1<<21);}while(0===i);return i},n.int32=()=>0|t.next(),n.quick=n,function(t,e,n){let i=n&&n.state;i&&("object"==typeof i&&e.copy(i,e),t.state=()=>e.copy(e,{}));}(n,t,e),n}(new e(t),n)}class e{constructor(t){null==t&&(t=+new Date);let e="";this.x=0,this.y=0,this.z=0,this.w=0,t===(0|t)?this.x=t:e+=t;for(let t=0;t>>19^s^s>>>8}copy(t,e){return e.x=t.x,e.y=t.y,e.z=t.z,e.w=t.w,e}}
+	function t$5(t,n){return function(t,e){let n=()=>(t.next()>>>0)/4294967296;return n.double=()=>{let e,n,i;do{e=t.next()>>>11,n=(t.next()>>>0)/4294967296,i=(e+n)/(1<<21);}while(0===i);return i},n.int32=()=>0|t.next(),n.quick=n,function(t,e,n){let i=n&&n.state;i&&("object"==typeof i&&e.copy(i,e),t.state=()=>e.copy(e,{}));}(n,t,e),n}(new e$5(t),n)}class e$5{constructor(t){null==t&&(t=+new Date);let e="";this.x=0,this.y=0,this.z=0,this.w=0,t===(0|t)?this.x=t:e+=t;for(let t=0;t>>19^s^s>>>8}copy(t,e){return e.x=t.x,e.y=t.y,e.z=t.z,e.w=t.w,e}}
 
 	const cjs_prng_xor128 = require('seedrandom/lib/xor128.js');
 
@@ -1755,13 +1815,13 @@
 	  };
 
 	  describe('shared', () =>
-	    test_prng_alg('xor128', prng_xor128, snap));
+	    test_prng_alg('xor128', prng_xor128$1, snap));
 
 	  describe('isolated', () =>
-	    test_prng_alg('xor128', prng_xor128$1, snap));
+	    test_prng_alg('xor128', prng_xor128, snap));
 
 	  describe('isolated minified', () =>
-	    test_prng_alg('xor128', t$1, snap));
+	    test_prng_alg('xor128', t$5, snap));
 
 	  if (cjs_prng_xor128)
 	    describe('original seedrandom (CommonJS)', () =>
@@ -1779,20 +1839,20 @@
 	  };
 
 	  describe('shared', () =>
-	    test_prng_alg('xor128', prng_xor128, snap));
+	    test_prng_alg('xor128', prng_xor128$1, snap));
 
 	  describe('isolated', () =>
-	    test_prng_alg('xor128', prng_xor128$1, snap));
+	    test_prng_alg('xor128', prng_xor128, snap));
 
 	  describe('isolated minified', () =>
-	    test_prng_alg('xor128', t$1, snap));
+	    test_prng_alg('xor128', t$5, snap));
 
 	  if (cjs_prng_xor128)
 	    describe('original seedrandom (CommonJS)', () =>
 	      test_prng_alg('xor128', cjs_prng_xor128, snap));
 	});
 
-	function _prng_restore$3(prng, xg, opts) {
+	function _prng_restore$4(prng, xg, opts) {
 	  let state = opts && opts.state;
 	  if (state) {
 	    if (typeof(state) == 'object') xg.copy(state, xg);
@@ -1800,7 +1860,7 @@
 	  }
 	}
 
-	function _prng_xor_core$2(xg, opts) {
+	function _prng_xor_core$3(xg, opts) {
 	  let prng = () => (xg.next() >>> 0) / 0x100000000;
 
 	  prng.double = () => {
@@ -1817,17 +1877,17 @@
 
 	  prng.quick = prng;
 
-	  _prng_restore$3(prng, xg, opts);
+	  _prng_restore$4(prng, xg, opts);
 	  return prng;
 	}
 
 	// A Javascript implementaion of the "Tyche-i" prng algorithm by
-	function prng_tychei$1(seed, opts) {
-	  let xg = new TycheiGen$1(seed);
-	  return _prng_xor_core$2(xg, opts);
+	function prng_tychei(seed, opts) {
+	  let xg = new TycheiGen(seed);
+	  return _prng_xor_core$3(xg, opts);
 	}
 
-	class TycheiGen$1 {
+	class TycheiGen {
 	  constructor(seed) {
 	    if (seed == null) seed = +(new Date);
 
@@ -1875,7 +1935,7 @@
 	  }
 	}
 
-	function t$2(t,n){return function(t,e){let n=()=>(t.next()>>>0)/4294967296;return n.double=()=>{let e,n,i;do{e=t.next()>>>11,n=(t.next()>>>0)/4294967296,i=(e+n)/(1<<21);}while(0===i);return i},n.int32=()=>0|t.next(),n.quick=n,function(t,e,n){let i=n&&n.state;i&&("object"==typeof i&&e.copy(i,e),t.state=()=>e.copy(e,{}));}(n,t,e),n}(new e$1(t),n)}class e$1{constructor(t){null==t&&(t=+new Date);let e="";this.a=0,this.b=0,this.c=-1640531527,this.d=1367130551,t===Math.floor(t)?(this.a=t/4294967296|0,this.b=0|t):e+=t;for(let t=0;t>>7^n,n=n-i|0,i=i<<24^i>>>8^t,t=t-e|0,this.b=e=e<<20^e>>>12^n,this.c=n=n-i|0,this.d=i<<16^n>>>16^t,this.a=t-e|0}copy(t,e){return e.a=t.a,e.b=t.b,e.c=t.c,e.d=t.d,e}}
+	function t$4(t,n){return function(t,e){let n=()=>(t.next()>>>0)/4294967296;return n.double=()=>{let e,n,i;do{e=t.next()>>>11,n=(t.next()>>>0)/4294967296,i=(e+n)/(1<<21);}while(0===i);return i},n.int32=()=>0|t.next(),n.quick=n,function(t,e,n){let i=n&&n.state;i&&("object"==typeof i&&e.copy(i,e),t.state=()=>e.copy(e,{}));}(n,t,e),n}(new e$4(t),n)}class e$4{constructor(t){null==t&&(t=+new Date);let e="";this.a=0,this.b=0,this.c=-1640531527,this.d=1367130551,t===Math.floor(t)?(this.a=t/4294967296|0,this.b=0|t):e+=t;for(let t=0;t>>7^n,n=n-i|0,i=i<<24^i>>>8^t,t=t-e|0,this.b=e=e<<20^e>>>12^n,this.c=n=n-i|0,this.d=i<<16^n>>>16^t,this.a=t-e|0}copy(t,e){return e.a=t.a,e.b=t.b,e.c=t.c,e.d=t.d,e}}
 
 	const cjs_prng_tychei = require('seedrandom/lib/tychei.js');
 
@@ -1891,13 +1951,13 @@
 
 
 	  describe('shared', () =>
-	    test_prng_alg('tychei', prng_tychei, snap));
+	    test_prng_alg('tychei', prng_tychei$1, snap));
 
 	  describe('isolated', () =>
-	    test_prng_alg('tychei', prng_tychei$1, snap));
+	    test_prng_alg('tychei', prng_tychei, snap));
 
 	  describe('isolated minified', () =>
-	    test_prng_alg('tychei', t$2, snap));
+	    test_prng_alg('tychei', t$4, snap));
 
 	  if (cjs_prng_tychei)
 	    describe('original seedrandom (CommonJS)', () =>
@@ -1917,20 +1977,20 @@
 
 
 	  describe('shared', () =>
-	    test_prng_alg('tychei', prng_tychei, snap));
+	    test_prng_alg('tychei', prng_tychei$1, snap));
 
 	  describe('isolated', () =>
-	    test_prng_alg('tychei', prng_tychei$1, snap));
+	    test_prng_alg('tychei', prng_tychei, snap));
 
 	  describe('isolated minified', () =>
-	    test_prng_alg('tychei', t$2, snap));
+	    test_prng_alg('tychei', t$4, snap));
 
 	  if (cjs_prng_tychei)
 	    describe('original seedrandom (CommonJS)', () =>
 	      test_prng_alg('tychei', cjs_prng_tychei, snap));
 	});
 
-	function _prng_restore$4(prng, xg, opts) {
+	function _prng_restore$3(prng, xg, opts) {
 	  let state = opts && opts.state;
 	  if (state) {
 	    if (typeof(state) == 'object') xg.copy(state, xg);
@@ -1938,7 +1998,7 @@
 	  }
 	}
 
-	function _prng_xor_core$3(xg, opts) {
+	function _prng_xor_core$2(xg, opts) {
 	  let prng = () => (xg.next() >>> 0) / 0x100000000;
 
 	  prng.double = () => {
@@ -1955,17 +2015,17 @@
 
 	  prng.quick = prng;
 
-	  _prng_restore$4(prng, xg, opts);
+	  _prng_restore$3(prng, xg, opts);
 	  return prng;
 	}
 
 	// A Javascript implementaion of the "xorwow" prng algorithm by
-	function prng_xorwow$1(seed, opts) {
-	  let xg = new XorWowGen$1(seed);
-	  return _prng_xor_core$3(xg, opts);
+	function prng_xorwow(seed, opts) {
+	  let xg = new XorWowGen(seed);
+	  return _prng_xor_core$2(xg, opts);
 	}
 
-	class XorWowGen$1 {
+	class XorWowGen {
 	  constructor(seed) {
 	    if (seed == null) seed = +(new Date);
 
@@ -2017,7 +2077,7 @@
 	  }
 	}
 
-	function t$3(t,i){return function(t,e){let i=()=>(t.next()>>>0)/4294967296;return i.double=()=>{let e,i,n;do{e=t.next()>>>11,i=(t.next()>>>0)/4294967296,n=(e+i)/(1<<21);}while(0===n);return n},i.int32=()=>0|t.next(),i.quick=i,function(t,e,i){let n=i&&i.state;n&&("object"==typeof n&&e.copy(n,e),t.state=()=>e.copy(e,{}));}(i,t,e),i}(new e$2(t),i)}class e$2{constructor(t){null==t&&(t=+new Date);let e="";this.x=0,this.y=0,this.z=0,this.w=0,this.v=0,t===(0|t)?this.x=t:e+=t;for(let t=0;t>>4),this.next();}next(){let{x:t,y:e,z:i,w:n,v:s,d:h}=this,x=t^t>>>2;return this.x=e,this.y=i,this.z=n,this.w=s,(this.d=h+362437|0)+(this.v=s^s<<4^x^x<<1)|0}copy(t,e){return e.x=t.x,e.y=t.y,e.z=t.z,e.w=t.w,e.v=t.v,e.d=t.d,e}}
+	function t$3(t,i){return function(t,e){let i=()=>(t.next()>>>0)/4294967296;return i.double=()=>{let e,i,n;do{e=t.next()>>>11,i=(t.next()>>>0)/4294967296,n=(e+i)/(1<<21);}while(0===n);return n},i.int32=()=>0|t.next(),i.quick=i,function(t,e,i){let n=i&&i.state;n&&("object"==typeof n&&e.copy(n,e),t.state=()=>e.copy(e,{}));}(i,t,e),i}(new e$3(t),i)}class e$3{constructor(t){null==t&&(t=+new Date);let e="";this.x=0,this.y=0,this.z=0,this.w=0,this.v=0,t===(0|t)?this.x=t:e+=t;for(let t=0;t>>4),this.next();}next(){let{x:t,y:e,z:i,w:n,v:s,d:h}=this,x=t^t>>>2;return this.x=e,this.y=i,this.z=n,this.w=s,(this.d=h+362437|0)+(this.v=s^s<<4^x^x<<1)|0}copy(t,e){return e.x=t.x,e.y=t.y,e.z=t.z,e.w=t.w,e.v=t.v,e.d=t.d,e}}
 
 	const cjs_prng_xorwow = require('seedrandom/lib/xorwow.js');
 
@@ -2033,10 +2093,10 @@
 	  };
 
 	  describe('shared', () =>
-	    test_prng_alg('xorwow', prng_xorwow, snap));
+	    test_prng_alg('xorwow', prng_xorwow$1, snap));
 
 	  describe('isolated', () =>
-	    test_prng_alg('xorwow', prng_xorwow$1, snap));
+	    test_prng_alg('xorwow', prng_xorwow, snap));
 
 	  describe('isolated minified', () =>
 	    test_prng_alg('xorwow', t$3, snap));
@@ -2057,10 +2117,10 @@
 	  };
 
 	  describe('shared', () =>
-	    test_prng_alg('xorwow', prng_xorwow, snap));
+	    test_prng_alg('xorwow', prng_xorwow$1, snap));
 
 	  describe('isolated', () =>
-	    test_prng_alg('xorwow', prng_xorwow$1, snap));
+	    test_prng_alg('xorwow', prng_xorwow, snap));
 
 	  describe('isolated minified', () =>
 	    test_prng_alg('xorwow', t$3, snap));
@@ -2070,7 +2130,7 @@
 	      test_prng_alg('xorwow', cjs_prng_xorwow, snap));
 	});
 
-	function _prng_restore$5(prng, xg, opts) {
+	function _prng_restore$2(prng, xg, opts) {
 	  let state = opts && opts.state;
 	  if (state) {
 	    if (typeof(state) == 'object') xg.copy(state, xg);
@@ -2078,7 +2138,7 @@
 	  }
 	}
 
-	function _prng_xor_core$4(xg, opts) {
+	function _prng_xor_core$1(xg, opts) {
 	  let prng = () => (xg.next() >>> 0) / 0x100000000;
 
 	  prng.double = () => {
@@ -2095,18 +2155,18 @@
 
 	  prng.quick = prng;
 
-	  _prng_restore$5(prng, xg, opts);
+	  _prng_restore$2(prng, xg, opts);
 	  return prng;
 	}
 
 	// A Javascript implementaion of Richard Brent's Xorgens xor4096 algorithm.
-	function prng_xor4096$1(seed, opts) {
-	  let xg = new Xor4096Gen$1(seed);
-	  return _prng_xor_core$4(xg, opts);
+	function prng_xor4096(seed, opts) {
+	  let xg = new Xor4096Gen(seed);
+	  return _prng_xor_core$1(xg, opts);
 	}
 
 
-	class Xor4096Gen$1 {
+	class Xor4096Gen {
 	  constructor(seed) {
 	    if (seed == null) seed = +(new Date);
 
@@ -2186,7 +2246,7 @@
 	  }
 	}
 
-	function t$4(t,n){return function(t,e){let n=()=>(t.next()>>>0)/4294967296;return n.double=()=>{let e,n,i;do{e=t.next()>>>11,n=(t.next()>>>0)/4294967296,i=(e+n)/(1<<21);}while(0===i);return i},n.int32=()=>0|t.next(),n.quick=n,function(t,e,n){let i=n&&n.state;i&&("object"==typeof i&&e.copy(i,e),t.state=()=>e.copy(e,{}));}(n,t,e),n}(new e$3(t),n)}class e$3{constructor(t){null==t&&(t=+new Date);let e,n,i,o,r,l=[],u=128;for(t===(0|t)?(n=t,t=null):(t+="\0",n=0,u=Math.max(u,t.length)),i=0,o=-32;o>>15,n^=n<<4,n^=n>>>13,o>=0&&(r=r+1640531527|0,e=l[127&o]^=n+r,i=0==e?i+1:0);for(i>=128&&(l[127&(t&&t.length||0)]=-1),i=127,o=512;o>0;--o)n=l[i+34&127],e=l[i=i+1&127],n^=n<<13,e^=e<<17,n^=n>>>15,e^=e>>>12,l[i]=n^e;this.w=r,this.X=l,this.i=i;}next(){let t,e,{w:n,X:i,i:o}=this;return this.w=n=n+1640531527|0,e=i[o+34&127],t=i[o=o+1&127],e^=e<<13,t^=t<<17,e^=e>>>15,t^=t>>>12,e=i[o]=e^t,this.i=o,e+(n^n>>>16)|0}copy(t,e){return e.i=t.i,e.w=t.w,e.X=[...t.X],e}}
+	function t$2(t,n){return function(t,e){let n=()=>(t.next()>>>0)/4294967296;return n.double=()=>{let e,n,i;do{e=t.next()>>>11,n=(t.next()>>>0)/4294967296,i=(e+n)/(1<<21);}while(0===i);return i},n.int32=()=>0|t.next(),n.quick=n,function(t,e,n){let i=n&&n.state;i&&("object"==typeof i&&e.copy(i,e),t.state=()=>e.copy(e,{}));}(n,t,e),n}(new e$2(t),n)}class e$2{constructor(t){null==t&&(t=+new Date);let e,n,i,l,o,r=[],u=128;for(t===(0|t)?(n=t,t=null):(t+="\0",n=0,u=Math.max(u,t.length)),i=0,l=-32;l>>15,n^=n<<4,n^=n>>>13,l>=0&&(o=o+1640531527|0,e=r[127&l]^=n+o,i=0==e?i+1:0);for(i>=128&&(r[127&(t&&t.length||0)]=-1),i=127,l=512;l>0;--l)n=r[i+34&127],e=r[i=i+1&127],n^=n<<13,e^=e<<17,n^=n>>>15,e^=e>>>12,r[i]=n^e;this.w=o,this.X=r,this.i=i;}next(){let t,e,{w:n,X:i,i:l}=this;return this.w=n=n+1640531527|0,e=i[l+34&127],t=i[l=l+1&127],e^=e<<13,t^=t<<17,e^=e>>>15,t^=t>>>12,e=i[l]=e^t,this.i=l,e+(n^n>>>16)|0}copy(t,e){return e.i=t.i,e.w=t.w,e.X=[...t.X],e}}
 
 	const cjs_prng_xor4096 = require('seedrandom/lib/xor4096.js');
 
@@ -2201,13 +2261,13 @@
 	  };
 
 	  describe('shared', () =>
-	    test_prng_alg('xor4096', prng_xor4096, snap));
+	    test_prng_alg('xor4096', prng_xor4096$1, snap));
 
 	  describe('isolated', () =>
-	    test_prng_alg('xor4096', prng_xor4096$1, snap));
+	    test_prng_alg('xor4096', prng_xor4096, snap));
 
 	  describe('isolated minified', () =>
-	    test_prng_alg('xor4096', t$4, snap));
+	    test_prng_alg('xor4096', t$2, snap));
 
 	  if (cjs_prng_xor4096)
 	    describe('original seedrandom (CommonJS)', () =>
@@ -2225,20 +2285,20 @@
 	  };
 
 	  describe('shared', () =>
-	    test_prng_alg('xor4096', prng_xor4096, snap));
+	    test_prng_alg('xor4096', prng_xor4096$1, snap));
 
 	  describe('isolated', () =>
-	    test_prng_alg('xor4096', prng_xor4096$1, snap));
+	    test_prng_alg('xor4096', prng_xor4096, snap));
 
 	  describe('isolated minified', () =>
-	    test_prng_alg('xor4096', t$4, snap));
+	    test_prng_alg('xor4096', t$2, snap));
 
 	  if (cjs_prng_xor4096)
 	    describe('original seedrandom (CommonJS)', () =>
 	      test_prng_alg('xor4096', cjs_prng_xor4096, snap));
 	});
 
-	function _prng_restore$6(prng, xg, opts) {
+	function _prng_restore$1(prng, xg, opts) {
 	  let state = opts && opts.state;
 	  if (state) {
 	    if (typeof(state) == 'object') xg.copy(state, xg);
@@ -2246,7 +2306,7 @@
 	  }
 	}
 
-	function _prng_xor_core$5(xg, opts) {
+	function _prng_xor_core(xg, opts) {
 	  let prng = () => (xg.next() >>> 0) / 0x100000000;
 
 	  prng.double = () => {
@@ -2263,26 +2323,26 @@
 
 	  prng.quick = prng;
 
-	  _prng_restore$6(prng, xg, opts);
+	  _prng_restore$1(prng, xg, opts);
 	  return prng;
 	}
 
 	// A Javascript implementaion of the "xorshift7" algorithm by
-	function prng_xorshift7$1(seed, opts) {
-	  let xg = new XorShift7Gen$1(seed);
-	  return _prng_xor_core$5(xg, opts);
+	function prng_xorshift7(seed, opts) {
+	  let xg = new XorShift7Gen(seed);
+	  return _prng_xor_core(xg, opts);
 	}
 
 
-	class XorShift7Gen$1 {
+	class XorShift7Gen {
 	  constructor(seed) {
 	    if (seed == null) seed = +(new Date);
 
-	    var j, w, x = [];
+	    var j, x = [];
 
 	    if (seed === (seed | 0)) {
 	      // Seed state array using a 32-bit integer.
-	      w = x[0] = seed;
+	      x[0] = seed;
 	    } else {
 	      // Seed state using a string.
 	      seed = '' + seed;
@@ -2295,7 +2355,7 @@
 	    // Enforce an array length of 8, not all zeroes.
 	    while (x.length < 8) x.push(0);
 	    for (j = 0; j < 8 && x[j] === 0; ++j);
-	    if (j == 8) w = x[7] = -1; else w = x[j];
+	    if (j == 8) x[7] = -1; else x[j];
 
 	    this.x = x;
 	    this.i = 0;
@@ -2326,7 +2386,7 @@
 	  }
 	}
 
-	function t$5(t,n){return function(t,e){let n=()=>(t.next()>>>0)/4294967296;return n.double=()=>{let e,n,r;do{e=t.next()>>>11,n=(t.next()>>>0)/4294967296,r=(e+n)/(1<<21);}while(0===r);return r},n.int32=()=>0|t.next(),n.quick=n,function(t,e,n){let r=n&&n.state;r&&("object"==typeof r&&e.copy(r,e),t.state=()=>e.copy(e,{}));}(n,t,e),n}(new e$4(t),n)}class e$4{constructor(t){null==t&&(t=+new Date);var e,n=[];if(t===(0|t))n[0]=t;else for(t=""+t,e=0;e0;--e)this.next();}next(){let t,e,{x:n,i:r}=this;return t=n[r],t^=t>>>7,e=t^t<<24,t=n[r+1&7],e^=t^t>>>10,t=n[r+3&7],e^=t^t>>>3,t=n[r+4&7],e^=t^t<<7,t=n[r+7&7],t^=t<<13,e^=t^t<<9,n[r]=e,this.i=r+1&7,e}copy(t,e){return e.x=[...t.x],e.i=t.i,e}}
+	function t$1(t,n){return function(t,e){let n=()=>(t.next()>>>0)/4294967296;return n.double=()=>{let e,n,r;do{e=t.next()>>>11,n=(t.next()>>>0)/4294967296,r=(e+n)/(1<<21);}while(0===r);return r},n.int32=()=>0|t.next(),n.quick=n,function(t,e,n){let r=n&&n.state;r&&("object"==typeof r&&e.copy(r,e),t.state=()=>e.copy(e,{}));}(n,t,e),n}(new e$1(t),n)}class e$1{constructor(t){null==t&&(t=+new Date);var e,n=[];if(t===(0|t))n[0]=t;else for(t=""+t,e=0;e0;--e)this.next();}next(){let t,e,{x:n,i:r}=this;return t=n[r],t^=t>>>7,e=t^t<<24,t=n[r+1&7],e^=t^t>>>10,t=n[r+3&7],e^=t^t>>>3,t=n[r+4&7],e^=t^t<<7,t=n[r+7&7],t^=t<<13,e^=t^t<<9,n[r]=e,this.i=r+1&7,e}copy(t,e){return e.x=[...t.x],e.i=t.i,e}}
 
 	const cjs_prng_xorshift7 = require('seedrandom/lib/xorshift7.js');
 
@@ -2341,13 +2401,13 @@
 	  };
 
 	  describe('shared', () =>
-	    test_prng_alg('xorshift7', prng_xorshift7, snap));
+	    test_prng_alg('xorshift7', prng_xorshift7$1, snap));
 
 	  describe('isolated', () =>
-	    test_prng_alg('xorshift7', prng_xorshift7$1, snap));
+	    test_prng_alg('xorshift7', prng_xorshift7, snap));
 
 	  describe('isolated minified', () =>
-	    test_prng_alg('xorshift7', t$5, snap));
+	    test_prng_alg('xorshift7', t$1, snap));
 
 	  if (cjs_prng_xorshift7)
 	    describe('original seedrandom (CommonJS)', () =>
@@ -2365,20 +2425,20 @@
 	  };
 
 	  describe('shared', () =>
-	    test_prng_alg('xorshift7', prng_xorshift7, snap));
+	    test_prng_alg('xorshift7', prng_xorshift7$1, snap));
 
 	  describe('isolated', () =>
-	    test_prng_alg('xorshift7', prng_xorshift7$1, snap));
+	    test_prng_alg('xorshift7', prng_xorshift7, snap));
 
 	  describe('isolated minified', () =>
-	    test_prng_alg('xorshift7', t$5, snap));
+	    test_prng_alg('xorshift7', t$1, snap));
 
 	  if (cjs_prng_xorshift7)
 	    describe('original seedrandom (CommonJS)', () =>
 	      test_prng_alg('xorshift7', cjs_prng_xorshift7, snap));
 	});
 
-	function _prng_restore$7(prng, xg, opts) {
+	function _prng_restore(prng, xg, opts) {
 	  let state = opts && opts.state;
 	  if (state) {
 	    if (typeof(state) == 'object') xg.copy(state, xg);
@@ -2409,8 +2469,8 @@
 	SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 
 	*/
-	function prng_arc4$1(seed, opts) {
-	  let xg = new ARC4Gen$1(seed);
+	function prng_arc4(seed, opts) {
+	  let xg = new ARC4Gen(seed);
 	  let prng = () => xg.next();
 
 	  prng.double = prng;
@@ -2419,7 +2479,7 @@
 
 	  prng.quick = () => xg.g(4) / 0x100000000;
 
-	  _prng_restore$7(prng, xg, opts);
+	  _prng_restore(prng, xg, opts);
 	  return prng
 	}
 
@@ -2441,12 +2501,12 @@
 
 	// const width = 256 // each RC4 output is 0 <= x < 256
 	// const chunks = 6 // at least six RC4 outputs for each double
-	const _arc4_startdenom$1 = 281474976710656;     // 256 ** 6 == width ** chunks
-	const _arc4_significance$1 = 4503599627370496;  // 2 ** 52 significant digits in a double
-	const _arc4_overflow$1 = 9007199254740992;      // 2 ** 53 == significance * 2
+	const _arc4_startdenom = 281474976710656;     // 256 ** 6 == width ** chunks
+	const _arc4_significance = 4503599627370496;  // 2 ** 52 significant digits in a double
+	const _arc4_overflow = 9007199254740992;      // 2 ** 53 == significance * 2
 
 
-	class ARC4Gen$1 {
+	class ARC4Gen {
 	  constructor(seed) {
 	    if (seed == null) seed = +(new Date);
 
@@ -2478,15 +2538,15 @@
 	    // randomness in every bit of the mantissa of the IEEE 754 value.
 
 	    let n = this.g(6);                  // Start with a numerator n < 2 ^ 48
-	    let d = _arc4_startdenom$1;           //   and denominator d = 2 ^ 48.
+	    let d = _arc4_startdenom;           //   and denominator d = 2 ^ 48.
 	    let x = 0;                          //   and no 'extra last byte'.
 
-	    while (n < _arc4_significance$1) {    // Fill up all significant digits (2 ** 52)
+	    while (n < _arc4_significance) {    // Fill up all significant digits (2 ** 52)
 	      n = (n + x) * 256;                //   by shifting numerator and
 	      d *= 256;                         //   denominator and generating a
 	      x = this.g(1);                    //   new least-significant-byte.
 	    }
-	    while (n >= _arc4_overflow$1) {       // To avoid rounding past overflow, before adding
+	    while (n >= _arc4_overflow) {       // To avoid rounding past overflow, before adding
 	      n /= 2;                           //   last byte, shift everything
 	      d /= 2;                           //   right using integer math until
 	      x >>>= 1;                         //   we have exactly the desired bits.
@@ -2524,7 +2584,7 @@
 	  }
 	}
 
-	function t$6(t,i){let r=new e$5(t),o=()=>r.next();return o.double=o,o.int32=()=>0|r.g(4),o.quick=()=>r.g(4)/4294967296,function(t,e,i){let r=i&&i.state;r&&("object"==typeof r&&e.copy(r,e),t.state=()=>e.copy(e,{}));}(o,r,i),o}class e$5{constructor(t){null==t&&(t=+new Date);let e,i,r,o=this.mixkey(t,[]),n=[],s=o.length;for(this.i=this.j=e=i=0,this.S=n,s||(o=[s++]);e<=255;)n[e]=e++;for(e=0;e<=255;e++)n[e]=n[i=255&i+o[e%s]+(r=n[e])],n[i]=r;this.g(256);}next(){let t=this.g(6),e=281474976710656,i=0;for(;t<4503599627370496;)t=256*(t+i),e*=256,i=this.g(1);for(;t>=9007199254740992;)t/=2,e/=2,i>>>=1;return (t+i)/e}g(t){let e,i=0,{i:r,j:o,S:n}=this;for(;t--;)e=n[r=255&r+1],i=256*i+n[255&(n[r]=n[o=255&o+e])+(n[o]=e)];return this.i=r,this.j=o,i}copy(t,e){return e.i=t.i,e.j=t.j,e.S=[...t.S],e}mixkey(t,e){t+="";let i=0,r=0;for(;rr.next();return n.double=n,n.int32=()=>0|r.g(4),n.quick=()=>r.g(4)/4294967296,function(t,e,i){let r=i&&i.state;r&&("object"==typeof r&&e.copy(r,e),t.state=()=>e.copy(e,{}));}(n,r,i),n}class e{constructor(t){null==t&&(t=+new Date);let e,i,r,n=this.mixkey(t,[]),o=[],s=n.length;for(this.i=this.j=e=i=0,this.S=o,s||(n=[s++]);e<=255;)o[e]=e++;for(e=0;e<=255;e++)o[e]=o[i=255&i+n[e%s]+(r=o[e])],o[i]=r;this.g(256);}next(){let t=this.g(6),e=281474976710656,i=0;for(;t<4503599627370496;)t=256*(t+i),e*=256,i=this.g(1);for(;t>=9007199254740992;)t/=2,e/=2,i>>>=1;return (t+i)/e}g(t){let e,i=0,{i:r,j:n,S:o}=this;for(;t--;)e=o[r=255&r+1],i=256*i+o[255&(o[r]=o[n=255&n+e])+(o[n]=e)];return this.i=r,this.j=n,i}copy(t,e){return e.i=t.i,e.j=t.j,e.S=[...t.S],e}mixkey(t,e){t+="";let i=0,r=0;for(;r
-	    test_prng_alg('arc4', prng_arc4, snap));
+	    test_prng_alg('arc4', prng_arc4$1, snap));
 
 	  describe('isolated', () =>
-	    test_prng_alg('arc4', prng_arc4$1, snap));
+	    test_prng_alg('arc4', prng_arc4, snap));
 
 	  describe('isolated minified', () =>
-	    test_prng_alg('arc4', t$6, snap));
+	    test_prng_alg('arc4', t, snap));
 
 	  if (cjs_prng_arc4)
 	    describe('original seedrandom (CommonJS)', () =>
@@ -2563,17 +2623,17 @@
 	  };
 
 	  describe('shared', () =>
-	    test_prng_alg('arc4', prng_arc4, snap));
+	    test_prng_alg('arc4', prng_arc4$1, snap));
 
 	  describe('isolated', () =>
-	    test_prng_alg('arc4', prng_arc4$1, snap));
+	    test_prng_alg('arc4', prng_arc4, snap));
 
 	  describe('isolated minified', () =>
-	    test_prng_alg('arc4', t$6, snap));
+	    test_prng_alg('arc4', t, snap));
 
 	  if (cjs_prng_arc4)
 	    describe('original seedrandom (CommonJS)', () =>
 	      test_prng_alg('arc4', cjs_prng_arc4, snap));
 	});
 
-}());
+})();
diff --git a/unittest/package-lock.json b/unittest/package-lock.json
deleted file mode 100644
index cad20f8..0000000
--- a/unittest/package-lock.json
+++ /dev/null
@@ -1,2430 +0,0 @@
-{
-  "name": "unittest",
-  "lockfileVersion": 2,
-  "requires": true,
-  "packages": {
-    "": {
-      "dependencies": {
-        "seedrandom": "^3.0.5"
-      },
-      "devDependencies": {
-        "@rollup/plugin-node-resolve": "^11.0.1",
-        "esm-seedrandom": "file:..",
-        "mocha": "^8.2.1",
-        "rollup": "^2.35.1",
-        "uvu": "^0.5.1"
-      }
-    },
-    "..": {
-      "version": "3.0.5",
-      "dev": true,
-      "license": "MIT",
-      "devDependencies": {
-        "rollup": "^2.35.1",
-        "rollup-plugin-terser": "^7.0.2"
-      }
-    },
-    "node_modules/@rollup/plugin-node-resolve": {
-      "version": "11.0.1",
-      "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-11.0.1.tgz",
-      "integrity": "sha512-ltlsj/4Bhwwhb+Nb5xCz/6vieuEj2/BAkkqVIKmZwC7pIdl8srmgmglE4S0jFlZa32K4qvdQ6NHdmpRKD/LwoQ==",
-      "dev": true,
-      "dependencies": {
-        "@rollup/pluginutils": "^3.1.0",
-        "@types/resolve": "1.17.1",
-        "builtin-modules": "^3.1.0",
-        "deepmerge": "^4.2.2",
-        "is-module": "^1.0.0",
-        "resolve": "^1.19.0"
-      },
-      "engines": {
-        "node": ">= 10.0.0"
-      },
-      "peerDependencies": {
-        "rollup": "^1.20.0||^2.0.0"
-      }
-    },
-    "node_modules/@rollup/pluginutils": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz",
-      "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==",
-      "dev": true,
-      "dependencies": {
-        "@types/estree": "0.0.39",
-        "estree-walker": "^1.0.1",
-        "picomatch": "^2.2.2"
-      },
-      "engines": {
-        "node": ">= 8.0.0"
-      },
-      "peerDependencies": {
-        "rollup": "^1.20.0||^2.0.0"
-      }
-    },
-    "node_modules/@types/estree": {
-      "version": "0.0.39",
-      "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz",
-      "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==",
-      "dev": true
-    },
-    "node_modules/@types/node": {
-      "version": "14.14.14",
-      "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.14.tgz",
-      "integrity": "sha512-UHnOPWVWV1z+VV8k6L1HhG7UbGBgIdghqF3l9Ny9ApPghbjICXkUJSd/b9gOgQfjM1r+37cipdw/HJ3F6ICEnQ==",
-      "dev": true
-    },
-    "node_modules/@types/resolve": {
-      "version": "1.17.1",
-      "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.17.1.tgz",
-      "integrity": "sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==",
-      "dev": true,
-      "dependencies": {
-        "@types/node": "*"
-      }
-    },
-    "node_modules/@ungap/promise-all-settled": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz",
-      "integrity": "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==",
-      "dev": true
-    },
-    "node_modules/ansi-colors": {
-      "version": "4.1.1",
-      "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz",
-      "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==",
-      "dev": true,
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/ansi-regex": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
-      "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
-      "dev": true,
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/ansi-styles": {
-      "version": "4.3.0",
-      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-      "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-      "dev": true,
-      "dependencies": {
-        "color-convert": "^2.0.1"
-      },
-      "engines": {
-        "node": ">=8"
-      },
-      "funding": {
-        "url": "https://github.com/chalk/ansi-styles?sponsor=1"
-      }
-    },
-    "node_modules/anymatch": {
-      "version": "3.1.1",
-      "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz",
-      "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==",
-      "dev": true,
-      "dependencies": {
-        "normalize-path": "^3.0.0",
-        "picomatch": "^2.0.4"
-      },
-      "engines": {
-        "node": ">= 8"
-      }
-    },
-    "node_modules/argparse": {
-      "version": "1.0.10",
-      "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
-      "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
-      "dev": true,
-      "dependencies": {
-        "sprintf-js": "~1.0.2"
-      }
-    },
-    "node_modules/balanced-match": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
-      "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
-      "dev": true
-    },
-    "node_modules/binary-extensions": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz",
-      "integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==",
-      "dev": true,
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/brace-expansion": {
-      "version": "1.1.11",
-      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
-      "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
-      "dev": true,
-      "dependencies": {
-        "balanced-match": "^1.0.0",
-        "concat-map": "0.0.1"
-      }
-    },
-    "node_modules/braces": {
-      "version": "3.0.2",
-      "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
-      "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
-      "dev": true,
-      "dependencies": {
-        "fill-range": "^7.0.1"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/browser-stdout": {
-      "version": "1.3.1",
-      "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz",
-      "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==",
-      "dev": true
-    },
-    "node_modules/builtin-modules": {
-      "version": "3.2.0",
-      "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.2.0.tgz",
-      "integrity": "sha512-lGzLKcioL90C7wMczpkY0n/oART3MbBa8R9OFGE1rJxoVI86u4WAGfEk8Wjv10eKSyTHVGkSo3bvBylCEtk7LA==",
-      "dev": true,
-      "engines": {
-        "node": ">=6"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/camelcase": {
-      "version": "5.3.1",
-      "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
-      "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
-      "dev": true,
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/chalk": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
-      "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
-      "dev": true,
-      "dependencies": {
-        "ansi-styles": "^4.1.0",
-        "supports-color": "^7.1.0"
-      },
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/chalk/chalk?sponsor=1"
-      }
-    },
-    "node_modules/chokidar": {
-      "version": "3.4.3",
-      "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.3.tgz",
-      "integrity": "sha512-DtM3g7juCXQxFVSNPNByEC2+NImtBuxQQvWlHunpJIS5Ocr0lG306cC7FCi7cEA0fzmybPUIl4txBIobk1gGOQ==",
-      "dev": true,
-      "dependencies": {
-        "anymatch": "~3.1.1",
-        "braces": "~3.0.2",
-        "fsevents": "~2.1.2",
-        "glob-parent": "~5.1.0",
-        "is-binary-path": "~2.1.0",
-        "is-glob": "~4.0.1",
-        "normalize-path": "~3.0.0",
-        "readdirp": "~3.5.0"
-      },
-      "engines": {
-        "node": ">= 8.10.0"
-      },
-      "optionalDependencies": {
-        "fsevents": "~2.1.2"
-      }
-    },
-    "node_modules/cliui": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz",
-      "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==",
-      "dev": true,
-      "dependencies": {
-        "string-width": "^3.1.0",
-        "strip-ansi": "^5.2.0",
-        "wrap-ansi": "^5.1.0"
-      }
-    },
-    "node_modules/cliui/node_modules/ansi-regex": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
-      "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
-      "dev": true,
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/cliui/node_modules/string-width": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
-      "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
-      "dev": true,
-      "dependencies": {
-        "emoji-regex": "^7.0.1",
-        "is-fullwidth-code-point": "^2.0.0",
-        "strip-ansi": "^5.1.0"
-      },
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/cliui/node_modules/strip-ansi": {
-      "version": "5.2.0",
-      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
-      "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
-      "dev": true,
-      "dependencies": {
-        "ansi-regex": "^4.1.0"
-      },
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/color-convert": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-      "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-      "dev": true,
-      "dependencies": {
-        "color-name": "~1.1.4"
-      },
-      "engines": {
-        "node": ">=7.0.0"
-      }
-    },
-    "node_modules/color-name": {
-      "version": "1.1.4",
-      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-      "dev": true
-    },
-    "node_modules/concat-map": {
-      "version": "0.0.1",
-      "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
-      "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
-      "dev": true
-    },
-    "node_modules/debug": {
-      "version": "4.2.0",
-      "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz",
-      "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==",
-      "deprecated": "Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)",
-      "dev": true,
-      "dependencies": {
-        "ms": "2.1.2"
-      },
-      "engines": {
-        "node": ">=6.0"
-      },
-      "peerDependenciesMeta": {
-        "supports-color": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/decamelize": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
-      "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=",
-      "dev": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/deepmerge": {
-      "version": "4.2.2",
-      "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz",
-      "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==",
-      "dev": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/dequal": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.2.tgz",
-      "integrity": "sha512-q9K8BlJVxK7hQYqa6XISGmBZbtQQWVXSrRrWreHC94rMt1QL/Impruc+7p2CYSYuVIUr+YCt6hjrs1kkdJRTug==",
-      "dev": true,
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/diff": {
-      "version": "4.0.2",
-      "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz",
-      "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==",
-      "dev": true,
-      "engines": {
-        "node": ">=0.3.1"
-      }
-    },
-    "node_modules/emoji-regex": {
-      "version": "7.0.3",
-      "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz",
-      "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==",
-      "dev": true
-    },
-    "node_modules/escape-string-regexp": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
-      "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
-      "dev": true,
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/esm-seedrandom": {
-      "resolved": "..",
-      "link": true
-    },
-    "node_modules/esprima": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
-      "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
-      "dev": true,
-      "bin": {
-        "esparse": "bin/esparse.js",
-        "esvalidate": "bin/esvalidate.js"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/estree-walker": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz",
-      "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==",
-      "dev": true
-    },
-    "node_modules/fill-range": {
-      "version": "7.0.1",
-      "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
-      "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
-      "dev": true,
-      "dependencies": {
-        "to-regex-range": "^5.0.1"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/find-up": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
-      "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
-      "dev": true,
-      "dependencies": {
-        "locate-path": "^6.0.0",
-        "path-exists": "^4.0.0"
-      },
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/flat": {
-      "version": "5.0.2",
-      "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz",
-      "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==",
-      "dev": true,
-      "bin": {
-        "flat": "cli.js"
-      }
-    },
-    "node_modules/fs.realpath": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
-      "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
-      "dev": true
-    },
-    "node_modules/fsevents": {
-      "version": "2.1.3",
-      "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz",
-      "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==",
-      "deprecated": "Please update to v 2.2.x",
-      "dev": true,
-      "hasInstallScript": true,
-      "optional": true,
-      "os": [
-        "darwin"
-      ],
-      "engines": {
-        "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
-      }
-    },
-    "node_modules/function-bind": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
-      "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
-      "dev": true
-    },
-    "node_modules/get-caller-file": {
-      "version": "2.0.5",
-      "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
-      "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
-      "dev": true,
-      "engines": {
-        "node": "6.* || 8.* || >= 10.*"
-      }
-    },
-    "node_modules/glob": {
-      "version": "7.1.6",
-      "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
-      "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
-      "dev": true,
-      "dependencies": {
-        "fs.realpath": "^1.0.0",
-        "inflight": "^1.0.4",
-        "inherits": "2",
-        "minimatch": "^3.0.4",
-        "once": "^1.3.0",
-        "path-is-absolute": "^1.0.0"
-      },
-      "engines": {
-        "node": "*"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/isaacs"
-      }
-    },
-    "node_modules/glob-parent": {
-      "version": "5.1.1",
-      "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz",
-      "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==",
-      "dev": true,
-      "dependencies": {
-        "is-glob": "^4.0.1"
-      },
-      "engines": {
-        "node": ">= 6"
-      }
-    },
-    "node_modules/growl": {
-      "version": "1.10.5",
-      "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz",
-      "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==",
-      "dev": true,
-      "engines": {
-        "node": ">=4.x"
-      }
-    },
-    "node_modules/has": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
-      "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
-      "dev": true,
-      "dependencies": {
-        "function-bind": "^1.1.1"
-      },
-      "engines": {
-        "node": ">= 0.4.0"
-      }
-    },
-    "node_modules/has-flag": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
-      "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
-      "dev": true,
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/he": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz",
-      "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==",
-      "dev": true,
-      "bin": {
-        "he": "bin/he"
-      }
-    },
-    "node_modules/inflight": {
-      "version": "1.0.6",
-      "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
-      "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
-      "dev": true,
-      "dependencies": {
-        "once": "^1.3.0",
-        "wrappy": "1"
-      }
-    },
-    "node_modules/inherits": {
-      "version": "2.0.4",
-      "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
-      "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
-      "dev": true
-    },
-    "node_modules/is-binary-path": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
-      "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
-      "dev": true,
-      "dependencies": {
-        "binary-extensions": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/is-core-module": {
-      "version": "2.2.0",
-      "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.2.0.tgz",
-      "integrity": "sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ==",
-      "dev": true,
-      "dependencies": {
-        "has": "^1.0.3"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/is-extglob": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
-      "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
-      "dev": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/is-fullwidth-code-point": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
-      "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
-      "dev": true,
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/is-glob": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz",
-      "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==",
-      "dev": true,
-      "dependencies": {
-        "is-extglob": "^2.1.1"
-      },
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/is-module": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz",
-      "integrity": "sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE=",
-      "dev": true
-    },
-    "node_modules/is-number": {
-      "version": "7.0.0",
-      "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
-      "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
-      "dev": true,
-      "engines": {
-        "node": ">=0.12.0"
-      }
-    },
-    "node_modules/is-plain-obj": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz",
-      "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==",
-      "dev": true,
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/isexe": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
-      "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
-      "dev": true
-    },
-    "node_modules/js-yaml": {
-      "version": "3.14.0",
-      "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz",
-      "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==",
-      "dev": true,
-      "dependencies": {
-        "argparse": "^1.0.7",
-        "esprima": "^4.0.0"
-      },
-      "bin": {
-        "js-yaml": "bin/js-yaml.js"
-      }
-    },
-    "node_modules/kleur": {
-      "version": "4.1.3",
-      "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.3.tgz",
-      "integrity": "sha512-H1tr8QP2PxFTNwAFM74Mui2b6ovcY9FoxJefgrwxY+OCJcq01k5nvhf4M/KnizzrJvLRap5STUy7dgDV35iUBw==",
-      "dev": true,
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/locate-path": {
-      "version": "6.0.0",
-      "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
-      "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
-      "dev": true,
-      "dependencies": {
-        "p-locate": "^5.0.0"
-      },
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/log-symbols": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.0.0.tgz",
-      "integrity": "sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA==",
-      "dev": true,
-      "dependencies": {
-        "chalk": "^4.0.0"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/minimatch": {
-      "version": "3.0.4",
-      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
-      "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
-      "dev": true,
-      "dependencies": {
-        "brace-expansion": "^1.1.7"
-      },
-      "engines": {
-        "node": "*"
-      }
-    },
-    "node_modules/mocha": {
-      "version": "8.2.1",
-      "resolved": "https://registry.npmjs.org/mocha/-/mocha-8.2.1.tgz",
-      "integrity": "sha512-cuLBVfyFfFqbNR0uUKbDGXKGk+UDFe6aR4os78XIrMQpZl/nv7JYHcvP5MFIAb374b2zFXsdgEGwmzMtP0Xg8w==",
-      "dev": true,
-      "dependencies": {
-        "@ungap/promise-all-settled": "1.1.2",
-        "ansi-colors": "4.1.1",
-        "browser-stdout": "1.3.1",
-        "chokidar": "3.4.3",
-        "debug": "4.2.0",
-        "diff": "4.0.2",
-        "escape-string-regexp": "4.0.0",
-        "find-up": "5.0.0",
-        "glob": "7.1.6",
-        "growl": "1.10.5",
-        "he": "1.2.0",
-        "js-yaml": "3.14.0",
-        "log-symbols": "4.0.0",
-        "minimatch": "3.0.4",
-        "ms": "2.1.2",
-        "nanoid": "3.1.12",
-        "serialize-javascript": "5.0.1",
-        "strip-json-comments": "3.1.1",
-        "supports-color": "7.2.0",
-        "which": "2.0.2",
-        "wide-align": "1.1.3",
-        "workerpool": "6.0.2",
-        "yargs": "13.3.2",
-        "yargs-parser": "13.1.2",
-        "yargs-unparser": "2.0.0"
-      },
-      "bin": {
-        "_mocha": "bin/_mocha",
-        "mocha": "bin/mocha"
-      },
-      "engines": {
-        "node": ">= 10.12.0"
-      },
-      "funding": {
-        "type": "opencollective",
-        "url": "https://opencollective.com/mochajs"
-      }
-    },
-    "node_modules/mri": {
-      "version": "1.1.6",
-      "resolved": "https://registry.npmjs.org/mri/-/mri-1.1.6.tgz",
-      "integrity": "sha512-oi1b3MfbyGa7FJMP9GmLTttni5JoICpYBRlq+x5V16fZbLsnL9N3wFqqIm/nIG43FjUFkFh9Epzp/kzUGUnJxQ==",
-      "dev": true,
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/ms": {
-      "version": "2.1.2",
-      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
-      "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
-      "dev": true
-    },
-    "node_modules/nanoid": {
-      "version": "3.1.12",
-      "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.12.tgz",
-      "integrity": "sha512-1qstj9z5+x491jfiC4Nelk+f8XBad7LN20PmyWINJEMRSf3wcAjAWysw1qaA8z6NSKe2sjq1hRSDpBH5paCb6A==",
-      "dev": true,
-      "bin": {
-        "nanoid": "bin/nanoid.cjs"
-      },
-      "engines": {
-        "node": "^10 || ^12 || >=13.7"
-      }
-    },
-    "node_modules/normalize-path": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
-      "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
-      "dev": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/once": {
-      "version": "1.4.0",
-      "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
-      "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
-      "dev": true,
-      "dependencies": {
-        "wrappy": "1"
-      }
-    },
-    "node_modules/p-limit": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
-      "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
-      "dev": true,
-      "dependencies": {
-        "yocto-queue": "^0.1.0"
-      },
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/p-locate": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
-      "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
-      "dev": true,
-      "dependencies": {
-        "p-limit": "^3.0.2"
-      },
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/p-try": {
-      "version": "2.2.0",
-      "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
-      "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
-      "dev": true,
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/path-exists": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
-      "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
-      "dev": true,
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/path-is-absolute": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
-      "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
-      "dev": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/path-parse": {
-      "version": "1.0.6",
-      "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz",
-      "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==",
-      "dev": true
-    },
-    "node_modules/picomatch": {
-      "version": "2.2.2",
-      "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz",
-      "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==",
-      "dev": true,
-      "engines": {
-        "node": ">=8.6"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/jonschlinkert"
-      }
-    },
-    "node_modules/randombytes": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
-      "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
-      "dev": true,
-      "dependencies": {
-        "safe-buffer": "^5.1.0"
-      }
-    },
-    "node_modules/readdirp": {
-      "version": "3.5.0",
-      "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz",
-      "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==",
-      "dev": true,
-      "dependencies": {
-        "picomatch": "^2.2.1"
-      },
-      "engines": {
-        "node": ">=8.10.0"
-      }
-    },
-    "node_modules/require-directory": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
-      "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=",
-      "dev": true,
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/require-main-filename": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz",
-      "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==",
-      "dev": true
-    },
-    "node_modules/resolve": {
-      "version": "1.19.0",
-      "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.19.0.tgz",
-      "integrity": "sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==",
-      "dev": true,
-      "dependencies": {
-        "is-core-module": "^2.1.0",
-        "path-parse": "^1.0.6"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/ljharb"
-      }
-    },
-    "node_modules/rollup": {
-      "version": "2.35.1",
-      "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.35.1.tgz",
-      "integrity": "sha512-q5KxEyWpprAIcainhVy6HfRttD9kutQpHbeqDTWnqAFNJotiojetK6uqmcydNMymBEtC4I8bCYR+J3mTMqeaUA==",
-      "dev": true,
-      "dependencies": {
-        "fsevents": "~2.1.2"
-      },
-      "bin": {
-        "rollup": "dist/bin/rollup"
-      },
-      "engines": {
-        "node": ">=10.0.0"
-      },
-      "optionalDependencies": {
-        "fsevents": "~2.1.2"
-      }
-    },
-    "node_modules/sade": {
-      "version": "1.7.4",
-      "resolved": "https://registry.npmjs.org/sade/-/sade-1.7.4.tgz",
-      "integrity": "sha512-y5yauMD93rX840MwUJr7C1ysLFBgMspsdTo4UVrDg3fXDvtwOyIqykhVAAm6fk/3au77773itJStObgK+LKaiA==",
-      "dev": true,
-      "dependencies": {
-        "mri": "^1.1.0"
-      },
-      "engines": {
-        "node": ">= 6"
-      }
-    },
-    "node_modules/safe-buffer": {
-      "version": "5.2.1",
-      "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
-      "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
-      "dev": true,
-      "funding": [
-        {
-          "type": "github",
-          "url": "https://github.com/sponsors/feross"
-        },
-        {
-          "type": "patreon",
-          "url": "https://www.patreon.com/feross"
-        },
-        {
-          "type": "consulting",
-          "url": "https://feross.org/support"
-        }
-      ]
-    },
-    "node_modules/seedrandom": {
-      "version": "3.0.5",
-      "resolved": "https://registry.npmjs.org/seedrandom/-/seedrandom-3.0.5.tgz",
-      "integrity": "sha512-8OwmbklUNzwezjGInmZ+2clQmExQPvomqjL7LFqOYqtmuxRgQYqOD3mHaU+MvZn5FLUeVxVfQjwLZW/n/JFuqg=="
-    },
-    "node_modules/serialize-javascript": {
-      "version": "5.0.1",
-      "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-5.0.1.tgz",
-      "integrity": "sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA==",
-      "dev": true,
-      "dependencies": {
-        "randombytes": "^2.1.0"
-      }
-    },
-    "node_modules/set-blocking": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
-      "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=",
-      "dev": true
-    },
-    "node_modules/sprintf-js": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
-      "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
-      "dev": true
-    },
-    "node_modules/string-width": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
-      "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
-      "dev": true,
-      "dependencies": {
-        "is-fullwidth-code-point": "^2.0.0",
-        "strip-ansi": "^4.0.0"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/strip-ansi": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
-      "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
-      "dev": true,
-      "dependencies": {
-        "ansi-regex": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/strip-json-comments": {
-      "version": "3.1.1",
-      "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
-      "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
-      "dev": true,
-      "engines": {
-        "node": ">=8"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/supports-color": {
-      "version": "7.2.0",
-      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
-      "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
-      "dev": true,
-      "dependencies": {
-        "has-flag": "^4.0.0"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/to-regex-range": {
-      "version": "5.0.1",
-      "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
-      "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
-      "dev": true,
-      "dependencies": {
-        "is-number": "^7.0.0"
-      },
-      "engines": {
-        "node": ">=8.0"
-      }
-    },
-    "node_modules/totalist": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/totalist/-/totalist-2.0.0.tgz",
-      "integrity": "sha512-+Y17F0YzxfACxTyjfhnJQEe7afPA0GSpYlFkl2VFMxYP7jshQf9gXV7cH47EfToBumFThfKBvfAcoUn6fdNeRQ==",
-      "dev": true,
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/uvu": {
-      "version": "0.5.1",
-      "resolved": "https://registry.npmjs.org/uvu/-/uvu-0.5.1.tgz",
-      "integrity": "sha512-JGxttnOGDFs77FaZ0yMUHIzczzQ5R1IlDeNW6Wymw6gAscwMdAffVOP6TlxLIfReZyK8tahoGwWZaTCJzNFDkg==",
-      "dev": true,
-      "dependencies": {
-        "dequal": "^2.0.0",
-        "diff": "^5.0.0",
-        "kleur": "^4.0.3",
-        "sade": "^1.7.3",
-        "totalist": "^2.0.0"
-      },
-      "bin": {
-        "uvu": "bin.js"
-      },
-      "engines": {
-        "node": ">=8"
-      }
-    },
-    "node_modules/uvu/node_modules/diff": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz",
-      "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==",
-      "dev": true,
-      "engines": {
-        "node": ">=0.3.1"
-      }
-    },
-    "node_modules/which": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
-      "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
-      "dev": true,
-      "dependencies": {
-        "isexe": "^2.0.0"
-      },
-      "bin": {
-        "node-which": "bin/node-which"
-      },
-      "engines": {
-        "node": ">= 8"
-      }
-    },
-    "node_modules/which-module": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz",
-      "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=",
-      "dev": true
-    },
-    "node_modules/wide-align": {
-      "version": "1.1.3",
-      "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz",
-      "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==",
-      "dev": true,
-      "dependencies": {
-        "string-width": "^1.0.2 || 2"
-      }
-    },
-    "node_modules/workerpool": {
-      "version": "6.0.2",
-      "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.0.2.tgz",
-      "integrity": "sha512-DSNyvOpFKrNusaaUwk+ej6cBj1bmhLcBfj80elGk+ZIo5JSkq+unB1dLKEOcNfJDZgjGICfhQ0Q5TbP0PvF4+Q==",
-      "dev": true
-    },
-    "node_modules/wrap-ansi": {
-      "version": "5.1.0",
-      "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz",
-      "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==",
-      "dev": true,
-      "dependencies": {
-        "ansi-styles": "^3.2.0",
-        "string-width": "^3.0.0",
-        "strip-ansi": "^5.0.0"
-      },
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/wrap-ansi/node_modules/ansi-regex": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
-      "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
-      "dev": true,
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/wrap-ansi/node_modules/ansi-styles": {
-      "version": "3.2.1",
-      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
-      "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
-      "dev": true,
-      "dependencies": {
-        "color-convert": "^1.9.0"
-      },
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/wrap-ansi/node_modules/color-convert": {
-      "version": "1.9.3",
-      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
-      "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
-      "dev": true,
-      "dependencies": {
-        "color-name": "1.1.3"
-      }
-    },
-    "node_modules/wrap-ansi/node_modules/color-name": {
-      "version": "1.1.3",
-      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
-      "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
-      "dev": true
-    },
-    "node_modules/wrap-ansi/node_modules/string-width": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
-      "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
-      "dev": true,
-      "dependencies": {
-        "emoji-regex": "^7.0.1",
-        "is-fullwidth-code-point": "^2.0.0",
-        "strip-ansi": "^5.1.0"
-      },
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/wrap-ansi/node_modules/strip-ansi": {
-      "version": "5.2.0",
-      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
-      "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
-      "dev": true,
-      "dependencies": {
-        "ansi-regex": "^4.1.0"
-      },
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/wrappy": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
-      "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
-      "dev": true
-    },
-    "node_modules/y18n": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.1.tgz",
-      "integrity": "sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ==",
-      "dev": true
-    },
-    "node_modules/yargs": {
-      "version": "13.3.2",
-      "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz",
-      "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==",
-      "dev": true,
-      "dependencies": {
-        "cliui": "^5.0.0",
-        "find-up": "^3.0.0",
-        "get-caller-file": "^2.0.1",
-        "require-directory": "^2.1.1",
-        "require-main-filename": "^2.0.0",
-        "set-blocking": "^2.0.0",
-        "string-width": "^3.0.0",
-        "which-module": "^2.0.0",
-        "y18n": "^4.0.0",
-        "yargs-parser": "^13.1.2"
-      }
-    },
-    "node_modules/yargs-parser": {
-      "version": "13.1.2",
-      "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz",
-      "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==",
-      "dev": true,
-      "dependencies": {
-        "camelcase": "^5.0.0",
-        "decamelize": "^1.2.0"
-      }
-    },
-    "node_modules/yargs-unparser": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz",
-      "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==",
-      "dev": true,
-      "dependencies": {
-        "camelcase": "^6.0.0",
-        "decamelize": "^4.0.0",
-        "flat": "^5.0.2",
-        "is-plain-obj": "^2.1.0"
-      },
-      "engines": {
-        "node": ">=10"
-      }
-    },
-    "node_modules/yargs-unparser/node_modules/camelcase": {
-      "version": "6.2.0",
-      "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz",
-      "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==",
-      "dev": true,
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/yargs-unparser/node_modules/decamelize": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz",
-      "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==",
-      "dev": true,
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/yargs/node_modules/ansi-regex": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
-      "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
-      "dev": true,
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/yargs/node_modules/find-up": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
-      "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
-      "dev": true,
-      "dependencies": {
-        "locate-path": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/yargs/node_modules/locate-path": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
-      "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
-      "dev": true,
-      "dependencies": {
-        "p-locate": "^3.0.0",
-        "path-exists": "^3.0.0"
-      },
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/yargs/node_modules/p-limit": {
-      "version": "2.3.0",
-      "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
-      "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
-      "dev": true,
-      "dependencies": {
-        "p-try": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=6"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    },
-    "node_modules/yargs/node_modules/p-locate": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
-      "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
-      "dev": true,
-      "dependencies": {
-        "p-limit": "^2.0.0"
-      },
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/yargs/node_modules/path-exists": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
-      "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=",
-      "dev": true,
-      "engines": {
-        "node": ">=4"
-      }
-    },
-    "node_modules/yargs/node_modules/string-width": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
-      "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
-      "dev": true,
-      "dependencies": {
-        "emoji-regex": "^7.0.1",
-        "is-fullwidth-code-point": "^2.0.0",
-        "strip-ansi": "^5.1.0"
-      },
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/yargs/node_modules/strip-ansi": {
-      "version": "5.2.0",
-      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
-      "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
-      "dev": true,
-      "dependencies": {
-        "ansi-regex": "^4.1.0"
-      },
-      "engines": {
-        "node": ">=6"
-      }
-    },
-    "node_modules/yocto-queue": {
-      "version": "0.1.0",
-      "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
-      "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
-      "dev": true,
-      "engines": {
-        "node": ">=10"
-      },
-      "funding": {
-        "url": "https://github.com/sponsors/sindresorhus"
-      }
-    }
-  },
-  "dependencies": {
-    "@rollup/plugin-node-resolve": {
-      "version": "11.0.1",
-      "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-11.0.1.tgz",
-      "integrity": "sha512-ltlsj/4Bhwwhb+Nb5xCz/6vieuEj2/BAkkqVIKmZwC7pIdl8srmgmglE4S0jFlZa32K4qvdQ6NHdmpRKD/LwoQ==",
-      "dev": true,
-      "requires": {
-        "@rollup/pluginutils": "^3.1.0",
-        "@types/resolve": "1.17.1",
-        "builtin-modules": "^3.1.0",
-        "deepmerge": "^4.2.2",
-        "is-module": "^1.0.0",
-        "resolve": "^1.19.0"
-      }
-    },
-    "@rollup/pluginutils": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz",
-      "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==",
-      "dev": true,
-      "requires": {
-        "@types/estree": "0.0.39",
-        "estree-walker": "^1.0.1",
-        "picomatch": "^2.2.2"
-      }
-    },
-    "@types/estree": {
-      "version": "0.0.39",
-      "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz",
-      "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==",
-      "dev": true
-    },
-    "@types/node": {
-      "version": "14.14.14",
-      "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.14.tgz",
-      "integrity": "sha512-UHnOPWVWV1z+VV8k6L1HhG7UbGBgIdghqF3l9Ny9ApPghbjICXkUJSd/b9gOgQfjM1r+37cipdw/HJ3F6ICEnQ==",
-      "dev": true
-    },
-    "@types/resolve": {
-      "version": "1.17.1",
-      "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.17.1.tgz",
-      "integrity": "sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==",
-      "dev": true,
-      "requires": {
-        "@types/node": "*"
-      }
-    },
-    "@ungap/promise-all-settled": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz",
-      "integrity": "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==",
-      "dev": true
-    },
-    "ansi-colors": {
-      "version": "4.1.1",
-      "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz",
-      "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==",
-      "dev": true
-    },
-    "ansi-regex": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
-      "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
-      "dev": true
-    },
-    "ansi-styles": {
-      "version": "4.3.0",
-      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
-      "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-      "dev": true,
-      "requires": {
-        "color-convert": "^2.0.1"
-      }
-    },
-    "anymatch": {
-      "version": "3.1.1",
-      "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz",
-      "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==",
-      "dev": true,
-      "requires": {
-        "normalize-path": "^3.0.0",
-        "picomatch": "^2.0.4"
-      }
-    },
-    "argparse": {
-      "version": "1.0.10",
-      "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
-      "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
-      "dev": true,
-      "requires": {
-        "sprintf-js": "~1.0.2"
-      }
-    },
-    "balanced-match": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
-      "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
-      "dev": true
-    },
-    "binary-extensions": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz",
-      "integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==",
-      "dev": true
-    },
-    "brace-expansion": {
-      "version": "1.1.11",
-      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
-      "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
-      "dev": true,
-      "requires": {
-        "balanced-match": "^1.0.0",
-        "concat-map": "0.0.1"
-      }
-    },
-    "braces": {
-      "version": "3.0.2",
-      "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
-      "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
-      "dev": true,
-      "requires": {
-        "fill-range": "^7.0.1"
-      }
-    },
-    "browser-stdout": {
-      "version": "1.3.1",
-      "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz",
-      "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==",
-      "dev": true
-    },
-    "builtin-modules": {
-      "version": "3.2.0",
-      "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.2.0.tgz",
-      "integrity": "sha512-lGzLKcioL90C7wMczpkY0n/oART3MbBa8R9OFGE1rJxoVI86u4WAGfEk8Wjv10eKSyTHVGkSo3bvBylCEtk7LA==",
-      "dev": true
-    },
-    "camelcase": {
-      "version": "5.3.1",
-      "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
-      "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
-      "dev": true
-    },
-    "chalk": {
-      "version": "4.1.0",
-      "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
-      "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
-      "dev": true,
-      "requires": {
-        "ansi-styles": "^4.1.0",
-        "supports-color": "^7.1.0"
-      }
-    },
-    "chokidar": {
-      "version": "3.4.3",
-      "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.3.tgz",
-      "integrity": "sha512-DtM3g7juCXQxFVSNPNByEC2+NImtBuxQQvWlHunpJIS5Ocr0lG306cC7FCi7cEA0fzmybPUIl4txBIobk1gGOQ==",
-      "dev": true,
-      "requires": {
-        "anymatch": "~3.1.1",
-        "braces": "~3.0.2",
-        "fsevents": "~2.1.2",
-        "glob-parent": "~5.1.0",
-        "is-binary-path": "~2.1.0",
-        "is-glob": "~4.0.1",
-        "normalize-path": "~3.0.0",
-        "readdirp": "~3.5.0"
-      }
-    },
-    "cliui": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz",
-      "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==",
-      "dev": true,
-      "requires": {
-        "string-width": "^3.1.0",
-        "strip-ansi": "^5.2.0",
-        "wrap-ansi": "^5.1.0"
-      },
-      "dependencies": {
-        "ansi-regex": {
-          "version": "4.1.0",
-          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
-          "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
-          "dev": true
-        },
-        "string-width": {
-          "version": "3.1.0",
-          "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
-          "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
-          "dev": true,
-          "requires": {
-            "emoji-regex": "^7.0.1",
-            "is-fullwidth-code-point": "^2.0.0",
-            "strip-ansi": "^5.1.0"
-          }
-        },
-        "strip-ansi": {
-          "version": "5.2.0",
-          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
-          "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
-          "dev": true,
-          "requires": {
-            "ansi-regex": "^4.1.0"
-          }
-        }
-      }
-    },
-    "color-convert": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
-      "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-      "dev": true,
-      "requires": {
-        "color-name": "~1.1.4"
-      }
-    },
-    "color-name": {
-      "version": "1.1.4",
-      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
-      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-      "dev": true
-    },
-    "concat-map": {
-      "version": "0.0.1",
-      "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
-      "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
-      "dev": true
-    },
-    "debug": {
-      "version": "4.2.0",
-      "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz",
-      "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==",
-      "dev": true,
-      "requires": {
-        "ms": "2.1.2"
-      }
-    },
-    "decamelize": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
-      "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=",
-      "dev": true
-    },
-    "deepmerge": {
-      "version": "4.2.2",
-      "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz",
-      "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==",
-      "dev": true
-    },
-    "dequal": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.2.tgz",
-      "integrity": "sha512-q9K8BlJVxK7hQYqa6XISGmBZbtQQWVXSrRrWreHC94rMt1QL/Impruc+7p2CYSYuVIUr+YCt6hjrs1kkdJRTug==",
-      "dev": true
-    },
-    "diff": {
-      "version": "4.0.2",
-      "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz",
-      "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==",
-      "dev": true
-    },
-    "emoji-regex": {
-      "version": "7.0.3",
-      "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz",
-      "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==",
-      "dev": true
-    },
-    "escape-string-regexp": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
-      "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
-      "dev": true
-    },
-    "esm-seedrandom": {
-      "version": "file:..",
-      "requires": {
-        "rollup": "^2.35.1",
-        "rollup-plugin-terser": "^7.0.2"
-      }
-    },
-    "esprima": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
-      "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
-      "dev": true
-    },
-    "estree-walker": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz",
-      "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==",
-      "dev": true
-    },
-    "fill-range": {
-      "version": "7.0.1",
-      "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
-      "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
-      "dev": true,
-      "requires": {
-        "to-regex-range": "^5.0.1"
-      }
-    },
-    "find-up": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
-      "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
-      "dev": true,
-      "requires": {
-        "locate-path": "^6.0.0",
-        "path-exists": "^4.0.0"
-      }
-    },
-    "flat": {
-      "version": "5.0.2",
-      "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz",
-      "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==",
-      "dev": true
-    },
-    "fs.realpath": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
-      "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
-      "dev": true
-    },
-    "fsevents": {
-      "version": "2.1.3",
-      "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz",
-      "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==",
-      "dev": true,
-      "optional": true
-    },
-    "function-bind": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
-      "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
-      "dev": true
-    },
-    "get-caller-file": {
-      "version": "2.0.5",
-      "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
-      "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
-      "dev": true
-    },
-    "glob": {
-      "version": "7.1.6",
-      "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
-      "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
-      "dev": true,
-      "requires": {
-        "fs.realpath": "^1.0.0",
-        "inflight": "^1.0.4",
-        "inherits": "2",
-        "minimatch": "^3.0.4",
-        "once": "^1.3.0",
-        "path-is-absolute": "^1.0.0"
-      }
-    },
-    "glob-parent": {
-      "version": "5.1.1",
-      "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz",
-      "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==",
-      "dev": true,
-      "requires": {
-        "is-glob": "^4.0.1"
-      }
-    },
-    "growl": {
-      "version": "1.10.5",
-      "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz",
-      "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==",
-      "dev": true
-    },
-    "has": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
-      "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
-      "dev": true,
-      "requires": {
-        "function-bind": "^1.1.1"
-      }
-    },
-    "has-flag": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
-      "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
-      "dev": true
-    },
-    "he": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz",
-      "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==",
-      "dev": true
-    },
-    "inflight": {
-      "version": "1.0.6",
-      "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
-      "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
-      "dev": true,
-      "requires": {
-        "once": "^1.3.0",
-        "wrappy": "1"
-      }
-    },
-    "inherits": {
-      "version": "2.0.4",
-      "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
-      "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
-      "dev": true
-    },
-    "is-binary-path": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
-      "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
-      "dev": true,
-      "requires": {
-        "binary-extensions": "^2.0.0"
-      }
-    },
-    "is-core-module": {
-      "version": "2.2.0",
-      "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.2.0.tgz",
-      "integrity": "sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ==",
-      "dev": true,
-      "requires": {
-        "has": "^1.0.3"
-      }
-    },
-    "is-extglob": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
-      "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
-      "dev": true
-    },
-    "is-fullwidth-code-point": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
-      "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
-      "dev": true
-    },
-    "is-glob": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz",
-      "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==",
-      "dev": true,
-      "requires": {
-        "is-extglob": "^2.1.1"
-      }
-    },
-    "is-module": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz",
-      "integrity": "sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE=",
-      "dev": true
-    },
-    "is-number": {
-      "version": "7.0.0",
-      "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
-      "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
-      "dev": true
-    },
-    "is-plain-obj": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz",
-      "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==",
-      "dev": true
-    },
-    "isexe": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
-      "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
-      "dev": true
-    },
-    "js-yaml": {
-      "version": "3.14.0",
-      "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz",
-      "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==",
-      "dev": true,
-      "requires": {
-        "argparse": "^1.0.7",
-        "esprima": "^4.0.0"
-      }
-    },
-    "kleur": {
-      "version": "4.1.3",
-      "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.3.tgz",
-      "integrity": "sha512-H1tr8QP2PxFTNwAFM74Mui2b6ovcY9FoxJefgrwxY+OCJcq01k5nvhf4M/KnizzrJvLRap5STUy7dgDV35iUBw==",
-      "dev": true
-    },
-    "locate-path": {
-      "version": "6.0.0",
-      "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
-      "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
-      "dev": true,
-      "requires": {
-        "p-locate": "^5.0.0"
-      }
-    },
-    "log-symbols": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.0.0.tgz",
-      "integrity": "sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA==",
-      "dev": true,
-      "requires": {
-        "chalk": "^4.0.0"
-      }
-    },
-    "minimatch": {
-      "version": "3.0.4",
-      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
-      "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
-      "dev": true,
-      "requires": {
-        "brace-expansion": "^1.1.7"
-      }
-    },
-    "mocha": {
-      "version": "8.2.1",
-      "resolved": "https://registry.npmjs.org/mocha/-/mocha-8.2.1.tgz",
-      "integrity": "sha512-cuLBVfyFfFqbNR0uUKbDGXKGk+UDFe6aR4os78XIrMQpZl/nv7JYHcvP5MFIAb374b2zFXsdgEGwmzMtP0Xg8w==",
-      "dev": true,
-      "requires": {
-        "@ungap/promise-all-settled": "1.1.2",
-        "ansi-colors": "4.1.1",
-        "browser-stdout": "1.3.1",
-        "chokidar": "3.4.3",
-        "debug": "4.2.0",
-        "diff": "4.0.2",
-        "escape-string-regexp": "4.0.0",
-        "find-up": "5.0.0",
-        "glob": "7.1.6",
-        "growl": "1.10.5",
-        "he": "1.2.0",
-        "js-yaml": "3.14.0",
-        "log-symbols": "4.0.0",
-        "minimatch": "3.0.4",
-        "ms": "2.1.2",
-        "nanoid": "3.1.12",
-        "serialize-javascript": "5.0.1",
-        "strip-json-comments": "3.1.1",
-        "supports-color": "7.2.0",
-        "which": "2.0.2",
-        "wide-align": "1.1.3",
-        "workerpool": "6.0.2",
-        "yargs": "13.3.2",
-        "yargs-parser": "13.1.2",
-        "yargs-unparser": "2.0.0"
-      }
-    },
-    "mri": {
-      "version": "1.1.6",
-      "resolved": "https://registry.npmjs.org/mri/-/mri-1.1.6.tgz",
-      "integrity": "sha512-oi1b3MfbyGa7FJMP9GmLTttni5JoICpYBRlq+x5V16fZbLsnL9N3wFqqIm/nIG43FjUFkFh9Epzp/kzUGUnJxQ==",
-      "dev": true
-    },
-    "ms": {
-      "version": "2.1.2",
-      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
-      "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
-      "dev": true
-    },
-    "nanoid": {
-      "version": "3.1.12",
-      "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.12.tgz",
-      "integrity": "sha512-1qstj9z5+x491jfiC4Nelk+f8XBad7LN20PmyWINJEMRSf3wcAjAWysw1qaA8z6NSKe2sjq1hRSDpBH5paCb6A==",
-      "dev": true
-    },
-    "normalize-path": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
-      "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
-      "dev": true
-    },
-    "once": {
-      "version": "1.4.0",
-      "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
-      "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
-      "dev": true,
-      "requires": {
-        "wrappy": "1"
-      }
-    },
-    "p-limit": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
-      "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
-      "dev": true,
-      "requires": {
-        "yocto-queue": "^0.1.0"
-      }
-    },
-    "p-locate": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
-      "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
-      "dev": true,
-      "requires": {
-        "p-limit": "^3.0.2"
-      }
-    },
-    "p-try": {
-      "version": "2.2.0",
-      "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
-      "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
-      "dev": true
-    },
-    "path-exists": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
-      "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
-      "dev": true
-    },
-    "path-is-absolute": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
-      "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
-      "dev": true
-    },
-    "path-parse": {
-      "version": "1.0.6",
-      "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz",
-      "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==",
-      "dev": true
-    },
-    "picomatch": {
-      "version": "2.2.2",
-      "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz",
-      "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==",
-      "dev": true
-    },
-    "randombytes": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
-      "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
-      "dev": true,
-      "requires": {
-        "safe-buffer": "^5.1.0"
-      }
-    },
-    "readdirp": {
-      "version": "3.5.0",
-      "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz",
-      "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==",
-      "dev": true,
-      "requires": {
-        "picomatch": "^2.2.1"
-      }
-    },
-    "require-directory": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
-      "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=",
-      "dev": true
-    },
-    "require-main-filename": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz",
-      "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==",
-      "dev": true
-    },
-    "resolve": {
-      "version": "1.19.0",
-      "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.19.0.tgz",
-      "integrity": "sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==",
-      "dev": true,
-      "requires": {
-        "is-core-module": "^2.1.0",
-        "path-parse": "^1.0.6"
-      }
-    },
-    "rollup": {
-      "version": "2.35.1",
-      "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.35.1.tgz",
-      "integrity": "sha512-q5KxEyWpprAIcainhVy6HfRttD9kutQpHbeqDTWnqAFNJotiojetK6uqmcydNMymBEtC4I8bCYR+J3mTMqeaUA==",
-      "dev": true,
-      "requires": {
-        "fsevents": "~2.1.2"
-      }
-    },
-    "sade": {
-      "version": "1.7.4",
-      "resolved": "https://registry.npmjs.org/sade/-/sade-1.7.4.tgz",
-      "integrity": "sha512-y5yauMD93rX840MwUJr7C1ysLFBgMspsdTo4UVrDg3fXDvtwOyIqykhVAAm6fk/3au77773itJStObgK+LKaiA==",
-      "dev": true,
-      "requires": {
-        "mri": "^1.1.0"
-      }
-    },
-    "safe-buffer": {
-      "version": "5.2.1",
-      "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
-      "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
-      "dev": true
-    },
-    "seedrandom": {
-      "version": "3.0.5",
-      "resolved": "https://registry.npmjs.org/seedrandom/-/seedrandom-3.0.5.tgz",
-      "integrity": "sha512-8OwmbklUNzwezjGInmZ+2clQmExQPvomqjL7LFqOYqtmuxRgQYqOD3mHaU+MvZn5FLUeVxVfQjwLZW/n/JFuqg=="
-    },
-    "serialize-javascript": {
-      "version": "5.0.1",
-      "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-5.0.1.tgz",
-      "integrity": "sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA==",
-      "dev": true,
-      "requires": {
-        "randombytes": "^2.1.0"
-      }
-    },
-    "set-blocking": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
-      "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=",
-      "dev": true
-    },
-    "sprintf-js": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
-      "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
-      "dev": true
-    },
-    "string-width": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
-      "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
-      "dev": true,
-      "requires": {
-        "is-fullwidth-code-point": "^2.0.0",
-        "strip-ansi": "^4.0.0"
-      }
-    },
-    "strip-ansi": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
-      "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
-      "dev": true,
-      "requires": {
-        "ansi-regex": "^3.0.0"
-      }
-    },
-    "strip-json-comments": {
-      "version": "3.1.1",
-      "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
-      "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
-      "dev": true
-    },
-    "supports-color": {
-      "version": "7.2.0",
-      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
-      "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
-      "dev": true,
-      "requires": {
-        "has-flag": "^4.0.0"
-      }
-    },
-    "to-regex-range": {
-      "version": "5.0.1",
-      "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
-      "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
-      "dev": true,
-      "requires": {
-        "is-number": "^7.0.0"
-      }
-    },
-    "totalist": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/totalist/-/totalist-2.0.0.tgz",
-      "integrity": "sha512-+Y17F0YzxfACxTyjfhnJQEe7afPA0GSpYlFkl2VFMxYP7jshQf9gXV7cH47EfToBumFThfKBvfAcoUn6fdNeRQ==",
-      "dev": true
-    },
-    "uvu": {
-      "version": "0.5.1",
-      "resolved": "https://registry.npmjs.org/uvu/-/uvu-0.5.1.tgz",
-      "integrity": "sha512-JGxttnOGDFs77FaZ0yMUHIzczzQ5R1IlDeNW6Wymw6gAscwMdAffVOP6TlxLIfReZyK8tahoGwWZaTCJzNFDkg==",
-      "dev": true,
-      "requires": {
-        "dequal": "^2.0.0",
-        "diff": "^5.0.0",
-        "kleur": "^4.0.3",
-        "sade": "^1.7.3",
-        "totalist": "^2.0.0"
-      },
-      "dependencies": {
-        "diff": {
-          "version": "5.0.0",
-          "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz",
-          "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==",
-          "dev": true
-        }
-      }
-    },
-    "which": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
-      "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
-      "dev": true,
-      "requires": {
-        "isexe": "^2.0.0"
-      }
-    },
-    "which-module": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz",
-      "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=",
-      "dev": true
-    },
-    "wide-align": {
-      "version": "1.1.3",
-      "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz",
-      "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==",
-      "dev": true,
-      "requires": {
-        "string-width": "^1.0.2 || 2"
-      }
-    },
-    "workerpool": {
-      "version": "6.0.2",
-      "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.0.2.tgz",
-      "integrity": "sha512-DSNyvOpFKrNusaaUwk+ej6cBj1bmhLcBfj80elGk+ZIo5JSkq+unB1dLKEOcNfJDZgjGICfhQ0Q5TbP0PvF4+Q==",
-      "dev": true
-    },
-    "wrap-ansi": {
-      "version": "5.1.0",
-      "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz",
-      "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==",
-      "dev": true,
-      "requires": {
-        "ansi-styles": "^3.2.0",
-        "string-width": "^3.0.0",
-        "strip-ansi": "^5.0.0"
-      },
-      "dependencies": {
-        "ansi-regex": {
-          "version": "4.1.0",
-          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
-          "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
-          "dev": true
-        },
-        "ansi-styles": {
-          "version": "3.2.1",
-          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
-          "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
-          "dev": true,
-          "requires": {
-            "color-convert": "^1.9.0"
-          }
-        },
-        "color-convert": {
-          "version": "1.9.3",
-          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
-          "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
-          "dev": true,
-          "requires": {
-            "color-name": "1.1.3"
-          }
-        },
-        "color-name": {
-          "version": "1.1.3",
-          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
-          "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
-          "dev": true
-        },
-        "string-width": {
-          "version": "3.1.0",
-          "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
-          "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
-          "dev": true,
-          "requires": {
-            "emoji-regex": "^7.0.1",
-            "is-fullwidth-code-point": "^2.0.0",
-            "strip-ansi": "^5.1.0"
-          }
-        },
-        "strip-ansi": {
-          "version": "5.2.0",
-          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
-          "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
-          "dev": true,
-          "requires": {
-            "ansi-regex": "^4.1.0"
-          }
-        }
-      }
-    },
-    "wrappy": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
-      "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
-      "dev": true
-    },
-    "y18n": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.1.tgz",
-      "integrity": "sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ==",
-      "dev": true
-    },
-    "yargs": {
-      "version": "13.3.2",
-      "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz",
-      "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==",
-      "dev": true,
-      "requires": {
-        "cliui": "^5.0.0",
-        "find-up": "^3.0.0",
-        "get-caller-file": "^2.0.1",
-        "require-directory": "^2.1.1",
-        "require-main-filename": "^2.0.0",
-        "set-blocking": "^2.0.0",
-        "string-width": "^3.0.0",
-        "which-module": "^2.0.0",
-        "y18n": "^4.0.0",
-        "yargs-parser": "^13.1.2"
-      },
-      "dependencies": {
-        "ansi-regex": {
-          "version": "4.1.0",
-          "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
-          "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
-          "dev": true
-        },
-        "find-up": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
-          "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
-          "dev": true,
-          "requires": {
-            "locate-path": "^3.0.0"
-          }
-        },
-        "locate-path": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
-          "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
-          "dev": true,
-          "requires": {
-            "p-locate": "^3.0.0",
-            "path-exists": "^3.0.0"
-          }
-        },
-        "p-limit": {
-          "version": "2.3.0",
-          "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
-          "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
-          "dev": true,
-          "requires": {
-            "p-try": "^2.0.0"
-          }
-        },
-        "p-locate": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
-          "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
-          "dev": true,
-          "requires": {
-            "p-limit": "^2.0.0"
-          }
-        },
-        "path-exists": {
-          "version": "3.0.0",
-          "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
-          "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=",
-          "dev": true
-        },
-        "string-width": {
-          "version": "3.1.0",
-          "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
-          "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
-          "dev": true,
-          "requires": {
-            "emoji-regex": "^7.0.1",
-            "is-fullwidth-code-point": "^2.0.0",
-            "strip-ansi": "^5.1.0"
-          }
-        },
-        "strip-ansi": {
-          "version": "5.2.0",
-          "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
-          "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
-          "dev": true,
-          "requires": {
-            "ansi-regex": "^4.1.0"
-          }
-        }
-      }
-    },
-    "yargs-parser": {
-      "version": "13.1.2",
-      "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz",
-      "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==",
-      "dev": true,
-      "requires": {
-        "camelcase": "^5.0.0",
-        "decamelize": "^1.2.0"
-      }
-    },
-    "yargs-unparser": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz",
-      "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==",
-      "dev": true,
-      "requires": {
-        "camelcase": "^6.0.0",
-        "decamelize": "^4.0.0",
-        "flat": "^5.0.2",
-        "is-plain-obj": "^2.1.0"
-      },
-      "dependencies": {
-        "camelcase": {
-          "version": "6.2.0",
-          "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz",
-          "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==",
-          "dev": true
-        },
-        "decamelize": {
-          "version": "4.0.0",
-          "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz",
-          "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==",
-          "dev": true
-        }
-      }
-    },
-    "yocto-queue": {
-      "version": "0.1.0",
-      "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
-      "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
-      "dev": true
-    }
-  }
-}
diff --git a/unittest/package.json b/unittest/package.json
index 6a9357e..a619358 100644
--- a/unittest/package.json
+++ b/unittest/package.json
@@ -1,23 +1,23 @@
 {
   "private": true,
   "dependencies": {
+    "esm-seedrandom": "file:..",
     "seedrandom": "^3.0.5"
   },
   "devDependencies": {
     "@rollup/plugin-node-resolve": "^11.0.1",
-    "esm-seedrandom": "file:..",
     "mocha": "^8.2.1",
     "rollup": "^2.35.1",
     "uvu": "^0.5.1"
   },
   "scripts": {
-    "prebuild": "test -d ./node_modules || npm -s install",
-    "clean": "rm ./mocha_unittest.cjs.js browser_unittest.iife.js",
+    "clean": "rm -rf ./dist",
     "build": "rollup --config",
     "watch": "npm -s run build -- --watch",
     "pretest": "npm -s run build",
+    "serve": "qsrv",
     "test": "npm -s run test:one",
-    "test:one": "mocha ./mocha_unittest.cjs.js",
-    "test:min": "mocha --reporter=min ./mocha_unittest.cjs.js"
+    "test:one": "mocha ./dist/mocha_unittest.cjs.js",
+    "test:min": "mocha --reporter=min ./dist/mocha_unittest.cjs.js"
   }
 }
diff --git a/unittest/rollup.config.js b/unittest/rollup.config.js
index ee371d4..e24ecf9 100644
--- a/unittest/rollup.config.js
+++ b/unittest/rollup.config.js
@@ -3,9 +3,9 @@ import rpi_resolve from '@rollup/plugin-node-resolve';
 const plugins = [ rpi_resolve() ]
 
 export default [
-  { input: `unittest.mjs`, plugins,
-    output: { file: `mocha_unittest.cjs.js`, format: 'cjs', sourcemap: false }},
+  { input: `unittest.js`, plugins,
+    output: { file: `dist/mocha_unittest.cjs.js`, format: 'cjs', sourcemap: false }},
 
-  { input: `unittest.mjs`, plugins,
-    output: { file: `browser_unittest.iife.js`, format: 'iife', name: `test_esm_seedrandom`, sourcemap: false }},
+  { input: `unittest.js`, plugins,
+    output: { file: `dist/browser_unittest.iife.js`, format: 'iife', name: `test_esm_seedrandom`, sourcemap: false }},
 ]
diff --git a/unittest/unit/_common.mjs b/unittest/unit/_common.js
similarity index 100%
rename from unittest/unit/_common.mjs
rename to unittest/unit/_common.js
diff --git a/unittest/unit/alea.mjs b/unittest/unit/alea.js
similarity index 96%
rename from unittest/unit/alea.mjs
rename to unittest/unit/alea.js
index c346a5d..68610a3 100644
--- a/unittest/unit/alea.mjs
+++ b/unittest/unit/alea.js
@@ -1,9 +1,9 @@
 import * as assert from 'uvu/assert'
-import {test_prng_alg} from './_common.mjs'
+import {test_prng_alg} from './_common.js'
 
 import { prng_alea } from 'esm-seedrandom'
-import { prng_alea as prng_alea_isolated } from 'esm-seedrandom/esm/alea.mjs'
-import { prng_alea as prng_alea_minify } from 'esm-seedrandom/esm/alea.min.mjs'
+import { prng_alea as prng_alea_isolated } from 'esm-seedrandom/esm/alea.js'
+import { prng_alea as prng_alea_minify } from 'esm-seedrandom/esm/alea.min.js'
 
 const cjs_prng_alea = require('seedrandom/lib/alea.js')
 
diff --git a/unittest/unit/arc4.mjs b/unittest/unit/arc4.js
similarity index 97%
rename from unittest/unit/arc4.mjs
rename to unittest/unit/arc4.js
index cbdfe33..628f4bd 100644
--- a/unittest/unit/arc4.mjs
+++ b/unittest/unit/arc4.js
@@ -1,9 +1,9 @@
 import * as assert from 'uvu/assert'
-import {test_prng_alg} from './_common.mjs'
+import {test_prng_alg} from './_common.js'
 
 import { prng_arc4 } from 'esm-seedrandom'
-import { prng_arc4 as prng_arc4_isolated } from 'esm-seedrandom/esm/arc4.mjs'
-import { prng_arc4 as prng_arc4_minify } from 'esm-seedrandom/esm/arc4.min.mjs'
+import { prng_arc4 as prng_arc4_isolated } from 'esm-seedrandom/esm/arc4.js'
+import { prng_arc4 as prng_arc4_minify } from 'esm-seedrandom/esm/arc4.min.js'
 
 const cjs_prng_arc4 = require('seedrandom')
 
diff --git a/unittest/unit/tychei.mjs b/unittest/unit/tychei.js
similarity index 95%
rename from unittest/unit/tychei.mjs
rename to unittest/unit/tychei.js
index 408b71f..2b1d0d4 100644
--- a/unittest/unit/tychei.mjs
+++ b/unittest/unit/tychei.js
@@ -1,9 +1,9 @@
 import * as assert from 'uvu/assert'
-import {test_prng_alg} from './_common.mjs'
+import {test_prng_alg} from './_common.js'
 
 import { prng_tychei } from 'esm-seedrandom'
-import { prng_tychei as prng_tychei_isolated } from 'esm-seedrandom/esm/tychei.mjs'
-import { prng_tychei as prng_tychei_minify } from 'esm-seedrandom/esm/tychei.min.mjs'
+import { prng_tychei as prng_tychei_isolated } from 'esm-seedrandom/esm/tychei.js'
+import { prng_tychei as prng_tychei_minify } from 'esm-seedrandom/esm/tychei.min.js'
 
 const cjs_prng_tychei = require('seedrandom/lib/tychei.js')
 
diff --git a/unittest/unit/xor128.mjs b/unittest/unit/xor128.js
similarity index 95%
rename from unittest/unit/xor128.mjs
rename to unittest/unit/xor128.js
index ae81587..6622333 100644
--- a/unittest/unit/xor128.mjs
+++ b/unittest/unit/xor128.js
@@ -1,9 +1,9 @@
 import * as assert from 'uvu/assert'
-import {test_prng_alg} from './_common.mjs'
+import {test_prng_alg} from './_common.js'
 
 import { prng_xor128 } from 'esm-seedrandom'
-import { prng_xor128 as prng_xor128_isolated } from 'esm-seedrandom/esm/xor128.mjs'
-import { prng_xor128 as prng_xor128_minify } from 'esm-seedrandom/esm/xor128.min.mjs'
+import { prng_xor128 as prng_xor128_isolated } from 'esm-seedrandom/esm/xor128.js'
+import { prng_xor128 as prng_xor128_minify } from 'esm-seedrandom/esm/xor128.min.js'
 
 const cjs_prng_xor128 = require('seedrandom/lib/xor128.js')
 
diff --git a/unittest/unit/xor4096.mjs b/unittest/unit/xor4096.js
similarity index 97%
rename from unittest/unit/xor4096.mjs
rename to unittest/unit/xor4096.js
index a72237f..ebe1a80 100644
--- a/unittest/unit/xor4096.mjs
+++ b/unittest/unit/xor4096.js
@@ -1,9 +1,9 @@
 import * as assert from 'uvu/assert'
-import {test_prng_alg} from './_common.mjs'
+import {test_prng_alg} from './_common.js'
 
 import { prng_xor4096 } from 'esm-seedrandom'
-import { prng_xor4096 as prng_xor4096_isolated } from 'esm-seedrandom/esm/xor4096.mjs'
-import { prng_xor4096 as prng_xor4096_minify } from 'esm-seedrandom/esm/xor4096.min.mjs'
+import { prng_xor4096 as prng_xor4096_isolated } from 'esm-seedrandom/esm/xor4096.js'
+import { prng_xor4096 as prng_xor4096_minify } from 'esm-seedrandom/esm/xor4096.min.js'
 
 const cjs_prng_xor4096 = require('seedrandom/lib/xor4096.js')
 
diff --git a/unittest/unit/xorshift7.mjs b/unittest/unit/xorshift7.js
similarity index 94%
rename from unittest/unit/xorshift7.mjs
rename to unittest/unit/xorshift7.js
index f4caa92..5493b7b 100644
--- a/unittest/unit/xorshift7.mjs
+++ b/unittest/unit/xorshift7.js
@@ -1,9 +1,9 @@
 import * as assert from 'uvu/assert'
-import {test_prng_alg} from './_common.mjs'
+import {test_prng_alg} from './_common.js'
 
 import { prng_xorshift7 } from 'esm-seedrandom'
-import { prng_xorshift7 as prng_xorshift7_isolated } from 'esm-seedrandom/esm/xorshift7.mjs'
-import { prng_xorshift7 as prng_xorshift7_minify } from 'esm-seedrandom/esm/xorshift7.min.mjs'
+import { prng_xorshift7 as prng_xorshift7_isolated } from 'esm-seedrandom/esm/xorshift7.js'
+import { prng_xorshift7 as prng_xorshift7_minify } from 'esm-seedrandom/esm/xorshift7.min.js'
 
 const cjs_prng_xorshift7 = require('seedrandom/lib/xorshift7.js')
 
diff --git a/unittest/unit/xorwow.mjs b/unittest/unit/xorwow.js
similarity index 95%
rename from unittest/unit/xorwow.mjs
rename to unittest/unit/xorwow.js
index 8293a42..988fde8 100644
--- a/unittest/unit/xorwow.mjs
+++ b/unittest/unit/xorwow.js
@@ -1,9 +1,9 @@
 import * as assert from 'uvu/assert'
-import {test_prng_alg} from './_common.mjs'
+import {test_prng_alg} from './_common.js'
 
 import { prng_xorwow } from 'esm-seedrandom'
-import { prng_xorwow as prng_xorwow_isolated } from 'esm-seedrandom/esm/xorwow.mjs'
-import { prng_xorwow as prng_xorwow_minify } from 'esm-seedrandom/esm/xorwow.min.mjs'
+import { prng_xorwow as prng_xorwow_isolated } from 'esm-seedrandom/esm/xorwow.js'
+import { prng_xorwow as prng_xorwow_minify } from 'esm-seedrandom/esm/xorwow.min.js'
 
 const cjs_prng_xorwow = require('seedrandom/lib/xorwow.js')
 
diff --git a/unittest/unittest.js b/unittest/unittest.js
new file mode 100644
index 0000000..548733a
--- /dev/null
+++ b/unittest/unittest.js
@@ -0,0 +1,7 @@
+import './unit/alea.js'
+import './unit/xor128.js'
+import './unit/tychei.js'
+import './unit/xorwow.js'
+import './unit/xor4096.js'
+import './unit/xorshift7.js'
+import './unit/arc4.js'
diff --git a/unittest/unittest.mjs b/unittest/unittest.mjs
deleted file mode 100644
index c534acf..0000000
--- a/unittest/unittest.mjs
+++ /dev/null
@@ -1,7 +0,0 @@
-import './unit/alea.mjs'
-import './unit/xor128.mjs'
-import './unit/tychei.mjs'
-import './unit/xorwow.mjs'
-import './unit/xor4096.mjs'
-import './unit/xorshift7.mjs'
-import './unit/arc4.mjs'