diff --git a/dist/otpauth.cjs.js b/dist/otpauth.cjs.js index 89de02ad..e83bd953 100644 --- a/dist/otpauth.cjs.js +++ b/dist/otpauth.cjs.js @@ -1,4 +1,4 @@ -/*! otpauth v7.0.5 | (c) Héctor Molinero Fernández | MIT | https://github.com/hectorm/otpauth */ +/*! otpauth v7.0.6 | (c) Héctor Molinero Fernández | MIT | https://github.com/hectorm/otpauth */ /*! jssha v3.2.0 | (c) Brian Turek | BSD-3-Clause | https://github.com/Caligatio/jsSHA */ 'use strict'; @@ -98,6 +98,8 @@ function _assertThisInitialized(self) { function _possibleConstructorReturn(self, call) { if (call && (typeof call === "object" || typeof call === "function")) { return call; + } else if (call !== void 0) { + throw new TypeError("Derived constructors may only return object or undefined"); } return _assertThisInitialized(self); @@ -2302,7 +2304,7 @@ var URI = /*#__PURE__*/function () { * Library version. * @type {string} */ -var version = '7.0.5'; +var version = '7.0.6'; exports.HOTP = HOTP; exports.Secret = Secret; diff --git a/dist/otpauth.cjs.min.js b/dist/otpauth.cjs.min.js index 39770b11..2173f724 100644 --- a/dist/otpauth.cjs.min.js +++ b/dist/otpauth.cjs.min.js @@ -1,39 +1,39 @@ -/*! otpauth v7.0.5 | (c) Héctor Molinero Fernández | MIT | https://github.com/hectorm/otpauth */ +/*! otpauth v7.0.6 | (c) Héctor Molinero Fernández | MIT | https://github.com/hectorm/otpauth */ /*! jssha v3.2.0 | (c) Brian Turek | BSD-3-Clause | https://github.com/Caligatio/jsSHA */ -"use strict";function _typeof(e){return(_typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function _defineProperties(e,t){for(var n=0;n=0&&0!==r;i--)n[i]=255&r,r-=n[i],r/=256;return t},t="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";function n(e,t,n,r){var i,o,u,a=t||[0],s=(n=n||0)>>>3,f=-1===r?3:0;for(i=0;i>>2,a.length<=o&&a.push(0),a[o]|=e[i]<<8*(f+r*(u%4));return{value:a,binLen:8*e.length+n}}function e(e,r,i){switch(r){case"UTF8":case"UTF16BE":case"UTF16LE":break;default:throw new Error("encoding must be UTF8, UTF16BE, or UTF16LE")}switch(e){case"HEX":return function(e,t,n){return function(e,t,n,r){var i,o,u,a;if(0!=e.length%2)throw new Error("String of HEX type must be in byte increments");var s=t||[0],f=(n=n||0)>>>3,c=-1===r?3:0;for(i=0;i>>1)+f)>>>2;s.length<=u;)s.push(0);s[u]|=o<<8*(c+r*(a%4))}return{value:s,binLen:4*e.length+n}}(e,t,n,i)};case"TEXT": -return function(e,t,n){return function(e,t,n,r,i){var o,u,a,s,f,c,h,l,w=0,p=n||[0],d=(r=r||0)>>>3;if("UTF8"===t)for(h=-1===i?3:0,a=0;a(o=e.charCodeAt(a))?u.push(o):2048>o?(u.push(192|o>>>6),u.push(128|63&o)):55296>o||57344<=o?u.push(224|o>>>12,128|o>>>6&63,128|63&o):(a+=1,o=65536+((1023&o)<<10|1023&e.charCodeAt(a)),u.push(240|o>>>18,128|o>>>12&63,128|o>>>6&63,128|63&o)),s=0;s>>2;p.length<=f;)p.push(0);p[f]|=u[s]<<8*(h+i*(c%4)),w+=1}else for(h=-1===i?2:0,l="UTF16LE"===t&&1!==i||"UTF16LE"!==t&&1===i,a=0;a>>8),f=(c=w+d)>>>2;p.length<=f;)p.push(0);p[f]|=o<<8*(h+i*(c%4)),w+=2}return{value:p,binLen:8*w+r}}(e,r,t,n,i)};case"B64":return function(e,n,r){return function(e,n,r,i){var o,u,a,s,f,c,h=0,l=n||[0],w=(r=r||0)>>>3,p=-1===i?3:0,d=e.indexOf("=");if(-1===e.search(/^[a-zA-Z0-9=+/]+$/))throw new Error("Invalid character in base-64 string");if(e=e.replace(/=/g,""), --1!==d&&d=0&&0!==n;i--)r[i]=255&n,n-=r[i],n/=256;return t},t="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";function n(e,t,r,n){var i,o,u,a=t||[0],s=(r=r||0)>>>3,f=-1===n?3:0;for(i=0;i>>2,a.length<=o&&a.push(0),a[o]|=e[i]<<8*(f+n*(u%4));return{value:a,binLen:8*e.length+r}}function e(e,r,i){switch(r){case"UTF8":case"UTF16BE":case"UTF16LE":break;default:throw new Error("encoding must be UTF8, UTF16BE, or UTF16LE")}switch(e){case"HEX":return function(e,t,r){return function(e,t,r,n){var i,o,u,a;if(0!=e.length%2)throw new Error("String of HEX type must be in byte increments");var s=t||[0],f=(r=r||0)>>>3,c=-1===n?3:0;for(i=0;i>>1)+f)>>>2;s.length<=u;)s.push(0);s[u]|=o<<8*(c+n*(a%4))}return{value:s,binLen:4*e.length+r}}(e,t,r,i)};case"TEXT":return function(e,t,n){return function(e,t,r,n,i){var o,u,a,s,f,c,h,l,w=0,p=r||[0],d=(n=n||0)>>>3;if("UTF8"===t)for(h=-1===i?3:0,a=0;a(o=e.charCodeAt(a))?u.push(o):2048>o?(u.push(192|o>>>6),u.push(128|63&o)):55296>o||57344<=o?u.push(224|o>>>12,128|o>>>6&63,128|63&o):(a+=1,o=65536+((1023&o)<<10|1023&e.charCodeAt(a)),u.push(240|o>>>18,128|o>>>12&63,128|o>>>6&63,128|63&o)),s=0;s>>2;p.length<=f;)p.push(0);p[f]|=u[s]<<8*(h+i*(c%4)),w+=1}else for(h=-1===i?2:0,l="UTF16LE"===t&&1!==i||"UTF16LE"!==t&&1===i,a=0;a>>8),f=(c=w+d)>>>2;p.length<=f;)p.push(0);p[f]|=o<<8*(h+i*(c%4)),w+=2}return{value:p,binLen:8*w+n}}(e,r,t,n,i)};case"B64":return function(e,r,n){return function(e,r,n,i){ +var o,u,a,s,f,c,h=0,l=r||[0],w=(n=n||0)>>>3,p=-1===i?3:0,d=e.indexOf("=");if(-1===e.search(/^[a-zA-Z0-9=+/]+$/))throw new Error("Invalid character in base-64 string");if(e=e.replace(/=/g,""),-1!==d&&d>>10<<5),a=t+r;e.length<=u;)e.push(0);for(e[t>>>5]|=128<<24-t%32,e[u]=4294967295&a,e[u-1]=a/4294967296|0,o=0;o>>1)%5][(n>>>1)/5|0]=x(t[(n>>>1)%5][(n>>>1)/5|0],new B(e[n+1],e[n]));for(r=0;r<24;r+=1){for(o=J(),n=0;n<5;n+=1)h[n]=(u=t[n][0],a=t[n][1],s=t[n][2], +f=t[n][3],c=t[n][4],new B(u.Y^a.Y^s.Y^f.Y^c.Y,u.N^a.N^s.N^f.N^c.N));for(n=0;n<5;n+=1)l[n]=x(h[(n+4)%5],L(h[(n+1)%5],1));for(n=0;n<5;n+=1)for(i=0;i<5;i+=1)t[n][i]=x(t[n][i],l[n]);for(n=0;n<5;n+=1)for(i=0;i<5;i+=1)o[i][(2*n+3*i)%5]=L(t[n][i],G[n][i]);for(n=0;n<5;n+=1)for(i=0;i<5;i+=1)t[n][i]=x(o[n][i],new B(~o[(n+1)%5][i].Y&o[(n+2)%5][i].Y,~o[(n+1)%5][i].N&o[(n+2)%5][i].N));t[0][0]=x(t[0][0],D[r])}return t}function $(e){var t,r,n=0,i=[0,0],o=[4294967295&e,e/4294967296&2097151];for(t=6;t>=0;t--)0===(r=o[t>>2]>>>8*t&255)&&0===n||(i[n+1>>2]|=r<<8*(n+1),n+=1);return n=0!==n?n:1,i[0]|=n,{value:n+1>4?i:[i[0]],binLen:8+8*n}}function tt(e){return u($(e.binLen),e)}function nt(e,t){var r,n=$(t),i=t>>>2,o=(i-(n=u(n,e)).value.length%i)%i;for(r=0;r>>5,l=t>>>5;for(a=0;a=i;a+=h)n=W(e.slice(a,a+h),n),t-=i;for(e=e.slice(a),t%=i;e.length>>3)>>2]^=o<=u));)c.push(s.Y),0==64*(f+=1)%i&&(W(null,n),f=0);return c}(e,t,0,n,s,a,i)},f.hmacKey&&u.M(c("hmacKey",f.hmacKey,u.K)),u}return _createClass(n,[{key:"_",value:function(e,t){var r=function(e){var t=e||{};return{funcName:c("funcName",t.funcName,1,{value:[],binLen:0}),customization:c("Customization",t.customization,1,{value:[],binLen:0})}}(e||{});t&&(r.funcName=t);var n=u(tt(r.funcName),tt(r.customization));if(0!==r.customization.binLen||0!==r.funcName.binLen){for(var i=nt(n,this.p>>>3),o=0;o>>5)this.C=this.R(i.slice(o,o+(this.p>>>5)),this.C),this.l+=this.p;return 4}return 31}},{key:"I",value:function(e){var t=function(e){var t=e||{};return{kmacKey:c("kmacKey",t.kmacKey,1),funcName:{value:[1128353099],binLen:32},customization:c("Customization",t.customization,1,{value:[],binLen:0})}}(e||{});this._(e,t.funcName) +;for(var r=nt(tt(t.kmacKey),this.p>>>3),n=0;n>>5)this.C=this.R(r.slice(n,n+(this.p>>>5)),this.C),this.l+=this.p;this.A=!0}},{key:"X",value:function(e){var t=u({value:this.o.slice(),binLen:this.h},function(e){var t,r,n=0,i=[0,0],o=[4294967295&e,e/4294967296&2097151];for(t=6;t>=0;t--)0===(r=o[t>>2]>>>8*t&255)&&0===n||(i[n>>2]|=r<<8*n,n+=1);return i[(n=0!==n?n:1)>>2]|=n<<8*n,{value:n+1>4?i:[i[0]],binLen:8+8*n}}(e.outputLen));return this.F(t.value,t.binLen,this.l,this.g(this.C),e.outputLen)}}]),n}(),_default=function(){function e(t,r,n){if(_classCallCheck(this,e),"SHA-1"==t)this.O=new K(t,r,n);else if("SHA-224"==t||"SHA-256"==t)this.O=new g(t,r,n);else if("SHA-384"==t||"SHA-512"==t)this.O=new q(t,r,n);else{if("SHA3-224"!=t&&"SHA3-256"!=t&&"SHA3-384"!=t&&"SHA3-512"!=t&&"SHAKE128"!=t&&"SHAKE256"!=t&&"CSHAKE128"!=t&&"CSHAKE256"!=t&&"KMAC128"!=t&&"KMAC256"!=t)throw new Error(h);this.O=new et(t,r,n)}}return _createClass(e,[{key:"update",value:function(e){this.O.update(e)}},{key:"getHash", +value:function(e,t){return this.O.getHash(e,t)}},{key:"setHMACKey",value:function(e,t,r){this.O.setHMACKey(e,t,r)}},{key:"getHMAC",value:function(e,t){return this.O.getHMAC(e,t)}}]),e}(),globalThis=function(){if("object"===_typeof(globalThis))return globalThis;Object.defineProperty(Object.prototype,"__GLOBALTHIS__",{get:function(){return this},configurable:!0});try{if("undefined"!=typeof __GLOBALTHIS__)return __GLOBALTHIS__}finally{delete Object.prototype.__GLOBALTHIS__}return"undefined"!=typeof self?self:"undefined"!=typeof window?window:"undefined"!=typeof global?global:void 0}(),isNode="[object process]"===Object.prototype.toString.call(globalThis.process),nodeRequire=isNode?eval("require"):function(){},NodeBuffer$1=isNode?globalThis.Buffer:void 0,NodeCrypto$2=isNode?nodeRequire("crypto"):void 0,OPENSSL_TO_JSSHA_ALGO={SHA1:"SHA-1",SHA224:"SHA-224",SHA256:"SHA-256",SHA384:"SHA-384",SHA512:"SHA-512","SHA3-224":"SHA3-224","SHA3-256":"SHA3-256","SHA3-384":"SHA3-384","SHA3-512":"SHA3-512" +},hmacDigest=function(e,t,r){if(isNode){var n=NodeCrypto$2.createHmac(e,NodeBuffer$1.from(t));return n.update(NodeBuffer$1.from(r)),n.digest().buffer}var i=OPENSSL_TO_JSSHA_ALGO[e.toUpperCase()];if(void 0===i)throw new TypeError("Unknown hash function");var o=new _default(i,"ARRAYBUFFER");return o.setHMACKey(t,"ARRAYBUFFER"),o.update(r),o.getHMAC("ARRAYBUFFER")},pad=function(e,t){for(var r="",n=t-String(e).length;n-- >0;)r+="0";return"".concat(r).concat(e)},ALPHABET="ABCDEFGHIJKLMNOPQRSTUVWXYZ234567",base32ToBuf=function(e){for(var t=e.toUpperCase().replace(/=+$/,""),r=new ArrayBuffer(5*t.length/8|0),n=new Uint8Array(r),i=0,o=0,u=0,a=0;a=8&&(n[u++]=o>>>i-8&255,i-=8)}return r},base32FromBuf=function(e){for(var t=new Uint8Array(e),r=0,n=0,i="",o=0;o=5;)i+=ALPHABET[n>>>r-5&31],r-=5;return r>0&&(i+=ALPHABET[n<<5-r&31]),i},hexToBuf=function(e){ +for(var t=new ArrayBuffer(e.length/2),r=new Uint8Array(t),n=0;n0&&void 0!==arguments[0]?arguments[0]:{},r=t.buffer,n=t.size,i=void 0===n?20:n;_classCallCheck(this,e),this.buffer=void 0===r?randomBytes(i):r}return _createClass(e,[{key:"latin1",get:function(){return Object.defineProperty(this,"latin1",{enumerable:!0,value:latin1FromBuf(this.buffer)}),this.latin1}},{key:"utf8",get:function(){return Object.defineProperty(this,"utf8",{enumerable:!0,value:utf8FromBuf(this.buffer)}),this.utf8}},{key:"base32",get:function(){return Object.defineProperty(this,"base32",{enumerable:!0,value:base32FromBuf(this.buffer)}),this.base32}},{key:"hex",get:function(){ +return Object.defineProperty(this,"hex",{enumerable:!0,value:hexFromBuf(this.buffer)}),this.hex}}],[{key:"fromLatin1",value:function(t){return new e({buffer:latin1ToBuf(t)})}},{key:"fromUTF8",value:function(t){return new e({buffer:utf8ToBuf(t)})}},{key:"fromBase32",value:function(t){return new e({buffer:base32ToBuf(t)})}},{key:"fromHex",value:function(t){return new e({buffer:hexToBuf(t)})}}]),e}(),NodeBuffer=isNode?globalThis.Buffer:void 0,NodeCrypto=isNode?nodeRequire("crypto"):void 0,timingSafeEqual=function(e,t){if(isNode)return NodeCrypto.timingSafeEqual(NodeBuffer.from(e),NodeBuffer.from(t));if(e.length!==t.length)throw new TypeError("Input strings must have the same length");for(var r=-1,n=0;++r0&&void 0!==arguments[0]?arguments[0]:{},r=t.issuer,n=void 0===r?e.defaults.issuer:r,i=t.label,o=void 0===i?e.defaults.label:i,u=t.secret,a=void 0===u?new Secret:u,s=t.algorithm,f=void 0===s?e.defaults.algorithm:s,c=t.digits,h=void 0===c?e.defaults.digits:c,l=t.counter,w=void 0===l?e.defaults.counter:l;_classCallCheck(this,e),this.issuer=n,this.label=o,this.secret="string"==typeof a?Secret.fromBase32(a):a,this.algorithm=f.toUpperCase(),this.digits=h,this.counter=w}return _createClass(e,[{key:"generate",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},r=t.counter,n=void 0===r?this.counter++:r;return e.generate({secret:this.secret,algorithm:this.algorithm,digits:this.digits,counter:n})}},{key:"validate",value:function(t){var r=t.token,n=t.counter,i=void 0===n?this.counter:n,o=t.window;return e.validate({token:r,secret:this.secret,algorithm:this.algorithm,digits:this.digits,counter:i,window:o})}},{key:"toString",value:function(){var e=encodeURIComponent +;return"otpauth://hotp/"+"".concat(this.issuer.length>0?"".concat(e(this.issuer),":").concat(e(this.label),"?issuer=").concat(e(this.issuer),"&"):"".concat(e(this.label),"?"))+"secret=".concat(e(this.secret.base32),"&")+"algorithm=".concat(e(this.algorithm),"&")+"digits=".concat(e(this.digits),"&")+"counter=".concat(e(this.counter))}}],[{key:"defaults",get:function(){return{issuer:"",label:"OTPAuth",algorithm:"SHA1",digits:6,counter:0,window:1}}},{key:"generate",value:function(t){var r=t.secret,n=t.algorithm,i=void 0===n?e.defaults.algorithm:n,o=t.digits,u=void 0===o?e.defaults.digits:o,a=t.counter,s=void 0===a?e.defaults.counter:a,f=new Uint8Array(hmacDigest(i,r.buffer,uintToBuf(s))),c=15&f[f.byteLength-1],h=((127&f[c])<<24|(255&f[c+1])<<16|(255&f[c+2])<<8|255&f[c+3])%Math.pow(10,u);return pad(h,u)}},{key:"validate",value:function(t){var r=t.token,n=t.secret,i=t.algorithm,o=t.digits,u=t.counter,a=void 0===u?e.defaults.counter:u,s=t.window,f=void 0===s?e.defaults.window:s;if(r.length!==o)return null +;for(var c=null,h=a-f;h<=a+f;++h){var l=e.generate({secret:n,algorithm:i,digits:o,counter:h});timingSafeEqual(r,l)&&(c=h-a)}return c}}]),e}(),TOTP=function(){function e(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},r=t.issuer,n=void 0===r?e.defaults.issuer:r,i=t.label,o=void 0===i?e.defaults.label:i,u=t.secret,a=void 0===u?new Secret:u,s=t.algorithm,f=void 0===s?e.defaults.algorithm:s,c=t.digits,h=void 0===c?e.defaults.digits:c,l=t.period,w=void 0===l?e.defaults.period:l;_classCallCheck(this,e),this.issuer=n,this.label=o,this.secret="string"==typeof a?Secret.fromBase32(a):a,this.algorithm=f.toUpperCase(),this.digits=h,this.period=w}return _createClass(e,[{key:"generate",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},r=t.timestamp,n=void 0===r?Date.now():r;return e.generate({secret:this.secret,algorithm:this.algorithm,digits:this.digits,period:this.period,timestamp:n})}},{key:"validate",value:function(t){var r=t.token,n=t.timestamp,i=t.window +;return e.validate({token:r,secret:this.secret,algorithm:this.algorithm,digits:this.digits,period:this.period,timestamp:n,window:i})}},{key:"toString",value:function(){var e=encodeURIComponent;return"otpauth://totp/"+"".concat(this.issuer.length>0?"".concat(e(this.issuer),":").concat(e(this.label),"?issuer=").concat(e(this.issuer),"&"):"".concat(e(this.label),"?"))+"secret=".concat(e(this.secret.base32),"&")+"algorithm=".concat(e(this.algorithm),"&")+"digits=".concat(e(this.digits),"&")+"period=".concat(e(this.period))}}],[{key:"defaults",get:function(){return{issuer:"",label:"OTPAuth",algorithm:"SHA1",digits:6,period:30,window:1}}},{key:"generate",value:function(t){var r=t.secret,n=t.algorithm,i=t.digits,o=t.period,u=void 0===o?e.defaults.period:o,a=t.timestamp,s=void 0===a?Date.now():a;return HOTP.generate({secret:r,algorithm:n,digits:i,counter:Math.floor(s/1e3/u)})}},{key:"validate",value:function(t){ +var r=t.token,n=t.secret,i=t.algorithm,o=t.digits,u=t.period,a=void 0===u?e.defaults.period:u,s=t.timestamp,f=void 0===s?Date.now():s,c=t.window;return HOTP.validate({token:r,secret:n,algorithm:i,digits:o,counter:Math.floor(f/1e3/a),window:c})}}]),e}(),OTPURI_REGEX=/^otpauth:\/\/([ht]otp)\/(.+)\?((?:&?[A-Z0-9.~_-]+=[^&]*)+)$/i,SECRET_REGEX=/^[2-7A-Z]+=*$/i,ALGORITHM_REGEX=/^SHA(?:1|224|256|384|512|3-224|3-256|3-384|3-512)$/i,INTEGER_REGEX=/^[+-]?\d+$/,POSITIVE_INTEGER_REGEX=/^\+?[1-9]\d*$/,URI=function(){function e(){_classCallCheck(this,e)}return _createClass(e,null,[{key:"parse",value:function(e){var t;try{t=e.match(OTPURI_REGEX)}catch(e){}if(!Array.isArray(t))throw new URIError("Invalid URI format");var r,n=t[1].toLowerCase(),i=t[2].split(/:(.+)/,2).map(decodeURIComponent),o=t[3].split("&").reduce((function(e,t){var r=t.split(/=(.*)/,2).map(decodeURIComponent),n=r[0].toLowerCase(),i=r[1],o=e;return o[n]=i,o}),{}),u={};if("hotp"===n){if(r=HOTP, +void 0===o.counter||!INTEGER_REGEX.test(o.counter))throw new TypeError("Missing or invalid 'counter' parameter");u.counter=parseInt(o.counter,10)}else{if("totp"!==n)throw new TypeError("Unknown OTP type");if(r=TOTP,void 0!==o.period){if(!POSITIVE_INTEGER_REGEX.test(o.period))throw new TypeError("Invalid 'period' parameter");u.period=parseInt(o.period,10)}}if(2===i.length)if(u.label=i[1],void 0===o.issuer)u.issuer=i[0];else{if(o.issuer!==i[0])throw new TypeError("Invalid 'issuer' parameter");u.issuer=o.issuer}else u.label=i[0],void 0!==o.issuer&&(u.issuer=o.issuer);if(void 0===o.secret||!SECRET_REGEX.test(o.secret))throw new TypeError("Missing or invalid 'secret' parameter");if(u.secret=o.secret,void 0!==o.algorithm){if(!ALGORITHM_REGEX.test(o.algorithm))throw new TypeError("Invalid 'algorithm' parameter");u.algorithm=o.algorithm}if(void 0!==o.digits){if(!POSITIVE_INTEGER_REGEX.test(o.digits))throw new TypeError("Invalid 'digits' parameter");u.digits=parseInt(o.digits,10)}return new r(u)}},{key:"stringify", +value:function(e){if(e instanceof HOTP||e instanceof TOTP)return e.toString();throw new TypeError("Invalid 'HOTP/TOTP' object")}}]),e}(),version="7.0.6";exports.HOTP=HOTP,exports.Secret=Secret,exports.TOTP=TOTP,exports.URI=URI,exports.version=version; //# sourceMappingURL=otpauth.cjs.min.js.map diff --git a/dist/otpauth.cjs.min.js.map b/dist/otpauth.cjs.min.js.map index 4bafd0a5..697542df 100644 --- a/dist/otpauth.cjs.min.js.map +++ b/dist/otpauth.cjs.min.js.map @@ -1 +1 @@ -{"version":3,"file":"otpauth.cjs.min.js","sources":["../src/utils/encoding/uint.js","../node_modules/jssha/dist/sha.mjs","../src/utils/global-this.js","../src/utils/is-node.js","../src/utils/node-require.js","../src/utils/crypto/hmac-digest.js","../src/utils/pad.js","../src/utils/encoding/base32.js","../src/utils/encoding/hex.js","../src/utils/encoding/latin1.js","../src/utils/encoding/utf8.js","../src/utils/crypto/random-bytes.js","../src/secret.js","../src/utils/crypto/timing-safe-equal.js","../src/hotp.js","../src/totp.js","../src/uri.js","../src/version.js"],"sourcesContent":["/**\n * Converts an integer to an ArrayBuffer.\n * @param {number} num Integer.\n * @returns {ArrayBuffer} ArrayBuffer.\n */\nconst uintToBuf = (num) => {\n\tconst buf = new ArrayBuffer(8);\n\tconst arr = new Uint8Array(buf);\n\tlet acc = num;\n\n\tfor (let i = 7; i >= 0; i--) {\n\t\tif (acc === 0) break;\n\t\tarr[i] = acc & 255;\n\t\tacc -= arr[i];\n\t\tacc /= 256;\n\t}\n\n\treturn buf;\n};\n\n/**\n * Converts an ArrayBuffer to an integer.\n * @param {ArrayBuffer} buf ArrayBuffer.\n * @returns {number} Integer.\n */\nconst uintFromBuf = (buf) => {\n\tconst arr = new Uint8Array(buf);\n\tlet num = 0;\n\n\tfor (let i = 0; i < arr.length; i++) {\n\t\tif (arr[i] !== 0) {\n\t\t\tnum *= 256;\n\t\t\tnum += arr[i];\n\t\t}\n\t}\n\n\treturn num;\n};\n\nexport { uintToBuf, uintFromBuf };\n","/**\n * A JavaScript implementation of the SHA family of hashes - defined in FIPS PUB 180-4, FIPS PUB 202,\n * and SP 800-185 - as well as the corresponding HMAC implementation as defined in FIPS PUB 198-1.\n *\n * Copyright 2008-2020 Brian Turek, 1998-2009 Paul Johnston & Contributors\n * Distributed under the BSD License\n * See http://caligatio.github.com/jsSHA/ for more information\n */\nconst t=\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\";function n(t,n,e,r){let i,s,o;const h=n||[0],u=(e=e||0)>>>3,w=-1===r?3:0;for(i=0;i>>2,h.length<=s&&h.push(0),h[s]|=t[i]<<8*(w+r*(o%4));return{value:h,binLen:8*t.length+e}}function e(e,r,i){switch(r){case\"UTF8\":case\"UTF16BE\":case\"UTF16LE\":break;default:throw new Error(\"encoding must be UTF8, UTF16BE, or UTF16LE\")}switch(e){case\"HEX\":return function(t,n,e){return function(t,n,e,r){let i,s,o,h;if(0!=t.length%2)throw new Error(\"String of HEX type must be in byte increments\");const u=n||[0],w=(e=e||0)>>>3,c=-1===r?3:0;for(i=0;i>>1)+w,o=h>>>2;u.length<=o;)u.push(0);u[o]|=s<<8*(c+r*(h%4))}return{value:u,binLen:4*t.length+e}}(t,n,e,i)};case\"TEXT\":return function(t,n,e){return function(t,n,e,r,i){let s,o,h,u,w,c,f,a,l=0;const A=e||[0],E=(r=r||0)>>>3;if(\"UTF8\"===n)for(f=-1===i?3:0,h=0;hs?o.push(s):2048>s?(o.push(192|s>>>6),o.push(128|63&s)):55296>s||57344<=s?o.push(224|s>>>12,128|s>>>6&63,128|63&s):(h+=1,s=65536+((1023&s)<<10|1023&t.charCodeAt(h)),o.push(240|s>>>18,128|s>>>12&63,128|s>>>6&63,128|63&s)),u=0;u>>2;A.length<=w;)A.push(0);A[w]|=o[u]<<8*(f+i*(c%4)),l+=1}else for(f=-1===i?2:0,a=\"UTF16LE\"===n&&1!==i||\"UTF16LE\"!==n&&1===i,h=0;h>>8),c=l+E,w=c>>>2;A.length<=w;)A.push(0);A[w]|=s<<8*(f+i*(c%4)),l+=2}return{value:A,binLen:8*l+r}}(t,r,n,e,i)};case\"B64\":return function(n,e,r){return function(n,e,r,i){let s,o,h,u,w,c,f,a=0;const l=e||[0],A=(r=r||0)>>>3,E=-1===i?3:0,H=n.indexOf(\"=\");if(-1===n.search(/^[a-zA-Z0-9=+/]+$/))throw new Error(\"Invalid character in base-64 string\");if(n=n.replace(/=/g,\"\"),-1!==H&&H {};\n\nexport { nodeRequire };\n","import jsSHA from 'jssha';\n\nimport { globalThis } from '../global-this';\nimport { isNode } from '../is-node';\nimport { nodeRequire } from '../node-require';\n\nconst NodeBuffer = isNode ? globalThis.Buffer : undefined;\nconst NodeCrypto = isNode ? nodeRequire('crypto') : undefined;\n\n/**\n * OpenSSL to jsSHA algorithms.\n * @type {Object.}\n */\nconst OPENSSL_TO_JSSHA_ALGO = {\n\t'SHA1': 'SHA-1',\n\t'SHA224': 'SHA-224',\n\t'SHA256': 'SHA-256',\n\t'SHA384': 'SHA-384',\n\t'SHA512': 'SHA-512',\n\t'SHA3-224': 'SHA3-224',\n\t'SHA3-256': 'SHA3-256',\n\t'SHA3-384': 'SHA3-384',\n\t'SHA3-512': 'SHA3-512',\n};\n\n/**\n * Calculates an HMAC digest.\n * In Node.js, the command \"openssl list -digest-algorithms\" displays the available digest algorithms.\n * @param {string} algorithm Algorithm.\n * @param {ArrayBuffer} key Key.\n * @param {ArrayBuffer} message Message.\n * @returns {ArrayBuffer} Digest.\n */\nconst hmacDigest = (algorithm, key, message) => {\n\tif (isNode) {\n\t\tconst hmac = NodeCrypto.createHmac(algorithm, NodeBuffer.from(key));\n\t\thmac.update(NodeBuffer.from(message));\n\t\treturn hmac.digest().buffer;\n\t} else {\n\t\tconst variant = OPENSSL_TO_JSSHA_ALGO[algorithm.toUpperCase()];\n\t\tif (typeof variant === 'undefined') {\n\t\t\tthrow new TypeError('Unknown hash function');\n\t\t}\n\t\t// @ts-ignore\n\t\t// eslint-disable-next-line @babel/new-cap\n\t\tconst hmac = new jsSHA(variant, 'ARRAYBUFFER');\n\t\thmac.setHMACKey(key, 'ARRAYBUFFER');\n\t\thmac.update(message);\n\t\treturn hmac.getHMAC('ARRAYBUFFER');\n\t}\n};\n\nexport { hmacDigest };\n","/**\n * Pads a number with leading zeros.\n * @param {number|string} num Number.\n * @param {number} digits Digits.\n * @returns {string} Padded number.\n */\nconst pad = (num, digits) => {\n\tlet prefix = '';\n\tlet repeat = digits - String(num).length;\n\twhile (repeat-- > 0) prefix += '0';\n\treturn `${prefix}${num}`;\n};\n\nexport { pad };\n","/**\n * RFC 4648 base32 alphabet without pad.\n * @type {string}\n */\nconst ALPHABET = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ234567';\n\n/**\n * Converts a base32 string to an ArrayBuffer (RFC 4648).\n * {@link https://github.com/LinusU/base32-decode|LinusU/base32-decode}\n * @param {string} str Base32 string.\n * @returns {ArrayBuffer} ArrayBuffer.\n */\nconst base32ToBuf = (str) => {\n\t// Canonicalize to all upper case and remove padding if it exists.\n\tconst cstr = str.toUpperCase().replace(/=+$/, '');\n\n\tconst buf = new ArrayBuffer((cstr.length * 5) / 8 | 0);\n\tconst arr = new Uint8Array(buf);\n\tlet bits = 0;\n\tlet value = 0;\n\tlet index = 0;\n\n\tfor (let i = 0; i < cstr.length; i++) {\n\t\tconst idx = ALPHABET.indexOf(cstr[i]);\n\t\tif (idx === -1) throw new TypeError(`Invalid character found: ${cstr[i]}`);\n\n\t\tvalue = (value << 5) | idx;\n\t\tbits += 5;\n\n\t\tif (bits >= 8) {\n\t\t\tarr[index++] = (value >>> bits - 8) & 255;\n\t\t\tbits -= 8;\n\t\t}\n\t}\n\n\treturn buf;\n};\n\n/**\n * Converts an ArrayBuffer to a base32 string (RFC 4648).\n * {@link https://github.com/LinusU/base32-encode|LinusU/base32-encode}\n * @param {ArrayBuffer} buf ArrayBuffer.\n * @returns {string} Base32 string.\n */\nconst base32FromBuf = (buf) => {\n\tconst arr = new Uint8Array(buf);\n\tlet bits = 0;\n\tlet value = 0;\n\tlet str = '';\n\n\tfor (let i = 0; i < arr.length; i++) {\n\t\tvalue = (value << 8) | arr[i];\n\t\tbits += 8;\n\n\t\twhile (bits >= 5) {\n\t\t\tstr += ALPHABET[(value >>> bits - 5) & 31];\n\t\t\tbits -= 5;\n\t\t}\n\t}\n\n\tif (bits > 0) {\n\t\tstr += ALPHABET[(value << 5 - bits) & 31];\n\t}\n\n\treturn str;\n};\n\nexport { base32ToBuf, base32FromBuf };\n","/**\n * Converts a hexadecimal string to an ArrayBuffer.\n * @param {string} str Hexadecimal string.\n * @returns {ArrayBuffer} ArrayBuffer.\n */\nconst hexToBuf = (str) => {\n\tconst buf = new ArrayBuffer(str.length / 2);\n\tconst arr = new Uint8Array(buf);\n\n\tfor (let i = 0; i < str.length; i += 2) {\n\t\tarr[i / 2] = parseInt(str.substr(i, 2), 16);\n\t}\n\n\treturn buf;\n};\n\n/**\n * Converts an ArrayBuffer to a hexadecimal string.\n * @param {ArrayBuffer} buf ArrayBuffer.\n * @returns {string} Hexadecimal string.\n */\nconst hexFromBuf = (buf) => {\n\tconst arr = new Uint8Array(buf);\n\tlet str = '';\n\n\tfor (let i = 0; i < arr.length; i++) {\n\t\tconst hex = arr[i].toString(16);\n\t\tif (hex.length === 1) str += '0';\n\t\tstr += hex;\n\t}\n\n\treturn str.toUpperCase();\n};\n\nexport { hexToBuf, hexFromBuf };\n","/**\n * Converts a Latin-1 string to an ArrayBuffer.\n * @param {string} str Latin-1 string.\n * @returns {ArrayBuffer} ArrayBuffer.\n */\nconst latin1ToBuf = (str) => {\n\tconst buf = new ArrayBuffer(str.length);\n\tconst arr = new Uint8Array(buf);\n\n\tfor (let i = 0; i < str.length; i++) {\n\t\tarr[i] = str.charCodeAt(i) & 0xFF;\n\t}\n\n\treturn buf;\n};\n\n/**\n * Converts an ArrayBuffer to a Latin-1 string.\n * @param {ArrayBuffer} buf ArrayBuffer.\n * @returns {string} Latin-1 string.\n */\nconst latin1FromBuf = (buf) => {\n\tconst arr = new Uint8Array(buf);\n\tlet str = '';\n\n\tfor (let i = 0; i < arr.length; i++) {\n\t\tstr += String.fromCharCode(arr[i]);\n\t}\n\n\treturn str;\n};\n\nexport { latin1ToBuf, latin1FromBuf };\n","import { globalThis } from '../global-this';\n\n/**\n * TextEncoder instance.\n * @type {TextEncoder|null}\n */\nconst ENCODER = globalThis.TextEncoder\n\t? new globalThis.TextEncoder('utf-8')\n\t: null;\n\n/**\n * TextDecoder instance.\n * @type {TextDecoder|null}\n */\nconst DECODER = globalThis.TextDecoder\n\t? new globalThis.TextDecoder('utf-8')\n\t: null;\n\n/**\n * Converts an UTF-8 string to an ArrayBuffer.\n * @param {string} str String.\n * @returns {ArrayBuffer} ArrayBuffer.\n */\nconst utf8ToBuf = (str) => {\n\tif (!ENCODER) {\n\t\tthrow new Error('Encoding API not available');\n\t}\n\n\treturn ENCODER.encode(str).buffer;\n};\n\n/**\n * Converts an ArrayBuffer to an UTF-8 string.\n * @param {ArrayBuffer} buf ArrayBuffer.\n * @returns {string} String.\n */\nconst utf8FromBuf = (buf) => {\n\tif (!DECODER) {\n\t\tthrow new Error('Encoding API not available');\n\t}\n\n\treturn DECODER.decode(buf);\n};\n\nexport { utf8ToBuf, utf8FromBuf };\n","import { globalThis } from '../global-this';\nimport { isNode } from '../is-node';\nimport { nodeRequire } from '../node-require';\n\nconst NodeCrypto = isNode ? nodeRequire('crypto') : undefined;\nconst BrowserCrypto = !isNode ? globalThis.crypto || globalThis.msCrypto : undefined;\n\n/**\n * Returns random bytes.\n * @param {number} size Size.\n * @returns {ArrayBuffer} Random bytes.\n */\nconst randomBytes = (size) => {\n\tif (isNode) {\n\t\treturn NodeCrypto.randomBytes(size).buffer;\n\t} else {\n\t\tif (!BrowserCrypto || !BrowserCrypto.getRandomValues) {\n\t\t\tthrow new Error('Cryptography API not available');\n\t\t}\n\t\treturn BrowserCrypto.getRandomValues(new Uint8Array(size)).buffer;\n\t}\n};\n\nexport { randomBytes };\n","import { base32ToBuf, base32FromBuf } from './utils/encoding/base32';\nimport { hexToBuf, hexFromBuf } from './utils/encoding/hex';\nimport { latin1ToBuf, latin1FromBuf } from './utils/encoding/latin1';\nimport { utf8ToBuf, utf8FromBuf } from './utils/encoding/utf8';\nimport { randomBytes } from './utils/crypto/random-bytes';\n\n/**\n * OTP secret key.\n */\nclass Secret {\n\t/**\n\t * Creates a secret key object.\n\t * @param {Object} [config] Configuration options.\n\t * @param {ArrayBuffer} [config.buffer=randomBytes] Secret key.\n\t * @param {number} [config.size=20] Number of random bytes to generate, ignored if 'buffer' is provided.\n\t */\n\tconstructor({ buffer, size = 20 } = {}) {\n\t\t/**\n\t\t * Secret key.\n\t\t * @type {ArrayBuffer}\n\t\t */\n\t\tthis.buffer = typeof buffer === 'undefined'\n\t\t\t? randomBytes(size)\n\t\t\t: buffer;\n\t}\n\n\t/**\n\t * Converts a Latin-1 string to a Secret object.\n\t * @param {string} str Latin-1 string.\n\t * @returns {Secret} Secret object.\n\t */\n\tstatic fromLatin1(str) {\n\t\treturn new Secret({ buffer: latin1ToBuf(str) });\n\t}\n\n\t/**\n\t * Converts an UTF-8 string to a Secret object.\n\t * @param {string} str UTF-8 string.\n\t * @returns {Secret} Secret object.\n\t */\n\tstatic fromUTF8(str) {\n\t\treturn new Secret({ buffer: utf8ToBuf(str) });\n\t}\n\n\t/**\n\t * Converts a base32 string to a Secret object.\n\t * @param {string} str Base32 string.\n\t * @returns {Secret} Secret object.\n\t */\n\tstatic fromBase32(str) {\n\t\treturn new Secret({ buffer: base32ToBuf(str) });\n\t}\n\n\t/**\n\t * Converts a hexadecimal string to a Secret object.\n\t * @param {string} str Hexadecimal string.\n\t * @returns {Secret} Secret object.\n\t */\n\tstatic fromHex(str) {\n\t\treturn new Secret({ buffer: hexToBuf(str) });\n\t}\n\n\t/**\n\t * Latin-1 string representation of secret key.\n\t * @type {string}\n\t */\n\tget latin1() {\n\t\tObject.defineProperty(this, 'latin1', {\n\t\t\tenumerable: true,\n\t\t\tvalue: latin1FromBuf(this.buffer),\n\t\t});\n\n\t\treturn this.latin1;\n\t}\n\n\t/**\n\t * UTF-8 string representation of secret key.\n\t * @type {string}\n\t */\n\tget utf8() {\n\t\tObject.defineProperty(this, 'utf8', {\n\t\t\tenumerable: true,\n\t\t\tvalue: utf8FromBuf(this.buffer),\n\t\t});\n\n\t\treturn this.utf8;\n\t}\n\n\t/**\n\t * Base32 string representation of secret key.\n\t * @type {string}\n\t */\n\tget base32() {\n\t\tObject.defineProperty(this, 'base32', {\n\t\t\tenumerable: true,\n\t\t\tvalue: base32FromBuf(this.buffer),\n\t\t});\n\n\t\treturn this.base32;\n\t}\n\n\t/**\n\t * Hexadecimal string representation of secret key.\n\t * @type {string}\n\t */\n\tget hex() {\n\t\tObject.defineProperty(this, 'hex', {\n\t\t\tenumerable: true,\n\t\t\tvalue: hexFromBuf(this.buffer),\n\t\t});\n\n\t\treturn this.hex;\n\t}\n}\n\nexport { Secret };\n","import { globalThis } from '../global-this';\nimport { isNode } from '../is-node';\nimport { nodeRequire } from '../node-require';\n\nconst NodeBuffer = isNode ? globalThis.Buffer : undefined;\nconst NodeCrypto = isNode ? nodeRequire('crypto') : undefined;\n\n/**\n * Returns true if a is equal to b, without leaking timing information that would allow an attacker to guess one of the values.\n * @param {string} a String a.\n * @param {string} b String b.\n * @returns {boolean} Equality result.\n */\nconst timingSafeEqual = (a, b) => {\n\tif (isNode) {\n\t\treturn NodeCrypto.timingSafeEqual(NodeBuffer.from(a), NodeBuffer.from(b));\n\t} else {\n\t\tif (a.length !== b.length) {\n\t\t\tthrow new TypeError('Input strings must have the same length');\n\t\t}\n\t\tlet i = -1;\n\t\tlet out = 0;\n\t\twhile (++i < a.length) {\n\t\t\tout |= a.charCodeAt(i) ^ b.charCodeAt(i);\n\t\t}\n\t\treturn out === 0;\n\t}\n};\n\nexport { timingSafeEqual };\n","import { uintToBuf } from './utils/encoding/uint';\nimport { hmacDigest } from './utils/crypto/hmac-digest';\nimport { pad } from './utils/pad';\nimport { Secret } from './secret';\nimport { timingSafeEqual } from './utils/crypto/timing-safe-equal';\n\n/**\n * HOTP: An HMAC-based One-time Password Algorithm.\n * {@link https://tools.ietf.org/html/rfc4226|RFC 4226}\n */\nclass HOTP {\n\t/**\n\t * Default configuration.\n\t * @type {{\n\t * issuer: string,\n\t * label: string,\n\t * algorithm: string,\n\t * digits: number,\n\t * counter: number\n\t * window: number\n\t * }}\n\t */\n\tstatic get defaults() {\n\t\treturn {\n\t\t\tissuer: '',\n\t\t\tlabel: 'OTPAuth',\n\t\t\talgorithm: 'SHA1',\n\t\t\tdigits: 6,\n\t\t\tcounter: 0,\n\t\t\twindow: 1,\n\t\t};\n\t}\n\n\t/**\n\t * Creates an HOTP object.\n\t * @param {Object} [config] Configuration options.\n\t * @param {string} [config.issuer=''] Account provider.\n\t * @param {string} [config.label='OTPAuth'] Account label.\n\t * @param {Secret|string} [config.secret=Secret] Secret key.\n\t * @param {string} [config.algorithm='SHA1'] HMAC hashing algorithm.\n\t * @param {number} [config.digits=6] Token length.\n\t * @param {number} [config.counter=0] Initial counter value.\n\t */\n\tconstructor({\n\t\tissuer = HOTP.defaults.issuer,\n\t\tlabel = HOTP.defaults.label,\n\t\tsecret = new Secret(),\n\t\talgorithm = HOTP.defaults.algorithm,\n\t\tdigits = HOTP.defaults.digits,\n\t\tcounter = HOTP.defaults.counter,\n\t} = {}) {\n\t\t/**\n\t\t * Account provider.\n\t\t * @type {string}\n\t\t */\n\t\tthis.issuer = issuer;\n\t\t/**\n\t\t * Account label.\n\t\t * @type {string}\n\t\t */\n\t\tthis.label = label;\n\t\t/**\n\t\t * Secret key.\n\t\t * @type {Secret}\n\t\t */\n\t\tthis.secret = typeof secret === 'string'\n\t\t\t? Secret.fromBase32(secret)\n\t\t\t: secret;\n\t\t/**\n\t\t * HMAC hashing algorithm.\n\t\t * @type {string}\n\t\t */\n\t\tthis.algorithm = algorithm.toUpperCase();\n\t\t/**\n\t\t * Token length.\n\t\t * @type {number}\n\t\t */\n\t\tthis.digits = digits;\n\t\t/**\n\t\t * Initial counter value.\n\t\t * @type {number}\n\t\t */\n\t\tthis.counter = counter;\n\t}\n\n\t/**\n\t * Generates an HOTP token.\n\t * @param {Object} config Configuration options.\n\t * @param {Secret} config.secret Secret key.\n\t * @param {string} [config.algorithm='SHA1'] HMAC hashing algorithm.\n\t * @param {number} [config.digits=6] Token length.\n\t * @param {number} [config.counter=0] Counter value.\n\t * @returns {string} Token.\n\t */\n\tstatic generate({\n\t\tsecret,\n\t\talgorithm = HOTP.defaults.algorithm,\n\t\tdigits = HOTP.defaults.digits,\n\t\tcounter = HOTP.defaults.counter,\n\t}) {\n\t\tconst digest = new Uint8Array(hmacDigest(algorithm, secret.buffer, uintToBuf(counter)));\n\t\tconst offset = digest[digest.byteLength - 1] & 15;\n\t\tconst otp = (\n\t\t\t((digest[offset] & 127) << 24)\n\t\t\t| ((digest[offset + 1] & 255) << 16)\n\t\t\t| ((digest[offset + 2] & 255) << 8)\n\t\t\t| (digest[offset + 3] & 255)\n\t\t) % (10 ** digits);\n\n\t\treturn pad(otp, digits);\n\t}\n\n\t/**\n\t * Generates an HOTP token.\n\t * @param {Object} [config] Configuration options.\n\t * @param {number} [config.counter=this.counter++] Counter value.\n\t * @returns {string} Token.\n\t */\n\tgenerate({\n\t\tcounter = this.counter++,\n\t} = {}) {\n\t\treturn HOTP.generate({\n\t\t\tsecret: this.secret,\n\t\t\talgorithm: this.algorithm,\n\t\t\tdigits: this.digits,\n\t\t\tcounter,\n\t\t});\n\t}\n\n\t/**\n\t * Validates an HOTP token.\n\t * @param {Object} config Configuration options.\n\t * @param {string} config.token Token value.\n\t * @param {Secret} config.secret Secret key.\n\t * @param {string} [config.algorithm='SHA1'] HMAC hashing algorithm.\n\t * @param {number} config.digits Token length.\n\t * @param {number} [config.counter=0] Counter value.\n\t * @param {number} [config.window=1] Window of counter values to test.\n\t * @returns {number|null} Token delta, or null if the token is not found.\n\t */\n\tstatic validate({\n\t\ttoken,\n\t\tsecret,\n\t\talgorithm,\n\t\tdigits,\n\t\tcounter = HOTP.defaults.counter,\n\t\twindow = HOTP.defaults.window,\n\t}) {\n\t\t// Return early if the token length does not match the digit number.\n\t\tif (token.length !== digits) return null;\n\n\t\tlet delta = null;\n\n\t\tfor (let i = counter - window; i <= counter + window; ++i) {\n\t\t\tconst generatedToken = HOTP.generate({\n\t\t\t\tsecret,\n\t\t\t\talgorithm,\n\t\t\t\tdigits,\n\t\t\t\tcounter: i,\n\t\t\t});\n\n\t\t\tif (timingSafeEqual(token, generatedToken)) {\n\t\t\t\tdelta = i - counter;\n\t\t\t}\n\t\t}\n\n\t\treturn delta;\n\t}\n\n\t/**\n\t * Validates an HOTP token.\n\t * @param {Object} config Configuration options.\n\t * @param {string} config.token Token value.\n\t * @param {number} [config.counter=this.counter] Counter value.\n\t * @param {number} [config.window=1] Window of counter values to test.\n\t * @returns {number|null} Token delta, or null if the token is not found.\n\t */\n\tvalidate({\n\t\ttoken,\n\t\tcounter = this.counter,\n\t\twindow,\n\t}) {\n\t\treturn HOTP.validate({\n\t\t\ttoken,\n\t\t\tsecret: this.secret,\n\t\t\talgorithm: this.algorithm,\n\t\t\tdigits: this.digits,\n\t\t\tcounter,\n\t\t\twindow,\n\t\t});\n\t}\n\n\t/**\n\t * Returns a Google Authenticator key URI.\n\t * @returns {string} URI.\n\t */\n\ttoString() {\n\t\tconst e = encodeURIComponent;\n\t\treturn 'otpauth://hotp/'\n\t\t\t+ `${this.issuer.length > 0\n\t\t\t\t? `${e(this.issuer)}:${e(this.label)}?issuer=${e(this.issuer)}&`\n\t\t\t\t: `${e(this.label)}?`}`\n\t\t\t+ `secret=${e(this.secret.base32)}&`\n\t\t\t+ `algorithm=${e(this.algorithm)}&`\n\t\t\t+ `digits=${e(this.digits)}&`\n\t\t\t+ `counter=${e(this.counter)}`;\n\t}\n}\n\nexport { HOTP };\n","import { HOTP } from './hotp';\nimport { Secret } from './secret';\n\n/**\n * TOTP: Time-Based One-Time Password Algorithm.\n * {@link https://tools.ietf.org/html/rfc6238|RFC 6238}\n */\nclass TOTP {\n\t/**\n\t * Default configuration.\n\t * @type {{\n\t * issuer: string,\n\t * label: string,\n\t * algorithm: string,\n\t * digits: number,\n\t * period: number\n\t * window: number\n\t * }}\n\t */\n\tstatic get defaults() {\n\t\treturn {\n\t\t\tissuer: '',\n\t\t\tlabel: 'OTPAuth',\n\t\t\talgorithm: 'SHA1',\n\t\t\tdigits: 6,\n\t\t\tperiod: 30,\n\t\t\twindow: 1,\n\t\t};\n\t}\n\n\t/**\n\t * Creates a TOTP object.\n\t * @param {Object} [config] Configuration options.\n\t * @param {string} [config.issuer=''] Account provider.\n\t * @param {string} [config.label='OTPAuth'] Account label.\n\t * @param {Secret|string} [config.secret=Secret] Secret key.\n\t * @param {string} [config.algorithm='SHA1'] HMAC hashing algorithm.\n\t * @param {number} [config.digits=6] Token length.\n\t * @param {number} [config.period=30] Token time-step duration.\n\t */\n\tconstructor({\n\t\tissuer = TOTP.defaults.issuer,\n\t\tlabel = TOTP.defaults.label,\n\t\tsecret = new Secret(),\n\t\talgorithm = TOTP.defaults.algorithm,\n\t\tdigits = TOTP.defaults.digits,\n\t\tperiod = TOTP.defaults.period,\n\t} = {}) {\n\t\t/**\n\t\t * Account provider.\n\t\t * @type {string}\n\t\t */\n\t\tthis.issuer = issuer;\n\t\t/**\n\t\t * Account label.\n\t\t * @type {string}\n\t\t */\n\t\tthis.label = label;\n\t\t/**\n\t\t * Secret key.\n\t\t * @type {Secret}\n\t\t */\n\t\tthis.secret = typeof secret === 'string'\n\t\t\t? Secret.fromBase32(secret)\n\t\t\t: secret;\n\t\t/**\n\t\t * HMAC hashing algorithm.\n\t\t * @type {string}\n\t\t */\n\t\tthis.algorithm = algorithm.toUpperCase();\n\t\t/**\n\t\t * Token length.\n\t\t * @type {number}\n\t\t */\n\t\tthis.digits = digits;\n\t\t/**\n\t\t * Token time-step duration.\n\t\t * @type {number}\n\t\t */\n\t\tthis.period = period;\n\t}\n\n\t/**\n\t * Generates a TOTP token.\n\t * @param {Object} config Configuration options.\n\t * @param {Secret} config.secret Secret key.\n\t * @param {string} [config.algorithm='SHA1'] HMAC hashing algorithm.\n\t * @param {number} [config.digits=6] Token length.\n\t * @param {number} [config.period=30] Token time-step duration.\n\t * @param {number} [config.timestamp=Date.now] Timestamp value in milliseconds.\n\t * @returns {string} Token.\n\t */\n\tstatic generate({\n\t\tsecret,\n\t\talgorithm,\n\t\tdigits,\n\t\tperiod = TOTP.defaults.period,\n\t\ttimestamp = Date.now(),\n\t}) {\n\t\treturn HOTP.generate({\n\t\t\tsecret,\n\t\t\talgorithm,\n\t\t\tdigits,\n\t\t\tcounter: Math.floor(timestamp / 1000 / period),\n\t\t});\n\t}\n\n\t/**\n\t * Generates a TOTP token.\n\t * @param {Object} [config] Configuration options.\n\t * @param {number} [config.timestamp=Date.now] Timestamp value in milliseconds.\n\t * @returns {string} Token.\n\t */\n\tgenerate({\n\t\ttimestamp = Date.now(),\n\t} = {}) {\n\t\treturn TOTP.generate({\n\t\t\tsecret: this.secret,\n\t\t\talgorithm: this.algorithm,\n\t\t\tdigits: this.digits,\n\t\t\tperiod: this.period,\n\t\t\ttimestamp,\n\t\t});\n\t}\n\n\t/**\n\t * Validates a TOTP token.\n\t * @param {Object} config Configuration options.\n\t * @param {string} config.token Token value.\n\t * @param {Secret} config.secret Secret key.\n\t * @param {string} [config.algorithm='SHA1'] HMAC hashing algorithm.\n\t * @param {number} config.digits Token length.\n\t * @param {number} [config.period=30] Token time-step duration.\n\t * @param {number} [config.timestamp=Date.now] Timestamp value in milliseconds.\n\t * @param {number} [config.window=1] Window of counter values to test.\n\t * @returns {number|null} Token delta, or null if the token is not found.\n\t */\n\tstatic validate({\n\t\ttoken,\n\t\tsecret,\n\t\talgorithm,\n\t\tdigits,\n\t\tperiod = TOTP.defaults.period,\n\t\ttimestamp = Date.now(),\n\t\twindow,\n\t}) {\n\t\treturn HOTP.validate({\n\t\t\ttoken,\n\t\t\tsecret,\n\t\t\talgorithm,\n\t\t\tdigits,\n\t\t\tcounter: Math.floor(timestamp / 1000 / period),\n\t\t\twindow,\n\t\t});\n\t}\n\n\t/**\n\t * Validates a TOTP token.\n\t * @param {Object} config Configuration options.\n\t * @param {string} config.token Token value.\n\t * @param {number} [config.timestamp=Date.now] Timestamp value in milliseconds.\n\t * @param {number} [config.window=1] Window of counter values to test.\n\t * @returns {number|null} Token delta, or null if the token is not found.\n\t */\n\tvalidate({\n\t\ttoken,\n\t\ttimestamp,\n\t\twindow,\n\t}) {\n\t\treturn TOTP.validate({\n\t\t\ttoken,\n\t\t\tsecret: this.secret,\n\t\t\talgorithm: this.algorithm,\n\t\t\tdigits: this.digits,\n\t\t\tperiod: this.period,\n\t\t\ttimestamp,\n\t\t\twindow,\n\t\t});\n\t}\n\n\t/**\n\t * Returns a Google Authenticator key URI.\n\t * @returns {string} URI.\n\t */\n\ttoString() {\n\t\tconst e = encodeURIComponent;\n\t\treturn 'otpauth://totp/'\n\t\t\t+ `${this.issuer.length > 0\n\t\t\t\t? `${e(this.issuer)}:${e(this.label)}?issuer=${e(this.issuer)}&`\n\t\t\t\t: `${e(this.label)}?`}`\n\t\t\t+ `secret=${e(this.secret.base32)}&`\n\t\t\t+ `algorithm=${e(this.algorithm)}&`\n\t\t\t+ `digits=${e(this.digits)}&`\n\t\t\t+ `period=${e(this.period)}`;\n\t}\n}\n\nexport { TOTP };\n","import { HOTP } from './hotp';\nimport { TOTP } from './totp';\n\n/**\n * Key URI regex (otpauth://TYPE/[ISSUER:]LABEL?PARAMETERS).\n * @type {RegExp}\n */\nconst OTPURI_REGEX = /^otpauth:\\/\\/([ht]otp)\\/(.+)\\?((?:&?[A-Z0-9.~_-]+=[^&]*)+)$/i;\n\n/**\n * RFC 4648 base32 alphabet with pad.\n * @type {RegExp}\n */\nconst SECRET_REGEX = /^[2-7A-Z]+=*$/i;\n\n/**\n * Regex for supported algorithms.\n * @type {RegExp}\n */\nconst ALGORITHM_REGEX = /^SHA(?:1|224|256|384|512|3-224|3-256|3-384|3-512)$/i;\n\n/**\n * Integer regex.\n * @type {RegExp}\n */\nconst INTEGER_REGEX = /^[+-]?\\d+$/;\n\n/**\n * Positive integer regex.\n * @type {RegExp}\n */\nconst POSITIVE_INTEGER_REGEX = /^\\+?[1-9]\\d*$/;\n\n/**\n * HOTP/TOTP object/string conversion.\n * {@link https://github.com/google/google-authenticator/wiki/Key-Uri-Format|Key URI Format}\n */\nclass URI {\n\t/**\n\t * Parses a Google Authenticator key URI and returns an HOTP/TOTP object.\n\t * @param {string} uri Google Authenticator Key URI.\n\t * @returns {HOTP|TOTP} HOTP/TOTP object.\n\t */\n\tstatic parse(uri) {\n\t\tlet uriGroups;\n\n\t\ttry {\n\t\t\turiGroups = uri.match(OTPURI_REGEX);\n\t\t} catch (error) { /* Handled below */ }\n\n\t\tif (!Array.isArray(uriGroups)) {\n\t\t\tthrow new URIError('Invalid URI format');\n\t\t}\n\n\t\t// Extract URI groups.\n\t\tconst uriType = uriGroups[1].toLowerCase();\n\t\tconst uriLabel = uriGroups[2].split(/:(.+)/, 2).map(decodeURIComponent);\n\t\t/** @type {Object.} */\n\t\tconst uriParams = uriGroups[3].split('&').reduce((acc, cur) => {\n\t\t\tconst pairArr = cur.split(/=(.*)/, 2).map(decodeURIComponent);\n\t\t\tconst pairKey = pairArr[0].toLowerCase();\n\t\t\tconst pairVal = pairArr[1];\n\t\t\t/** @type {Object.} */\n\t\t\tconst pairAcc = acc;\n\n\t\t\tpairAcc[pairKey] = pairVal;\n\t\t\treturn pairAcc;\n\t\t}, {});\n\n\t\t// 'OTP' will be instantiated with 'config' argument.\n\t\tlet OTP;\n\t\tconst config = {};\n\n\t\tif (uriType === 'hotp') {\n\t\t\tOTP = HOTP;\n\n\t\t\t// Counter: required\n\t\t\tif (typeof uriParams.counter !== 'undefined' && INTEGER_REGEX.test(uriParams.counter)) {\n\t\t\t\tconfig.counter = parseInt(uriParams.counter, 10);\n\t\t\t} else {\n\t\t\t\tthrow new TypeError('Missing or invalid \\'counter\\' parameter');\n\t\t\t}\n\t\t} else if (uriType === 'totp') {\n\t\t\tOTP = TOTP;\n\n\t\t\t// Period: optional\n\t\t\tif (typeof uriParams.period !== 'undefined') {\n\t\t\t\tif (POSITIVE_INTEGER_REGEX.test(uriParams.period)) {\n\t\t\t\t\tconfig.period = parseInt(uriParams.period, 10);\n\t\t\t\t} else {\n\t\t\t\t\tthrow new TypeError('Invalid \\'period\\' parameter');\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tthrow new TypeError('Unknown OTP type');\n\t\t}\n\n\t\t// Label: required\n\t\t// Issuer: optional\n\t\tif (uriLabel.length === 2) {\n\t\t\tconfig.label = uriLabel[1];\n\t\t\tif (typeof uriParams.issuer === 'undefined') {\n\t\t\t\tconfig.issuer = uriLabel[0];\n\t\t\t} else if (uriParams.issuer === uriLabel[0]) {\n\t\t\t\tconfig.issuer = uriParams.issuer;\n\t\t\t} else {\n\t\t\t\tthrow new TypeError('Invalid \\'issuer\\' parameter');\n\t\t\t}\n\t\t} else {\n\t\t\tconfig.label = uriLabel[0];\n\t\t\tif (typeof uriParams.issuer !== 'undefined') {\n\t\t\t\tconfig.issuer = uriParams.issuer;\n\t\t\t}\n\t\t}\n\n\t\t// Secret: required\n\t\tif (typeof uriParams.secret !== 'undefined' && SECRET_REGEX.test(uriParams.secret)) {\n\t\t\tconfig.secret = uriParams.secret;\n\t\t} else {\n\t\t\tthrow new TypeError('Missing or invalid \\'secret\\' parameter');\n\t\t}\n\n\t\t// Algorithm: optional\n\t\tif (typeof uriParams.algorithm !== 'undefined') {\n\t\t\tif (ALGORITHM_REGEX.test(uriParams.algorithm)) {\n\t\t\t\tconfig.algorithm = uriParams.algorithm;\n\t\t\t} else {\n\t\t\t\tthrow new TypeError('Invalid \\'algorithm\\' parameter');\n\t\t\t}\n\t\t}\n\n\t\t// Digits: optional\n\t\tif (typeof uriParams.digits !== 'undefined') {\n\t\t\tif (POSITIVE_INTEGER_REGEX.test(uriParams.digits)) {\n\t\t\t\tconfig.digits = parseInt(uriParams.digits, 10);\n\t\t\t} else {\n\t\t\t\tthrow new TypeError('Invalid \\'digits\\' parameter');\n\t\t\t}\n\t\t}\n\n\t\treturn new OTP(config);\n\t}\n\n\t/**\n\t * Converts an HOTP/TOTP object to a Google Authenticator key URI.\n\t * @param {HOTP|TOTP} otp HOTP/TOTP object.\n\t * @returns {string} Google Authenticator Key URI.\n\t */\n\tstatic stringify(otp) {\n\t\tif (otp instanceof HOTP || otp instanceof TOTP) {\n\t\t\treturn otp.toString();\n\t\t}\n\n\t\tthrow new TypeError('Invalid \\'HOTP/TOTP\\' object');\n\t}\n}\n\nexport { URI };\n","/**\n * Library version.\n * @type {string}\n */\nconst version = '__OTPAUTH_VERSION__';\n\nexport { version };\n"],"names":["uintToBuf","num","buf","ArrayBuffer","arr","Uint8Array","acc","i","b64Tab","uint8array2packed","existingPacked","existingPackedLen","bigEndianMod","intOffset","byteOffset","packed","existingByteLen","shiftModifier","length","push","value","binLen","getStrConverter","format","utfType","Error","str","existingBin","existingBinLen","parseInt","substr","isNaN","codePnt","codePntArr","j","transposeBytes","byteCnt","charCodeAt","tmpInt","strPart","firstEqual","indexOf","search","replace","charAt","ignore","getOutputConverter","outputBinLen","outputOptions","binarray","outputLength","formatOpts","srcByte","outputUpper","toUpperCase","triplet","int1","int2","b64Pad","String","fromCharCode","retVal","arrView","globalThis","_typeof","Object","defineProperty","prototype","get","this","configurable","__GLOBALTHIS__","self","window","global","isNode","toString","call","process","nodeRequire","eval","NodeBuffer","Buffer","undefined","NodeCrypto","OPENSSL_TO_JSSHA_ALGO","hmacDigest","algorithm","key","message","hmac","createHmac","from","update","digest","buffer","variant","TypeError","jsSHA","setHMACKey","getHMAC","pad","digits","prefix","repeat","ALPHABET","base32ToBuf","cstr","bits","index","idx","base32FromBuf","hexToBuf","hexFromBuf","hex","latin1ToBuf","latin1FromBuf","ENCODER","TextEncoder","DECODER","TextDecoder","utf8ToBuf","encode","utf8FromBuf","decode","BrowserCrypto","crypto","msCrypto","randomBytes","size","getRandomValues","Secret","enumerable","latin1","utf8","base32","timingSafeEqual","a","b","out","HOTP","issuer","defaults","label","secret","counter","fromBase32","generate","token","validate","e","encodeURIComponent","offset","byteLength","otp","delta","generatedToken","TOTP","period","timestamp","Date","now","Math","floor","OTPURI_REGEX","SECRET_REGEX","ALGORITHM_REGEX","INTEGER_REGEX","POSITIVE_INTEGER_REGEX","URI","uri","uriGroups","match","error","Array","isArray","URIError","OTP","uriType","toLowerCase","uriLabel","split","map","decodeURIComponent","uriParams","reduce","cur","pairArr","pairKey","pairVal","pairAcc","config","test","version"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"otpauth.cjs.min.js","sources":["../src/utils/encoding/uint.js","../node_modules/jssha/dist/sha.mjs","../src/utils/global-this.js","../src/utils/is-node.js","../src/utils/node-require.js","../src/utils/crypto/hmac-digest.js","../src/utils/pad.js","../src/utils/encoding/base32.js","../src/utils/encoding/hex.js","../src/utils/encoding/latin1.js","../src/utils/encoding/utf8.js","../src/utils/crypto/random-bytes.js","../src/secret.js","../src/utils/crypto/timing-safe-equal.js","../src/hotp.js","../src/totp.js","../src/uri.js","../src/version.js"],"sourcesContent":["/**\n * Converts an integer to an ArrayBuffer.\n * @param {number} num Integer.\n * @returns {ArrayBuffer} ArrayBuffer.\n */\nconst uintToBuf = (num) => {\n\tconst buf = new ArrayBuffer(8);\n\tconst arr = new Uint8Array(buf);\n\tlet acc = num;\n\n\tfor (let i = 7; i >= 0; i--) {\n\t\tif (acc === 0) break;\n\t\tarr[i] = acc & 255;\n\t\tacc -= arr[i];\n\t\tacc /= 256;\n\t}\n\n\treturn buf;\n};\n\n/**\n * Converts an ArrayBuffer to an integer.\n * @param {ArrayBuffer} buf ArrayBuffer.\n * @returns {number} Integer.\n */\nconst uintFromBuf = (buf) => {\n\tconst arr = new Uint8Array(buf);\n\tlet num = 0;\n\n\tfor (let i = 0; i < arr.length; i++) {\n\t\tif (arr[i] !== 0) {\n\t\t\tnum *= 256;\n\t\t\tnum += arr[i];\n\t\t}\n\t}\n\n\treturn num;\n};\n\nexport { uintToBuf, uintFromBuf };\n","/**\n * A JavaScript implementation of the SHA family of hashes - defined in FIPS PUB 180-4, FIPS PUB 202,\n * and SP 800-185 - as well as the corresponding HMAC implementation as defined in FIPS PUB 198-1.\n *\n * Copyright 2008-2020 Brian Turek, 1998-2009 Paul Johnston & Contributors\n * Distributed under the BSD License\n * See http://caligatio.github.com/jsSHA/ for more information\n */\nconst t=\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\";function n(t,n,e,r){let i,s,o;const h=n||[0],u=(e=e||0)>>>3,w=-1===r?3:0;for(i=0;i>>2,h.length<=s&&h.push(0),h[s]|=t[i]<<8*(w+r*(o%4));return{value:h,binLen:8*t.length+e}}function e(e,r,i){switch(r){case\"UTF8\":case\"UTF16BE\":case\"UTF16LE\":break;default:throw new Error(\"encoding must be UTF8, UTF16BE, or UTF16LE\")}switch(e){case\"HEX\":return function(t,n,e){return function(t,n,e,r){let i,s,o,h;if(0!=t.length%2)throw new Error(\"String of HEX type must be in byte increments\");const u=n||[0],w=(e=e||0)>>>3,c=-1===r?3:0;for(i=0;i>>1)+w,o=h>>>2;u.length<=o;)u.push(0);u[o]|=s<<8*(c+r*(h%4))}return{value:u,binLen:4*t.length+e}}(t,n,e,i)};case\"TEXT\":return function(t,n,e){return function(t,n,e,r,i){let s,o,h,u,w,c,f,a,l=0;const A=e||[0],E=(r=r||0)>>>3;if(\"UTF8\"===n)for(f=-1===i?3:0,h=0;hs?o.push(s):2048>s?(o.push(192|s>>>6),o.push(128|63&s)):55296>s||57344<=s?o.push(224|s>>>12,128|s>>>6&63,128|63&s):(h+=1,s=65536+((1023&s)<<10|1023&t.charCodeAt(h)),o.push(240|s>>>18,128|s>>>12&63,128|s>>>6&63,128|63&s)),u=0;u>>2;A.length<=w;)A.push(0);A[w]|=o[u]<<8*(f+i*(c%4)),l+=1}else for(f=-1===i?2:0,a=\"UTF16LE\"===n&&1!==i||\"UTF16LE\"!==n&&1===i,h=0;h>>8),c=l+E,w=c>>>2;A.length<=w;)A.push(0);A[w]|=s<<8*(f+i*(c%4)),l+=2}return{value:A,binLen:8*l+r}}(t,r,n,e,i)};case\"B64\":return function(n,e,r){return function(n,e,r,i){let s,o,h,u,w,c,f,a=0;const l=e||[0],A=(r=r||0)>>>3,E=-1===i?3:0,H=n.indexOf(\"=\");if(-1===n.search(/^[a-zA-Z0-9=+/]+$/))throw new Error(\"Invalid character in base-64 string\");if(n=n.replace(/=/g,\"\"),-1!==H&&H {};\n\nexport { nodeRequire };\n","import jsSHA from 'jssha';\n\nimport { globalThis } from '../global-this';\nimport { isNode } from '../is-node';\nimport { nodeRequire } from '../node-require';\n\nconst NodeBuffer = isNode ? globalThis.Buffer : undefined;\nconst NodeCrypto = isNode ? nodeRequire('crypto') : undefined;\n\n/**\n * OpenSSL to jsSHA algorithms.\n * @type {Object.}\n */\nconst OPENSSL_TO_JSSHA_ALGO = {\n\t'SHA1': 'SHA-1',\n\t'SHA224': 'SHA-224',\n\t'SHA256': 'SHA-256',\n\t'SHA384': 'SHA-384',\n\t'SHA512': 'SHA-512',\n\t'SHA3-224': 'SHA3-224',\n\t'SHA3-256': 'SHA3-256',\n\t'SHA3-384': 'SHA3-384',\n\t'SHA3-512': 'SHA3-512',\n};\n\n/**\n * Calculates an HMAC digest.\n * In Node.js, the command \"openssl list -digest-algorithms\" displays the available digest algorithms.\n * @param {string} algorithm Algorithm.\n * @param {ArrayBuffer} key Key.\n * @param {ArrayBuffer} message Message.\n * @returns {ArrayBuffer} Digest.\n */\nconst hmacDigest = (algorithm, key, message) => {\n\tif (isNode) {\n\t\tconst hmac = NodeCrypto.createHmac(algorithm, NodeBuffer.from(key));\n\t\thmac.update(NodeBuffer.from(message));\n\t\treturn hmac.digest().buffer;\n\t} else {\n\t\tconst variant = OPENSSL_TO_JSSHA_ALGO[algorithm.toUpperCase()];\n\t\tif (typeof variant === 'undefined') {\n\t\t\tthrow new TypeError('Unknown hash function');\n\t\t}\n\t\t// @ts-ignore\n\t\t// eslint-disable-next-line @babel/new-cap\n\t\tconst hmac = new jsSHA(variant, 'ARRAYBUFFER');\n\t\thmac.setHMACKey(key, 'ARRAYBUFFER');\n\t\thmac.update(message);\n\t\treturn hmac.getHMAC('ARRAYBUFFER');\n\t}\n};\n\nexport { hmacDigest };\n","/**\n * Pads a number with leading zeros.\n * @param {number|string} num Number.\n * @param {number} digits Digits.\n * @returns {string} Padded number.\n */\nconst pad = (num, digits) => {\n\tlet prefix = '';\n\tlet repeat = digits - String(num).length;\n\twhile (repeat-- > 0) prefix += '0';\n\treturn `${prefix}${num}`;\n};\n\nexport { pad };\n","/**\n * RFC 4648 base32 alphabet without pad.\n * @type {string}\n */\nconst ALPHABET = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ234567';\n\n/**\n * Converts a base32 string to an ArrayBuffer (RFC 4648).\n * {@link https://github.com/LinusU/base32-decode|LinusU/base32-decode}\n * @param {string} str Base32 string.\n * @returns {ArrayBuffer} ArrayBuffer.\n */\nconst base32ToBuf = (str) => {\n\t// Canonicalize to all upper case and remove padding if it exists.\n\tconst cstr = str.toUpperCase().replace(/=+$/, '');\n\n\tconst buf = new ArrayBuffer((cstr.length * 5) / 8 | 0);\n\tconst arr = new Uint8Array(buf);\n\tlet bits = 0;\n\tlet value = 0;\n\tlet index = 0;\n\n\tfor (let i = 0; i < cstr.length; i++) {\n\t\tconst idx = ALPHABET.indexOf(cstr[i]);\n\t\tif (idx === -1) throw new TypeError(`Invalid character found: ${cstr[i]}`);\n\n\t\tvalue = (value << 5) | idx;\n\t\tbits += 5;\n\n\t\tif (bits >= 8) {\n\t\t\tarr[index++] = (value >>> bits - 8) & 255;\n\t\t\tbits -= 8;\n\t\t}\n\t}\n\n\treturn buf;\n};\n\n/**\n * Converts an ArrayBuffer to a base32 string (RFC 4648).\n * {@link https://github.com/LinusU/base32-encode|LinusU/base32-encode}\n * @param {ArrayBuffer} buf ArrayBuffer.\n * @returns {string} Base32 string.\n */\nconst base32FromBuf = (buf) => {\n\tconst arr = new Uint8Array(buf);\n\tlet bits = 0;\n\tlet value = 0;\n\tlet str = '';\n\n\tfor (let i = 0; i < arr.length; i++) {\n\t\tvalue = (value << 8) | arr[i];\n\t\tbits += 8;\n\n\t\twhile (bits >= 5) {\n\t\t\tstr += ALPHABET[(value >>> bits - 5) & 31];\n\t\t\tbits -= 5;\n\t\t}\n\t}\n\n\tif (bits > 0) {\n\t\tstr += ALPHABET[(value << 5 - bits) & 31];\n\t}\n\n\treturn str;\n};\n\nexport { base32ToBuf, base32FromBuf };\n","/**\n * Converts a hexadecimal string to an ArrayBuffer.\n * @param {string} str Hexadecimal string.\n * @returns {ArrayBuffer} ArrayBuffer.\n */\nconst hexToBuf = (str) => {\n\tconst buf = new ArrayBuffer(str.length / 2);\n\tconst arr = new Uint8Array(buf);\n\n\tfor (let i = 0; i < str.length; i += 2) {\n\t\tarr[i / 2] = parseInt(str.substr(i, 2), 16);\n\t}\n\n\treturn buf;\n};\n\n/**\n * Converts an ArrayBuffer to a hexadecimal string.\n * @param {ArrayBuffer} buf ArrayBuffer.\n * @returns {string} Hexadecimal string.\n */\nconst hexFromBuf = (buf) => {\n\tconst arr = new Uint8Array(buf);\n\tlet str = '';\n\n\tfor (let i = 0; i < arr.length; i++) {\n\t\tconst hex = arr[i].toString(16);\n\t\tif (hex.length === 1) str += '0';\n\t\tstr += hex;\n\t}\n\n\treturn str.toUpperCase();\n};\n\nexport { hexToBuf, hexFromBuf };\n","/**\n * Converts a Latin-1 string to an ArrayBuffer.\n * @param {string} str Latin-1 string.\n * @returns {ArrayBuffer} ArrayBuffer.\n */\nconst latin1ToBuf = (str) => {\n\tconst buf = new ArrayBuffer(str.length);\n\tconst arr = new Uint8Array(buf);\n\n\tfor (let i = 0; i < str.length; i++) {\n\t\tarr[i] = str.charCodeAt(i) & 0xFF;\n\t}\n\n\treturn buf;\n};\n\n/**\n * Converts an ArrayBuffer to a Latin-1 string.\n * @param {ArrayBuffer} buf ArrayBuffer.\n * @returns {string} Latin-1 string.\n */\nconst latin1FromBuf = (buf) => {\n\tconst arr = new Uint8Array(buf);\n\tlet str = '';\n\n\tfor (let i = 0; i < arr.length; i++) {\n\t\tstr += String.fromCharCode(arr[i]);\n\t}\n\n\treturn str;\n};\n\nexport { latin1ToBuf, latin1FromBuf };\n","import { globalThis } from '../global-this';\n\n/**\n * TextEncoder instance.\n * @type {TextEncoder|null}\n */\nconst ENCODER = globalThis.TextEncoder\n\t? new globalThis.TextEncoder('utf-8')\n\t: null;\n\n/**\n * TextDecoder instance.\n * @type {TextDecoder|null}\n */\nconst DECODER = globalThis.TextDecoder\n\t? new globalThis.TextDecoder('utf-8')\n\t: null;\n\n/**\n * Converts an UTF-8 string to an ArrayBuffer.\n * @param {string} str String.\n * @returns {ArrayBuffer} ArrayBuffer.\n */\nconst utf8ToBuf = (str) => {\n\tif (!ENCODER) {\n\t\tthrow new Error('Encoding API not available');\n\t}\n\n\treturn ENCODER.encode(str).buffer;\n};\n\n/**\n * Converts an ArrayBuffer to an UTF-8 string.\n * @param {ArrayBuffer} buf ArrayBuffer.\n * @returns {string} String.\n */\nconst utf8FromBuf = (buf) => {\n\tif (!DECODER) {\n\t\tthrow new Error('Encoding API not available');\n\t}\n\n\treturn DECODER.decode(buf);\n};\n\nexport { utf8ToBuf, utf8FromBuf };\n","import { globalThis } from '../global-this';\nimport { isNode } from '../is-node';\nimport { nodeRequire } from '../node-require';\n\nconst NodeCrypto = isNode ? nodeRequire('crypto') : undefined;\nconst BrowserCrypto = !isNode ? globalThis.crypto || globalThis.msCrypto : undefined;\n\n/**\n * Returns random bytes.\n * @param {number} size Size.\n * @returns {ArrayBuffer} Random bytes.\n */\nconst randomBytes = (size) => {\n\tif (isNode) {\n\t\treturn NodeCrypto.randomBytes(size).buffer;\n\t} else {\n\t\tif (!BrowserCrypto || !BrowserCrypto.getRandomValues) {\n\t\t\tthrow new Error('Cryptography API not available');\n\t\t}\n\t\treturn BrowserCrypto.getRandomValues(new Uint8Array(size)).buffer;\n\t}\n};\n\nexport { randomBytes };\n","import { base32ToBuf, base32FromBuf } from './utils/encoding/base32';\nimport { hexToBuf, hexFromBuf } from './utils/encoding/hex';\nimport { latin1ToBuf, latin1FromBuf } from './utils/encoding/latin1';\nimport { utf8ToBuf, utf8FromBuf } from './utils/encoding/utf8';\nimport { randomBytes } from './utils/crypto/random-bytes';\n\n/**\n * OTP secret key.\n */\nclass Secret {\n\t/**\n\t * Creates a secret key object.\n\t * @param {Object} [config] Configuration options.\n\t * @param {ArrayBuffer} [config.buffer=randomBytes] Secret key.\n\t * @param {number} [config.size=20] Number of random bytes to generate, ignored if 'buffer' is provided.\n\t */\n\tconstructor({ buffer, size = 20 } = {}) {\n\t\t/**\n\t\t * Secret key.\n\t\t * @type {ArrayBuffer}\n\t\t */\n\t\tthis.buffer = typeof buffer === 'undefined'\n\t\t\t? randomBytes(size)\n\t\t\t: buffer;\n\t}\n\n\t/**\n\t * Converts a Latin-1 string to a Secret object.\n\t * @param {string} str Latin-1 string.\n\t * @returns {Secret} Secret object.\n\t */\n\tstatic fromLatin1(str) {\n\t\treturn new Secret({ buffer: latin1ToBuf(str) });\n\t}\n\n\t/**\n\t * Converts an UTF-8 string to a Secret object.\n\t * @param {string} str UTF-8 string.\n\t * @returns {Secret} Secret object.\n\t */\n\tstatic fromUTF8(str) {\n\t\treturn new Secret({ buffer: utf8ToBuf(str) });\n\t}\n\n\t/**\n\t * Converts a base32 string to a Secret object.\n\t * @param {string} str Base32 string.\n\t * @returns {Secret} Secret object.\n\t */\n\tstatic fromBase32(str) {\n\t\treturn new Secret({ buffer: base32ToBuf(str) });\n\t}\n\n\t/**\n\t * Converts a hexadecimal string to a Secret object.\n\t * @param {string} str Hexadecimal string.\n\t * @returns {Secret} Secret object.\n\t */\n\tstatic fromHex(str) {\n\t\treturn new Secret({ buffer: hexToBuf(str) });\n\t}\n\n\t/**\n\t * Latin-1 string representation of secret key.\n\t * @type {string}\n\t */\n\tget latin1() {\n\t\tObject.defineProperty(this, 'latin1', {\n\t\t\tenumerable: true,\n\t\t\tvalue: latin1FromBuf(this.buffer),\n\t\t});\n\n\t\treturn this.latin1;\n\t}\n\n\t/**\n\t * UTF-8 string representation of secret key.\n\t * @type {string}\n\t */\n\tget utf8() {\n\t\tObject.defineProperty(this, 'utf8', {\n\t\t\tenumerable: true,\n\t\t\tvalue: utf8FromBuf(this.buffer),\n\t\t});\n\n\t\treturn this.utf8;\n\t}\n\n\t/**\n\t * Base32 string representation of secret key.\n\t * @type {string}\n\t */\n\tget base32() {\n\t\tObject.defineProperty(this, 'base32', {\n\t\t\tenumerable: true,\n\t\t\tvalue: base32FromBuf(this.buffer),\n\t\t});\n\n\t\treturn this.base32;\n\t}\n\n\t/**\n\t * Hexadecimal string representation of secret key.\n\t * @type {string}\n\t */\n\tget hex() {\n\t\tObject.defineProperty(this, 'hex', {\n\t\t\tenumerable: true,\n\t\t\tvalue: hexFromBuf(this.buffer),\n\t\t});\n\n\t\treturn this.hex;\n\t}\n}\n\nexport { Secret };\n","import { globalThis } from '../global-this';\nimport { isNode } from '../is-node';\nimport { nodeRequire } from '../node-require';\n\nconst NodeBuffer = isNode ? globalThis.Buffer : undefined;\nconst NodeCrypto = isNode ? nodeRequire('crypto') : undefined;\n\n/**\n * Returns true if a is equal to b, without leaking timing information that would allow an attacker to guess one of the values.\n * @param {string} a String a.\n * @param {string} b String b.\n * @returns {boolean} Equality result.\n */\nconst timingSafeEqual = (a, b) => {\n\tif (isNode) {\n\t\treturn NodeCrypto.timingSafeEqual(NodeBuffer.from(a), NodeBuffer.from(b));\n\t} else {\n\t\tif (a.length !== b.length) {\n\t\t\tthrow new TypeError('Input strings must have the same length');\n\t\t}\n\t\tlet i = -1;\n\t\tlet out = 0;\n\t\twhile (++i < a.length) {\n\t\t\tout |= a.charCodeAt(i) ^ b.charCodeAt(i);\n\t\t}\n\t\treturn out === 0;\n\t}\n};\n\nexport { timingSafeEqual };\n","import { uintToBuf } from './utils/encoding/uint';\nimport { hmacDigest } from './utils/crypto/hmac-digest';\nimport { pad } from './utils/pad';\nimport { Secret } from './secret';\nimport { timingSafeEqual } from './utils/crypto/timing-safe-equal';\n\n/**\n * HOTP: An HMAC-based One-time Password Algorithm.\n * {@link https://tools.ietf.org/html/rfc4226|RFC 4226}\n */\nclass HOTP {\n\t/**\n\t * Default configuration.\n\t * @type {{\n\t * issuer: string,\n\t * label: string,\n\t * algorithm: string,\n\t * digits: number,\n\t * counter: number\n\t * window: number\n\t * }}\n\t */\n\tstatic get defaults() {\n\t\treturn {\n\t\t\tissuer: '',\n\t\t\tlabel: 'OTPAuth',\n\t\t\talgorithm: 'SHA1',\n\t\t\tdigits: 6,\n\t\t\tcounter: 0,\n\t\t\twindow: 1,\n\t\t};\n\t}\n\n\t/**\n\t * Creates an HOTP object.\n\t * @param {Object} [config] Configuration options.\n\t * @param {string} [config.issuer=''] Account provider.\n\t * @param {string} [config.label='OTPAuth'] Account label.\n\t * @param {Secret|string} [config.secret=Secret] Secret key.\n\t * @param {string} [config.algorithm='SHA1'] HMAC hashing algorithm.\n\t * @param {number} [config.digits=6] Token length.\n\t * @param {number} [config.counter=0] Initial counter value.\n\t */\n\tconstructor({\n\t\tissuer = HOTP.defaults.issuer,\n\t\tlabel = HOTP.defaults.label,\n\t\tsecret = new Secret(),\n\t\talgorithm = HOTP.defaults.algorithm,\n\t\tdigits = HOTP.defaults.digits,\n\t\tcounter = HOTP.defaults.counter,\n\t} = {}) {\n\t\t/**\n\t\t * Account provider.\n\t\t * @type {string}\n\t\t */\n\t\tthis.issuer = issuer;\n\t\t/**\n\t\t * Account label.\n\t\t * @type {string}\n\t\t */\n\t\tthis.label = label;\n\t\t/**\n\t\t * Secret key.\n\t\t * @type {Secret}\n\t\t */\n\t\tthis.secret = typeof secret === 'string'\n\t\t\t? Secret.fromBase32(secret)\n\t\t\t: secret;\n\t\t/**\n\t\t * HMAC hashing algorithm.\n\t\t * @type {string}\n\t\t */\n\t\tthis.algorithm = algorithm.toUpperCase();\n\t\t/**\n\t\t * Token length.\n\t\t * @type {number}\n\t\t */\n\t\tthis.digits = digits;\n\t\t/**\n\t\t * Initial counter value.\n\t\t * @type {number}\n\t\t */\n\t\tthis.counter = counter;\n\t}\n\n\t/**\n\t * Generates an HOTP token.\n\t * @param {Object} config Configuration options.\n\t * @param {Secret} config.secret Secret key.\n\t * @param {string} [config.algorithm='SHA1'] HMAC hashing algorithm.\n\t * @param {number} [config.digits=6] Token length.\n\t * @param {number} [config.counter=0] Counter value.\n\t * @returns {string} Token.\n\t */\n\tstatic generate({\n\t\tsecret,\n\t\talgorithm = HOTP.defaults.algorithm,\n\t\tdigits = HOTP.defaults.digits,\n\t\tcounter = HOTP.defaults.counter,\n\t}) {\n\t\tconst digest = new Uint8Array(hmacDigest(algorithm, secret.buffer, uintToBuf(counter)));\n\t\tconst offset = digest[digest.byteLength - 1] & 15;\n\t\tconst otp = (\n\t\t\t((digest[offset] & 127) << 24)\n\t\t\t| ((digest[offset + 1] & 255) << 16)\n\t\t\t| ((digest[offset + 2] & 255) << 8)\n\t\t\t| (digest[offset + 3] & 255)\n\t\t) % (10 ** digits);\n\n\t\treturn pad(otp, digits);\n\t}\n\n\t/**\n\t * Generates an HOTP token.\n\t * @param {Object} [config] Configuration options.\n\t * @param {number} [config.counter=this.counter++] Counter value.\n\t * @returns {string} Token.\n\t */\n\tgenerate({\n\t\tcounter = this.counter++,\n\t} = {}) {\n\t\treturn HOTP.generate({\n\t\t\tsecret: this.secret,\n\t\t\talgorithm: this.algorithm,\n\t\t\tdigits: this.digits,\n\t\t\tcounter,\n\t\t});\n\t}\n\n\t/**\n\t * Validates an HOTP token.\n\t * @param {Object} config Configuration options.\n\t * @param {string} config.token Token value.\n\t * @param {Secret} config.secret Secret key.\n\t * @param {string} [config.algorithm='SHA1'] HMAC hashing algorithm.\n\t * @param {number} config.digits Token length.\n\t * @param {number} [config.counter=0] Counter value.\n\t * @param {number} [config.window=1] Window of counter values to test.\n\t * @returns {number|null} Token delta, or null if the token is not found.\n\t */\n\tstatic validate({\n\t\ttoken,\n\t\tsecret,\n\t\talgorithm,\n\t\tdigits,\n\t\tcounter = HOTP.defaults.counter,\n\t\twindow = HOTP.defaults.window,\n\t}) {\n\t\t// Return early if the token length does not match the digit number.\n\t\tif (token.length !== digits) return null;\n\n\t\tlet delta = null;\n\n\t\tfor (let i = counter - window; i <= counter + window; ++i) {\n\t\t\tconst generatedToken = HOTP.generate({\n\t\t\t\tsecret,\n\t\t\t\talgorithm,\n\t\t\t\tdigits,\n\t\t\t\tcounter: i,\n\t\t\t});\n\n\t\t\tif (timingSafeEqual(token, generatedToken)) {\n\t\t\t\tdelta = i - counter;\n\t\t\t}\n\t\t}\n\n\t\treturn delta;\n\t}\n\n\t/**\n\t * Validates an HOTP token.\n\t * @param {Object} config Configuration options.\n\t * @param {string} config.token Token value.\n\t * @param {number} [config.counter=this.counter] Counter value.\n\t * @param {number} [config.window=1] Window of counter values to test.\n\t * @returns {number|null} Token delta, or null if the token is not found.\n\t */\n\tvalidate({\n\t\ttoken,\n\t\tcounter = this.counter,\n\t\twindow,\n\t}) {\n\t\treturn HOTP.validate({\n\t\t\ttoken,\n\t\t\tsecret: this.secret,\n\t\t\talgorithm: this.algorithm,\n\t\t\tdigits: this.digits,\n\t\t\tcounter,\n\t\t\twindow,\n\t\t});\n\t}\n\n\t/**\n\t * Returns a Google Authenticator key URI.\n\t * @returns {string} URI.\n\t */\n\ttoString() {\n\t\tconst e = encodeURIComponent;\n\t\treturn 'otpauth://hotp/'\n\t\t\t+ `${this.issuer.length > 0\n\t\t\t\t? `${e(this.issuer)}:${e(this.label)}?issuer=${e(this.issuer)}&`\n\t\t\t\t: `${e(this.label)}?`}`\n\t\t\t+ `secret=${e(this.secret.base32)}&`\n\t\t\t+ `algorithm=${e(this.algorithm)}&`\n\t\t\t+ `digits=${e(this.digits)}&`\n\t\t\t+ `counter=${e(this.counter)}`;\n\t}\n}\n\nexport { HOTP };\n","import { HOTP } from './hotp';\nimport { Secret } from './secret';\n\n/**\n * TOTP: Time-Based One-Time Password Algorithm.\n * {@link https://tools.ietf.org/html/rfc6238|RFC 6238}\n */\nclass TOTP {\n\t/**\n\t * Default configuration.\n\t * @type {{\n\t * issuer: string,\n\t * label: string,\n\t * algorithm: string,\n\t * digits: number,\n\t * period: number\n\t * window: number\n\t * }}\n\t */\n\tstatic get defaults() {\n\t\treturn {\n\t\t\tissuer: '',\n\t\t\tlabel: 'OTPAuth',\n\t\t\talgorithm: 'SHA1',\n\t\t\tdigits: 6,\n\t\t\tperiod: 30,\n\t\t\twindow: 1,\n\t\t};\n\t}\n\n\t/**\n\t * Creates a TOTP object.\n\t * @param {Object} [config] Configuration options.\n\t * @param {string} [config.issuer=''] Account provider.\n\t * @param {string} [config.label='OTPAuth'] Account label.\n\t * @param {Secret|string} [config.secret=Secret] Secret key.\n\t * @param {string} [config.algorithm='SHA1'] HMAC hashing algorithm.\n\t * @param {number} [config.digits=6] Token length.\n\t * @param {number} [config.period=30] Token time-step duration.\n\t */\n\tconstructor({\n\t\tissuer = TOTP.defaults.issuer,\n\t\tlabel = TOTP.defaults.label,\n\t\tsecret = new Secret(),\n\t\talgorithm = TOTP.defaults.algorithm,\n\t\tdigits = TOTP.defaults.digits,\n\t\tperiod = TOTP.defaults.period,\n\t} = {}) {\n\t\t/**\n\t\t * Account provider.\n\t\t * @type {string}\n\t\t */\n\t\tthis.issuer = issuer;\n\t\t/**\n\t\t * Account label.\n\t\t * @type {string}\n\t\t */\n\t\tthis.label = label;\n\t\t/**\n\t\t * Secret key.\n\t\t * @type {Secret}\n\t\t */\n\t\tthis.secret = typeof secret === 'string'\n\t\t\t? Secret.fromBase32(secret)\n\t\t\t: secret;\n\t\t/**\n\t\t * HMAC hashing algorithm.\n\t\t * @type {string}\n\t\t */\n\t\tthis.algorithm = algorithm.toUpperCase();\n\t\t/**\n\t\t * Token length.\n\t\t * @type {number}\n\t\t */\n\t\tthis.digits = digits;\n\t\t/**\n\t\t * Token time-step duration.\n\t\t * @type {number}\n\t\t */\n\t\tthis.period = period;\n\t}\n\n\t/**\n\t * Generates a TOTP token.\n\t * @param {Object} config Configuration options.\n\t * @param {Secret} config.secret Secret key.\n\t * @param {string} [config.algorithm='SHA1'] HMAC hashing algorithm.\n\t * @param {number} [config.digits=6] Token length.\n\t * @param {number} [config.period=30] Token time-step duration.\n\t * @param {number} [config.timestamp=Date.now] Timestamp value in milliseconds.\n\t * @returns {string} Token.\n\t */\n\tstatic generate({\n\t\tsecret,\n\t\talgorithm,\n\t\tdigits,\n\t\tperiod = TOTP.defaults.period,\n\t\ttimestamp = Date.now(),\n\t}) {\n\t\treturn HOTP.generate({\n\t\t\tsecret,\n\t\t\talgorithm,\n\t\t\tdigits,\n\t\t\tcounter: Math.floor(timestamp / 1000 / period),\n\t\t});\n\t}\n\n\t/**\n\t * Generates a TOTP token.\n\t * @param {Object} [config] Configuration options.\n\t * @param {number} [config.timestamp=Date.now] Timestamp value in milliseconds.\n\t * @returns {string} Token.\n\t */\n\tgenerate({\n\t\ttimestamp = Date.now(),\n\t} = {}) {\n\t\treturn TOTP.generate({\n\t\t\tsecret: this.secret,\n\t\t\talgorithm: this.algorithm,\n\t\t\tdigits: this.digits,\n\t\t\tperiod: this.period,\n\t\t\ttimestamp,\n\t\t});\n\t}\n\n\t/**\n\t * Validates a TOTP token.\n\t * @param {Object} config Configuration options.\n\t * @param {string} config.token Token value.\n\t * @param {Secret} config.secret Secret key.\n\t * @param {string} [config.algorithm='SHA1'] HMAC hashing algorithm.\n\t * @param {number} config.digits Token length.\n\t * @param {number} [config.period=30] Token time-step duration.\n\t * @param {number} [config.timestamp=Date.now] Timestamp value in milliseconds.\n\t * @param {number} [config.window=1] Window of counter values to test.\n\t * @returns {number|null} Token delta, or null if the token is not found.\n\t */\n\tstatic validate({\n\t\ttoken,\n\t\tsecret,\n\t\talgorithm,\n\t\tdigits,\n\t\tperiod = TOTP.defaults.period,\n\t\ttimestamp = Date.now(),\n\t\twindow,\n\t}) {\n\t\treturn HOTP.validate({\n\t\t\ttoken,\n\t\t\tsecret,\n\t\t\talgorithm,\n\t\t\tdigits,\n\t\t\tcounter: Math.floor(timestamp / 1000 / period),\n\t\t\twindow,\n\t\t});\n\t}\n\n\t/**\n\t * Validates a TOTP token.\n\t * @param {Object} config Configuration options.\n\t * @param {string} config.token Token value.\n\t * @param {number} [config.timestamp=Date.now] Timestamp value in milliseconds.\n\t * @param {number} [config.window=1] Window of counter values to test.\n\t * @returns {number|null} Token delta, or null if the token is not found.\n\t */\n\tvalidate({\n\t\ttoken,\n\t\ttimestamp,\n\t\twindow,\n\t}) {\n\t\treturn TOTP.validate({\n\t\t\ttoken,\n\t\t\tsecret: this.secret,\n\t\t\talgorithm: this.algorithm,\n\t\t\tdigits: this.digits,\n\t\t\tperiod: this.period,\n\t\t\ttimestamp,\n\t\t\twindow,\n\t\t});\n\t}\n\n\t/**\n\t * Returns a Google Authenticator key URI.\n\t * @returns {string} URI.\n\t */\n\ttoString() {\n\t\tconst e = encodeURIComponent;\n\t\treturn 'otpauth://totp/'\n\t\t\t+ `${this.issuer.length > 0\n\t\t\t\t? `${e(this.issuer)}:${e(this.label)}?issuer=${e(this.issuer)}&`\n\t\t\t\t: `${e(this.label)}?`}`\n\t\t\t+ `secret=${e(this.secret.base32)}&`\n\t\t\t+ `algorithm=${e(this.algorithm)}&`\n\t\t\t+ `digits=${e(this.digits)}&`\n\t\t\t+ `period=${e(this.period)}`;\n\t}\n}\n\nexport { TOTP };\n","import { HOTP } from './hotp';\nimport { TOTP } from './totp';\n\n/**\n * Key URI regex (otpauth://TYPE/[ISSUER:]LABEL?PARAMETERS).\n * @type {RegExp}\n */\nconst OTPURI_REGEX = /^otpauth:\\/\\/([ht]otp)\\/(.+)\\?((?:&?[A-Z0-9.~_-]+=[^&]*)+)$/i;\n\n/**\n * RFC 4648 base32 alphabet with pad.\n * @type {RegExp}\n */\nconst SECRET_REGEX = /^[2-7A-Z]+=*$/i;\n\n/**\n * Regex for supported algorithms.\n * @type {RegExp}\n */\nconst ALGORITHM_REGEX = /^SHA(?:1|224|256|384|512|3-224|3-256|3-384|3-512)$/i;\n\n/**\n * Integer regex.\n * @type {RegExp}\n */\nconst INTEGER_REGEX = /^[+-]?\\d+$/;\n\n/**\n * Positive integer regex.\n * @type {RegExp}\n */\nconst POSITIVE_INTEGER_REGEX = /^\\+?[1-9]\\d*$/;\n\n/**\n * HOTP/TOTP object/string conversion.\n * {@link https://github.com/google/google-authenticator/wiki/Key-Uri-Format|Key URI Format}\n */\nclass URI {\n\t/**\n\t * Parses a Google Authenticator key URI and returns an HOTP/TOTP object.\n\t * @param {string} uri Google Authenticator Key URI.\n\t * @returns {HOTP|TOTP} HOTP/TOTP object.\n\t */\n\tstatic parse(uri) {\n\t\tlet uriGroups;\n\n\t\ttry {\n\t\t\turiGroups = uri.match(OTPURI_REGEX);\n\t\t} catch (error) { /* Handled below */ }\n\n\t\tif (!Array.isArray(uriGroups)) {\n\t\t\tthrow new URIError('Invalid URI format');\n\t\t}\n\n\t\t// Extract URI groups.\n\t\tconst uriType = uriGroups[1].toLowerCase();\n\t\tconst uriLabel = uriGroups[2].split(/:(.+)/, 2).map(decodeURIComponent);\n\t\t/** @type {Object.} */\n\t\tconst uriParams = uriGroups[3].split('&').reduce((acc, cur) => {\n\t\t\tconst pairArr = cur.split(/=(.*)/, 2).map(decodeURIComponent);\n\t\t\tconst pairKey = pairArr[0].toLowerCase();\n\t\t\tconst pairVal = pairArr[1];\n\t\t\t/** @type {Object.} */\n\t\t\tconst pairAcc = acc;\n\n\t\t\tpairAcc[pairKey] = pairVal;\n\t\t\treturn pairAcc;\n\t\t}, {});\n\n\t\t// 'OTP' will be instantiated with 'config' argument.\n\t\tlet OTP;\n\t\tconst config = {};\n\n\t\tif (uriType === 'hotp') {\n\t\t\tOTP = HOTP;\n\n\t\t\t// Counter: required\n\t\t\tif (typeof uriParams.counter !== 'undefined' && INTEGER_REGEX.test(uriParams.counter)) {\n\t\t\t\tconfig.counter = parseInt(uriParams.counter, 10);\n\t\t\t} else {\n\t\t\t\tthrow new TypeError('Missing or invalid \\'counter\\' parameter');\n\t\t\t}\n\t\t} else if (uriType === 'totp') {\n\t\t\tOTP = TOTP;\n\n\t\t\t// Period: optional\n\t\t\tif (typeof uriParams.period !== 'undefined') {\n\t\t\t\tif (POSITIVE_INTEGER_REGEX.test(uriParams.period)) {\n\t\t\t\t\tconfig.period = parseInt(uriParams.period, 10);\n\t\t\t\t} else {\n\t\t\t\t\tthrow new TypeError('Invalid \\'period\\' parameter');\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tthrow new TypeError('Unknown OTP type');\n\t\t}\n\n\t\t// Label: required\n\t\t// Issuer: optional\n\t\tif (uriLabel.length === 2) {\n\t\t\tconfig.label = uriLabel[1];\n\t\t\tif (typeof uriParams.issuer === 'undefined') {\n\t\t\t\tconfig.issuer = uriLabel[0];\n\t\t\t} else if (uriParams.issuer === uriLabel[0]) {\n\t\t\t\tconfig.issuer = uriParams.issuer;\n\t\t\t} else {\n\t\t\t\tthrow new TypeError('Invalid \\'issuer\\' parameter');\n\t\t\t}\n\t\t} else {\n\t\t\tconfig.label = uriLabel[0];\n\t\t\tif (typeof uriParams.issuer !== 'undefined') {\n\t\t\t\tconfig.issuer = uriParams.issuer;\n\t\t\t}\n\t\t}\n\n\t\t// Secret: required\n\t\tif (typeof uriParams.secret !== 'undefined' && SECRET_REGEX.test(uriParams.secret)) {\n\t\t\tconfig.secret = uriParams.secret;\n\t\t} else {\n\t\t\tthrow new TypeError('Missing or invalid \\'secret\\' parameter');\n\t\t}\n\n\t\t// Algorithm: optional\n\t\tif (typeof uriParams.algorithm !== 'undefined') {\n\t\t\tif (ALGORITHM_REGEX.test(uriParams.algorithm)) {\n\t\t\t\tconfig.algorithm = uriParams.algorithm;\n\t\t\t} else {\n\t\t\t\tthrow new TypeError('Invalid \\'algorithm\\' parameter');\n\t\t\t}\n\t\t}\n\n\t\t// Digits: optional\n\t\tif (typeof uriParams.digits !== 'undefined') {\n\t\t\tif (POSITIVE_INTEGER_REGEX.test(uriParams.digits)) {\n\t\t\t\tconfig.digits = parseInt(uriParams.digits, 10);\n\t\t\t} else {\n\t\t\t\tthrow new TypeError('Invalid \\'digits\\' parameter');\n\t\t\t}\n\t\t}\n\n\t\treturn new OTP(config);\n\t}\n\n\t/**\n\t * Converts an HOTP/TOTP object to a Google Authenticator key URI.\n\t * @param {HOTP|TOTP} otp HOTP/TOTP object.\n\t * @returns {string} Google Authenticator Key URI.\n\t */\n\tstatic stringify(otp) {\n\t\tif (otp instanceof HOTP || otp instanceof TOTP) {\n\t\t\treturn otp.toString();\n\t\t}\n\n\t\tthrow new TypeError('Invalid \\'HOTP/TOTP\\' object');\n\t}\n}\n\nexport { URI };\n","/**\n * Library version.\n * @type {string}\n */\nconst version = '__OTPAUTH_VERSION__';\n\nexport { version };\n"],"names":["uintToBuf","num","buf","ArrayBuffer","arr","Uint8Array","acc","i","b64Tab","uint8array2packed","existingPacked","existingPackedLen","bigEndianMod","intOffset","byteOffset","packed","existingByteLen","shiftModifier","length","push","value","binLen","getStrConverter","format","utfType","Error","str","existingBin","existingBinLen","parseInt","substr","isNaN","codePnt","codePntArr","j","transposeBytes","byteCnt","charCodeAt","tmpInt","strPart","firstEqual","indexOf","search","replace","charAt","ignore","getOutputConverter","outputBinLen","outputOptions","binarray","outputLength","formatOpts","srcByte","outputUpper","toUpperCase","triplet","int1","int2","b64Pad","String","fromCharCode","retVal","arrView","globalThis","_typeof","Object","defineProperty","prototype","get","this","configurable","__GLOBALTHIS__","self","window","global","isNode","toString","call","process","nodeRequire","eval","NodeBuffer","Buffer","undefined","NodeCrypto","OPENSSL_TO_JSSHA_ALGO","hmacDigest","algorithm","key","message","hmac","createHmac","from","update","digest","buffer","variant","TypeError","jsSHA","setHMACKey","getHMAC","pad","digits","prefix","repeat","ALPHABET","base32ToBuf","cstr","bits","index","idx","base32FromBuf","hexToBuf","hexFromBuf","hex","latin1ToBuf","latin1FromBuf","ENCODER","TextEncoder","DECODER","TextDecoder","utf8ToBuf","encode","utf8FromBuf","decode","BrowserCrypto","crypto","msCrypto","randomBytes","size","getRandomValues","Secret","enumerable","latin1","utf8","base32","timingSafeEqual","a","b","out","HOTP","issuer","defaults","label","secret","counter","fromBase32","generate","token","validate","e","encodeURIComponent","offset","byteLength","otp","delta","generatedToken","TOTP","period","timestamp","Date","now","Math","floor","OTPURI_REGEX","SECRET_REGEX","ALGORITHM_REGEX","INTEGER_REGEX","POSITIVE_INTEGER_REGEX","URI","uri","uriGroups","match","error","Array","isArray","URIError","OTP","uriType","toLowerCase","uriLabel","split","map","decodeURIComponent","uriParams","reduce","cur","pairArr","pairKey","pairVal","pairAcc","config","test","version"],"mappings":"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"} \ No newline at end of file diff --git a/dist/otpauth.esm.js b/dist/otpauth.esm.js index 79188f85..72b769a4 100644 --- a/dist/otpauth.esm.js +++ b/dist/otpauth.esm.js @@ -1,4 +1,4 @@ -/*! otpauth v7.0.5 | (c) Héctor Molinero Fernández | MIT | https://github.com/hectorm/otpauth */ +/*! otpauth v7.0.6 | (c) Héctor Molinero Fernández | MIT | https://github.com/hectorm/otpauth */ /*! jssha v3.2.0 | (c) Brian Turek | BSD-3-Clause | https://github.com/Caligatio/jsSHA */ function _typeof(obj) { @@ -94,6 +94,8 @@ function _assertThisInitialized(self) { function _possibleConstructorReturn(self, call) { if (call && (typeof call === "object" || typeof call === "function")) { return call; + } else if (call !== void 0) { + throw new TypeError("Derived constructors may only return object or undefined"); } return _assertThisInitialized(self); @@ -2298,6 +2300,6 @@ var URI = /*#__PURE__*/function () { * Library version. * @type {string} */ -var version = '7.0.5'; +var version = '7.0.6'; export { HOTP, Secret, TOTP, URI, version }; diff --git a/dist/otpauth.esm.min.js b/dist/otpauth.esm.min.js index 5bdf273e..0924669b 100644 --- a/dist/otpauth.esm.min.js +++ b/dist/otpauth.esm.min.js @@ -1,12 +1,12 @@ -/*! otpauth v7.0.5 | (c) Héctor Molinero Fernández | MIT | https://github.com/hectorm/otpauth */ +/*! otpauth v7.0.6 | (c) Héctor Molinero Fernández | MIT | https://github.com/hectorm/otpauth */ /*! jssha v3.2.0 | (c) Brian Turek | BSD-3-Clause | https://github.com/Caligatio/jsSHA */ -function _typeof(e){return(_typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function _defineProperties(e,t){for(var n=0;n=0&&0!==r;i--)n[i]=255&r,r-=n[i],r/=256;return t},t="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";function n(e,t,n,r){var i,o,u,a=t||[0],s=(n=n||0)>>>3,f=-1===r?3:0;for(i=0;i>>2,a.length<=o&&a.push(0),a[o]|=e[i]<<8*(f+r*(u%4));return{value:a,binLen:8*e.length+n}}function e(e,r,i){switch(r){case"UTF8":case"UTF16BE":case"UTF16LE":break;default:throw new Error("encoding must be UTF8, UTF16BE, or UTF16LE")}switch(e){case"HEX":return function(e,t,n){return function(e,t,n,r){var i,o,u,a;if(0!=e.length%2)throw new Error("String of HEX type must be in byte increments");var s=t||[0],f=(n=n||0)>>>3,c=-1===r?3:0;for(i=0;i>>1)+f)>>>2;s.length<=u;)s.push(0);s[u]|=o<<8*(c+r*(a%4))}return{value:s,binLen:4*e.length+n}}(e,t,n,i)};case"TEXT":return function(e,t,n){return function(e,t,n,r,i){ -var o,u,a,s,f,c,h,l,w=0,p=n||[0],d=(r=r||0)>>>3;if("UTF8"===t)for(h=-1===i?3:0,a=0;a(o=e.charCodeAt(a))?u.push(o):2048>o?(u.push(192|o>>>6),u.push(128|63&o)):55296>o||57344<=o?u.push(224|o>>>12,128|o>>>6&63,128|63&o):(a+=1,o=65536+((1023&o)<<10|1023&e.charCodeAt(a)),u.push(240|o>>>18,128|o>>>12&63,128|o>>>6&63,128|63&o)),s=0;s>>2;p.length<=f;)p.push(0);p[f]|=u[s]<<8*(h+i*(c%4)),w+=1}else for(h=-1===i?2:0,l="UTF16LE"===t&&1!==i||"UTF16LE"!==t&&1===i,a=0;a>>8),f=(c=w+d)>>>2;p.length<=f;)p.push(0);p[f]|=o<<8*(h+i*(c%4)),w+=2}return{value:p,binLen:8*w+r}}(e,r,t,n,i)};case"B64":return function(e,n,r){return function(e,n,r,i){var o,u,a,s,f,c,h=0,l=n||[0],w=(r=r||0)>>>3,p=-1===i?3:0,d=e.indexOf("=");if(-1===e.search(/^[a-zA-Z0-9=+/]+$/))throw new Error("Invalid character in base-64 string");if(e=e.replace(/=/g,""),-1!==d&&d=0&&0!==r;i--)n[i]=255&r,r-=n[i],r/=256;return t},t="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";function n(e,t,n,r){var i,o,u,a=t||[0],s=(n=n||0)>>>3,f=-1===r?3:0;for(i=0;i>>2,a.length<=o&&a.push(0),a[o]|=e[i]<<8*(f+r*(u%4));return{value:a,binLen:8*e.length+n}}function e(e,r,i){switch(r){case"UTF8":case"UTF16BE":case"UTF16LE":break;default:throw new Error("encoding must be UTF8, UTF16BE, or UTF16LE")}switch(e){case"HEX":return function(e,t,n){return function(e,t,n,r){var i,o,u,a;if(0!=e.length%2)throw new Error("String of HEX type must be in byte increments");var s=t||[0],f=(n=n||0)>>>3,c=-1===r?3:0;for(i=0;i>>1)+f)>>>2;s.length<=u;)s.push(0);s[u]|=o<<8*(c+r*(a%4))}return{value:s,binLen:4*e.length+n}}(e,t,n,i)};case"TEXT":return function(e,t,n){return function(e,t,n,r,i){var o,u,a,s,f,c,h,l,w=0,p=n||[0],d=(r=r||0)>>>3;if("UTF8"===t)for(h=-1===i?3:0,a=0;a(o=e.charCodeAt(a))?u.push(o):2048>o?(u.push(192|o>>>6),u.push(128|63&o)):55296>o||57344<=o?u.push(224|o>>>12,128|o>>>6&63,128|63&o):(a+=1,o=65536+((1023&o)<<10|1023&e.charCodeAt(a)),u.push(240|o>>>18,128|o>>>12&63,128|o>>>6&63,128|63&o)),s=0;s>>2;p.length<=f;)p.push(0);p[f]|=u[s]<<8*(h+i*(c%4)),w+=1}else for(h=-1===i?2:0,l="UTF16LE"===t&&1!==i||"UTF16LE"!==t&&1===i,a=0;a>>8),f=(c=w+d)>>>2;p.length<=f;)p.push(0);p[f]|=o<<8*(h+i*(c%4)),w+=2}return{value:p,binLen:8*w+r}}(e,r,t,n,i)};case"B64":return function(e,n,r){return function(e,n,r,i){var o,u,a,s,f,c,h=0,l=n||[0],w=(r=r||0)>>>3,p=-1===i?3:0,d=e.indexOf("=") +;if(-1===e.search(/^[a-zA-Z0-9=+/]+$/))throw new Error("Invalid character in base-64 string");if(e=e.replace(/=/g,""),-1!==d&&d {\n\tconst buf = new ArrayBuffer(8);\n\tconst arr = new Uint8Array(buf);\n\tlet acc = num;\n\n\tfor (let i = 7; i >= 0; i--) {\n\t\tif (acc === 0) break;\n\t\tarr[i] = acc & 255;\n\t\tacc -= arr[i];\n\t\tacc /= 256;\n\t}\n\n\treturn buf;\n};\n\n/**\n * Converts an ArrayBuffer to an integer.\n * @param {ArrayBuffer} buf ArrayBuffer.\n * @returns {number} Integer.\n */\nconst uintFromBuf = (buf) => {\n\tconst arr = new Uint8Array(buf);\n\tlet num = 0;\n\n\tfor (let i = 0; i < arr.length; i++) {\n\t\tif (arr[i] !== 0) {\n\t\t\tnum *= 256;\n\t\t\tnum += arr[i];\n\t\t}\n\t}\n\n\treturn num;\n};\n\nexport { uintToBuf, uintFromBuf };\n","/**\n * A JavaScript implementation of the SHA family of hashes - defined in FIPS PUB 180-4, FIPS PUB 202,\n * and SP 800-185 - as well as the corresponding HMAC implementation as defined in FIPS PUB 198-1.\n *\n * Copyright 2008-2020 Brian Turek, 1998-2009 Paul Johnston & Contributors\n * Distributed under the BSD License\n * See http://caligatio.github.com/jsSHA/ for more information\n */\nconst t=\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\";function n(t,n,e,r){let i,s,o;const h=n||[0],u=(e=e||0)>>>3,w=-1===r?3:0;for(i=0;i>>2,h.length<=s&&h.push(0),h[s]|=t[i]<<8*(w+r*(o%4));return{value:h,binLen:8*t.length+e}}function e(e,r,i){switch(r){case\"UTF8\":case\"UTF16BE\":case\"UTF16LE\":break;default:throw new Error(\"encoding must be UTF8, UTF16BE, or UTF16LE\")}switch(e){case\"HEX\":return function(t,n,e){return function(t,n,e,r){let i,s,o,h;if(0!=t.length%2)throw new Error(\"String of HEX type must be in byte increments\");const u=n||[0],w=(e=e||0)>>>3,c=-1===r?3:0;for(i=0;i>>1)+w,o=h>>>2;u.length<=o;)u.push(0);u[o]|=s<<8*(c+r*(h%4))}return{value:u,binLen:4*t.length+e}}(t,n,e,i)};case\"TEXT\":return function(t,n,e){return function(t,n,e,r,i){let s,o,h,u,w,c,f,a,l=0;const A=e||[0],E=(r=r||0)>>>3;if(\"UTF8\"===n)for(f=-1===i?3:0,h=0;hs?o.push(s):2048>s?(o.push(192|s>>>6),o.push(128|63&s)):55296>s||57344<=s?o.push(224|s>>>12,128|s>>>6&63,128|63&s):(h+=1,s=65536+((1023&s)<<10|1023&t.charCodeAt(h)),o.push(240|s>>>18,128|s>>>12&63,128|s>>>6&63,128|63&s)),u=0;u>>2;A.length<=w;)A.push(0);A[w]|=o[u]<<8*(f+i*(c%4)),l+=1}else for(f=-1===i?2:0,a=\"UTF16LE\"===n&&1!==i||\"UTF16LE\"!==n&&1===i,h=0;h>>8),c=l+E,w=c>>>2;A.length<=w;)A.push(0);A[w]|=s<<8*(f+i*(c%4)),l+=2}return{value:A,binLen:8*l+r}}(t,r,n,e,i)};case\"B64\":return function(n,e,r){return function(n,e,r,i){let s,o,h,u,w,c,f,a=0;const l=e||[0],A=(r=r||0)>>>3,E=-1===i?3:0,H=n.indexOf(\"=\");if(-1===n.search(/^[a-zA-Z0-9=+/]+$/))throw new Error(\"Invalid character in base-64 string\");if(n=n.replace(/=/g,\"\"),-1!==H&&H {};\n\nexport { nodeRequire };\n","import jsSHA from 'jssha';\n\nimport { globalThis } from '../global-this';\nimport { isNode } from '../is-node';\nimport { nodeRequire } from '../node-require';\n\nconst NodeBuffer = isNode ? globalThis.Buffer : undefined;\nconst NodeCrypto = isNode ? nodeRequire('crypto') : undefined;\n\n/**\n * OpenSSL to jsSHA algorithms.\n * @type {Object.}\n */\nconst OPENSSL_TO_JSSHA_ALGO = {\n\t'SHA1': 'SHA-1',\n\t'SHA224': 'SHA-224',\n\t'SHA256': 'SHA-256',\n\t'SHA384': 'SHA-384',\n\t'SHA512': 'SHA-512',\n\t'SHA3-224': 'SHA3-224',\n\t'SHA3-256': 'SHA3-256',\n\t'SHA3-384': 'SHA3-384',\n\t'SHA3-512': 'SHA3-512',\n};\n\n/**\n * Calculates an HMAC digest.\n * In Node.js, the command \"openssl list -digest-algorithms\" displays the available digest algorithms.\n * @param {string} algorithm Algorithm.\n * @param {ArrayBuffer} key Key.\n * @param {ArrayBuffer} message Message.\n * @returns {ArrayBuffer} Digest.\n */\nconst hmacDigest = (algorithm, key, message) => {\n\tif (isNode) {\n\t\tconst hmac = NodeCrypto.createHmac(algorithm, NodeBuffer.from(key));\n\t\thmac.update(NodeBuffer.from(message));\n\t\treturn hmac.digest().buffer;\n\t} else {\n\t\tconst variant = OPENSSL_TO_JSSHA_ALGO[algorithm.toUpperCase()];\n\t\tif (typeof variant === 'undefined') {\n\t\t\tthrow new TypeError('Unknown hash function');\n\t\t}\n\t\t// @ts-ignore\n\t\t// eslint-disable-next-line @babel/new-cap\n\t\tconst hmac = new jsSHA(variant, 'ARRAYBUFFER');\n\t\thmac.setHMACKey(key, 'ARRAYBUFFER');\n\t\thmac.update(message);\n\t\treturn hmac.getHMAC('ARRAYBUFFER');\n\t}\n};\n\nexport { hmacDigest };\n","/**\n * Pads a number with leading zeros.\n * @param {number|string} num Number.\n * @param {number} digits Digits.\n * @returns {string} Padded number.\n */\nconst pad = (num, digits) => {\n\tlet prefix = '';\n\tlet repeat = digits - String(num).length;\n\twhile (repeat-- > 0) prefix += '0';\n\treturn `${prefix}${num}`;\n};\n\nexport { pad };\n","/**\n * RFC 4648 base32 alphabet without pad.\n * @type {string}\n */\nconst ALPHABET = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ234567';\n\n/**\n * Converts a base32 string to an ArrayBuffer (RFC 4648).\n * {@link https://github.com/LinusU/base32-decode|LinusU/base32-decode}\n * @param {string} str Base32 string.\n * @returns {ArrayBuffer} ArrayBuffer.\n */\nconst base32ToBuf = (str) => {\n\t// Canonicalize to all upper case and remove padding if it exists.\n\tconst cstr = str.toUpperCase().replace(/=+$/, '');\n\n\tconst buf = new ArrayBuffer((cstr.length * 5) / 8 | 0);\n\tconst arr = new Uint8Array(buf);\n\tlet bits = 0;\n\tlet value = 0;\n\tlet index = 0;\n\n\tfor (let i = 0; i < cstr.length; i++) {\n\t\tconst idx = ALPHABET.indexOf(cstr[i]);\n\t\tif (idx === -1) throw new TypeError(`Invalid character found: ${cstr[i]}`);\n\n\t\tvalue = (value << 5) | idx;\n\t\tbits += 5;\n\n\t\tif (bits >= 8) {\n\t\t\tarr[index++] = (value >>> bits - 8) & 255;\n\t\t\tbits -= 8;\n\t\t}\n\t}\n\n\treturn buf;\n};\n\n/**\n * Converts an ArrayBuffer to a base32 string (RFC 4648).\n * {@link https://github.com/LinusU/base32-encode|LinusU/base32-encode}\n * @param {ArrayBuffer} buf ArrayBuffer.\n * @returns {string} Base32 string.\n */\nconst base32FromBuf = (buf) => {\n\tconst arr = new Uint8Array(buf);\n\tlet bits = 0;\n\tlet value = 0;\n\tlet str = '';\n\n\tfor (let i = 0; i < arr.length; i++) {\n\t\tvalue = (value << 8) | arr[i];\n\t\tbits += 8;\n\n\t\twhile (bits >= 5) {\n\t\t\tstr += ALPHABET[(value >>> bits - 5) & 31];\n\t\t\tbits -= 5;\n\t\t}\n\t}\n\n\tif (bits > 0) {\n\t\tstr += ALPHABET[(value << 5 - bits) & 31];\n\t}\n\n\treturn str;\n};\n\nexport { base32ToBuf, base32FromBuf };\n","/**\n * Converts a hexadecimal string to an ArrayBuffer.\n * @param {string} str Hexadecimal string.\n * @returns {ArrayBuffer} ArrayBuffer.\n */\nconst hexToBuf = (str) => {\n\tconst buf = new ArrayBuffer(str.length / 2);\n\tconst arr = new Uint8Array(buf);\n\n\tfor (let i = 0; i < str.length; i += 2) {\n\t\tarr[i / 2] = parseInt(str.substr(i, 2), 16);\n\t}\n\n\treturn buf;\n};\n\n/**\n * Converts an ArrayBuffer to a hexadecimal string.\n * @param {ArrayBuffer} buf ArrayBuffer.\n * @returns {string} Hexadecimal string.\n */\nconst hexFromBuf = (buf) => {\n\tconst arr = new Uint8Array(buf);\n\tlet str = '';\n\n\tfor (let i = 0; i < arr.length; i++) {\n\t\tconst hex = arr[i].toString(16);\n\t\tif (hex.length === 1) str += '0';\n\t\tstr += hex;\n\t}\n\n\treturn str.toUpperCase();\n};\n\nexport { hexToBuf, hexFromBuf };\n","/**\n * Converts a Latin-1 string to an ArrayBuffer.\n * @param {string} str Latin-1 string.\n * @returns {ArrayBuffer} ArrayBuffer.\n */\nconst latin1ToBuf = (str) => {\n\tconst buf = new ArrayBuffer(str.length);\n\tconst arr = new Uint8Array(buf);\n\n\tfor (let i = 0; i < str.length; i++) {\n\t\tarr[i] = str.charCodeAt(i) & 0xFF;\n\t}\n\n\treturn buf;\n};\n\n/**\n * Converts an ArrayBuffer to a Latin-1 string.\n * @param {ArrayBuffer} buf ArrayBuffer.\n * @returns {string} Latin-1 string.\n */\nconst latin1FromBuf = (buf) => {\n\tconst arr = new Uint8Array(buf);\n\tlet str = '';\n\n\tfor (let i = 0; i < arr.length; i++) {\n\t\tstr += String.fromCharCode(arr[i]);\n\t}\n\n\treturn str;\n};\n\nexport { latin1ToBuf, latin1FromBuf };\n","import { globalThis } from '../global-this';\n\n/**\n * TextEncoder instance.\n * @type {TextEncoder|null}\n */\nconst ENCODER = globalThis.TextEncoder\n\t? new globalThis.TextEncoder('utf-8')\n\t: null;\n\n/**\n * TextDecoder instance.\n * @type {TextDecoder|null}\n */\nconst DECODER = globalThis.TextDecoder\n\t? new globalThis.TextDecoder('utf-8')\n\t: null;\n\n/**\n * Converts an UTF-8 string to an ArrayBuffer.\n * @param {string} str String.\n * @returns {ArrayBuffer} ArrayBuffer.\n */\nconst utf8ToBuf = (str) => {\n\tif (!ENCODER) {\n\t\tthrow new Error('Encoding API not available');\n\t}\n\n\treturn ENCODER.encode(str).buffer;\n};\n\n/**\n * Converts an ArrayBuffer to an UTF-8 string.\n * @param {ArrayBuffer} buf ArrayBuffer.\n * @returns {string} String.\n */\nconst utf8FromBuf = (buf) => {\n\tif (!DECODER) {\n\t\tthrow new Error('Encoding API not available');\n\t}\n\n\treturn DECODER.decode(buf);\n};\n\nexport { utf8ToBuf, utf8FromBuf };\n","import { globalThis } from '../global-this';\nimport { isNode } from '../is-node';\nimport { nodeRequire } from '../node-require';\n\nconst NodeCrypto = isNode ? nodeRequire('crypto') : undefined;\nconst BrowserCrypto = !isNode ? globalThis.crypto || globalThis.msCrypto : undefined;\n\n/**\n * Returns random bytes.\n * @param {number} size Size.\n * @returns {ArrayBuffer} Random bytes.\n */\nconst randomBytes = (size) => {\n\tif (isNode) {\n\t\treturn NodeCrypto.randomBytes(size).buffer;\n\t} else {\n\t\tif (!BrowserCrypto || !BrowserCrypto.getRandomValues) {\n\t\t\tthrow new Error('Cryptography API not available');\n\t\t}\n\t\treturn BrowserCrypto.getRandomValues(new Uint8Array(size)).buffer;\n\t}\n};\n\nexport { randomBytes };\n","import { base32ToBuf, base32FromBuf } from './utils/encoding/base32';\nimport { hexToBuf, hexFromBuf } from './utils/encoding/hex';\nimport { latin1ToBuf, latin1FromBuf } from './utils/encoding/latin1';\nimport { utf8ToBuf, utf8FromBuf } from './utils/encoding/utf8';\nimport { randomBytes } from './utils/crypto/random-bytes';\n\n/**\n * OTP secret key.\n */\nclass Secret {\n\t/**\n\t * Creates a secret key object.\n\t * @param {Object} [config] Configuration options.\n\t * @param {ArrayBuffer} [config.buffer=randomBytes] Secret key.\n\t * @param {number} [config.size=20] Number of random bytes to generate, ignored if 'buffer' is provided.\n\t */\n\tconstructor({ buffer, size = 20 } = {}) {\n\t\t/**\n\t\t * Secret key.\n\t\t * @type {ArrayBuffer}\n\t\t */\n\t\tthis.buffer = typeof buffer === 'undefined'\n\t\t\t? randomBytes(size)\n\t\t\t: buffer;\n\t}\n\n\t/**\n\t * Converts a Latin-1 string to a Secret object.\n\t * @param {string} str Latin-1 string.\n\t * @returns {Secret} Secret object.\n\t */\n\tstatic fromLatin1(str) {\n\t\treturn new Secret({ buffer: latin1ToBuf(str) });\n\t}\n\n\t/**\n\t * Converts an UTF-8 string to a Secret object.\n\t * @param {string} str UTF-8 string.\n\t * @returns {Secret} Secret object.\n\t */\n\tstatic fromUTF8(str) {\n\t\treturn new Secret({ buffer: utf8ToBuf(str) });\n\t}\n\n\t/**\n\t * Converts a base32 string to a Secret object.\n\t * @param {string} str Base32 string.\n\t * @returns {Secret} Secret object.\n\t */\n\tstatic fromBase32(str) {\n\t\treturn new Secret({ buffer: base32ToBuf(str) });\n\t}\n\n\t/**\n\t * Converts a hexadecimal string to a Secret object.\n\t * @param {string} str Hexadecimal string.\n\t * @returns {Secret} Secret object.\n\t */\n\tstatic fromHex(str) {\n\t\treturn new Secret({ buffer: hexToBuf(str) });\n\t}\n\n\t/**\n\t * Latin-1 string representation of secret key.\n\t * @type {string}\n\t */\n\tget latin1() {\n\t\tObject.defineProperty(this, 'latin1', {\n\t\t\tenumerable: true,\n\t\t\tvalue: latin1FromBuf(this.buffer),\n\t\t});\n\n\t\treturn this.latin1;\n\t}\n\n\t/**\n\t * UTF-8 string representation of secret key.\n\t * @type {string}\n\t */\n\tget utf8() {\n\t\tObject.defineProperty(this, 'utf8', {\n\t\t\tenumerable: true,\n\t\t\tvalue: utf8FromBuf(this.buffer),\n\t\t});\n\n\t\treturn this.utf8;\n\t}\n\n\t/**\n\t * Base32 string representation of secret key.\n\t * @type {string}\n\t */\n\tget base32() {\n\t\tObject.defineProperty(this, 'base32', {\n\t\t\tenumerable: true,\n\t\t\tvalue: base32FromBuf(this.buffer),\n\t\t});\n\n\t\treturn this.base32;\n\t}\n\n\t/**\n\t * Hexadecimal string representation of secret key.\n\t * @type {string}\n\t */\n\tget hex() {\n\t\tObject.defineProperty(this, 'hex', {\n\t\t\tenumerable: true,\n\t\t\tvalue: hexFromBuf(this.buffer),\n\t\t});\n\n\t\treturn this.hex;\n\t}\n}\n\nexport { Secret };\n","import { globalThis } from '../global-this';\nimport { isNode } from '../is-node';\nimport { nodeRequire } from '../node-require';\n\nconst NodeBuffer = isNode ? globalThis.Buffer : undefined;\nconst NodeCrypto = isNode ? nodeRequire('crypto') : undefined;\n\n/**\n * Returns true if a is equal to b, without leaking timing information that would allow an attacker to guess one of the values.\n * @param {string} a String a.\n * @param {string} b String b.\n * @returns {boolean} Equality result.\n */\nconst timingSafeEqual = (a, b) => {\n\tif (isNode) {\n\t\treturn NodeCrypto.timingSafeEqual(NodeBuffer.from(a), NodeBuffer.from(b));\n\t} else {\n\t\tif (a.length !== b.length) {\n\t\t\tthrow new TypeError('Input strings must have the same length');\n\t\t}\n\t\tlet i = -1;\n\t\tlet out = 0;\n\t\twhile (++i < a.length) {\n\t\t\tout |= a.charCodeAt(i) ^ b.charCodeAt(i);\n\t\t}\n\t\treturn out === 0;\n\t}\n};\n\nexport { timingSafeEqual };\n","import { uintToBuf } from './utils/encoding/uint';\nimport { hmacDigest } from './utils/crypto/hmac-digest';\nimport { pad } from './utils/pad';\nimport { Secret } from './secret';\nimport { timingSafeEqual } from './utils/crypto/timing-safe-equal';\n\n/**\n * HOTP: An HMAC-based One-time Password Algorithm.\n * {@link https://tools.ietf.org/html/rfc4226|RFC 4226}\n */\nclass HOTP {\n\t/**\n\t * Default configuration.\n\t * @type {{\n\t * issuer: string,\n\t * label: string,\n\t * algorithm: string,\n\t * digits: number,\n\t * counter: number\n\t * window: number\n\t * }}\n\t */\n\tstatic get defaults() {\n\t\treturn {\n\t\t\tissuer: '',\n\t\t\tlabel: 'OTPAuth',\n\t\t\talgorithm: 'SHA1',\n\t\t\tdigits: 6,\n\t\t\tcounter: 0,\n\t\t\twindow: 1,\n\t\t};\n\t}\n\n\t/**\n\t * Creates an HOTP object.\n\t * @param {Object} [config] Configuration options.\n\t * @param {string} [config.issuer=''] Account provider.\n\t * @param {string} [config.label='OTPAuth'] Account label.\n\t * @param {Secret|string} [config.secret=Secret] Secret key.\n\t * @param {string} [config.algorithm='SHA1'] HMAC hashing algorithm.\n\t * @param {number} [config.digits=6] Token length.\n\t * @param {number} [config.counter=0] Initial counter value.\n\t */\n\tconstructor({\n\t\tissuer = HOTP.defaults.issuer,\n\t\tlabel = HOTP.defaults.label,\n\t\tsecret = new Secret(),\n\t\talgorithm = HOTP.defaults.algorithm,\n\t\tdigits = HOTP.defaults.digits,\n\t\tcounter = HOTP.defaults.counter,\n\t} = {}) {\n\t\t/**\n\t\t * Account provider.\n\t\t * @type {string}\n\t\t */\n\t\tthis.issuer = issuer;\n\t\t/**\n\t\t * Account label.\n\t\t * @type {string}\n\t\t */\n\t\tthis.label = label;\n\t\t/**\n\t\t * Secret key.\n\t\t * @type {Secret}\n\t\t */\n\t\tthis.secret = typeof secret === 'string'\n\t\t\t? Secret.fromBase32(secret)\n\t\t\t: secret;\n\t\t/**\n\t\t * HMAC hashing algorithm.\n\t\t * @type {string}\n\t\t */\n\t\tthis.algorithm = algorithm.toUpperCase();\n\t\t/**\n\t\t * Token length.\n\t\t * @type {number}\n\t\t */\n\t\tthis.digits = digits;\n\t\t/**\n\t\t * Initial counter value.\n\t\t * @type {number}\n\t\t */\n\t\tthis.counter = counter;\n\t}\n\n\t/**\n\t * Generates an HOTP token.\n\t * @param {Object} config Configuration options.\n\t * @param {Secret} config.secret Secret key.\n\t * @param {string} [config.algorithm='SHA1'] HMAC hashing algorithm.\n\t * @param {number} [config.digits=6] Token length.\n\t * @param {number} [config.counter=0] Counter value.\n\t * @returns {string} Token.\n\t */\n\tstatic generate({\n\t\tsecret,\n\t\talgorithm = HOTP.defaults.algorithm,\n\t\tdigits = HOTP.defaults.digits,\n\t\tcounter = HOTP.defaults.counter,\n\t}) {\n\t\tconst digest = new Uint8Array(hmacDigest(algorithm, secret.buffer, uintToBuf(counter)));\n\t\tconst offset = digest[digest.byteLength - 1] & 15;\n\t\tconst otp = (\n\t\t\t((digest[offset] & 127) << 24)\n\t\t\t| ((digest[offset + 1] & 255) << 16)\n\t\t\t| ((digest[offset + 2] & 255) << 8)\n\t\t\t| (digest[offset + 3] & 255)\n\t\t) % (10 ** digits);\n\n\t\treturn pad(otp, digits);\n\t}\n\n\t/**\n\t * Generates an HOTP token.\n\t * @param {Object} [config] Configuration options.\n\t * @param {number} [config.counter=this.counter++] Counter value.\n\t * @returns {string} Token.\n\t */\n\tgenerate({\n\t\tcounter = this.counter++,\n\t} = {}) {\n\t\treturn HOTP.generate({\n\t\t\tsecret: this.secret,\n\t\t\talgorithm: this.algorithm,\n\t\t\tdigits: this.digits,\n\t\t\tcounter,\n\t\t});\n\t}\n\n\t/**\n\t * Validates an HOTP token.\n\t * @param {Object} config Configuration options.\n\t * @param {string} config.token Token value.\n\t * @param {Secret} config.secret Secret key.\n\t * @param {string} [config.algorithm='SHA1'] HMAC hashing algorithm.\n\t * @param {number} config.digits Token length.\n\t * @param {number} [config.counter=0] Counter value.\n\t * @param {number} [config.window=1] Window of counter values to test.\n\t * @returns {number|null} Token delta, or null if the token is not found.\n\t */\n\tstatic validate({\n\t\ttoken,\n\t\tsecret,\n\t\talgorithm,\n\t\tdigits,\n\t\tcounter = HOTP.defaults.counter,\n\t\twindow = HOTP.defaults.window,\n\t}) {\n\t\t// Return early if the token length does not match the digit number.\n\t\tif (token.length !== digits) return null;\n\n\t\tlet delta = null;\n\n\t\tfor (let i = counter - window; i <= counter + window; ++i) {\n\t\t\tconst generatedToken = HOTP.generate({\n\t\t\t\tsecret,\n\t\t\t\talgorithm,\n\t\t\t\tdigits,\n\t\t\t\tcounter: i,\n\t\t\t});\n\n\t\t\tif (timingSafeEqual(token, generatedToken)) {\n\t\t\t\tdelta = i - counter;\n\t\t\t}\n\t\t}\n\n\t\treturn delta;\n\t}\n\n\t/**\n\t * Validates an HOTP token.\n\t * @param {Object} config Configuration options.\n\t * @param {string} config.token Token value.\n\t * @param {number} [config.counter=this.counter] Counter value.\n\t * @param {number} [config.window=1] Window of counter values to test.\n\t * @returns {number|null} Token delta, or null if the token is not found.\n\t */\n\tvalidate({\n\t\ttoken,\n\t\tcounter = this.counter,\n\t\twindow,\n\t}) {\n\t\treturn HOTP.validate({\n\t\t\ttoken,\n\t\t\tsecret: this.secret,\n\t\t\talgorithm: this.algorithm,\n\t\t\tdigits: this.digits,\n\t\t\tcounter,\n\t\t\twindow,\n\t\t});\n\t}\n\n\t/**\n\t * Returns a Google Authenticator key URI.\n\t * @returns {string} URI.\n\t */\n\ttoString() {\n\t\tconst e = encodeURIComponent;\n\t\treturn 'otpauth://hotp/'\n\t\t\t+ `${this.issuer.length > 0\n\t\t\t\t? `${e(this.issuer)}:${e(this.label)}?issuer=${e(this.issuer)}&`\n\t\t\t\t: `${e(this.label)}?`}`\n\t\t\t+ `secret=${e(this.secret.base32)}&`\n\t\t\t+ `algorithm=${e(this.algorithm)}&`\n\t\t\t+ `digits=${e(this.digits)}&`\n\t\t\t+ `counter=${e(this.counter)}`;\n\t}\n}\n\nexport { HOTP };\n","import { HOTP } from './hotp';\nimport { Secret } from './secret';\n\n/**\n * TOTP: Time-Based One-Time Password Algorithm.\n * {@link https://tools.ietf.org/html/rfc6238|RFC 6238}\n */\nclass TOTP {\n\t/**\n\t * Default configuration.\n\t * @type {{\n\t * issuer: string,\n\t * label: string,\n\t * algorithm: string,\n\t * digits: number,\n\t * period: number\n\t * window: number\n\t * }}\n\t */\n\tstatic get defaults() {\n\t\treturn {\n\t\t\tissuer: '',\n\t\t\tlabel: 'OTPAuth',\n\t\t\talgorithm: 'SHA1',\n\t\t\tdigits: 6,\n\t\t\tperiod: 30,\n\t\t\twindow: 1,\n\t\t};\n\t}\n\n\t/**\n\t * Creates a TOTP object.\n\t * @param {Object} [config] Configuration options.\n\t * @param {string} [config.issuer=''] Account provider.\n\t * @param {string} [config.label='OTPAuth'] Account label.\n\t * @param {Secret|string} [config.secret=Secret] Secret key.\n\t * @param {string} [config.algorithm='SHA1'] HMAC hashing algorithm.\n\t * @param {number} [config.digits=6] Token length.\n\t * @param {number} [config.period=30] Token time-step duration.\n\t */\n\tconstructor({\n\t\tissuer = TOTP.defaults.issuer,\n\t\tlabel = TOTP.defaults.label,\n\t\tsecret = new Secret(),\n\t\talgorithm = TOTP.defaults.algorithm,\n\t\tdigits = TOTP.defaults.digits,\n\t\tperiod = TOTP.defaults.period,\n\t} = {}) {\n\t\t/**\n\t\t * Account provider.\n\t\t * @type {string}\n\t\t */\n\t\tthis.issuer = issuer;\n\t\t/**\n\t\t * Account label.\n\t\t * @type {string}\n\t\t */\n\t\tthis.label = label;\n\t\t/**\n\t\t * Secret key.\n\t\t * @type {Secret}\n\t\t */\n\t\tthis.secret = typeof secret === 'string'\n\t\t\t? Secret.fromBase32(secret)\n\t\t\t: secret;\n\t\t/**\n\t\t * HMAC hashing algorithm.\n\t\t * @type {string}\n\t\t */\n\t\tthis.algorithm = algorithm.toUpperCase();\n\t\t/**\n\t\t * Token length.\n\t\t * @type {number}\n\t\t */\n\t\tthis.digits = digits;\n\t\t/**\n\t\t * Token time-step duration.\n\t\t * @type {number}\n\t\t */\n\t\tthis.period = period;\n\t}\n\n\t/**\n\t * Generates a TOTP token.\n\t * @param {Object} config Configuration options.\n\t * @param {Secret} config.secret Secret key.\n\t * @param {string} [config.algorithm='SHA1'] HMAC hashing algorithm.\n\t * @param {number} [config.digits=6] Token length.\n\t * @param {number} [config.period=30] Token time-step duration.\n\t * @param {number} [config.timestamp=Date.now] Timestamp value in milliseconds.\n\t * @returns {string} Token.\n\t */\n\tstatic generate({\n\t\tsecret,\n\t\talgorithm,\n\t\tdigits,\n\t\tperiod = TOTP.defaults.period,\n\t\ttimestamp = Date.now(),\n\t}) {\n\t\treturn HOTP.generate({\n\t\t\tsecret,\n\t\t\talgorithm,\n\t\t\tdigits,\n\t\t\tcounter: Math.floor(timestamp / 1000 / period),\n\t\t});\n\t}\n\n\t/**\n\t * Generates a TOTP token.\n\t * @param {Object} [config] Configuration options.\n\t * @param {number} [config.timestamp=Date.now] Timestamp value in milliseconds.\n\t * @returns {string} Token.\n\t */\n\tgenerate({\n\t\ttimestamp = Date.now(),\n\t} = {}) {\n\t\treturn TOTP.generate({\n\t\t\tsecret: this.secret,\n\t\t\talgorithm: this.algorithm,\n\t\t\tdigits: this.digits,\n\t\t\tperiod: this.period,\n\t\t\ttimestamp,\n\t\t});\n\t}\n\n\t/**\n\t * Validates a TOTP token.\n\t * @param {Object} config Configuration options.\n\t * @param {string} config.token Token value.\n\t * @param {Secret} config.secret Secret key.\n\t * @param {string} [config.algorithm='SHA1'] HMAC hashing algorithm.\n\t * @param {number} config.digits Token length.\n\t * @param {number} [config.period=30] Token time-step duration.\n\t * @param {number} [config.timestamp=Date.now] Timestamp value in milliseconds.\n\t * @param {number} [config.window=1] Window of counter values to test.\n\t * @returns {number|null} Token delta, or null if the token is not found.\n\t */\n\tstatic validate({\n\t\ttoken,\n\t\tsecret,\n\t\talgorithm,\n\t\tdigits,\n\t\tperiod = TOTP.defaults.period,\n\t\ttimestamp = Date.now(),\n\t\twindow,\n\t}) {\n\t\treturn HOTP.validate({\n\t\t\ttoken,\n\t\t\tsecret,\n\t\t\talgorithm,\n\t\t\tdigits,\n\t\t\tcounter: Math.floor(timestamp / 1000 / period),\n\t\t\twindow,\n\t\t});\n\t}\n\n\t/**\n\t * Validates a TOTP token.\n\t * @param {Object} config Configuration options.\n\t * @param {string} config.token Token value.\n\t * @param {number} [config.timestamp=Date.now] Timestamp value in milliseconds.\n\t * @param {number} [config.window=1] Window of counter values to test.\n\t * @returns {number|null} Token delta, or null if the token is not found.\n\t */\n\tvalidate({\n\t\ttoken,\n\t\ttimestamp,\n\t\twindow,\n\t}) {\n\t\treturn TOTP.validate({\n\t\t\ttoken,\n\t\t\tsecret: this.secret,\n\t\t\talgorithm: this.algorithm,\n\t\t\tdigits: this.digits,\n\t\t\tperiod: this.period,\n\t\t\ttimestamp,\n\t\t\twindow,\n\t\t});\n\t}\n\n\t/**\n\t * Returns a Google Authenticator key URI.\n\t * @returns {string} URI.\n\t */\n\ttoString() {\n\t\tconst e = encodeURIComponent;\n\t\treturn 'otpauth://totp/'\n\t\t\t+ `${this.issuer.length > 0\n\t\t\t\t? `${e(this.issuer)}:${e(this.label)}?issuer=${e(this.issuer)}&`\n\t\t\t\t: `${e(this.label)}?`}`\n\t\t\t+ `secret=${e(this.secret.base32)}&`\n\t\t\t+ `algorithm=${e(this.algorithm)}&`\n\t\t\t+ `digits=${e(this.digits)}&`\n\t\t\t+ `period=${e(this.period)}`;\n\t}\n}\n\nexport { TOTP };\n","import { HOTP } from './hotp';\nimport { TOTP } from './totp';\n\n/**\n * Key URI regex (otpauth://TYPE/[ISSUER:]LABEL?PARAMETERS).\n * @type {RegExp}\n */\nconst OTPURI_REGEX = /^otpauth:\\/\\/([ht]otp)\\/(.+)\\?((?:&?[A-Z0-9.~_-]+=[^&]*)+)$/i;\n\n/**\n * RFC 4648 base32 alphabet with pad.\n * @type {RegExp}\n */\nconst SECRET_REGEX = /^[2-7A-Z]+=*$/i;\n\n/**\n * Regex for supported algorithms.\n * @type {RegExp}\n */\nconst ALGORITHM_REGEX = /^SHA(?:1|224|256|384|512|3-224|3-256|3-384|3-512)$/i;\n\n/**\n * Integer regex.\n * @type {RegExp}\n */\nconst INTEGER_REGEX = /^[+-]?\\d+$/;\n\n/**\n * Positive integer regex.\n * @type {RegExp}\n */\nconst POSITIVE_INTEGER_REGEX = /^\\+?[1-9]\\d*$/;\n\n/**\n * HOTP/TOTP object/string conversion.\n * {@link https://github.com/google/google-authenticator/wiki/Key-Uri-Format|Key URI Format}\n */\nclass URI {\n\t/**\n\t * Parses a Google Authenticator key URI and returns an HOTP/TOTP object.\n\t * @param {string} uri Google Authenticator Key URI.\n\t * @returns {HOTP|TOTP} HOTP/TOTP object.\n\t */\n\tstatic parse(uri) {\n\t\tlet uriGroups;\n\n\t\ttry {\n\t\t\turiGroups = uri.match(OTPURI_REGEX);\n\t\t} catch (error) { /* Handled below */ }\n\n\t\tif (!Array.isArray(uriGroups)) {\n\t\t\tthrow new URIError('Invalid URI format');\n\t\t}\n\n\t\t// Extract URI groups.\n\t\tconst uriType = uriGroups[1].toLowerCase();\n\t\tconst uriLabel = uriGroups[2].split(/:(.+)/, 2).map(decodeURIComponent);\n\t\t/** @type {Object.} */\n\t\tconst uriParams = uriGroups[3].split('&').reduce((acc, cur) => {\n\t\t\tconst pairArr = cur.split(/=(.*)/, 2).map(decodeURIComponent);\n\t\t\tconst pairKey = pairArr[0].toLowerCase();\n\t\t\tconst pairVal = pairArr[1];\n\t\t\t/** @type {Object.} */\n\t\t\tconst pairAcc = acc;\n\n\t\t\tpairAcc[pairKey] = pairVal;\n\t\t\treturn pairAcc;\n\t\t}, {});\n\n\t\t// 'OTP' will be instantiated with 'config' argument.\n\t\tlet OTP;\n\t\tconst config = {};\n\n\t\tif (uriType === 'hotp') {\n\t\t\tOTP = HOTP;\n\n\t\t\t// Counter: required\n\t\t\tif (typeof uriParams.counter !== 'undefined' && INTEGER_REGEX.test(uriParams.counter)) {\n\t\t\t\tconfig.counter = parseInt(uriParams.counter, 10);\n\t\t\t} else {\n\t\t\t\tthrow new TypeError('Missing or invalid \\'counter\\' parameter');\n\t\t\t}\n\t\t} else if (uriType === 'totp') {\n\t\t\tOTP = TOTP;\n\n\t\t\t// Period: optional\n\t\t\tif (typeof uriParams.period !== 'undefined') {\n\t\t\t\tif (POSITIVE_INTEGER_REGEX.test(uriParams.period)) {\n\t\t\t\t\tconfig.period = parseInt(uriParams.period, 10);\n\t\t\t\t} else {\n\t\t\t\t\tthrow new TypeError('Invalid \\'period\\' parameter');\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tthrow new TypeError('Unknown OTP type');\n\t\t}\n\n\t\t// Label: required\n\t\t// Issuer: optional\n\t\tif (uriLabel.length === 2) {\n\t\t\tconfig.label = uriLabel[1];\n\t\t\tif (typeof uriParams.issuer === 'undefined') {\n\t\t\t\tconfig.issuer = uriLabel[0];\n\t\t\t} else if (uriParams.issuer === uriLabel[0]) {\n\t\t\t\tconfig.issuer = uriParams.issuer;\n\t\t\t} else {\n\t\t\t\tthrow new TypeError('Invalid \\'issuer\\' parameter');\n\t\t\t}\n\t\t} else {\n\t\t\tconfig.label = uriLabel[0];\n\t\t\tif (typeof uriParams.issuer !== 'undefined') {\n\t\t\t\tconfig.issuer = uriParams.issuer;\n\t\t\t}\n\t\t}\n\n\t\t// Secret: required\n\t\tif (typeof uriParams.secret !== 'undefined' && SECRET_REGEX.test(uriParams.secret)) {\n\t\t\tconfig.secret = uriParams.secret;\n\t\t} else {\n\t\t\tthrow new TypeError('Missing or invalid \\'secret\\' parameter');\n\t\t}\n\n\t\t// Algorithm: optional\n\t\tif (typeof uriParams.algorithm !== 'undefined') {\n\t\t\tif (ALGORITHM_REGEX.test(uriParams.algorithm)) {\n\t\t\t\tconfig.algorithm = uriParams.algorithm;\n\t\t\t} else {\n\t\t\t\tthrow new TypeError('Invalid \\'algorithm\\' parameter');\n\t\t\t}\n\t\t}\n\n\t\t// Digits: optional\n\t\tif (typeof uriParams.digits !== 'undefined') {\n\t\t\tif (POSITIVE_INTEGER_REGEX.test(uriParams.digits)) {\n\t\t\t\tconfig.digits = parseInt(uriParams.digits, 10);\n\t\t\t} else {\n\t\t\t\tthrow new TypeError('Invalid \\'digits\\' parameter');\n\t\t\t}\n\t\t}\n\n\t\treturn new OTP(config);\n\t}\n\n\t/**\n\t * Converts an HOTP/TOTP object to a Google Authenticator key URI.\n\t * @param {HOTP|TOTP} otp HOTP/TOTP object.\n\t * @returns {string} Google Authenticator Key URI.\n\t */\n\tstatic stringify(otp) {\n\t\tif (otp instanceof HOTP || otp instanceof TOTP) {\n\t\t\treturn otp.toString();\n\t\t}\n\n\t\tthrow new TypeError('Invalid \\'HOTP/TOTP\\' object');\n\t}\n}\n\nexport { URI };\n","/**\n * Library version.\n * @type {string}\n */\nconst version = '__OTPAUTH_VERSION__';\n\nexport { version };\n"],"names":["uintToBuf","num","buf","ArrayBuffer","arr","Uint8Array","acc","i","b64Tab","uint8array2packed","existingPacked","existingPackedLen","bigEndianMod","intOffset","byteOffset","packed","existingByteLen","shiftModifier","length","push","value","binLen","getStrConverter","format","utfType","Error","str","existingBin","existingBinLen","parseInt","substr","isNaN","codePnt","codePntArr","j","transposeBytes","byteCnt","charCodeAt","tmpInt","strPart","firstEqual","indexOf","search","replace","charAt","ignore","getOutputConverter","outputBinLen","outputOptions","binarray","outputLength","formatOpts","srcByte","outputUpper","toUpperCase","triplet","int1","int2","b64Pad","String","fromCharCode","retVal","arrView","globalThis","_typeof","Object","defineProperty","prototype","get","this","configurable","__GLOBALTHIS__","self","window","global","isNode","toString","call","process","nodeRequire","eval","NodeBuffer","Buffer","undefined","NodeCrypto","OPENSSL_TO_JSSHA_ALGO","hmacDigest","algorithm","key","message","hmac","createHmac","from","update","digest","buffer","variant","TypeError","jsSHA","setHMACKey","getHMAC","pad","digits","prefix","repeat","ALPHABET","base32ToBuf","cstr","bits","index","idx","base32FromBuf","hexToBuf","hexFromBuf","hex","latin1ToBuf","latin1FromBuf","ENCODER","TextEncoder","DECODER","TextDecoder","utf8ToBuf","encode","utf8FromBuf","decode","BrowserCrypto","crypto","msCrypto","randomBytes","size","getRandomValues","Secret","enumerable","latin1","utf8","base32","timingSafeEqual","a","b","out","HOTP","issuer","defaults","label","secret","counter","fromBase32","generate","token","validate","e","encodeURIComponent","offset","byteLength","otp","delta","generatedToken","TOTP","period","timestamp","Date","now","Math","floor","OTPURI_REGEX","SECRET_REGEX","ALGORITHM_REGEX","INTEGER_REGEX","POSITIVE_INTEGER_REGEX","URI","uri","uriGroups","match","error","Array","isArray","URIError","OTP","uriType","toLowerCase","uriLabel","split","map","decodeURIComponent","uriParams","reduce","cur","pairArr","pairKey","pairVal","pairAcc","config","test","version"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"otpauth.esm.min.js","sources":["../src/utils/encoding/uint.js","../node_modules/jssha/dist/sha.mjs","../src/utils/global-this.js","../src/utils/is-node.js","../src/utils/node-require.js","../src/utils/crypto/hmac-digest.js","../src/utils/pad.js","../src/utils/encoding/base32.js","../src/utils/encoding/hex.js","../src/utils/encoding/latin1.js","../src/utils/encoding/utf8.js","../src/utils/crypto/random-bytes.js","../src/secret.js","../src/utils/crypto/timing-safe-equal.js","../src/hotp.js","../src/totp.js","../src/uri.js","../src/version.js"],"sourcesContent":["/**\n * Converts an integer to an ArrayBuffer.\n * @param {number} num Integer.\n * @returns {ArrayBuffer} ArrayBuffer.\n */\nconst uintToBuf = (num) => {\n\tconst buf = new ArrayBuffer(8);\n\tconst arr = new Uint8Array(buf);\n\tlet acc = num;\n\n\tfor (let i = 7; i >= 0; i--) {\n\t\tif (acc === 0) break;\n\t\tarr[i] = acc & 255;\n\t\tacc -= arr[i];\n\t\tacc /= 256;\n\t}\n\n\treturn buf;\n};\n\n/**\n * Converts an ArrayBuffer to an integer.\n * @param {ArrayBuffer} buf ArrayBuffer.\n * @returns {number} Integer.\n */\nconst uintFromBuf = (buf) => {\n\tconst arr = new Uint8Array(buf);\n\tlet num = 0;\n\n\tfor (let i = 0; i < arr.length; i++) {\n\t\tif (arr[i] !== 0) {\n\t\t\tnum *= 256;\n\t\t\tnum += arr[i];\n\t\t}\n\t}\n\n\treturn num;\n};\n\nexport { uintToBuf, uintFromBuf };\n","/**\n * A JavaScript implementation of the SHA family of hashes - defined in FIPS PUB 180-4, FIPS PUB 202,\n * and SP 800-185 - as well as the corresponding HMAC implementation as defined in FIPS PUB 198-1.\n *\n * Copyright 2008-2020 Brian Turek, 1998-2009 Paul Johnston & Contributors\n * Distributed under the BSD License\n * See http://caligatio.github.com/jsSHA/ for more information\n */\nconst t=\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\";function n(t,n,e,r){let i,s,o;const h=n||[0],u=(e=e||0)>>>3,w=-1===r?3:0;for(i=0;i>>2,h.length<=s&&h.push(0),h[s]|=t[i]<<8*(w+r*(o%4));return{value:h,binLen:8*t.length+e}}function e(e,r,i){switch(r){case\"UTF8\":case\"UTF16BE\":case\"UTF16LE\":break;default:throw new Error(\"encoding must be UTF8, UTF16BE, or UTF16LE\")}switch(e){case\"HEX\":return function(t,n,e){return function(t,n,e,r){let i,s,o,h;if(0!=t.length%2)throw new Error(\"String of HEX type must be in byte increments\");const u=n||[0],w=(e=e||0)>>>3,c=-1===r?3:0;for(i=0;i>>1)+w,o=h>>>2;u.length<=o;)u.push(0);u[o]|=s<<8*(c+r*(h%4))}return{value:u,binLen:4*t.length+e}}(t,n,e,i)};case\"TEXT\":return function(t,n,e){return function(t,n,e,r,i){let s,o,h,u,w,c,f,a,l=0;const A=e||[0],E=(r=r||0)>>>3;if(\"UTF8\"===n)for(f=-1===i?3:0,h=0;hs?o.push(s):2048>s?(o.push(192|s>>>6),o.push(128|63&s)):55296>s||57344<=s?o.push(224|s>>>12,128|s>>>6&63,128|63&s):(h+=1,s=65536+((1023&s)<<10|1023&t.charCodeAt(h)),o.push(240|s>>>18,128|s>>>12&63,128|s>>>6&63,128|63&s)),u=0;u>>2;A.length<=w;)A.push(0);A[w]|=o[u]<<8*(f+i*(c%4)),l+=1}else for(f=-1===i?2:0,a=\"UTF16LE\"===n&&1!==i||\"UTF16LE\"!==n&&1===i,h=0;h>>8),c=l+E,w=c>>>2;A.length<=w;)A.push(0);A[w]|=s<<8*(f+i*(c%4)),l+=2}return{value:A,binLen:8*l+r}}(t,r,n,e,i)};case\"B64\":return function(n,e,r){return function(n,e,r,i){let s,o,h,u,w,c,f,a=0;const l=e||[0],A=(r=r||0)>>>3,E=-1===i?3:0,H=n.indexOf(\"=\");if(-1===n.search(/^[a-zA-Z0-9=+/]+$/))throw new Error(\"Invalid character in base-64 string\");if(n=n.replace(/=/g,\"\"),-1!==H&&H {};\n\nexport { nodeRequire };\n","import jsSHA from 'jssha';\n\nimport { globalThis } from '../global-this';\nimport { isNode } from '../is-node';\nimport { nodeRequire } from '../node-require';\n\nconst NodeBuffer = isNode ? globalThis.Buffer : undefined;\nconst NodeCrypto = isNode ? nodeRequire('crypto') : undefined;\n\n/**\n * OpenSSL to jsSHA algorithms.\n * @type {Object.}\n */\nconst OPENSSL_TO_JSSHA_ALGO = {\n\t'SHA1': 'SHA-1',\n\t'SHA224': 'SHA-224',\n\t'SHA256': 'SHA-256',\n\t'SHA384': 'SHA-384',\n\t'SHA512': 'SHA-512',\n\t'SHA3-224': 'SHA3-224',\n\t'SHA3-256': 'SHA3-256',\n\t'SHA3-384': 'SHA3-384',\n\t'SHA3-512': 'SHA3-512',\n};\n\n/**\n * Calculates an HMAC digest.\n * In Node.js, the command \"openssl list -digest-algorithms\" displays the available digest algorithms.\n * @param {string} algorithm Algorithm.\n * @param {ArrayBuffer} key Key.\n * @param {ArrayBuffer} message Message.\n * @returns {ArrayBuffer} Digest.\n */\nconst hmacDigest = (algorithm, key, message) => {\n\tif (isNode) {\n\t\tconst hmac = NodeCrypto.createHmac(algorithm, NodeBuffer.from(key));\n\t\thmac.update(NodeBuffer.from(message));\n\t\treturn hmac.digest().buffer;\n\t} else {\n\t\tconst variant = OPENSSL_TO_JSSHA_ALGO[algorithm.toUpperCase()];\n\t\tif (typeof variant === 'undefined') {\n\t\t\tthrow new TypeError('Unknown hash function');\n\t\t}\n\t\t// @ts-ignore\n\t\t// eslint-disable-next-line @babel/new-cap\n\t\tconst hmac = new jsSHA(variant, 'ARRAYBUFFER');\n\t\thmac.setHMACKey(key, 'ARRAYBUFFER');\n\t\thmac.update(message);\n\t\treturn hmac.getHMAC('ARRAYBUFFER');\n\t}\n};\n\nexport { hmacDigest };\n","/**\n * Pads a number with leading zeros.\n * @param {number|string} num Number.\n * @param {number} digits Digits.\n * @returns {string} Padded number.\n */\nconst pad = (num, digits) => {\n\tlet prefix = '';\n\tlet repeat = digits - String(num).length;\n\twhile (repeat-- > 0) prefix += '0';\n\treturn `${prefix}${num}`;\n};\n\nexport { pad };\n","/**\n * RFC 4648 base32 alphabet without pad.\n * @type {string}\n */\nconst ALPHABET = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ234567';\n\n/**\n * Converts a base32 string to an ArrayBuffer (RFC 4648).\n * {@link https://github.com/LinusU/base32-decode|LinusU/base32-decode}\n * @param {string} str Base32 string.\n * @returns {ArrayBuffer} ArrayBuffer.\n */\nconst base32ToBuf = (str) => {\n\t// Canonicalize to all upper case and remove padding if it exists.\n\tconst cstr = str.toUpperCase().replace(/=+$/, '');\n\n\tconst buf = new ArrayBuffer((cstr.length * 5) / 8 | 0);\n\tconst arr = new Uint8Array(buf);\n\tlet bits = 0;\n\tlet value = 0;\n\tlet index = 0;\n\n\tfor (let i = 0; i < cstr.length; i++) {\n\t\tconst idx = ALPHABET.indexOf(cstr[i]);\n\t\tif (idx === -1) throw new TypeError(`Invalid character found: ${cstr[i]}`);\n\n\t\tvalue = (value << 5) | idx;\n\t\tbits += 5;\n\n\t\tif (bits >= 8) {\n\t\t\tarr[index++] = (value >>> bits - 8) & 255;\n\t\t\tbits -= 8;\n\t\t}\n\t}\n\n\treturn buf;\n};\n\n/**\n * Converts an ArrayBuffer to a base32 string (RFC 4648).\n * {@link https://github.com/LinusU/base32-encode|LinusU/base32-encode}\n * @param {ArrayBuffer} buf ArrayBuffer.\n * @returns {string} Base32 string.\n */\nconst base32FromBuf = (buf) => {\n\tconst arr = new Uint8Array(buf);\n\tlet bits = 0;\n\tlet value = 0;\n\tlet str = '';\n\n\tfor (let i = 0; i < arr.length; i++) {\n\t\tvalue = (value << 8) | arr[i];\n\t\tbits += 8;\n\n\t\twhile (bits >= 5) {\n\t\t\tstr += ALPHABET[(value >>> bits - 5) & 31];\n\t\t\tbits -= 5;\n\t\t}\n\t}\n\n\tif (bits > 0) {\n\t\tstr += ALPHABET[(value << 5 - bits) & 31];\n\t}\n\n\treturn str;\n};\n\nexport { base32ToBuf, base32FromBuf };\n","/**\n * Converts a hexadecimal string to an ArrayBuffer.\n * @param {string} str Hexadecimal string.\n * @returns {ArrayBuffer} ArrayBuffer.\n */\nconst hexToBuf = (str) => {\n\tconst buf = new ArrayBuffer(str.length / 2);\n\tconst arr = new Uint8Array(buf);\n\n\tfor (let i = 0; i < str.length; i += 2) {\n\t\tarr[i / 2] = parseInt(str.substr(i, 2), 16);\n\t}\n\n\treturn buf;\n};\n\n/**\n * Converts an ArrayBuffer to a hexadecimal string.\n * @param {ArrayBuffer} buf ArrayBuffer.\n * @returns {string} Hexadecimal string.\n */\nconst hexFromBuf = (buf) => {\n\tconst arr = new Uint8Array(buf);\n\tlet str = '';\n\n\tfor (let i = 0; i < arr.length; i++) {\n\t\tconst hex = arr[i].toString(16);\n\t\tif (hex.length === 1) str += '0';\n\t\tstr += hex;\n\t}\n\n\treturn str.toUpperCase();\n};\n\nexport { hexToBuf, hexFromBuf };\n","/**\n * Converts a Latin-1 string to an ArrayBuffer.\n * @param {string} str Latin-1 string.\n * @returns {ArrayBuffer} ArrayBuffer.\n */\nconst latin1ToBuf = (str) => {\n\tconst buf = new ArrayBuffer(str.length);\n\tconst arr = new Uint8Array(buf);\n\n\tfor (let i = 0; i < str.length; i++) {\n\t\tarr[i] = str.charCodeAt(i) & 0xFF;\n\t}\n\n\treturn buf;\n};\n\n/**\n * Converts an ArrayBuffer to a Latin-1 string.\n * @param {ArrayBuffer} buf ArrayBuffer.\n * @returns {string} Latin-1 string.\n */\nconst latin1FromBuf = (buf) => {\n\tconst arr = new Uint8Array(buf);\n\tlet str = '';\n\n\tfor (let i = 0; i < arr.length; i++) {\n\t\tstr += String.fromCharCode(arr[i]);\n\t}\n\n\treturn str;\n};\n\nexport { latin1ToBuf, latin1FromBuf };\n","import { globalThis } from '../global-this';\n\n/**\n * TextEncoder instance.\n * @type {TextEncoder|null}\n */\nconst ENCODER = globalThis.TextEncoder\n\t? new globalThis.TextEncoder('utf-8')\n\t: null;\n\n/**\n * TextDecoder instance.\n * @type {TextDecoder|null}\n */\nconst DECODER = globalThis.TextDecoder\n\t? new globalThis.TextDecoder('utf-8')\n\t: null;\n\n/**\n * Converts an UTF-8 string to an ArrayBuffer.\n * @param {string} str String.\n * @returns {ArrayBuffer} ArrayBuffer.\n */\nconst utf8ToBuf = (str) => {\n\tif (!ENCODER) {\n\t\tthrow new Error('Encoding API not available');\n\t}\n\n\treturn ENCODER.encode(str).buffer;\n};\n\n/**\n * Converts an ArrayBuffer to an UTF-8 string.\n * @param {ArrayBuffer} buf ArrayBuffer.\n * @returns {string} String.\n */\nconst utf8FromBuf = (buf) => {\n\tif (!DECODER) {\n\t\tthrow new Error('Encoding API not available');\n\t}\n\n\treturn DECODER.decode(buf);\n};\n\nexport { utf8ToBuf, utf8FromBuf };\n","import { globalThis } from '../global-this';\nimport { isNode } from '../is-node';\nimport { nodeRequire } from '../node-require';\n\nconst NodeCrypto = isNode ? nodeRequire('crypto') : undefined;\nconst BrowserCrypto = !isNode ? globalThis.crypto || globalThis.msCrypto : undefined;\n\n/**\n * Returns random bytes.\n * @param {number} size Size.\n * @returns {ArrayBuffer} Random bytes.\n */\nconst randomBytes = (size) => {\n\tif (isNode) {\n\t\treturn NodeCrypto.randomBytes(size).buffer;\n\t} else {\n\t\tif (!BrowserCrypto || !BrowserCrypto.getRandomValues) {\n\t\t\tthrow new Error('Cryptography API not available');\n\t\t}\n\t\treturn BrowserCrypto.getRandomValues(new Uint8Array(size)).buffer;\n\t}\n};\n\nexport { randomBytes };\n","import { base32ToBuf, base32FromBuf } from './utils/encoding/base32';\nimport { hexToBuf, hexFromBuf } from './utils/encoding/hex';\nimport { latin1ToBuf, latin1FromBuf } from './utils/encoding/latin1';\nimport { utf8ToBuf, utf8FromBuf } from './utils/encoding/utf8';\nimport { randomBytes } from './utils/crypto/random-bytes';\n\n/**\n * OTP secret key.\n */\nclass Secret {\n\t/**\n\t * Creates a secret key object.\n\t * @param {Object} [config] Configuration options.\n\t * @param {ArrayBuffer} [config.buffer=randomBytes] Secret key.\n\t * @param {number} [config.size=20] Number of random bytes to generate, ignored if 'buffer' is provided.\n\t */\n\tconstructor({ buffer, size = 20 } = {}) {\n\t\t/**\n\t\t * Secret key.\n\t\t * @type {ArrayBuffer}\n\t\t */\n\t\tthis.buffer = typeof buffer === 'undefined'\n\t\t\t? randomBytes(size)\n\t\t\t: buffer;\n\t}\n\n\t/**\n\t * Converts a Latin-1 string to a Secret object.\n\t * @param {string} str Latin-1 string.\n\t * @returns {Secret} Secret object.\n\t */\n\tstatic fromLatin1(str) {\n\t\treturn new Secret({ buffer: latin1ToBuf(str) });\n\t}\n\n\t/**\n\t * Converts an UTF-8 string to a Secret object.\n\t * @param {string} str UTF-8 string.\n\t * @returns {Secret} Secret object.\n\t */\n\tstatic fromUTF8(str) {\n\t\treturn new Secret({ buffer: utf8ToBuf(str) });\n\t}\n\n\t/**\n\t * Converts a base32 string to a Secret object.\n\t * @param {string} str Base32 string.\n\t * @returns {Secret} Secret object.\n\t */\n\tstatic fromBase32(str) {\n\t\treturn new Secret({ buffer: base32ToBuf(str) });\n\t}\n\n\t/**\n\t * Converts a hexadecimal string to a Secret object.\n\t * @param {string} str Hexadecimal string.\n\t * @returns {Secret} Secret object.\n\t */\n\tstatic fromHex(str) {\n\t\treturn new Secret({ buffer: hexToBuf(str) });\n\t}\n\n\t/**\n\t * Latin-1 string representation of secret key.\n\t * @type {string}\n\t */\n\tget latin1() {\n\t\tObject.defineProperty(this, 'latin1', {\n\t\t\tenumerable: true,\n\t\t\tvalue: latin1FromBuf(this.buffer),\n\t\t});\n\n\t\treturn this.latin1;\n\t}\n\n\t/**\n\t * UTF-8 string representation of secret key.\n\t * @type {string}\n\t */\n\tget utf8() {\n\t\tObject.defineProperty(this, 'utf8', {\n\t\t\tenumerable: true,\n\t\t\tvalue: utf8FromBuf(this.buffer),\n\t\t});\n\n\t\treturn this.utf8;\n\t}\n\n\t/**\n\t * Base32 string representation of secret key.\n\t * @type {string}\n\t */\n\tget base32() {\n\t\tObject.defineProperty(this, 'base32', {\n\t\t\tenumerable: true,\n\t\t\tvalue: base32FromBuf(this.buffer),\n\t\t});\n\n\t\treturn this.base32;\n\t}\n\n\t/**\n\t * Hexadecimal string representation of secret key.\n\t * @type {string}\n\t */\n\tget hex() {\n\t\tObject.defineProperty(this, 'hex', {\n\t\t\tenumerable: true,\n\t\t\tvalue: hexFromBuf(this.buffer),\n\t\t});\n\n\t\treturn this.hex;\n\t}\n}\n\nexport { Secret };\n","import { globalThis } from '../global-this';\nimport { isNode } from '../is-node';\nimport { nodeRequire } from '../node-require';\n\nconst NodeBuffer = isNode ? globalThis.Buffer : undefined;\nconst NodeCrypto = isNode ? nodeRequire('crypto') : undefined;\n\n/**\n * Returns true if a is equal to b, without leaking timing information that would allow an attacker to guess one of the values.\n * @param {string} a String a.\n * @param {string} b String b.\n * @returns {boolean} Equality result.\n */\nconst timingSafeEqual = (a, b) => {\n\tif (isNode) {\n\t\treturn NodeCrypto.timingSafeEqual(NodeBuffer.from(a), NodeBuffer.from(b));\n\t} else {\n\t\tif (a.length !== b.length) {\n\t\t\tthrow new TypeError('Input strings must have the same length');\n\t\t}\n\t\tlet i = -1;\n\t\tlet out = 0;\n\t\twhile (++i < a.length) {\n\t\t\tout |= a.charCodeAt(i) ^ b.charCodeAt(i);\n\t\t}\n\t\treturn out === 0;\n\t}\n};\n\nexport { timingSafeEqual };\n","import { uintToBuf } from './utils/encoding/uint';\nimport { hmacDigest } from './utils/crypto/hmac-digest';\nimport { pad } from './utils/pad';\nimport { Secret } from './secret';\nimport { timingSafeEqual } from './utils/crypto/timing-safe-equal';\n\n/**\n * HOTP: An HMAC-based One-time Password Algorithm.\n * {@link https://tools.ietf.org/html/rfc4226|RFC 4226}\n */\nclass HOTP {\n\t/**\n\t * Default configuration.\n\t * @type {{\n\t * issuer: string,\n\t * label: string,\n\t * algorithm: string,\n\t * digits: number,\n\t * counter: number\n\t * window: number\n\t * }}\n\t */\n\tstatic get defaults() {\n\t\treturn {\n\t\t\tissuer: '',\n\t\t\tlabel: 'OTPAuth',\n\t\t\talgorithm: 'SHA1',\n\t\t\tdigits: 6,\n\t\t\tcounter: 0,\n\t\t\twindow: 1,\n\t\t};\n\t}\n\n\t/**\n\t * Creates an HOTP object.\n\t * @param {Object} [config] Configuration options.\n\t * @param {string} [config.issuer=''] Account provider.\n\t * @param {string} [config.label='OTPAuth'] Account label.\n\t * @param {Secret|string} [config.secret=Secret] Secret key.\n\t * @param {string} [config.algorithm='SHA1'] HMAC hashing algorithm.\n\t * @param {number} [config.digits=6] Token length.\n\t * @param {number} [config.counter=0] Initial counter value.\n\t */\n\tconstructor({\n\t\tissuer = HOTP.defaults.issuer,\n\t\tlabel = HOTP.defaults.label,\n\t\tsecret = new Secret(),\n\t\talgorithm = HOTP.defaults.algorithm,\n\t\tdigits = HOTP.defaults.digits,\n\t\tcounter = HOTP.defaults.counter,\n\t} = {}) {\n\t\t/**\n\t\t * Account provider.\n\t\t * @type {string}\n\t\t */\n\t\tthis.issuer = issuer;\n\t\t/**\n\t\t * Account label.\n\t\t * @type {string}\n\t\t */\n\t\tthis.label = label;\n\t\t/**\n\t\t * Secret key.\n\t\t * @type {Secret}\n\t\t */\n\t\tthis.secret = typeof secret === 'string'\n\t\t\t? Secret.fromBase32(secret)\n\t\t\t: secret;\n\t\t/**\n\t\t * HMAC hashing algorithm.\n\t\t * @type {string}\n\t\t */\n\t\tthis.algorithm = algorithm.toUpperCase();\n\t\t/**\n\t\t * Token length.\n\t\t * @type {number}\n\t\t */\n\t\tthis.digits = digits;\n\t\t/**\n\t\t * Initial counter value.\n\t\t * @type {number}\n\t\t */\n\t\tthis.counter = counter;\n\t}\n\n\t/**\n\t * Generates an HOTP token.\n\t * @param {Object} config Configuration options.\n\t * @param {Secret} config.secret Secret key.\n\t * @param {string} [config.algorithm='SHA1'] HMAC hashing algorithm.\n\t * @param {number} [config.digits=6] Token length.\n\t * @param {number} [config.counter=0] Counter value.\n\t * @returns {string} Token.\n\t */\n\tstatic generate({\n\t\tsecret,\n\t\talgorithm = HOTP.defaults.algorithm,\n\t\tdigits = HOTP.defaults.digits,\n\t\tcounter = HOTP.defaults.counter,\n\t}) {\n\t\tconst digest = new Uint8Array(hmacDigest(algorithm, secret.buffer, uintToBuf(counter)));\n\t\tconst offset = digest[digest.byteLength - 1] & 15;\n\t\tconst otp = (\n\t\t\t((digest[offset] & 127) << 24)\n\t\t\t| ((digest[offset + 1] & 255) << 16)\n\t\t\t| ((digest[offset + 2] & 255) << 8)\n\t\t\t| (digest[offset + 3] & 255)\n\t\t) % (10 ** digits);\n\n\t\treturn pad(otp, digits);\n\t}\n\n\t/**\n\t * Generates an HOTP token.\n\t * @param {Object} [config] Configuration options.\n\t * @param {number} [config.counter=this.counter++] Counter value.\n\t * @returns {string} Token.\n\t */\n\tgenerate({\n\t\tcounter = this.counter++,\n\t} = {}) {\n\t\treturn HOTP.generate({\n\t\t\tsecret: this.secret,\n\t\t\talgorithm: this.algorithm,\n\t\t\tdigits: this.digits,\n\t\t\tcounter,\n\t\t});\n\t}\n\n\t/**\n\t * Validates an HOTP token.\n\t * @param {Object} config Configuration options.\n\t * @param {string} config.token Token value.\n\t * @param {Secret} config.secret Secret key.\n\t * @param {string} [config.algorithm='SHA1'] HMAC hashing algorithm.\n\t * @param {number} config.digits Token length.\n\t * @param {number} [config.counter=0] Counter value.\n\t * @param {number} [config.window=1] Window of counter values to test.\n\t * @returns {number|null} Token delta, or null if the token is not found.\n\t */\n\tstatic validate({\n\t\ttoken,\n\t\tsecret,\n\t\talgorithm,\n\t\tdigits,\n\t\tcounter = HOTP.defaults.counter,\n\t\twindow = HOTP.defaults.window,\n\t}) {\n\t\t// Return early if the token length does not match the digit number.\n\t\tif (token.length !== digits) return null;\n\n\t\tlet delta = null;\n\n\t\tfor (let i = counter - window; i <= counter + window; ++i) {\n\t\t\tconst generatedToken = HOTP.generate({\n\t\t\t\tsecret,\n\t\t\t\talgorithm,\n\t\t\t\tdigits,\n\t\t\t\tcounter: i,\n\t\t\t});\n\n\t\t\tif (timingSafeEqual(token, generatedToken)) {\n\t\t\t\tdelta = i - counter;\n\t\t\t}\n\t\t}\n\n\t\treturn delta;\n\t}\n\n\t/**\n\t * Validates an HOTP token.\n\t * @param {Object} config Configuration options.\n\t * @param {string} config.token Token value.\n\t * @param {number} [config.counter=this.counter] Counter value.\n\t * @param {number} [config.window=1] Window of counter values to test.\n\t * @returns {number|null} Token delta, or null if the token is not found.\n\t */\n\tvalidate({\n\t\ttoken,\n\t\tcounter = this.counter,\n\t\twindow,\n\t}) {\n\t\treturn HOTP.validate({\n\t\t\ttoken,\n\t\t\tsecret: this.secret,\n\t\t\talgorithm: this.algorithm,\n\t\t\tdigits: this.digits,\n\t\t\tcounter,\n\t\t\twindow,\n\t\t});\n\t}\n\n\t/**\n\t * Returns a Google Authenticator key URI.\n\t * @returns {string} URI.\n\t */\n\ttoString() {\n\t\tconst e = encodeURIComponent;\n\t\treturn 'otpauth://hotp/'\n\t\t\t+ `${this.issuer.length > 0\n\t\t\t\t? `${e(this.issuer)}:${e(this.label)}?issuer=${e(this.issuer)}&`\n\t\t\t\t: `${e(this.label)}?`}`\n\t\t\t+ `secret=${e(this.secret.base32)}&`\n\t\t\t+ `algorithm=${e(this.algorithm)}&`\n\t\t\t+ `digits=${e(this.digits)}&`\n\t\t\t+ `counter=${e(this.counter)}`;\n\t}\n}\n\nexport { HOTP };\n","import { HOTP } from './hotp';\nimport { Secret } from './secret';\n\n/**\n * TOTP: Time-Based One-Time Password Algorithm.\n * {@link https://tools.ietf.org/html/rfc6238|RFC 6238}\n */\nclass TOTP {\n\t/**\n\t * Default configuration.\n\t * @type {{\n\t * issuer: string,\n\t * label: string,\n\t * algorithm: string,\n\t * digits: number,\n\t * period: number\n\t * window: number\n\t * }}\n\t */\n\tstatic get defaults() {\n\t\treturn {\n\t\t\tissuer: '',\n\t\t\tlabel: 'OTPAuth',\n\t\t\talgorithm: 'SHA1',\n\t\t\tdigits: 6,\n\t\t\tperiod: 30,\n\t\t\twindow: 1,\n\t\t};\n\t}\n\n\t/**\n\t * Creates a TOTP object.\n\t * @param {Object} [config] Configuration options.\n\t * @param {string} [config.issuer=''] Account provider.\n\t * @param {string} [config.label='OTPAuth'] Account label.\n\t * @param {Secret|string} [config.secret=Secret] Secret key.\n\t * @param {string} [config.algorithm='SHA1'] HMAC hashing algorithm.\n\t * @param {number} [config.digits=6] Token length.\n\t * @param {number} [config.period=30] Token time-step duration.\n\t */\n\tconstructor({\n\t\tissuer = TOTP.defaults.issuer,\n\t\tlabel = TOTP.defaults.label,\n\t\tsecret = new Secret(),\n\t\talgorithm = TOTP.defaults.algorithm,\n\t\tdigits = TOTP.defaults.digits,\n\t\tperiod = TOTP.defaults.period,\n\t} = {}) {\n\t\t/**\n\t\t * Account provider.\n\t\t * @type {string}\n\t\t */\n\t\tthis.issuer = issuer;\n\t\t/**\n\t\t * Account label.\n\t\t * @type {string}\n\t\t */\n\t\tthis.label = label;\n\t\t/**\n\t\t * Secret key.\n\t\t * @type {Secret}\n\t\t */\n\t\tthis.secret = typeof secret === 'string'\n\t\t\t? Secret.fromBase32(secret)\n\t\t\t: secret;\n\t\t/**\n\t\t * HMAC hashing algorithm.\n\t\t * @type {string}\n\t\t */\n\t\tthis.algorithm = algorithm.toUpperCase();\n\t\t/**\n\t\t * Token length.\n\t\t * @type {number}\n\t\t */\n\t\tthis.digits = digits;\n\t\t/**\n\t\t * Token time-step duration.\n\t\t * @type {number}\n\t\t */\n\t\tthis.period = period;\n\t}\n\n\t/**\n\t * Generates a TOTP token.\n\t * @param {Object} config Configuration options.\n\t * @param {Secret} config.secret Secret key.\n\t * @param {string} [config.algorithm='SHA1'] HMAC hashing algorithm.\n\t * @param {number} [config.digits=6] Token length.\n\t * @param {number} [config.period=30] Token time-step duration.\n\t * @param {number} [config.timestamp=Date.now] Timestamp value in milliseconds.\n\t * @returns {string} Token.\n\t */\n\tstatic generate({\n\t\tsecret,\n\t\talgorithm,\n\t\tdigits,\n\t\tperiod = TOTP.defaults.period,\n\t\ttimestamp = Date.now(),\n\t}) {\n\t\treturn HOTP.generate({\n\t\t\tsecret,\n\t\t\talgorithm,\n\t\t\tdigits,\n\t\t\tcounter: Math.floor(timestamp / 1000 / period),\n\t\t});\n\t}\n\n\t/**\n\t * Generates a TOTP token.\n\t * @param {Object} [config] Configuration options.\n\t * @param {number} [config.timestamp=Date.now] Timestamp value in milliseconds.\n\t * @returns {string} Token.\n\t */\n\tgenerate({\n\t\ttimestamp = Date.now(),\n\t} = {}) {\n\t\treturn TOTP.generate({\n\t\t\tsecret: this.secret,\n\t\t\talgorithm: this.algorithm,\n\t\t\tdigits: this.digits,\n\t\t\tperiod: this.period,\n\t\t\ttimestamp,\n\t\t});\n\t}\n\n\t/**\n\t * Validates a TOTP token.\n\t * @param {Object} config Configuration options.\n\t * @param {string} config.token Token value.\n\t * @param {Secret} config.secret Secret key.\n\t * @param {string} [config.algorithm='SHA1'] HMAC hashing algorithm.\n\t * @param {number} config.digits Token length.\n\t * @param {number} [config.period=30] Token time-step duration.\n\t * @param {number} [config.timestamp=Date.now] Timestamp value in milliseconds.\n\t * @param {number} [config.window=1] Window of counter values to test.\n\t * @returns {number|null} Token delta, or null if the token is not found.\n\t */\n\tstatic validate({\n\t\ttoken,\n\t\tsecret,\n\t\talgorithm,\n\t\tdigits,\n\t\tperiod = TOTP.defaults.period,\n\t\ttimestamp = Date.now(),\n\t\twindow,\n\t}) {\n\t\treturn HOTP.validate({\n\t\t\ttoken,\n\t\t\tsecret,\n\t\t\talgorithm,\n\t\t\tdigits,\n\t\t\tcounter: Math.floor(timestamp / 1000 / period),\n\t\t\twindow,\n\t\t});\n\t}\n\n\t/**\n\t * Validates a TOTP token.\n\t * @param {Object} config Configuration options.\n\t * @param {string} config.token Token value.\n\t * @param {number} [config.timestamp=Date.now] Timestamp value in milliseconds.\n\t * @param {number} [config.window=1] Window of counter values to test.\n\t * @returns {number|null} Token delta, or null if the token is not found.\n\t */\n\tvalidate({\n\t\ttoken,\n\t\ttimestamp,\n\t\twindow,\n\t}) {\n\t\treturn TOTP.validate({\n\t\t\ttoken,\n\t\t\tsecret: this.secret,\n\t\t\talgorithm: this.algorithm,\n\t\t\tdigits: this.digits,\n\t\t\tperiod: this.period,\n\t\t\ttimestamp,\n\t\t\twindow,\n\t\t});\n\t}\n\n\t/**\n\t * Returns a Google Authenticator key URI.\n\t * @returns {string} URI.\n\t */\n\ttoString() {\n\t\tconst e = encodeURIComponent;\n\t\treturn 'otpauth://totp/'\n\t\t\t+ `${this.issuer.length > 0\n\t\t\t\t? `${e(this.issuer)}:${e(this.label)}?issuer=${e(this.issuer)}&`\n\t\t\t\t: `${e(this.label)}?`}`\n\t\t\t+ `secret=${e(this.secret.base32)}&`\n\t\t\t+ `algorithm=${e(this.algorithm)}&`\n\t\t\t+ `digits=${e(this.digits)}&`\n\t\t\t+ `period=${e(this.period)}`;\n\t}\n}\n\nexport { TOTP };\n","import { HOTP } from './hotp';\nimport { TOTP } from './totp';\n\n/**\n * Key URI regex (otpauth://TYPE/[ISSUER:]LABEL?PARAMETERS).\n * @type {RegExp}\n */\nconst OTPURI_REGEX = /^otpauth:\\/\\/([ht]otp)\\/(.+)\\?((?:&?[A-Z0-9.~_-]+=[^&]*)+)$/i;\n\n/**\n * RFC 4648 base32 alphabet with pad.\n * @type {RegExp}\n */\nconst SECRET_REGEX = /^[2-7A-Z]+=*$/i;\n\n/**\n * Regex for supported algorithms.\n * @type {RegExp}\n */\nconst ALGORITHM_REGEX = /^SHA(?:1|224|256|384|512|3-224|3-256|3-384|3-512)$/i;\n\n/**\n * Integer regex.\n * @type {RegExp}\n */\nconst INTEGER_REGEX = /^[+-]?\\d+$/;\n\n/**\n * Positive integer regex.\n * @type {RegExp}\n */\nconst POSITIVE_INTEGER_REGEX = /^\\+?[1-9]\\d*$/;\n\n/**\n * HOTP/TOTP object/string conversion.\n * {@link https://github.com/google/google-authenticator/wiki/Key-Uri-Format|Key URI Format}\n */\nclass URI {\n\t/**\n\t * Parses a Google Authenticator key URI and returns an HOTP/TOTP object.\n\t * @param {string} uri Google Authenticator Key URI.\n\t * @returns {HOTP|TOTP} HOTP/TOTP object.\n\t */\n\tstatic parse(uri) {\n\t\tlet uriGroups;\n\n\t\ttry {\n\t\t\turiGroups = uri.match(OTPURI_REGEX);\n\t\t} catch (error) { /* Handled below */ }\n\n\t\tif (!Array.isArray(uriGroups)) {\n\t\t\tthrow new URIError('Invalid URI format');\n\t\t}\n\n\t\t// Extract URI groups.\n\t\tconst uriType = uriGroups[1].toLowerCase();\n\t\tconst uriLabel = uriGroups[2].split(/:(.+)/, 2).map(decodeURIComponent);\n\t\t/** @type {Object.} */\n\t\tconst uriParams = uriGroups[3].split('&').reduce((acc, cur) => {\n\t\t\tconst pairArr = cur.split(/=(.*)/, 2).map(decodeURIComponent);\n\t\t\tconst pairKey = pairArr[0].toLowerCase();\n\t\t\tconst pairVal = pairArr[1];\n\t\t\t/** @type {Object.} */\n\t\t\tconst pairAcc = acc;\n\n\t\t\tpairAcc[pairKey] = pairVal;\n\t\t\treturn pairAcc;\n\t\t}, {});\n\n\t\t// 'OTP' will be instantiated with 'config' argument.\n\t\tlet OTP;\n\t\tconst config = {};\n\n\t\tif (uriType === 'hotp') {\n\t\t\tOTP = HOTP;\n\n\t\t\t// Counter: required\n\t\t\tif (typeof uriParams.counter !== 'undefined' && INTEGER_REGEX.test(uriParams.counter)) {\n\t\t\t\tconfig.counter = parseInt(uriParams.counter, 10);\n\t\t\t} else {\n\t\t\t\tthrow new TypeError('Missing or invalid \\'counter\\' parameter');\n\t\t\t}\n\t\t} else if (uriType === 'totp') {\n\t\t\tOTP = TOTP;\n\n\t\t\t// Period: optional\n\t\t\tif (typeof uriParams.period !== 'undefined') {\n\t\t\t\tif (POSITIVE_INTEGER_REGEX.test(uriParams.period)) {\n\t\t\t\t\tconfig.period = parseInt(uriParams.period, 10);\n\t\t\t\t} else {\n\t\t\t\t\tthrow new TypeError('Invalid \\'period\\' parameter');\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tthrow new TypeError('Unknown OTP type');\n\t\t}\n\n\t\t// Label: required\n\t\t// Issuer: optional\n\t\tif (uriLabel.length === 2) {\n\t\t\tconfig.label = uriLabel[1];\n\t\t\tif (typeof uriParams.issuer === 'undefined') {\n\t\t\t\tconfig.issuer = uriLabel[0];\n\t\t\t} else if (uriParams.issuer === uriLabel[0]) {\n\t\t\t\tconfig.issuer = uriParams.issuer;\n\t\t\t} else {\n\t\t\t\tthrow new TypeError('Invalid \\'issuer\\' parameter');\n\t\t\t}\n\t\t} else {\n\t\t\tconfig.label = uriLabel[0];\n\t\t\tif (typeof uriParams.issuer !== 'undefined') {\n\t\t\t\tconfig.issuer = uriParams.issuer;\n\t\t\t}\n\t\t}\n\n\t\t// Secret: required\n\t\tif (typeof uriParams.secret !== 'undefined' && SECRET_REGEX.test(uriParams.secret)) {\n\t\t\tconfig.secret = uriParams.secret;\n\t\t} else {\n\t\t\tthrow new TypeError('Missing or invalid \\'secret\\' parameter');\n\t\t}\n\n\t\t// Algorithm: optional\n\t\tif (typeof uriParams.algorithm !== 'undefined') {\n\t\t\tif (ALGORITHM_REGEX.test(uriParams.algorithm)) {\n\t\t\t\tconfig.algorithm = uriParams.algorithm;\n\t\t\t} else {\n\t\t\t\tthrow new TypeError('Invalid \\'algorithm\\' parameter');\n\t\t\t}\n\t\t}\n\n\t\t// Digits: optional\n\t\tif (typeof uriParams.digits !== 'undefined') {\n\t\t\tif (POSITIVE_INTEGER_REGEX.test(uriParams.digits)) {\n\t\t\t\tconfig.digits = parseInt(uriParams.digits, 10);\n\t\t\t} else {\n\t\t\t\tthrow new TypeError('Invalid \\'digits\\' parameter');\n\t\t\t}\n\t\t}\n\n\t\treturn new OTP(config);\n\t}\n\n\t/**\n\t * Converts an HOTP/TOTP object to a Google Authenticator key URI.\n\t * @param {HOTP|TOTP} otp HOTP/TOTP object.\n\t * @returns {string} Google Authenticator Key URI.\n\t */\n\tstatic stringify(otp) {\n\t\tif (otp instanceof HOTP || otp instanceof TOTP) {\n\t\t\treturn otp.toString();\n\t\t}\n\n\t\tthrow new TypeError('Invalid \\'HOTP/TOTP\\' object');\n\t}\n}\n\nexport { URI };\n","/**\n * Library version.\n * @type {string}\n */\nconst version = '__OTPAUTH_VERSION__';\n\nexport { version };\n"],"names":["uintToBuf","num","buf","ArrayBuffer","arr","Uint8Array","acc","i","b64Tab","uint8array2packed","existingPacked","existingPackedLen","bigEndianMod","intOffset","byteOffset","packed","existingByteLen","shiftModifier","length","push","value","binLen","getStrConverter","format","utfType","Error","str","existingBin","existingBinLen","parseInt","substr","isNaN","codePnt","codePntArr","j","transposeBytes","byteCnt","charCodeAt","tmpInt","strPart","firstEqual","indexOf","search","replace","charAt","ignore","getOutputConverter","outputBinLen","outputOptions","binarray","outputLength","formatOpts","srcByte","outputUpper","toUpperCase","triplet","int1","int2","b64Pad","String","fromCharCode","retVal","arrView","globalThis","_typeof","Object","defineProperty","prototype","get","this","configurable","__GLOBALTHIS__","self","window","global","isNode","toString","call","process","nodeRequire","eval","NodeBuffer","Buffer","undefined","NodeCrypto","OPENSSL_TO_JSSHA_ALGO","hmacDigest","algorithm","key","message","hmac","createHmac","from","update","digest","buffer","variant","TypeError","jsSHA","setHMACKey","getHMAC","pad","digits","prefix","repeat","ALPHABET","base32ToBuf","cstr","bits","index","idx","base32FromBuf","hexToBuf","hexFromBuf","hex","latin1ToBuf","latin1FromBuf","ENCODER","TextEncoder","DECODER","TextDecoder","utf8ToBuf","encode","utf8FromBuf","decode","BrowserCrypto","crypto","msCrypto","randomBytes","size","getRandomValues","Secret","enumerable","latin1","utf8","base32","timingSafeEqual","a","b","out","HOTP","issuer","defaults","label","secret","counter","fromBase32","generate","token","validate","e","encodeURIComponent","offset","byteLength","otp","delta","generatedToken","TOTP","period","timestamp","Date","now","Math","floor","OTPURI_REGEX","SECRET_REGEX","ALGORITHM_REGEX","INTEGER_REGEX","POSITIVE_INTEGER_REGEX","URI","uri","uriGroups","match","error","Array","isArray","URIError","OTP","uriType","toLowerCase","uriLabel","split","map","decodeURIComponent","uriParams","reduce","cur","pairArr","pairKey","pairVal","pairAcc","config","test","version"],"mappings":"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"} \ No newline at end of file diff --git a/dist/otpauth.umd.js b/dist/otpauth.umd.js index c00f0798..bf1697ae 100644 --- a/dist/otpauth.umd.js +++ b/dist/otpauth.umd.js @@ -1,4 +1,4 @@ -/*! otpauth v7.0.5 | (c) Héctor Molinero Fernández | MIT | https://github.com/hectorm/otpauth */ +/*! otpauth v7.0.6 | (c) Héctor Molinero Fernández | MIT | https://github.com/hectorm/otpauth */ /*! jssha v3.2.0 | (c) Brian Turek | BSD-3-Clause | https://github.com/Caligatio/jsSHA */ (function (global, factory) { @@ -100,6 +100,8 @@ function _possibleConstructorReturn(self, call) { if (call && (typeof call === "object" || typeof call === "function")) { return call; + } else if (call !== void 0) { + throw new TypeError("Derived constructors may only return object or undefined"); } return _assertThisInitialized(self); @@ -2304,7 +2306,7 @@ * Library version. * @type {string} */ - var version = '7.0.5'; + var version = '7.0.6'; exports.HOTP = HOTP; exports.Secret = Secret; diff --git a/dist/otpauth.umd.min.js b/dist/otpauth.umd.min.js index 825c41c5..54a2644c 100644 --- a/dist/otpauth.umd.min.js +++ b/dist/otpauth.umd.min.js @@ -1,39 +1,39 @@ -/*! otpauth v7.0.5 | (c) Héctor Molinero Fernández | MIT | https://github.com/hectorm/otpauth */ +/*! otpauth v7.0.6 | (c) Héctor Molinero Fernández | MIT | https://github.com/hectorm/otpauth */ /*! jssha v3.2.0 | (c) Brian Turek | BSD-3-Clause | https://github.com/Caligatio/jsSHA */ -!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).OTPAuth={})}(this,(function(exports){"use strict";function _typeof(e){return(_typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function _defineProperties(e,t){for(var n=0;n=0&&0!==r;i--)n[i]=255&r,r-=n[i],r/=256;return t},t="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";function n(e,t,n,r){var i,o,u,a=t||[0],s=(n=n||0)>>>3,f=-1===r?3:0;for(i=0;i>>2,a.length<=o&&a.push(0),a[o]|=e[i]<<8*(f+r*(u%4));return{value:a,binLen:8*e.length+n}}function e(e,r,i){switch(r){case"UTF8":case"UTF16BE":case"UTF16LE":break;default:throw new Error("encoding must be UTF8, UTF16BE, or UTF16LE")}switch(e){case"HEX":return function(e,t,n){return function(e,t,n,r){var i,o,u,a;if(0!=e.length%2)throw new Error("String of HEX type must be in byte increments");var s=t||[0],f=(n=n||0)>>>3,c=-1===r?3:0;for(i=0;i>>1)+f)>>>2;s.length<=u;)s.push(0);s[u]|=o<<8*(c+r*(a%4))}return{value:s,binLen:4*e.length+n}}(e,t,n,i)};case"TEXT":return function(e,t,n){return function(e,t,n,r,i){var o,u,a,s,f,c,h,l,w=0,p=n||[0],d=(r=r||0)>>>3;if("UTF8"===t)for(h=-1===i?3:0,a=0;a(o=e.charCodeAt(a))?u.push(o):2048>o?(u.push(192|o>>>6),u.push(128|63&o)):55296>o||57344<=o?u.push(224|o>>>12,128|o>>>6&63,128|63&o):(a+=1,o=65536+((1023&o)<<10|1023&e.charCodeAt(a)),u.push(240|o>>>18,128|o>>>12&63,128|o>>>6&63,128|63&o)),s=0;s>>2;p.length<=f;)p.push(0);p[f]|=u[s]<<8*(h+i*(c%4)),w+=1}else for(h=-1===i?2:0,l="UTF16LE"===t&&1!==i||"UTF16LE"!==t&&1===i,a=0;a>>8),f=(c=w+d)>>>2;p.length<=f;)p.push(0);p[f]|=o<<8*(h+i*(c%4)),w+=2}return{value:p,binLen:8*w+r}}(e,r,t,n,i)};case"B64":return function(e,n,r){return function(e,n,r,i){ -var o,u,a,s,f,c,h=0,l=n||[0],w=(r=r||0)>>>3,p=-1===i?3:0,d=e.indexOf("=");if(-1===e.search(/^[a-zA-Z0-9=+/]+$/))throw new Error("Invalid character in base-64 string");if(e=e.replace(/=/g,""),-1!==d&&d=0&&0!==r;i--)n[i]=255&r,r-=n[i],r/=256;return t},t="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";function n(e,t,n,r){var i,o,u,s=t||[0],a=(n=n||0)>>>3,f=-1===r?3:0;for(i=0;i>>2,s.length<=o&&s.push(0),s[o]|=e[i]<<8*(f+r*(u%4));return{value:s,binLen:8*e.length+n}}function e(e,r,i){switch(r){case"UTF8":case"UTF16BE":case"UTF16LE":break;default:throw new Error("encoding must be UTF8, UTF16BE, or UTF16LE")}switch(e){case"HEX":return function(e,t,n){return function(e,t,n,r){var i,o,u,s +;if(0!=e.length%2)throw new Error("String of HEX type must be in byte increments");var a=t||[0],f=(n=n||0)>>>3,c=-1===r?3:0;for(i=0;i>>1)+f)>>>2;a.length<=u;)a.push(0);a[u]|=o<<8*(c+r*(s%4))}return{value:a,binLen:4*e.length+n}}(e,t,n,i)};case"TEXT":return function(e,t,n){return function(e,t,n,r,i){var o,u,s,a,f,c,h,l,w=0,p=n||[0],d=(r=r||0)>>>3;if("UTF8"===t)for(h=-1===i?3:0,s=0;s(o=e.charCodeAt(s))?u.push(o):2048>o?(u.push(192|o>>>6),u.push(128|63&o)):55296>o||57344<=o?u.push(224|o>>>12,128|o>>>6&63,128|63&o):(s+=1,o=65536+((1023&o)<<10|1023&e.charCodeAt(s)),u.push(240|o>>>18,128|o>>>12&63,128|o>>>6&63,128|63&o)),a=0;a>>2;p.length<=f;)p.push(0);p[f]|=u[a]<<8*(h+i*(c%4)),w+=1}else for(h=-1===i?2:0,l="UTF16LE"===t&&1!==i||"UTF16LE"!==t&&1===i,s=0;s>>8), +f=(c=w+d)>>>2;p.length<=f;)p.push(0);p[f]|=o<<8*(h+i*(c%4)),w+=2}return{value:p,binLen:8*w+r}}(e,r,t,n,i)};case"B64":return function(e,n,r){return function(e,n,r,i){var o,u,s,a,f,c,h=0,l=n||[0],w=(r=r||0)>>>3,p=-1===i?3:0,d=e.indexOf("=");if(-1===e.search(/^[a-zA-Z0-9=+/]+$/))throw new Error("Invalid character in base-64 string");if(e=e.replace(/=/g,""),-1!==d&&d {\n\tconst buf = new ArrayBuffer(8);\n\tconst arr = new Uint8Array(buf);\n\tlet acc = num;\n\n\tfor (let i = 7; i >= 0; i--) {\n\t\tif (acc === 0) break;\n\t\tarr[i] = acc & 255;\n\t\tacc -= arr[i];\n\t\tacc /= 256;\n\t}\n\n\treturn buf;\n};\n\n/**\n * Converts an ArrayBuffer to an integer.\n * @param {ArrayBuffer} buf ArrayBuffer.\n * @returns {number} Integer.\n */\nconst uintFromBuf = (buf) => {\n\tconst arr = new Uint8Array(buf);\n\tlet num = 0;\n\n\tfor (let i = 0; i < arr.length; i++) {\n\t\tif (arr[i] !== 0) {\n\t\t\tnum *= 256;\n\t\t\tnum += arr[i];\n\t\t}\n\t}\n\n\treturn num;\n};\n\nexport { uintToBuf, uintFromBuf };\n","/**\n * A JavaScript implementation of the SHA family of hashes - defined in FIPS PUB 180-4, FIPS PUB 202,\n * and SP 800-185 - as well as the corresponding HMAC implementation as defined in FIPS PUB 198-1.\n *\n * Copyright 2008-2020 Brian Turek, 1998-2009 Paul Johnston & Contributors\n * Distributed under the BSD License\n * See http://caligatio.github.com/jsSHA/ for more information\n */\nconst t=\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\";function n(t,n,e,r){let i,s,o;const h=n||[0],u=(e=e||0)>>>3,w=-1===r?3:0;for(i=0;i>>2,h.length<=s&&h.push(0),h[s]|=t[i]<<8*(w+r*(o%4));return{value:h,binLen:8*t.length+e}}function e(e,r,i){switch(r){case\"UTF8\":case\"UTF16BE\":case\"UTF16LE\":break;default:throw new Error(\"encoding must be UTF8, UTF16BE, or UTF16LE\")}switch(e){case\"HEX\":return function(t,n,e){return function(t,n,e,r){let i,s,o,h;if(0!=t.length%2)throw new Error(\"String of HEX type must be in byte increments\");const u=n||[0],w=(e=e||0)>>>3,c=-1===r?3:0;for(i=0;i>>1)+w,o=h>>>2;u.length<=o;)u.push(0);u[o]|=s<<8*(c+r*(h%4))}return{value:u,binLen:4*t.length+e}}(t,n,e,i)};case\"TEXT\":return function(t,n,e){return function(t,n,e,r,i){let s,o,h,u,w,c,f,a,l=0;const A=e||[0],E=(r=r||0)>>>3;if(\"UTF8\"===n)for(f=-1===i?3:0,h=0;hs?o.push(s):2048>s?(o.push(192|s>>>6),o.push(128|63&s)):55296>s||57344<=s?o.push(224|s>>>12,128|s>>>6&63,128|63&s):(h+=1,s=65536+((1023&s)<<10|1023&t.charCodeAt(h)),o.push(240|s>>>18,128|s>>>12&63,128|s>>>6&63,128|63&s)),u=0;u>>2;A.length<=w;)A.push(0);A[w]|=o[u]<<8*(f+i*(c%4)),l+=1}else for(f=-1===i?2:0,a=\"UTF16LE\"===n&&1!==i||\"UTF16LE\"!==n&&1===i,h=0;h>>8),c=l+E,w=c>>>2;A.length<=w;)A.push(0);A[w]|=s<<8*(f+i*(c%4)),l+=2}return{value:A,binLen:8*l+r}}(t,r,n,e,i)};case\"B64\":return function(n,e,r){return function(n,e,r,i){let s,o,h,u,w,c,f,a=0;const l=e||[0],A=(r=r||0)>>>3,E=-1===i?3:0,H=n.indexOf(\"=\");if(-1===n.search(/^[a-zA-Z0-9=+/]+$/))throw new Error(\"Invalid character in base-64 string\");if(n=n.replace(/=/g,\"\"),-1!==H&&H {};\n\nexport { nodeRequire };\n","import jsSHA from 'jssha';\n\nimport { globalThis } from '../global-this';\nimport { isNode } from '../is-node';\nimport { nodeRequire } from '../node-require';\n\nconst NodeBuffer = isNode ? globalThis.Buffer : undefined;\nconst NodeCrypto = isNode ? nodeRequire('crypto') : undefined;\n\n/**\n * OpenSSL to jsSHA algorithms.\n * @type {Object.}\n */\nconst OPENSSL_TO_JSSHA_ALGO = {\n\t'SHA1': 'SHA-1',\n\t'SHA224': 'SHA-224',\n\t'SHA256': 'SHA-256',\n\t'SHA384': 'SHA-384',\n\t'SHA512': 'SHA-512',\n\t'SHA3-224': 'SHA3-224',\n\t'SHA3-256': 'SHA3-256',\n\t'SHA3-384': 'SHA3-384',\n\t'SHA3-512': 'SHA3-512',\n};\n\n/**\n * Calculates an HMAC digest.\n * In Node.js, the command \"openssl list -digest-algorithms\" displays the available digest algorithms.\n * @param {string} algorithm Algorithm.\n * @param {ArrayBuffer} key Key.\n * @param {ArrayBuffer} message Message.\n * @returns {ArrayBuffer} Digest.\n */\nconst hmacDigest = (algorithm, key, message) => {\n\tif (isNode) {\n\t\tconst hmac = NodeCrypto.createHmac(algorithm, NodeBuffer.from(key));\n\t\thmac.update(NodeBuffer.from(message));\n\t\treturn hmac.digest().buffer;\n\t} else {\n\t\tconst variant = OPENSSL_TO_JSSHA_ALGO[algorithm.toUpperCase()];\n\t\tif (typeof variant === 'undefined') {\n\t\t\tthrow new TypeError('Unknown hash function');\n\t\t}\n\t\t// @ts-ignore\n\t\t// eslint-disable-next-line @babel/new-cap\n\t\tconst hmac = new jsSHA(variant, 'ARRAYBUFFER');\n\t\thmac.setHMACKey(key, 'ARRAYBUFFER');\n\t\thmac.update(message);\n\t\treturn hmac.getHMAC('ARRAYBUFFER');\n\t}\n};\n\nexport { hmacDigest };\n","/**\n * Pads a number with leading zeros.\n * @param {number|string} num Number.\n * @param {number} digits Digits.\n * @returns {string} Padded number.\n */\nconst pad = (num, digits) => {\n\tlet prefix = '';\n\tlet repeat = digits - String(num).length;\n\twhile (repeat-- > 0) prefix += '0';\n\treturn `${prefix}${num}`;\n};\n\nexport { pad };\n","/**\n * RFC 4648 base32 alphabet without pad.\n * @type {string}\n */\nconst ALPHABET = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ234567';\n\n/**\n * Converts a base32 string to an ArrayBuffer (RFC 4648).\n * {@link https://github.com/LinusU/base32-decode|LinusU/base32-decode}\n * @param {string} str Base32 string.\n * @returns {ArrayBuffer} ArrayBuffer.\n */\nconst base32ToBuf = (str) => {\n\t// Canonicalize to all upper case and remove padding if it exists.\n\tconst cstr = str.toUpperCase().replace(/=+$/, '');\n\n\tconst buf = new ArrayBuffer((cstr.length * 5) / 8 | 0);\n\tconst arr = new Uint8Array(buf);\n\tlet bits = 0;\n\tlet value = 0;\n\tlet index = 0;\n\n\tfor (let i = 0; i < cstr.length; i++) {\n\t\tconst idx = ALPHABET.indexOf(cstr[i]);\n\t\tif (idx === -1) throw new TypeError(`Invalid character found: ${cstr[i]}`);\n\n\t\tvalue = (value << 5) | idx;\n\t\tbits += 5;\n\n\t\tif (bits >= 8) {\n\t\t\tarr[index++] = (value >>> bits - 8) & 255;\n\t\t\tbits -= 8;\n\t\t}\n\t}\n\n\treturn buf;\n};\n\n/**\n * Converts an ArrayBuffer to a base32 string (RFC 4648).\n * {@link https://github.com/LinusU/base32-encode|LinusU/base32-encode}\n * @param {ArrayBuffer} buf ArrayBuffer.\n * @returns {string} Base32 string.\n */\nconst base32FromBuf = (buf) => {\n\tconst arr = new Uint8Array(buf);\n\tlet bits = 0;\n\tlet value = 0;\n\tlet str = '';\n\n\tfor (let i = 0; i < arr.length; i++) {\n\t\tvalue = (value << 8) | arr[i];\n\t\tbits += 8;\n\n\t\twhile (bits >= 5) {\n\t\t\tstr += ALPHABET[(value >>> bits - 5) & 31];\n\t\t\tbits -= 5;\n\t\t}\n\t}\n\n\tif (bits > 0) {\n\t\tstr += ALPHABET[(value << 5 - bits) & 31];\n\t}\n\n\treturn str;\n};\n\nexport { base32ToBuf, base32FromBuf };\n","/**\n * Converts a hexadecimal string to an ArrayBuffer.\n * @param {string} str Hexadecimal string.\n * @returns {ArrayBuffer} ArrayBuffer.\n */\nconst hexToBuf = (str) => {\n\tconst buf = new ArrayBuffer(str.length / 2);\n\tconst arr = new Uint8Array(buf);\n\n\tfor (let i = 0; i < str.length; i += 2) {\n\t\tarr[i / 2] = parseInt(str.substr(i, 2), 16);\n\t}\n\n\treturn buf;\n};\n\n/**\n * Converts an ArrayBuffer to a hexadecimal string.\n * @param {ArrayBuffer} buf ArrayBuffer.\n * @returns {string} Hexadecimal string.\n */\nconst hexFromBuf = (buf) => {\n\tconst arr = new Uint8Array(buf);\n\tlet str = '';\n\n\tfor (let i = 0; i < arr.length; i++) {\n\t\tconst hex = arr[i].toString(16);\n\t\tif (hex.length === 1) str += '0';\n\t\tstr += hex;\n\t}\n\n\treturn str.toUpperCase();\n};\n\nexport { hexToBuf, hexFromBuf };\n","/**\n * Converts a Latin-1 string to an ArrayBuffer.\n * @param {string} str Latin-1 string.\n * @returns {ArrayBuffer} ArrayBuffer.\n */\nconst latin1ToBuf = (str) => {\n\tconst buf = new ArrayBuffer(str.length);\n\tconst arr = new Uint8Array(buf);\n\n\tfor (let i = 0; i < str.length; i++) {\n\t\tarr[i] = str.charCodeAt(i) & 0xFF;\n\t}\n\n\treturn buf;\n};\n\n/**\n * Converts an ArrayBuffer to a Latin-1 string.\n * @param {ArrayBuffer} buf ArrayBuffer.\n * @returns {string} Latin-1 string.\n */\nconst latin1FromBuf = (buf) => {\n\tconst arr = new Uint8Array(buf);\n\tlet str = '';\n\n\tfor (let i = 0; i < arr.length; i++) {\n\t\tstr += String.fromCharCode(arr[i]);\n\t}\n\n\treturn str;\n};\n\nexport { latin1ToBuf, latin1FromBuf };\n","import { globalThis } from '../global-this';\n\n/**\n * TextEncoder instance.\n * @type {TextEncoder|null}\n */\nconst ENCODER = globalThis.TextEncoder\n\t? new globalThis.TextEncoder('utf-8')\n\t: null;\n\n/**\n * TextDecoder instance.\n * @type {TextDecoder|null}\n */\nconst DECODER = globalThis.TextDecoder\n\t? new globalThis.TextDecoder('utf-8')\n\t: null;\n\n/**\n * Converts an UTF-8 string to an ArrayBuffer.\n * @param {string} str String.\n * @returns {ArrayBuffer} ArrayBuffer.\n */\nconst utf8ToBuf = (str) => {\n\tif (!ENCODER) {\n\t\tthrow new Error('Encoding API not available');\n\t}\n\n\treturn ENCODER.encode(str).buffer;\n};\n\n/**\n * Converts an ArrayBuffer to an UTF-8 string.\n * @param {ArrayBuffer} buf ArrayBuffer.\n * @returns {string} String.\n */\nconst utf8FromBuf = (buf) => {\n\tif (!DECODER) {\n\t\tthrow new Error('Encoding API not available');\n\t}\n\n\treturn DECODER.decode(buf);\n};\n\nexport { utf8ToBuf, utf8FromBuf };\n","import { globalThis } from '../global-this';\nimport { isNode } from '../is-node';\nimport { nodeRequire } from '../node-require';\n\nconst NodeCrypto = isNode ? nodeRequire('crypto') : undefined;\nconst BrowserCrypto = !isNode ? globalThis.crypto || globalThis.msCrypto : undefined;\n\n/**\n * Returns random bytes.\n * @param {number} size Size.\n * @returns {ArrayBuffer} Random bytes.\n */\nconst randomBytes = (size) => {\n\tif (isNode) {\n\t\treturn NodeCrypto.randomBytes(size).buffer;\n\t} else {\n\t\tif (!BrowserCrypto || !BrowserCrypto.getRandomValues) {\n\t\t\tthrow new Error('Cryptography API not available');\n\t\t}\n\t\treturn BrowserCrypto.getRandomValues(new Uint8Array(size)).buffer;\n\t}\n};\n\nexport { randomBytes };\n","import { base32ToBuf, base32FromBuf } from './utils/encoding/base32';\nimport { hexToBuf, hexFromBuf } from './utils/encoding/hex';\nimport { latin1ToBuf, latin1FromBuf } from './utils/encoding/latin1';\nimport { utf8ToBuf, utf8FromBuf } from './utils/encoding/utf8';\nimport { randomBytes } from './utils/crypto/random-bytes';\n\n/**\n * OTP secret key.\n */\nclass Secret {\n\t/**\n\t * Creates a secret key object.\n\t * @param {Object} [config] Configuration options.\n\t * @param {ArrayBuffer} [config.buffer=randomBytes] Secret key.\n\t * @param {number} [config.size=20] Number of random bytes to generate, ignored if 'buffer' is provided.\n\t */\n\tconstructor({ buffer, size = 20 } = {}) {\n\t\t/**\n\t\t * Secret key.\n\t\t * @type {ArrayBuffer}\n\t\t */\n\t\tthis.buffer = typeof buffer === 'undefined'\n\t\t\t? randomBytes(size)\n\t\t\t: buffer;\n\t}\n\n\t/**\n\t * Converts a Latin-1 string to a Secret object.\n\t * @param {string} str Latin-1 string.\n\t * @returns {Secret} Secret object.\n\t */\n\tstatic fromLatin1(str) {\n\t\treturn new Secret({ buffer: latin1ToBuf(str) });\n\t}\n\n\t/**\n\t * Converts an UTF-8 string to a Secret object.\n\t * @param {string} str UTF-8 string.\n\t * @returns {Secret} Secret object.\n\t */\n\tstatic fromUTF8(str) {\n\t\treturn new Secret({ buffer: utf8ToBuf(str) });\n\t}\n\n\t/**\n\t * Converts a base32 string to a Secret object.\n\t * @param {string} str Base32 string.\n\t * @returns {Secret} Secret object.\n\t */\n\tstatic fromBase32(str) {\n\t\treturn new Secret({ buffer: base32ToBuf(str) });\n\t}\n\n\t/**\n\t * Converts a hexadecimal string to a Secret object.\n\t * @param {string} str Hexadecimal string.\n\t * @returns {Secret} Secret object.\n\t */\n\tstatic fromHex(str) {\n\t\treturn new Secret({ buffer: hexToBuf(str) });\n\t}\n\n\t/**\n\t * Latin-1 string representation of secret key.\n\t * @type {string}\n\t */\n\tget latin1() {\n\t\tObject.defineProperty(this, 'latin1', {\n\t\t\tenumerable: true,\n\t\t\tvalue: latin1FromBuf(this.buffer),\n\t\t});\n\n\t\treturn this.latin1;\n\t}\n\n\t/**\n\t * UTF-8 string representation of secret key.\n\t * @type {string}\n\t */\n\tget utf8() {\n\t\tObject.defineProperty(this, 'utf8', {\n\t\t\tenumerable: true,\n\t\t\tvalue: utf8FromBuf(this.buffer),\n\t\t});\n\n\t\treturn this.utf8;\n\t}\n\n\t/**\n\t * Base32 string representation of secret key.\n\t * @type {string}\n\t */\n\tget base32() {\n\t\tObject.defineProperty(this, 'base32', {\n\t\t\tenumerable: true,\n\t\t\tvalue: base32FromBuf(this.buffer),\n\t\t});\n\n\t\treturn this.base32;\n\t}\n\n\t/**\n\t * Hexadecimal string representation of secret key.\n\t * @type {string}\n\t */\n\tget hex() {\n\t\tObject.defineProperty(this, 'hex', {\n\t\t\tenumerable: true,\n\t\t\tvalue: hexFromBuf(this.buffer),\n\t\t});\n\n\t\treturn this.hex;\n\t}\n}\n\nexport { Secret };\n","import { globalThis } from '../global-this';\nimport { isNode } from '../is-node';\nimport { nodeRequire } from '../node-require';\n\nconst NodeBuffer = isNode ? globalThis.Buffer : undefined;\nconst NodeCrypto = isNode ? nodeRequire('crypto') : undefined;\n\n/**\n * Returns true if a is equal to b, without leaking timing information that would allow an attacker to guess one of the values.\n * @param {string} a String a.\n * @param {string} b String b.\n * @returns {boolean} Equality result.\n */\nconst timingSafeEqual = (a, b) => {\n\tif (isNode) {\n\t\treturn NodeCrypto.timingSafeEqual(NodeBuffer.from(a), NodeBuffer.from(b));\n\t} else {\n\t\tif (a.length !== b.length) {\n\t\t\tthrow new TypeError('Input strings must have the same length');\n\t\t}\n\t\tlet i = -1;\n\t\tlet out = 0;\n\t\twhile (++i < a.length) {\n\t\t\tout |= a.charCodeAt(i) ^ b.charCodeAt(i);\n\t\t}\n\t\treturn out === 0;\n\t}\n};\n\nexport { timingSafeEqual };\n","import { uintToBuf } from './utils/encoding/uint';\nimport { hmacDigest } from './utils/crypto/hmac-digest';\nimport { pad } from './utils/pad';\nimport { Secret } from './secret';\nimport { timingSafeEqual } from './utils/crypto/timing-safe-equal';\n\n/**\n * HOTP: An HMAC-based One-time Password Algorithm.\n * {@link https://tools.ietf.org/html/rfc4226|RFC 4226}\n */\nclass HOTP {\n\t/**\n\t * Default configuration.\n\t * @type {{\n\t * issuer: string,\n\t * label: string,\n\t * algorithm: string,\n\t * digits: number,\n\t * counter: number\n\t * window: number\n\t * }}\n\t */\n\tstatic get defaults() {\n\t\treturn {\n\t\t\tissuer: '',\n\t\t\tlabel: 'OTPAuth',\n\t\t\talgorithm: 'SHA1',\n\t\t\tdigits: 6,\n\t\t\tcounter: 0,\n\t\t\twindow: 1,\n\t\t};\n\t}\n\n\t/**\n\t * Creates an HOTP object.\n\t * @param {Object} [config] Configuration options.\n\t * @param {string} [config.issuer=''] Account provider.\n\t * @param {string} [config.label='OTPAuth'] Account label.\n\t * @param {Secret|string} [config.secret=Secret] Secret key.\n\t * @param {string} [config.algorithm='SHA1'] HMAC hashing algorithm.\n\t * @param {number} [config.digits=6] Token length.\n\t * @param {number} [config.counter=0] Initial counter value.\n\t */\n\tconstructor({\n\t\tissuer = HOTP.defaults.issuer,\n\t\tlabel = HOTP.defaults.label,\n\t\tsecret = new Secret(),\n\t\talgorithm = HOTP.defaults.algorithm,\n\t\tdigits = HOTP.defaults.digits,\n\t\tcounter = HOTP.defaults.counter,\n\t} = {}) {\n\t\t/**\n\t\t * Account provider.\n\t\t * @type {string}\n\t\t */\n\t\tthis.issuer = issuer;\n\t\t/**\n\t\t * Account label.\n\t\t * @type {string}\n\t\t */\n\t\tthis.label = label;\n\t\t/**\n\t\t * Secret key.\n\t\t * @type {Secret}\n\t\t */\n\t\tthis.secret = typeof secret === 'string'\n\t\t\t? Secret.fromBase32(secret)\n\t\t\t: secret;\n\t\t/**\n\t\t * HMAC hashing algorithm.\n\t\t * @type {string}\n\t\t */\n\t\tthis.algorithm = algorithm.toUpperCase();\n\t\t/**\n\t\t * Token length.\n\t\t * @type {number}\n\t\t */\n\t\tthis.digits = digits;\n\t\t/**\n\t\t * Initial counter value.\n\t\t * @type {number}\n\t\t */\n\t\tthis.counter = counter;\n\t}\n\n\t/**\n\t * Generates an HOTP token.\n\t * @param {Object} config Configuration options.\n\t * @param {Secret} config.secret Secret key.\n\t * @param {string} [config.algorithm='SHA1'] HMAC hashing algorithm.\n\t * @param {number} [config.digits=6] Token length.\n\t * @param {number} [config.counter=0] Counter value.\n\t * @returns {string} Token.\n\t */\n\tstatic generate({\n\t\tsecret,\n\t\talgorithm = HOTP.defaults.algorithm,\n\t\tdigits = HOTP.defaults.digits,\n\t\tcounter = HOTP.defaults.counter,\n\t}) {\n\t\tconst digest = new Uint8Array(hmacDigest(algorithm, secret.buffer, uintToBuf(counter)));\n\t\tconst offset = digest[digest.byteLength - 1] & 15;\n\t\tconst otp = (\n\t\t\t((digest[offset] & 127) << 24)\n\t\t\t| ((digest[offset + 1] & 255) << 16)\n\t\t\t| ((digest[offset + 2] & 255) << 8)\n\t\t\t| (digest[offset + 3] & 255)\n\t\t) % (10 ** digits);\n\n\t\treturn pad(otp, digits);\n\t}\n\n\t/**\n\t * Generates an HOTP token.\n\t * @param {Object} [config] Configuration options.\n\t * @param {number} [config.counter=this.counter++] Counter value.\n\t * @returns {string} Token.\n\t */\n\tgenerate({\n\t\tcounter = this.counter++,\n\t} = {}) {\n\t\treturn HOTP.generate({\n\t\t\tsecret: this.secret,\n\t\t\talgorithm: this.algorithm,\n\t\t\tdigits: this.digits,\n\t\t\tcounter,\n\t\t});\n\t}\n\n\t/**\n\t * Validates an HOTP token.\n\t * @param {Object} config Configuration options.\n\t * @param {string} config.token Token value.\n\t * @param {Secret} config.secret Secret key.\n\t * @param {string} [config.algorithm='SHA1'] HMAC hashing algorithm.\n\t * @param {number} config.digits Token length.\n\t * @param {number} [config.counter=0] Counter value.\n\t * @param {number} [config.window=1] Window of counter values to test.\n\t * @returns {number|null} Token delta, or null if the token is not found.\n\t */\n\tstatic validate({\n\t\ttoken,\n\t\tsecret,\n\t\talgorithm,\n\t\tdigits,\n\t\tcounter = HOTP.defaults.counter,\n\t\twindow = HOTP.defaults.window,\n\t}) {\n\t\t// Return early if the token length does not match the digit number.\n\t\tif (token.length !== digits) return null;\n\n\t\tlet delta = null;\n\n\t\tfor (let i = counter - window; i <= counter + window; ++i) {\n\t\t\tconst generatedToken = HOTP.generate({\n\t\t\t\tsecret,\n\t\t\t\talgorithm,\n\t\t\t\tdigits,\n\t\t\t\tcounter: i,\n\t\t\t});\n\n\t\t\tif (timingSafeEqual(token, generatedToken)) {\n\t\t\t\tdelta = i - counter;\n\t\t\t}\n\t\t}\n\n\t\treturn delta;\n\t}\n\n\t/**\n\t * Validates an HOTP token.\n\t * @param {Object} config Configuration options.\n\t * @param {string} config.token Token value.\n\t * @param {number} [config.counter=this.counter] Counter value.\n\t * @param {number} [config.window=1] Window of counter values to test.\n\t * @returns {number|null} Token delta, or null if the token is not found.\n\t */\n\tvalidate({\n\t\ttoken,\n\t\tcounter = this.counter,\n\t\twindow,\n\t}) {\n\t\treturn HOTP.validate({\n\t\t\ttoken,\n\t\t\tsecret: this.secret,\n\t\t\talgorithm: this.algorithm,\n\t\t\tdigits: this.digits,\n\t\t\tcounter,\n\t\t\twindow,\n\t\t});\n\t}\n\n\t/**\n\t * Returns a Google Authenticator key URI.\n\t * @returns {string} URI.\n\t */\n\ttoString() {\n\t\tconst e = encodeURIComponent;\n\t\treturn 'otpauth://hotp/'\n\t\t\t+ `${this.issuer.length > 0\n\t\t\t\t? `${e(this.issuer)}:${e(this.label)}?issuer=${e(this.issuer)}&`\n\t\t\t\t: `${e(this.label)}?`}`\n\t\t\t+ `secret=${e(this.secret.base32)}&`\n\t\t\t+ `algorithm=${e(this.algorithm)}&`\n\t\t\t+ `digits=${e(this.digits)}&`\n\t\t\t+ `counter=${e(this.counter)}`;\n\t}\n}\n\nexport { HOTP };\n","import { HOTP } from './hotp';\nimport { Secret } from './secret';\n\n/**\n * TOTP: Time-Based One-Time Password Algorithm.\n * {@link https://tools.ietf.org/html/rfc6238|RFC 6238}\n */\nclass TOTP {\n\t/**\n\t * Default configuration.\n\t * @type {{\n\t * issuer: string,\n\t * label: string,\n\t * algorithm: string,\n\t * digits: number,\n\t * period: number\n\t * window: number\n\t * }}\n\t */\n\tstatic get defaults() {\n\t\treturn {\n\t\t\tissuer: '',\n\t\t\tlabel: 'OTPAuth',\n\t\t\talgorithm: 'SHA1',\n\t\t\tdigits: 6,\n\t\t\tperiod: 30,\n\t\t\twindow: 1,\n\t\t};\n\t}\n\n\t/**\n\t * Creates a TOTP object.\n\t * @param {Object} [config] Configuration options.\n\t * @param {string} [config.issuer=''] Account provider.\n\t * @param {string} [config.label='OTPAuth'] Account label.\n\t * @param {Secret|string} [config.secret=Secret] Secret key.\n\t * @param {string} [config.algorithm='SHA1'] HMAC hashing algorithm.\n\t * @param {number} [config.digits=6] Token length.\n\t * @param {number} [config.period=30] Token time-step duration.\n\t */\n\tconstructor({\n\t\tissuer = TOTP.defaults.issuer,\n\t\tlabel = TOTP.defaults.label,\n\t\tsecret = new Secret(),\n\t\talgorithm = TOTP.defaults.algorithm,\n\t\tdigits = TOTP.defaults.digits,\n\t\tperiod = TOTP.defaults.period,\n\t} = {}) {\n\t\t/**\n\t\t * Account provider.\n\t\t * @type {string}\n\t\t */\n\t\tthis.issuer = issuer;\n\t\t/**\n\t\t * Account label.\n\t\t * @type {string}\n\t\t */\n\t\tthis.label = label;\n\t\t/**\n\t\t * Secret key.\n\t\t * @type {Secret}\n\t\t */\n\t\tthis.secret = typeof secret === 'string'\n\t\t\t? Secret.fromBase32(secret)\n\t\t\t: secret;\n\t\t/**\n\t\t * HMAC hashing algorithm.\n\t\t * @type {string}\n\t\t */\n\t\tthis.algorithm = algorithm.toUpperCase();\n\t\t/**\n\t\t * Token length.\n\t\t * @type {number}\n\t\t */\n\t\tthis.digits = digits;\n\t\t/**\n\t\t * Token time-step duration.\n\t\t * @type {number}\n\t\t */\n\t\tthis.period = period;\n\t}\n\n\t/**\n\t * Generates a TOTP token.\n\t * @param {Object} config Configuration options.\n\t * @param {Secret} config.secret Secret key.\n\t * @param {string} [config.algorithm='SHA1'] HMAC hashing algorithm.\n\t * @param {number} [config.digits=6] Token length.\n\t * @param {number} [config.period=30] Token time-step duration.\n\t * @param {number} [config.timestamp=Date.now] Timestamp value in milliseconds.\n\t * @returns {string} Token.\n\t */\n\tstatic generate({\n\t\tsecret,\n\t\talgorithm,\n\t\tdigits,\n\t\tperiod = TOTP.defaults.period,\n\t\ttimestamp = Date.now(),\n\t}) {\n\t\treturn HOTP.generate({\n\t\t\tsecret,\n\t\t\talgorithm,\n\t\t\tdigits,\n\t\t\tcounter: Math.floor(timestamp / 1000 / period),\n\t\t});\n\t}\n\n\t/**\n\t * Generates a TOTP token.\n\t * @param {Object} [config] Configuration options.\n\t * @param {number} [config.timestamp=Date.now] Timestamp value in milliseconds.\n\t * @returns {string} Token.\n\t */\n\tgenerate({\n\t\ttimestamp = Date.now(),\n\t} = {}) {\n\t\treturn TOTP.generate({\n\t\t\tsecret: this.secret,\n\t\t\talgorithm: this.algorithm,\n\t\t\tdigits: this.digits,\n\t\t\tperiod: this.period,\n\t\t\ttimestamp,\n\t\t});\n\t}\n\n\t/**\n\t * Validates a TOTP token.\n\t * @param {Object} config Configuration options.\n\t * @param {string} config.token Token value.\n\t * @param {Secret} config.secret Secret key.\n\t * @param {string} [config.algorithm='SHA1'] HMAC hashing algorithm.\n\t * @param {number} config.digits Token length.\n\t * @param {number} [config.period=30] Token time-step duration.\n\t * @param {number} [config.timestamp=Date.now] Timestamp value in milliseconds.\n\t * @param {number} [config.window=1] Window of counter values to test.\n\t * @returns {number|null} Token delta, or null if the token is not found.\n\t */\n\tstatic validate({\n\t\ttoken,\n\t\tsecret,\n\t\talgorithm,\n\t\tdigits,\n\t\tperiod = TOTP.defaults.period,\n\t\ttimestamp = Date.now(),\n\t\twindow,\n\t}) {\n\t\treturn HOTP.validate({\n\t\t\ttoken,\n\t\t\tsecret,\n\t\t\talgorithm,\n\t\t\tdigits,\n\t\t\tcounter: Math.floor(timestamp / 1000 / period),\n\t\t\twindow,\n\t\t});\n\t}\n\n\t/**\n\t * Validates a TOTP token.\n\t * @param {Object} config Configuration options.\n\t * @param {string} config.token Token value.\n\t * @param {number} [config.timestamp=Date.now] Timestamp value in milliseconds.\n\t * @param {number} [config.window=1] Window of counter values to test.\n\t * @returns {number|null} Token delta, or null if the token is not found.\n\t */\n\tvalidate({\n\t\ttoken,\n\t\ttimestamp,\n\t\twindow,\n\t}) {\n\t\treturn TOTP.validate({\n\t\t\ttoken,\n\t\t\tsecret: this.secret,\n\t\t\talgorithm: this.algorithm,\n\t\t\tdigits: this.digits,\n\t\t\tperiod: this.period,\n\t\t\ttimestamp,\n\t\t\twindow,\n\t\t});\n\t}\n\n\t/**\n\t * Returns a Google Authenticator key URI.\n\t * @returns {string} URI.\n\t */\n\ttoString() {\n\t\tconst e = encodeURIComponent;\n\t\treturn 'otpauth://totp/'\n\t\t\t+ `${this.issuer.length > 0\n\t\t\t\t? `${e(this.issuer)}:${e(this.label)}?issuer=${e(this.issuer)}&`\n\t\t\t\t: `${e(this.label)}?`}`\n\t\t\t+ `secret=${e(this.secret.base32)}&`\n\t\t\t+ `algorithm=${e(this.algorithm)}&`\n\t\t\t+ `digits=${e(this.digits)}&`\n\t\t\t+ `period=${e(this.period)}`;\n\t}\n}\n\nexport { TOTP };\n","import { HOTP } from './hotp';\nimport { TOTP } from './totp';\n\n/**\n * Key URI regex (otpauth://TYPE/[ISSUER:]LABEL?PARAMETERS).\n * @type {RegExp}\n */\nconst OTPURI_REGEX = /^otpauth:\\/\\/([ht]otp)\\/(.+)\\?((?:&?[A-Z0-9.~_-]+=[^&]*)+)$/i;\n\n/**\n * RFC 4648 base32 alphabet with pad.\n * @type {RegExp}\n */\nconst SECRET_REGEX = /^[2-7A-Z]+=*$/i;\n\n/**\n * Regex for supported algorithms.\n * @type {RegExp}\n */\nconst ALGORITHM_REGEX = /^SHA(?:1|224|256|384|512|3-224|3-256|3-384|3-512)$/i;\n\n/**\n * Integer regex.\n * @type {RegExp}\n */\nconst INTEGER_REGEX = /^[+-]?\\d+$/;\n\n/**\n * Positive integer regex.\n * @type {RegExp}\n */\nconst POSITIVE_INTEGER_REGEX = /^\\+?[1-9]\\d*$/;\n\n/**\n * HOTP/TOTP object/string conversion.\n * {@link https://github.com/google/google-authenticator/wiki/Key-Uri-Format|Key URI Format}\n */\nclass URI {\n\t/**\n\t * Parses a Google Authenticator key URI and returns an HOTP/TOTP object.\n\t * @param {string} uri Google Authenticator Key URI.\n\t * @returns {HOTP|TOTP} HOTP/TOTP object.\n\t */\n\tstatic parse(uri) {\n\t\tlet uriGroups;\n\n\t\ttry {\n\t\t\turiGroups = uri.match(OTPURI_REGEX);\n\t\t} catch (error) { /* Handled below */ }\n\n\t\tif (!Array.isArray(uriGroups)) {\n\t\t\tthrow new URIError('Invalid URI format');\n\t\t}\n\n\t\t// Extract URI groups.\n\t\tconst uriType = uriGroups[1].toLowerCase();\n\t\tconst uriLabel = uriGroups[2].split(/:(.+)/, 2).map(decodeURIComponent);\n\t\t/** @type {Object.} */\n\t\tconst uriParams = uriGroups[3].split('&').reduce((acc, cur) => {\n\t\t\tconst pairArr = cur.split(/=(.*)/, 2).map(decodeURIComponent);\n\t\t\tconst pairKey = pairArr[0].toLowerCase();\n\t\t\tconst pairVal = pairArr[1];\n\t\t\t/** @type {Object.} */\n\t\t\tconst pairAcc = acc;\n\n\t\t\tpairAcc[pairKey] = pairVal;\n\t\t\treturn pairAcc;\n\t\t}, {});\n\n\t\t// 'OTP' will be instantiated with 'config' argument.\n\t\tlet OTP;\n\t\tconst config = {};\n\n\t\tif (uriType === 'hotp') {\n\t\t\tOTP = HOTP;\n\n\t\t\t// Counter: required\n\t\t\tif (typeof uriParams.counter !== 'undefined' && INTEGER_REGEX.test(uriParams.counter)) {\n\t\t\t\tconfig.counter = parseInt(uriParams.counter, 10);\n\t\t\t} else {\n\t\t\t\tthrow new TypeError('Missing or invalid \\'counter\\' parameter');\n\t\t\t}\n\t\t} else if (uriType === 'totp') {\n\t\t\tOTP = TOTP;\n\n\t\t\t// Period: optional\n\t\t\tif (typeof uriParams.period !== 'undefined') {\n\t\t\t\tif (POSITIVE_INTEGER_REGEX.test(uriParams.period)) {\n\t\t\t\t\tconfig.period = parseInt(uriParams.period, 10);\n\t\t\t\t} else {\n\t\t\t\t\tthrow new TypeError('Invalid \\'period\\' parameter');\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tthrow new TypeError('Unknown OTP type');\n\t\t}\n\n\t\t// Label: required\n\t\t// Issuer: optional\n\t\tif (uriLabel.length === 2) {\n\t\t\tconfig.label = uriLabel[1];\n\t\t\tif (typeof uriParams.issuer === 'undefined') {\n\t\t\t\tconfig.issuer = uriLabel[0];\n\t\t\t} else if (uriParams.issuer === uriLabel[0]) {\n\t\t\t\tconfig.issuer = uriParams.issuer;\n\t\t\t} else {\n\t\t\t\tthrow new TypeError('Invalid \\'issuer\\' parameter');\n\t\t\t}\n\t\t} else {\n\t\t\tconfig.label = uriLabel[0];\n\t\t\tif (typeof uriParams.issuer !== 'undefined') {\n\t\t\t\tconfig.issuer = uriParams.issuer;\n\t\t\t}\n\t\t}\n\n\t\t// Secret: required\n\t\tif (typeof uriParams.secret !== 'undefined' && SECRET_REGEX.test(uriParams.secret)) {\n\t\t\tconfig.secret = uriParams.secret;\n\t\t} else {\n\t\t\tthrow new TypeError('Missing or invalid \\'secret\\' parameter');\n\t\t}\n\n\t\t// Algorithm: optional\n\t\tif (typeof uriParams.algorithm !== 'undefined') {\n\t\t\tif (ALGORITHM_REGEX.test(uriParams.algorithm)) {\n\t\t\t\tconfig.algorithm = uriParams.algorithm;\n\t\t\t} else {\n\t\t\t\tthrow new TypeError('Invalid \\'algorithm\\' parameter');\n\t\t\t}\n\t\t}\n\n\t\t// Digits: optional\n\t\tif (typeof uriParams.digits !== 'undefined') {\n\t\t\tif (POSITIVE_INTEGER_REGEX.test(uriParams.digits)) {\n\t\t\t\tconfig.digits = parseInt(uriParams.digits, 10);\n\t\t\t} else {\n\t\t\t\tthrow new TypeError('Invalid \\'digits\\' parameter');\n\t\t\t}\n\t\t}\n\n\t\treturn new OTP(config);\n\t}\n\n\t/**\n\t * Converts an HOTP/TOTP object to a Google Authenticator key URI.\n\t * @param {HOTP|TOTP} otp HOTP/TOTP object.\n\t * @returns {string} Google Authenticator Key URI.\n\t */\n\tstatic stringify(otp) {\n\t\tif (otp instanceof HOTP || otp instanceof TOTP) {\n\t\t\treturn otp.toString();\n\t\t}\n\n\t\tthrow new TypeError('Invalid \\'HOTP/TOTP\\' object');\n\t}\n}\n\nexport { URI };\n","/**\n * Library version.\n * @type {string}\n */\nconst version = '__OTPAUTH_VERSION__';\n\nexport { version };\n"],"names":["uintToBuf","num","buf","ArrayBuffer","arr","Uint8Array","acc","i","b64Tab","uint8array2packed","existingPacked","existingPackedLen","bigEndianMod","intOffset","byteOffset","packed","existingByteLen","shiftModifier","length","push","value","binLen","getStrConverter","format","utfType","Error","str","existingBin","existingBinLen","parseInt","substr","isNaN","codePnt","codePntArr","j","transposeBytes","byteCnt","charCodeAt","tmpInt","strPart","firstEqual","indexOf","search","replace","charAt","ignore","getOutputConverter","outputBinLen","outputOptions","binarray","outputLength","formatOpts","srcByte","outputUpper","toUpperCase","triplet","int1","int2","b64Pad","String","fromCharCode","retVal","arrView","globalThis","_typeof","Object","defineProperty","prototype","get","this","configurable","__GLOBALTHIS__","self","window","global","isNode","toString","call","process","nodeRequire","eval","NodeBuffer","Buffer","undefined","NodeCrypto","OPENSSL_TO_JSSHA_ALGO","hmacDigest","algorithm","key","message","hmac","createHmac","from","update","digest","buffer","variant","TypeError","jsSHA","setHMACKey","getHMAC","pad","digits","prefix","repeat","ALPHABET","base32ToBuf","cstr","bits","index","idx","base32FromBuf","hexToBuf","hexFromBuf","hex","latin1ToBuf","latin1FromBuf","ENCODER","TextEncoder","DECODER","TextDecoder","utf8ToBuf","encode","utf8FromBuf","decode","BrowserCrypto","crypto","msCrypto","randomBytes","size","getRandomValues","Secret","enumerable","latin1","utf8","base32","timingSafeEqual","a","b","out","HOTP","issuer","defaults","label","secret","counter","fromBase32","generate","token","validate","e","encodeURIComponent","offset","byteLength","otp","delta","generatedToken","TOTP","period","timestamp","Date","now","Math","floor","OTPURI_REGEX","SECRET_REGEX","ALGORITHM_REGEX","INTEGER_REGEX","POSITIVE_INTEGER_REGEX","URI","uri","uriGroups","match","error","Array","isArray","URIError","OTP","uriType","toLowerCase","uriLabel","split","map","decodeURIComponent","uriParams","reduce","cur","pairArr","pairKey","pairVal","pairAcc","config","test","version"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"otpauth.umd.min.js","sources":["../src/utils/encoding/uint.js","../node_modules/jssha/dist/sha.mjs","../src/utils/global-this.js","../src/utils/is-node.js","../src/utils/node-require.js","../src/utils/crypto/hmac-digest.js","../src/utils/pad.js","../src/utils/encoding/base32.js","../src/utils/encoding/hex.js","../src/utils/encoding/latin1.js","../src/utils/encoding/utf8.js","../src/utils/crypto/random-bytes.js","../src/secret.js","../src/utils/crypto/timing-safe-equal.js","../src/hotp.js","../src/totp.js","../src/uri.js","../src/version.js"],"sourcesContent":["/**\n * Converts an integer to an ArrayBuffer.\n * @param {number} num Integer.\n * @returns {ArrayBuffer} ArrayBuffer.\n */\nconst uintToBuf = (num) => {\n\tconst buf = new ArrayBuffer(8);\n\tconst arr = new Uint8Array(buf);\n\tlet acc = num;\n\n\tfor (let i = 7; i >= 0; i--) {\n\t\tif (acc === 0) break;\n\t\tarr[i] = acc & 255;\n\t\tacc -= arr[i];\n\t\tacc /= 256;\n\t}\n\n\treturn buf;\n};\n\n/**\n * Converts an ArrayBuffer to an integer.\n * @param {ArrayBuffer} buf ArrayBuffer.\n * @returns {number} Integer.\n */\nconst uintFromBuf = (buf) => {\n\tconst arr = new Uint8Array(buf);\n\tlet num = 0;\n\n\tfor (let i = 0; i < arr.length; i++) {\n\t\tif (arr[i] !== 0) {\n\t\t\tnum *= 256;\n\t\t\tnum += arr[i];\n\t\t}\n\t}\n\n\treturn num;\n};\n\nexport { uintToBuf, uintFromBuf };\n","/**\n * A JavaScript implementation of the SHA family of hashes - defined in FIPS PUB 180-4, FIPS PUB 202,\n * and SP 800-185 - as well as the corresponding HMAC implementation as defined in FIPS PUB 198-1.\n *\n * Copyright 2008-2020 Brian Turek, 1998-2009 Paul Johnston & Contributors\n * Distributed under the BSD License\n * See http://caligatio.github.com/jsSHA/ for more information\n */\nconst t=\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\";function n(t,n,e,r){let i,s,o;const h=n||[0],u=(e=e||0)>>>3,w=-1===r?3:0;for(i=0;i>>2,h.length<=s&&h.push(0),h[s]|=t[i]<<8*(w+r*(o%4));return{value:h,binLen:8*t.length+e}}function e(e,r,i){switch(r){case\"UTF8\":case\"UTF16BE\":case\"UTF16LE\":break;default:throw new Error(\"encoding must be UTF8, UTF16BE, or UTF16LE\")}switch(e){case\"HEX\":return function(t,n,e){return function(t,n,e,r){let i,s,o,h;if(0!=t.length%2)throw new Error(\"String of HEX type must be in byte increments\");const u=n||[0],w=(e=e||0)>>>3,c=-1===r?3:0;for(i=0;i>>1)+w,o=h>>>2;u.length<=o;)u.push(0);u[o]|=s<<8*(c+r*(h%4))}return{value:u,binLen:4*t.length+e}}(t,n,e,i)};case\"TEXT\":return function(t,n,e){return function(t,n,e,r,i){let s,o,h,u,w,c,f,a,l=0;const A=e||[0],E=(r=r||0)>>>3;if(\"UTF8\"===n)for(f=-1===i?3:0,h=0;hs?o.push(s):2048>s?(o.push(192|s>>>6),o.push(128|63&s)):55296>s||57344<=s?o.push(224|s>>>12,128|s>>>6&63,128|63&s):(h+=1,s=65536+((1023&s)<<10|1023&t.charCodeAt(h)),o.push(240|s>>>18,128|s>>>12&63,128|s>>>6&63,128|63&s)),u=0;u>>2;A.length<=w;)A.push(0);A[w]|=o[u]<<8*(f+i*(c%4)),l+=1}else for(f=-1===i?2:0,a=\"UTF16LE\"===n&&1!==i||\"UTF16LE\"!==n&&1===i,h=0;h>>8),c=l+E,w=c>>>2;A.length<=w;)A.push(0);A[w]|=s<<8*(f+i*(c%4)),l+=2}return{value:A,binLen:8*l+r}}(t,r,n,e,i)};case\"B64\":return function(n,e,r){return function(n,e,r,i){let s,o,h,u,w,c,f,a=0;const l=e||[0],A=(r=r||0)>>>3,E=-1===i?3:0,H=n.indexOf(\"=\");if(-1===n.search(/^[a-zA-Z0-9=+/]+$/))throw new Error(\"Invalid character in base-64 string\");if(n=n.replace(/=/g,\"\"),-1!==H&&H {};\n\nexport { nodeRequire };\n","import jsSHA from 'jssha';\n\nimport { globalThis } from '../global-this';\nimport { isNode } from '../is-node';\nimport { nodeRequire } from '../node-require';\n\nconst NodeBuffer = isNode ? globalThis.Buffer : undefined;\nconst NodeCrypto = isNode ? nodeRequire('crypto') : undefined;\n\n/**\n * OpenSSL to jsSHA algorithms.\n * @type {Object.}\n */\nconst OPENSSL_TO_JSSHA_ALGO = {\n\t'SHA1': 'SHA-1',\n\t'SHA224': 'SHA-224',\n\t'SHA256': 'SHA-256',\n\t'SHA384': 'SHA-384',\n\t'SHA512': 'SHA-512',\n\t'SHA3-224': 'SHA3-224',\n\t'SHA3-256': 'SHA3-256',\n\t'SHA3-384': 'SHA3-384',\n\t'SHA3-512': 'SHA3-512',\n};\n\n/**\n * Calculates an HMAC digest.\n * In Node.js, the command \"openssl list -digest-algorithms\" displays the available digest algorithms.\n * @param {string} algorithm Algorithm.\n * @param {ArrayBuffer} key Key.\n * @param {ArrayBuffer} message Message.\n * @returns {ArrayBuffer} Digest.\n */\nconst hmacDigest = (algorithm, key, message) => {\n\tif (isNode) {\n\t\tconst hmac = NodeCrypto.createHmac(algorithm, NodeBuffer.from(key));\n\t\thmac.update(NodeBuffer.from(message));\n\t\treturn hmac.digest().buffer;\n\t} else {\n\t\tconst variant = OPENSSL_TO_JSSHA_ALGO[algorithm.toUpperCase()];\n\t\tif (typeof variant === 'undefined') {\n\t\t\tthrow new TypeError('Unknown hash function');\n\t\t}\n\t\t// @ts-ignore\n\t\t// eslint-disable-next-line @babel/new-cap\n\t\tconst hmac = new jsSHA(variant, 'ARRAYBUFFER');\n\t\thmac.setHMACKey(key, 'ARRAYBUFFER');\n\t\thmac.update(message);\n\t\treturn hmac.getHMAC('ARRAYBUFFER');\n\t}\n};\n\nexport { hmacDigest };\n","/**\n * Pads a number with leading zeros.\n * @param {number|string} num Number.\n * @param {number} digits Digits.\n * @returns {string} Padded number.\n */\nconst pad = (num, digits) => {\n\tlet prefix = '';\n\tlet repeat = digits - String(num).length;\n\twhile (repeat-- > 0) prefix += '0';\n\treturn `${prefix}${num}`;\n};\n\nexport { pad };\n","/**\n * RFC 4648 base32 alphabet without pad.\n * @type {string}\n */\nconst ALPHABET = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ234567';\n\n/**\n * Converts a base32 string to an ArrayBuffer (RFC 4648).\n * {@link https://github.com/LinusU/base32-decode|LinusU/base32-decode}\n * @param {string} str Base32 string.\n * @returns {ArrayBuffer} ArrayBuffer.\n */\nconst base32ToBuf = (str) => {\n\t// Canonicalize to all upper case and remove padding if it exists.\n\tconst cstr = str.toUpperCase().replace(/=+$/, '');\n\n\tconst buf = new ArrayBuffer((cstr.length * 5) / 8 | 0);\n\tconst arr = new Uint8Array(buf);\n\tlet bits = 0;\n\tlet value = 0;\n\tlet index = 0;\n\n\tfor (let i = 0; i < cstr.length; i++) {\n\t\tconst idx = ALPHABET.indexOf(cstr[i]);\n\t\tif (idx === -1) throw new TypeError(`Invalid character found: ${cstr[i]}`);\n\n\t\tvalue = (value << 5) | idx;\n\t\tbits += 5;\n\n\t\tif (bits >= 8) {\n\t\t\tarr[index++] = (value >>> bits - 8) & 255;\n\t\t\tbits -= 8;\n\t\t}\n\t}\n\n\treturn buf;\n};\n\n/**\n * Converts an ArrayBuffer to a base32 string (RFC 4648).\n * {@link https://github.com/LinusU/base32-encode|LinusU/base32-encode}\n * @param {ArrayBuffer} buf ArrayBuffer.\n * @returns {string} Base32 string.\n */\nconst base32FromBuf = (buf) => {\n\tconst arr = new Uint8Array(buf);\n\tlet bits = 0;\n\tlet value = 0;\n\tlet str = '';\n\n\tfor (let i = 0; i < arr.length; i++) {\n\t\tvalue = (value << 8) | arr[i];\n\t\tbits += 8;\n\n\t\twhile (bits >= 5) {\n\t\t\tstr += ALPHABET[(value >>> bits - 5) & 31];\n\t\t\tbits -= 5;\n\t\t}\n\t}\n\n\tif (bits > 0) {\n\t\tstr += ALPHABET[(value << 5 - bits) & 31];\n\t}\n\n\treturn str;\n};\n\nexport { base32ToBuf, base32FromBuf };\n","/**\n * Converts a hexadecimal string to an ArrayBuffer.\n * @param {string} str Hexadecimal string.\n * @returns {ArrayBuffer} ArrayBuffer.\n */\nconst hexToBuf = (str) => {\n\tconst buf = new ArrayBuffer(str.length / 2);\n\tconst arr = new Uint8Array(buf);\n\n\tfor (let i = 0; i < str.length; i += 2) {\n\t\tarr[i / 2] = parseInt(str.substr(i, 2), 16);\n\t}\n\n\treturn buf;\n};\n\n/**\n * Converts an ArrayBuffer to a hexadecimal string.\n * @param {ArrayBuffer} buf ArrayBuffer.\n * @returns {string} Hexadecimal string.\n */\nconst hexFromBuf = (buf) => {\n\tconst arr = new Uint8Array(buf);\n\tlet str = '';\n\n\tfor (let i = 0; i < arr.length; i++) {\n\t\tconst hex = arr[i].toString(16);\n\t\tif (hex.length === 1) str += '0';\n\t\tstr += hex;\n\t}\n\n\treturn str.toUpperCase();\n};\n\nexport { hexToBuf, hexFromBuf };\n","/**\n * Converts a Latin-1 string to an ArrayBuffer.\n * @param {string} str Latin-1 string.\n * @returns {ArrayBuffer} ArrayBuffer.\n */\nconst latin1ToBuf = (str) => {\n\tconst buf = new ArrayBuffer(str.length);\n\tconst arr = new Uint8Array(buf);\n\n\tfor (let i = 0; i < str.length; i++) {\n\t\tarr[i] = str.charCodeAt(i) & 0xFF;\n\t}\n\n\treturn buf;\n};\n\n/**\n * Converts an ArrayBuffer to a Latin-1 string.\n * @param {ArrayBuffer} buf ArrayBuffer.\n * @returns {string} Latin-1 string.\n */\nconst latin1FromBuf = (buf) => {\n\tconst arr = new Uint8Array(buf);\n\tlet str = '';\n\n\tfor (let i = 0; i < arr.length; i++) {\n\t\tstr += String.fromCharCode(arr[i]);\n\t}\n\n\treturn str;\n};\n\nexport { latin1ToBuf, latin1FromBuf };\n","import { globalThis } from '../global-this';\n\n/**\n * TextEncoder instance.\n * @type {TextEncoder|null}\n */\nconst ENCODER = globalThis.TextEncoder\n\t? new globalThis.TextEncoder('utf-8')\n\t: null;\n\n/**\n * TextDecoder instance.\n * @type {TextDecoder|null}\n */\nconst DECODER = globalThis.TextDecoder\n\t? new globalThis.TextDecoder('utf-8')\n\t: null;\n\n/**\n * Converts an UTF-8 string to an ArrayBuffer.\n * @param {string} str String.\n * @returns {ArrayBuffer} ArrayBuffer.\n */\nconst utf8ToBuf = (str) => {\n\tif (!ENCODER) {\n\t\tthrow new Error('Encoding API not available');\n\t}\n\n\treturn ENCODER.encode(str).buffer;\n};\n\n/**\n * Converts an ArrayBuffer to an UTF-8 string.\n * @param {ArrayBuffer} buf ArrayBuffer.\n * @returns {string} String.\n */\nconst utf8FromBuf = (buf) => {\n\tif (!DECODER) {\n\t\tthrow new Error('Encoding API not available');\n\t}\n\n\treturn DECODER.decode(buf);\n};\n\nexport { utf8ToBuf, utf8FromBuf };\n","import { globalThis } from '../global-this';\nimport { isNode } from '../is-node';\nimport { nodeRequire } from '../node-require';\n\nconst NodeCrypto = isNode ? nodeRequire('crypto') : undefined;\nconst BrowserCrypto = !isNode ? globalThis.crypto || globalThis.msCrypto : undefined;\n\n/**\n * Returns random bytes.\n * @param {number} size Size.\n * @returns {ArrayBuffer} Random bytes.\n */\nconst randomBytes = (size) => {\n\tif (isNode) {\n\t\treturn NodeCrypto.randomBytes(size).buffer;\n\t} else {\n\t\tif (!BrowserCrypto || !BrowserCrypto.getRandomValues) {\n\t\t\tthrow new Error('Cryptography API not available');\n\t\t}\n\t\treturn BrowserCrypto.getRandomValues(new Uint8Array(size)).buffer;\n\t}\n};\n\nexport { randomBytes };\n","import { base32ToBuf, base32FromBuf } from './utils/encoding/base32';\nimport { hexToBuf, hexFromBuf } from './utils/encoding/hex';\nimport { latin1ToBuf, latin1FromBuf } from './utils/encoding/latin1';\nimport { utf8ToBuf, utf8FromBuf } from './utils/encoding/utf8';\nimport { randomBytes } from './utils/crypto/random-bytes';\n\n/**\n * OTP secret key.\n */\nclass Secret {\n\t/**\n\t * Creates a secret key object.\n\t * @param {Object} [config] Configuration options.\n\t * @param {ArrayBuffer} [config.buffer=randomBytes] Secret key.\n\t * @param {number} [config.size=20] Number of random bytes to generate, ignored if 'buffer' is provided.\n\t */\n\tconstructor({ buffer, size = 20 } = {}) {\n\t\t/**\n\t\t * Secret key.\n\t\t * @type {ArrayBuffer}\n\t\t */\n\t\tthis.buffer = typeof buffer === 'undefined'\n\t\t\t? randomBytes(size)\n\t\t\t: buffer;\n\t}\n\n\t/**\n\t * Converts a Latin-1 string to a Secret object.\n\t * @param {string} str Latin-1 string.\n\t * @returns {Secret} Secret object.\n\t */\n\tstatic fromLatin1(str) {\n\t\treturn new Secret({ buffer: latin1ToBuf(str) });\n\t}\n\n\t/**\n\t * Converts an UTF-8 string to a Secret object.\n\t * @param {string} str UTF-8 string.\n\t * @returns {Secret} Secret object.\n\t */\n\tstatic fromUTF8(str) {\n\t\treturn new Secret({ buffer: utf8ToBuf(str) });\n\t}\n\n\t/**\n\t * Converts a base32 string to a Secret object.\n\t * @param {string} str Base32 string.\n\t * @returns {Secret} Secret object.\n\t */\n\tstatic fromBase32(str) {\n\t\treturn new Secret({ buffer: base32ToBuf(str) });\n\t}\n\n\t/**\n\t * Converts a hexadecimal string to a Secret object.\n\t * @param {string} str Hexadecimal string.\n\t * @returns {Secret} Secret object.\n\t */\n\tstatic fromHex(str) {\n\t\treturn new Secret({ buffer: hexToBuf(str) });\n\t}\n\n\t/**\n\t * Latin-1 string representation of secret key.\n\t * @type {string}\n\t */\n\tget latin1() {\n\t\tObject.defineProperty(this, 'latin1', {\n\t\t\tenumerable: true,\n\t\t\tvalue: latin1FromBuf(this.buffer),\n\t\t});\n\n\t\treturn this.latin1;\n\t}\n\n\t/**\n\t * UTF-8 string representation of secret key.\n\t * @type {string}\n\t */\n\tget utf8() {\n\t\tObject.defineProperty(this, 'utf8', {\n\t\t\tenumerable: true,\n\t\t\tvalue: utf8FromBuf(this.buffer),\n\t\t});\n\n\t\treturn this.utf8;\n\t}\n\n\t/**\n\t * Base32 string representation of secret key.\n\t * @type {string}\n\t */\n\tget base32() {\n\t\tObject.defineProperty(this, 'base32', {\n\t\t\tenumerable: true,\n\t\t\tvalue: base32FromBuf(this.buffer),\n\t\t});\n\n\t\treturn this.base32;\n\t}\n\n\t/**\n\t * Hexadecimal string representation of secret key.\n\t * @type {string}\n\t */\n\tget hex() {\n\t\tObject.defineProperty(this, 'hex', {\n\t\t\tenumerable: true,\n\t\t\tvalue: hexFromBuf(this.buffer),\n\t\t});\n\n\t\treturn this.hex;\n\t}\n}\n\nexport { Secret };\n","import { globalThis } from '../global-this';\nimport { isNode } from '../is-node';\nimport { nodeRequire } from '../node-require';\n\nconst NodeBuffer = isNode ? globalThis.Buffer : undefined;\nconst NodeCrypto = isNode ? nodeRequire('crypto') : undefined;\n\n/**\n * Returns true if a is equal to b, without leaking timing information that would allow an attacker to guess one of the values.\n * @param {string} a String a.\n * @param {string} b String b.\n * @returns {boolean} Equality result.\n */\nconst timingSafeEqual = (a, b) => {\n\tif (isNode) {\n\t\treturn NodeCrypto.timingSafeEqual(NodeBuffer.from(a), NodeBuffer.from(b));\n\t} else {\n\t\tif (a.length !== b.length) {\n\t\t\tthrow new TypeError('Input strings must have the same length');\n\t\t}\n\t\tlet i = -1;\n\t\tlet out = 0;\n\t\twhile (++i < a.length) {\n\t\t\tout |= a.charCodeAt(i) ^ b.charCodeAt(i);\n\t\t}\n\t\treturn out === 0;\n\t}\n};\n\nexport { timingSafeEqual };\n","import { uintToBuf } from './utils/encoding/uint';\nimport { hmacDigest } from './utils/crypto/hmac-digest';\nimport { pad } from './utils/pad';\nimport { Secret } from './secret';\nimport { timingSafeEqual } from './utils/crypto/timing-safe-equal';\n\n/**\n * HOTP: An HMAC-based One-time Password Algorithm.\n * {@link https://tools.ietf.org/html/rfc4226|RFC 4226}\n */\nclass HOTP {\n\t/**\n\t * Default configuration.\n\t * @type {{\n\t * issuer: string,\n\t * label: string,\n\t * algorithm: string,\n\t * digits: number,\n\t * counter: number\n\t * window: number\n\t * }}\n\t */\n\tstatic get defaults() {\n\t\treturn {\n\t\t\tissuer: '',\n\t\t\tlabel: 'OTPAuth',\n\t\t\talgorithm: 'SHA1',\n\t\t\tdigits: 6,\n\t\t\tcounter: 0,\n\t\t\twindow: 1,\n\t\t};\n\t}\n\n\t/**\n\t * Creates an HOTP object.\n\t * @param {Object} [config] Configuration options.\n\t * @param {string} [config.issuer=''] Account provider.\n\t * @param {string} [config.label='OTPAuth'] Account label.\n\t * @param {Secret|string} [config.secret=Secret] Secret key.\n\t * @param {string} [config.algorithm='SHA1'] HMAC hashing algorithm.\n\t * @param {number} [config.digits=6] Token length.\n\t * @param {number} [config.counter=0] Initial counter value.\n\t */\n\tconstructor({\n\t\tissuer = HOTP.defaults.issuer,\n\t\tlabel = HOTP.defaults.label,\n\t\tsecret = new Secret(),\n\t\talgorithm = HOTP.defaults.algorithm,\n\t\tdigits = HOTP.defaults.digits,\n\t\tcounter = HOTP.defaults.counter,\n\t} = {}) {\n\t\t/**\n\t\t * Account provider.\n\t\t * @type {string}\n\t\t */\n\t\tthis.issuer = issuer;\n\t\t/**\n\t\t * Account label.\n\t\t * @type {string}\n\t\t */\n\t\tthis.label = label;\n\t\t/**\n\t\t * Secret key.\n\t\t * @type {Secret}\n\t\t */\n\t\tthis.secret = typeof secret === 'string'\n\t\t\t? Secret.fromBase32(secret)\n\t\t\t: secret;\n\t\t/**\n\t\t * HMAC hashing algorithm.\n\t\t * @type {string}\n\t\t */\n\t\tthis.algorithm = algorithm.toUpperCase();\n\t\t/**\n\t\t * Token length.\n\t\t * @type {number}\n\t\t */\n\t\tthis.digits = digits;\n\t\t/**\n\t\t * Initial counter value.\n\t\t * @type {number}\n\t\t */\n\t\tthis.counter = counter;\n\t}\n\n\t/**\n\t * Generates an HOTP token.\n\t * @param {Object} config Configuration options.\n\t * @param {Secret} config.secret Secret key.\n\t * @param {string} [config.algorithm='SHA1'] HMAC hashing algorithm.\n\t * @param {number} [config.digits=6] Token length.\n\t * @param {number} [config.counter=0] Counter value.\n\t * @returns {string} Token.\n\t */\n\tstatic generate({\n\t\tsecret,\n\t\talgorithm = HOTP.defaults.algorithm,\n\t\tdigits = HOTP.defaults.digits,\n\t\tcounter = HOTP.defaults.counter,\n\t}) {\n\t\tconst digest = new Uint8Array(hmacDigest(algorithm, secret.buffer, uintToBuf(counter)));\n\t\tconst offset = digest[digest.byteLength - 1] & 15;\n\t\tconst otp = (\n\t\t\t((digest[offset] & 127) << 24)\n\t\t\t| ((digest[offset + 1] & 255) << 16)\n\t\t\t| ((digest[offset + 2] & 255) << 8)\n\t\t\t| (digest[offset + 3] & 255)\n\t\t) % (10 ** digits);\n\n\t\treturn pad(otp, digits);\n\t}\n\n\t/**\n\t * Generates an HOTP token.\n\t * @param {Object} [config] Configuration options.\n\t * @param {number} [config.counter=this.counter++] Counter value.\n\t * @returns {string} Token.\n\t */\n\tgenerate({\n\t\tcounter = this.counter++,\n\t} = {}) {\n\t\treturn HOTP.generate({\n\t\t\tsecret: this.secret,\n\t\t\talgorithm: this.algorithm,\n\t\t\tdigits: this.digits,\n\t\t\tcounter,\n\t\t});\n\t}\n\n\t/**\n\t * Validates an HOTP token.\n\t * @param {Object} config Configuration options.\n\t * @param {string} config.token Token value.\n\t * @param {Secret} config.secret Secret key.\n\t * @param {string} [config.algorithm='SHA1'] HMAC hashing algorithm.\n\t * @param {number} config.digits Token length.\n\t * @param {number} [config.counter=0] Counter value.\n\t * @param {number} [config.window=1] Window of counter values to test.\n\t * @returns {number|null} Token delta, or null if the token is not found.\n\t */\n\tstatic validate({\n\t\ttoken,\n\t\tsecret,\n\t\talgorithm,\n\t\tdigits,\n\t\tcounter = HOTP.defaults.counter,\n\t\twindow = HOTP.defaults.window,\n\t}) {\n\t\t// Return early if the token length does not match the digit number.\n\t\tif (token.length !== digits) return null;\n\n\t\tlet delta = null;\n\n\t\tfor (let i = counter - window; i <= counter + window; ++i) {\n\t\t\tconst generatedToken = HOTP.generate({\n\t\t\t\tsecret,\n\t\t\t\talgorithm,\n\t\t\t\tdigits,\n\t\t\t\tcounter: i,\n\t\t\t});\n\n\t\t\tif (timingSafeEqual(token, generatedToken)) {\n\t\t\t\tdelta = i - counter;\n\t\t\t}\n\t\t}\n\n\t\treturn delta;\n\t}\n\n\t/**\n\t * Validates an HOTP token.\n\t * @param {Object} config Configuration options.\n\t * @param {string} config.token Token value.\n\t * @param {number} [config.counter=this.counter] Counter value.\n\t * @param {number} [config.window=1] Window of counter values to test.\n\t * @returns {number|null} Token delta, or null if the token is not found.\n\t */\n\tvalidate({\n\t\ttoken,\n\t\tcounter = this.counter,\n\t\twindow,\n\t}) {\n\t\treturn HOTP.validate({\n\t\t\ttoken,\n\t\t\tsecret: this.secret,\n\t\t\talgorithm: this.algorithm,\n\t\t\tdigits: this.digits,\n\t\t\tcounter,\n\t\t\twindow,\n\t\t});\n\t}\n\n\t/**\n\t * Returns a Google Authenticator key URI.\n\t * @returns {string} URI.\n\t */\n\ttoString() {\n\t\tconst e = encodeURIComponent;\n\t\treturn 'otpauth://hotp/'\n\t\t\t+ `${this.issuer.length > 0\n\t\t\t\t? `${e(this.issuer)}:${e(this.label)}?issuer=${e(this.issuer)}&`\n\t\t\t\t: `${e(this.label)}?`}`\n\t\t\t+ `secret=${e(this.secret.base32)}&`\n\t\t\t+ `algorithm=${e(this.algorithm)}&`\n\t\t\t+ `digits=${e(this.digits)}&`\n\t\t\t+ `counter=${e(this.counter)}`;\n\t}\n}\n\nexport { HOTP };\n","import { HOTP } from './hotp';\nimport { Secret } from './secret';\n\n/**\n * TOTP: Time-Based One-Time Password Algorithm.\n * {@link https://tools.ietf.org/html/rfc6238|RFC 6238}\n */\nclass TOTP {\n\t/**\n\t * Default configuration.\n\t * @type {{\n\t * issuer: string,\n\t * label: string,\n\t * algorithm: string,\n\t * digits: number,\n\t * period: number\n\t * window: number\n\t * }}\n\t */\n\tstatic get defaults() {\n\t\treturn {\n\t\t\tissuer: '',\n\t\t\tlabel: 'OTPAuth',\n\t\t\talgorithm: 'SHA1',\n\t\t\tdigits: 6,\n\t\t\tperiod: 30,\n\t\t\twindow: 1,\n\t\t};\n\t}\n\n\t/**\n\t * Creates a TOTP object.\n\t * @param {Object} [config] Configuration options.\n\t * @param {string} [config.issuer=''] Account provider.\n\t * @param {string} [config.label='OTPAuth'] Account label.\n\t * @param {Secret|string} [config.secret=Secret] Secret key.\n\t * @param {string} [config.algorithm='SHA1'] HMAC hashing algorithm.\n\t * @param {number} [config.digits=6] Token length.\n\t * @param {number} [config.period=30] Token time-step duration.\n\t */\n\tconstructor({\n\t\tissuer = TOTP.defaults.issuer,\n\t\tlabel = TOTP.defaults.label,\n\t\tsecret = new Secret(),\n\t\talgorithm = TOTP.defaults.algorithm,\n\t\tdigits = TOTP.defaults.digits,\n\t\tperiod = TOTP.defaults.period,\n\t} = {}) {\n\t\t/**\n\t\t * Account provider.\n\t\t * @type {string}\n\t\t */\n\t\tthis.issuer = issuer;\n\t\t/**\n\t\t * Account label.\n\t\t * @type {string}\n\t\t */\n\t\tthis.label = label;\n\t\t/**\n\t\t * Secret key.\n\t\t * @type {Secret}\n\t\t */\n\t\tthis.secret = typeof secret === 'string'\n\t\t\t? Secret.fromBase32(secret)\n\t\t\t: secret;\n\t\t/**\n\t\t * HMAC hashing algorithm.\n\t\t * @type {string}\n\t\t */\n\t\tthis.algorithm = algorithm.toUpperCase();\n\t\t/**\n\t\t * Token length.\n\t\t * @type {number}\n\t\t */\n\t\tthis.digits = digits;\n\t\t/**\n\t\t * Token time-step duration.\n\t\t * @type {number}\n\t\t */\n\t\tthis.period = period;\n\t}\n\n\t/**\n\t * Generates a TOTP token.\n\t * @param {Object} config Configuration options.\n\t * @param {Secret} config.secret Secret key.\n\t * @param {string} [config.algorithm='SHA1'] HMAC hashing algorithm.\n\t * @param {number} [config.digits=6] Token length.\n\t * @param {number} [config.period=30] Token time-step duration.\n\t * @param {number} [config.timestamp=Date.now] Timestamp value in milliseconds.\n\t * @returns {string} Token.\n\t */\n\tstatic generate({\n\t\tsecret,\n\t\talgorithm,\n\t\tdigits,\n\t\tperiod = TOTP.defaults.period,\n\t\ttimestamp = Date.now(),\n\t}) {\n\t\treturn HOTP.generate({\n\t\t\tsecret,\n\t\t\talgorithm,\n\t\t\tdigits,\n\t\t\tcounter: Math.floor(timestamp / 1000 / period),\n\t\t});\n\t}\n\n\t/**\n\t * Generates a TOTP token.\n\t * @param {Object} [config] Configuration options.\n\t * @param {number} [config.timestamp=Date.now] Timestamp value in milliseconds.\n\t * @returns {string} Token.\n\t */\n\tgenerate({\n\t\ttimestamp = Date.now(),\n\t} = {}) {\n\t\treturn TOTP.generate({\n\t\t\tsecret: this.secret,\n\t\t\talgorithm: this.algorithm,\n\t\t\tdigits: this.digits,\n\t\t\tperiod: this.period,\n\t\t\ttimestamp,\n\t\t});\n\t}\n\n\t/**\n\t * Validates a TOTP token.\n\t * @param {Object} config Configuration options.\n\t * @param {string} config.token Token value.\n\t * @param {Secret} config.secret Secret key.\n\t * @param {string} [config.algorithm='SHA1'] HMAC hashing algorithm.\n\t * @param {number} config.digits Token length.\n\t * @param {number} [config.period=30] Token time-step duration.\n\t * @param {number} [config.timestamp=Date.now] Timestamp value in milliseconds.\n\t * @param {number} [config.window=1] Window of counter values to test.\n\t * @returns {number|null} Token delta, or null if the token is not found.\n\t */\n\tstatic validate({\n\t\ttoken,\n\t\tsecret,\n\t\talgorithm,\n\t\tdigits,\n\t\tperiod = TOTP.defaults.period,\n\t\ttimestamp = Date.now(),\n\t\twindow,\n\t}) {\n\t\treturn HOTP.validate({\n\t\t\ttoken,\n\t\t\tsecret,\n\t\t\talgorithm,\n\t\t\tdigits,\n\t\t\tcounter: Math.floor(timestamp / 1000 / period),\n\t\t\twindow,\n\t\t});\n\t}\n\n\t/**\n\t * Validates a TOTP token.\n\t * @param {Object} config Configuration options.\n\t * @param {string} config.token Token value.\n\t * @param {number} [config.timestamp=Date.now] Timestamp value in milliseconds.\n\t * @param {number} [config.window=1] Window of counter values to test.\n\t * @returns {number|null} Token delta, or null if the token is not found.\n\t */\n\tvalidate({\n\t\ttoken,\n\t\ttimestamp,\n\t\twindow,\n\t}) {\n\t\treturn TOTP.validate({\n\t\t\ttoken,\n\t\t\tsecret: this.secret,\n\t\t\talgorithm: this.algorithm,\n\t\t\tdigits: this.digits,\n\t\t\tperiod: this.period,\n\t\t\ttimestamp,\n\t\t\twindow,\n\t\t});\n\t}\n\n\t/**\n\t * Returns a Google Authenticator key URI.\n\t * @returns {string} URI.\n\t */\n\ttoString() {\n\t\tconst e = encodeURIComponent;\n\t\treturn 'otpauth://totp/'\n\t\t\t+ `${this.issuer.length > 0\n\t\t\t\t? `${e(this.issuer)}:${e(this.label)}?issuer=${e(this.issuer)}&`\n\t\t\t\t: `${e(this.label)}?`}`\n\t\t\t+ `secret=${e(this.secret.base32)}&`\n\t\t\t+ `algorithm=${e(this.algorithm)}&`\n\t\t\t+ `digits=${e(this.digits)}&`\n\t\t\t+ `period=${e(this.period)}`;\n\t}\n}\n\nexport { TOTP };\n","import { HOTP } from './hotp';\nimport { TOTP } from './totp';\n\n/**\n * Key URI regex (otpauth://TYPE/[ISSUER:]LABEL?PARAMETERS).\n * @type {RegExp}\n */\nconst OTPURI_REGEX = /^otpauth:\\/\\/([ht]otp)\\/(.+)\\?((?:&?[A-Z0-9.~_-]+=[^&]*)+)$/i;\n\n/**\n * RFC 4648 base32 alphabet with pad.\n * @type {RegExp}\n */\nconst SECRET_REGEX = /^[2-7A-Z]+=*$/i;\n\n/**\n * Regex for supported algorithms.\n * @type {RegExp}\n */\nconst ALGORITHM_REGEX = /^SHA(?:1|224|256|384|512|3-224|3-256|3-384|3-512)$/i;\n\n/**\n * Integer regex.\n * @type {RegExp}\n */\nconst INTEGER_REGEX = /^[+-]?\\d+$/;\n\n/**\n * Positive integer regex.\n * @type {RegExp}\n */\nconst POSITIVE_INTEGER_REGEX = /^\\+?[1-9]\\d*$/;\n\n/**\n * HOTP/TOTP object/string conversion.\n * {@link https://github.com/google/google-authenticator/wiki/Key-Uri-Format|Key URI Format}\n */\nclass URI {\n\t/**\n\t * Parses a Google Authenticator key URI and returns an HOTP/TOTP object.\n\t * @param {string} uri Google Authenticator Key URI.\n\t * @returns {HOTP|TOTP} HOTP/TOTP object.\n\t */\n\tstatic parse(uri) {\n\t\tlet uriGroups;\n\n\t\ttry {\n\t\t\turiGroups = uri.match(OTPURI_REGEX);\n\t\t} catch (error) { /* Handled below */ }\n\n\t\tif (!Array.isArray(uriGroups)) {\n\t\t\tthrow new URIError('Invalid URI format');\n\t\t}\n\n\t\t// Extract URI groups.\n\t\tconst uriType = uriGroups[1].toLowerCase();\n\t\tconst uriLabel = uriGroups[2].split(/:(.+)/, 2).map(decodeURIComponent);\n\t\t/** @type {Object.} */\n\t\tconst uriParams = uriGroups[3].split('&').reduce((acc, cur) => {\n\t\t\tconst pairArr = cur.split(/=(.*)/, 2).map(decodeURIComponent);\n\t\t\tconst pairKey = pairArr[0].toLowerCase();\n\t\t\tconst pairVal = pairArr[1];\n\t\t\t/** @type {Object.} */\n\t\t\tconst pairAcc = acc;\n\n\t\t\tpairAcc[pairKey] = pairVal;\n\t\t\treturn pairAcc;\n\t\t}, {});\n\n\t\t// 'OTP' will be instantiated with 'config' argument.\n\t\tlet OTP;\n\t\tconst config = {};\n\n\t\tif (uriType === 'hotp') {\n\t\t\tOTP = HOTP;\n\n\t\t\t// Counter: required\n\t\t\tif (typeof uriParams.counter !== 'undefined' && INTEGER_REGEX.test(uriParams.counter)) {\n\t\t\t\tconfig.counter = parseInt(uriParams.counter, 10);\n\t\t\t} else {\n\t\t\t\tthrow new TypeError('Missing or invalid \\'counter\\' parameter');\n\t\t\t}\n\t\t} else if (uriType === 'totp') {\n\t\t\tOTP = TOTP;\n\n\t\t\t// Period: optional\n\t\t\tif (typeof uriParams.period !== 'undefined') {\n\t\t\t\tif (POSITIVE_INTEGER_REGEX.test(uriParams.period)) {\n\t\t\t\t\tconfig.period = parseInt(uriParams.period, 10);\n\t\t\t\t} else {\n\t\t\t\t\tthrow new TypeError('Invalid \\'period\\' parameter');\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tthrow new TypeError('Unknown OTP type');\n\t\t}\n\n\t\t// Label: required\n\t\t// Issuer: optional\n\t\tif (uriLabel.length === 2) {\n\t\t\tconfig.label = uriLabel[1];\n\t\t\tif (typeof uriParams.issuer === 'undefined') {\n\t\t\t\tconfig.issuer = uriLabel[0];\n\t\t\t} else if (uriParams.issuer === uriLabel[0]) {\n\t\t\t\tconfig.issuer = uriParams.issuer;\n\t\t\t} else {\n\t\t\t\tthrow new TypeError('Invalid \\'issuer\\' parameter');\n\t\t\t}\n\t\t} else {\n\t\t\tconfig.label = uriLabel[0];\n\t\t\tif (typeof uriParams.issuer !== 'undefined') {\n\t\t\t\tconfig.issuer = uriParams.issuer;\n\t\t\t}\n\t\t}\n\n\t\t// Secret: required\n\t\tif (typeof uriParams.secret !== 'undefined' && SECRET_REGEX.test(uriParams.secret)) {\n\t\t\tconfig.secret = uriParams.secret;\n\t\t} else {\n\t\t\tthrow new TypeError('Missing or invalid \\'secret\\' parameter');\n\t\t}\n\n\t\t// Algorithm: optional\n\t\tif (typeof uriParams.algorithm !== 'undefined') {\n\t\t\tif (ALGORITHM_REGEX.test(uriParams.algorithm)) {\n\t\t\t\tconfig.algorithm = uriParams.algorithm;\n\t\t\t} else {\n\t\t\t\tthrow new TypeError('Invalid \\'algorithm\\' parameter');\n\t\t\t}\n\t\t}\n\n\t\t// Digits: optional\n\t\tif (typeof uriParams.digits !== 'undefined') {\n\t\t\tif (POSITIVE_INTEGER_REGEX.test(uriParams.digits)) {\n\t\t\t\tconfig.digits = parseInt(uriParams.digits, 10);\n\t\t\t} else {\n\t\t\t\tthrow new TypeError('Invalid \\'digits\\' parameter');\n\t\t\t}\n\t\t}\n\n\t\treturn new OTP(config);\n\t}\n\n\t/**\n\t * Converts an HOTP/TOTP object to a Google Authenticator key URI.\n\t * @param {HOTP|TOTP} otp HOTP/TOTP object.\n\t * @returns {string} Google Authenticator Key URI.\n\t */\n\tstatic stringify(otp) {\n\t\tif (otp instanceof HOTP || otp instanceof TOTP) {\n\t\t\treturn otp.toString();\n\t\t}\n\n\t\tthrow new TypeError('Invalid \\'HOTP/TOTP\\' object');\n\t}\n}\n\nexport { URI };\n","/**\n * Library version.\n * @type {string}\n */\nconst version = '__OTPAUTH_VERSION__';\n\nexport { version };\n"],"names":["uintToBuf","num","buf","ArrayBuffer","arr","Uint8Array","acc","i","b64Tab","uint8array2packed","existingPacked","existingPackedLen","bigEndianMod","intOffset","byteOffset","packed","existingByteLen","shiftModifier","length","push","value","binLen","getStrConverter","format","utfType","Error","str","existingBin","existingBinLen","parseInt","substr","isNaN","codePnt","codePntArr","j","transposeBytes","byteCnt","charCodeAt","tmpInt","strPart","firstEqual","indexOf","search","replace","charAt","ignore","getOutputConverter","outputBinLen","outputOptions","binarray","outputLength","formatOpts","srcByte","outputUpper","toUpperCase","triplet","int1","int2","b64Pad","String","fromCharCode","retVal","arrView","globalThis","_typeof","Object","defineProperty","prototype","get","this","configurable","__GLOBALTHIS__","self","window","global","isNode","toString","call","process","nodeRequire","eval","NodeBuffer","Buffer","undefined","NodeCrypto","OPENSSL_TO_JSSHA_ALGO","hmacDigest","algorithm","key","message","hmac","createHmac","from","update","digest","buffer","variant","TypeError","jsSHA","setHMACKey","getHMAC","pad","digits","prefix","repeat","ALPHABET","base32ToBuf","cstr","bits","index","idx","base32FromBuf","hexToBuf","hexFromBuf","hex","latin1ToBuf","latin1FromBuf","ENCODER","TextEncoder","DECODER","TextDecoder","utf8ToBuf","encode","utf8FromBuf","decode","BrowserCrypto","crypto","msCrypto","randomBytes","size","getRandomValues","Secret","enumerable","latin1","utf8","base32","timingSafeEqual","a","b","out","HOTP","issuer","defaults","label","secret","counter","fromBase32","generate","token","validate","e","encodeURIComponent","offset","byteLength","otp","delta","generatedToken","TOTP","period","timestamp","Date","now","Math","floor","OTPURI_REGEX","SECRET_REGEX","ALGORITHM_REGEX","INTEGER_REGEX","POSITIVE_INTEGER_REGEX","URI","uri","uriGroups","match","error","Array","isArray","URIError","OTP","uriType","toLowerCase","uriLabel","split","map","decodeURIComponent","uriParams","reduce","cur","pairArr","pairKey","pairVal","pairAcc","config","test","version"],"mappings":"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"} \ No newline at end of file diff --git a/docs/assets/css/main.css b/docs/assets/css/main.css deleted file mode 100644 index 2d35c0c8..00000000 --- a/docs/assets/css/main.css +++ /dev/null @@ -1,2660 +0,0 @@ -:root { - --color-background: #fdfdfd; - --color-text: #222; - --color-text-aside: #707070; - --color-link: #4da6ff; - --color-menu-divider: #eee; - --color-menu-divider-focus: #000; - --color-menu-label: #707070; - --color-panel: #fff; - --color-panel-divider: #eee; - --color-comment-tag: #707070; - --color-comment-tag-text: #fff; - --color-code-background: rgba(0, 0, 0, 0.04); - --color-ts: #9600ff; - --color-ts-interface: #647f1b; - --color-ts-enum: #937210; - --color-ts-class: #0672de; - --color-ts-private: #707070; - --color-toolbar: #fff; - --color-toolbar-text: #333; -} - -/*! normalize.css v1.1.3 | MIT License | git.io/normalize */ -/* ========================================================================== - * * HTML5 display definitions - * * ========================================================================== */ -/** - * * Correct `block` display not defined in IE 6/7/8/9 and Firefox 3. */ -article, aside, details, figcaption, figure, footer, header, hgroup, main, nav, section, summary { - display: block; -} - -/** - * * Correct `inline-block` display not defined in IE 6/7/8/9 and Firefox 3. */ -audio, canvas, video { - display: inline-block; - *display: inline; - *zoom: 1; -} - -/** - * * Prevent modern browsers from displaying `audio` without controls. - * * Remove excess height in iOS 5 devices. */ -audio:not([controls]) { - display: none; - height: 0; -} - -/** - * * Address styling not present in IE 7/8/9, Firefox 3, and Safari 4. - * * Known issue: no IE 6 support. */ -[hidden] { - display: none; -} - -/* ========================================================================== - * * Base - * * ========================================================================== */ -/** - * * 1. Correct text resizing oddly in IE 6/7 when body `font-size` is set using - * * `em` units. - * * 2. Prevent iOS text size adjust after orientation change, without disabling - * * user zoom. */ -html { - font-size: 100%; - /* 1 */ - -ms-text-size-adjust: 100%; - /* 2 */ - -webkit-text-size-adjust: 100%; - /* 2 */ - font-family: sans-serif; -} - -/** - * * Address `font-family` inconsistency between `textarea` and other form - * * elements. */ -button, input, select, textarea { - font-family: sans-serif; -} - -/** - * * Address margins handled incorrectly in IE 6/7. */ -body { - margin: 0; -} - -/* ========================================================================== - * * Links - * * ========================================================================== */ -/** - * * Address `outline` inconsistency between Chrome and other browsers. */ -a:focus { - outline: thin dotted; -} -a:active, a:hover { - outline: 0; -} - -/** - * * Improve readability when focused and also mouse hovered in all browsers. */ -/* ========================================================================== - * * Typography - * * ========================================================================== */ -/** - * * Address font sizes and margins set differently in IE 6/7. - * * Address font sizes within `section` and `article` in Firefox 4+, Safari 5, - * * and Chrome. */ -h1 { - font-size: 2em; - margin: 0.67em 0; -} - -h2 { - font-size: 1.5em; - margin: 0.83em 0; -} - -h3 { - font-size: 1.17em; - margin: 1em 0; -} - -h4, .tsd-index-panel h3 { - font-size: 1em; - margin: 1.33em 0; -} - -h5 { - font-size: 0.83em; - margin: 1.67em 0; -} - -h6 { - font-size: 0.67em; - margin: 2.33em 0; -} - -/** - * * Address styling not present in IE 7/8/9, Safari 5, and Chrome. */ -abbr[title] { - border-bottom: 1px dotted; -} - -/** - * * Address style set to `bolder` in Firefox 3+, Safari 4/5, and Chrome. */ -b, strong { - font-weight: bold; -} - -blockquote { - margin: 1em 40px; -} - -/** - * * Address styling not present in Safari 5 and Chrome. */ -dfn { - font-style: italic; -} - -/** - * * Address differences between Firefox and other browsers. - * * Known issue: no IE 6/7 normalization. */ -hr { - -moz-box-sizing: content-box; - box-sizing: content-box; - height: 0; -} - -/** - * * Address styling not present in IE 6/7/8/9. */ -mark { - background: #ff0; - color: #000; -} - -/** - * * Address margins set differently in IE 6/7. */ -p, pre { - margin: 1em 0; -} - -/** - * * Correct font family set oddly in IE 6, Safari 4/5, and Chrome. */ -code, kbd, pre, samp { - font-family: monospace, serif; - _font-family: "courier new", monospace; - font-size: 1em; -} - -/** - * * Improve readability of pre-formatted text in all browsers. */ -pre { - white-space: pre; - white-space: pre-wrap; - word-wrap: break-word; -} - -/** - * * Address CSS quotes not supported in IE 6/7. */ -q { - quotes: none; -} -q:before, q:after { - content: ""; - content: none; -} - -/** - * * Address `quotes` property not supported in Safari 4. */ -/** - * * Address inconsistent and variable font size in all browsers. */ -small { - font-size: 80%; -} - -/** - * * Prevent `sub` and `sup` affecting `line-height` in all browsers. */ -sub { - font-size: 75%; - line-height: 0; - position: relative; - vertical-align: baseline; -} - -sup { - font-size: 75%; - line-height: 0; - position: relative; - vertical-align: baseline; - top: -0.5em; -} - -sub { - bottom: -0.25em; -} - -/* ========================================================================== - * * Lists - * * ========================================================================== */ -/** - * * Address margins set differently in IE 6/7. */ -dl, menu, ol, ul { - margin: 1em 0; -} - -dd { - margin: 0 0 0 40px; -} - -/** - * * Address paddings set differently in IE 6/7. */ -menu, ol, ul { - padding: 0 0 0 40px; -} - -/** - * * Correct list images handled incorrectly in IE 7. */ -nav ul, nav ol { - list-style: none; - list-style-image: none; -} - -/* ========================================================================== - * * Embedded content - * * ========================================================================== */ -/** - * * 1. Remove border when inside `a` element in IE 6/7/8/9 and Firefox 3. - * * 2. Improve image quality when scaled in IE 7. */ -img { - border: 0; - /* 1 */ - -ms-interpolation-mode: bicubic; -} - -/* 2 */ -/** - * * Correct overflow displayed oddly in IE 9. */ -svg:not(:root) { - overflow: hidden; -} - -/* ========================================================================== - * * Figures - * * ========================================================================== */ -/** - * * Address margin not present in IE 6/7/8/9, Safari 5, and Opera 11. */ -figure, form { - margin: 0; -} - -/* ========================================================================== - * * Forms - * * ========================================================================== */ -/** - * * Correct margin displayed oddly in IE 6/7. */ -/** - * * Define consistent border, margin, and padding. */ -fieldset { - border: 1px solid #c0c0c0; - margin: 0 2px; - padding: 0.35em 0.625em 0.75em; -} - -/** - * * 1. Correct color not being inherited in IE 6/7/8/9. - * * 2. Correct text not wrapping in Firefox 3. - * * 3. Correct alignment displayed oddly in IE 6/7. */ -legend { - border: 0; - /* 1 */ - padding: 0; - white-space: normal; - /* 2 */ - *margin-left: -7px; -} - -/* 3 */ -/** - * * 1. Correct font size not being inherited in all browsers. - * * 2. Address margins set differently in IE 6/7, Firefox 3+, Safari 5, - * * and Chrome. - * * 3. Improve appearance and consistency in all browsers. */ -button, input, select, textarea { - font-size: 100%; - /* 1 */ - margin: 0; - /* 2 */ - vertical-align: baseline; - /* 3 */ - *vertical-align: middle; -} - -/* 3 */ -/** - * * Address Firefox 3+ setting `line-height` on `input` using `!important` in - * * the UA stylesheet. */ -button, input { - line-height: normal; -} - -/** - * * Address inconsistent `text-transform` inheritance for `button` and `select`. - * * All other form control elements do not inherit `text-transform` values. - * * Correct `button` style inheritance in Chrome, Safari 5+, and IE 6+. - * * Correct `select` style inheritance in Firefox 4+ and Opera. */ -button, select { - text-transform: none; -} - -/** - * * 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio` - * * and `video` controls. - * * 2. Correct inability to style clickable `input` types in iOS. - * * 3. Improve usability and consistency of cursor style between image-type - * * `input` and others. - * * 4. Remove inner spacing in IE 7 without affecting normal text inputs. - * * Known issue: inner spacing remains in IE 6. */ -button, html input[type=button] { - -webkit-appearance: button; - /* 2 */ - cursor: pointer; - /* 3 */ - *overflow: visible; -} - -/* 4 */ -input[type=reset], input[type=submit] { - -webkit-appearance: button; - /* 2 */ - cursor: pointer; - /* 3 */ - *overflow: visible; -} - -/* 4 */ -/** - * * Re-set default cursor for disabled elements. */ -button[disabled], html input[disabled] { - cursor: default; -} - -/** - * * 1. Address box sizing set to content-box in IE 8/9. - * * 2. Remove excess padding in IE 8/9. - * * 3. Remove excess padding in IE 7. - * * Known issue: excess padding remains in IE 6. */ -input { - /* 3 */ -} -input[type=checkbox], input[type=radio] { - box-sizing: border-box; - /* 1 */ - padding: 0; - /* 2 */ - *height: 13px; - /* 3 */ - *width: 13px; -} -input[type=search] { - -webkit-appearance: textfield; - /* 1 */ - -moz-box-sizing: content-box; - -webkit-box-sizing: content-box; - /* 2 */ - box-sizing: content-box; -} -input[type=search]::-webkit-search-cancel-button, input[type=search]::-webkit-search-decoration { - -webkit-appearance: none; -} - -/** - * * 1. Address `appearance` set to `searchfield` in Safari 5 and Chrome. - * * 2. Address `box-sizing` set to `border-box` in Safari 5 and Chrome - * * (include `-moz` to future-proof). */ -/** - * * Remove inner padding and search cancel button in Safari 5 and Chrome - * * on OS X. */ -/** - * * Remove inner padding and border in Firefox 3+. */ -button::-moz-focus-inner, input::-moz-focus-inner { - border: 0; - padding: 0; -} - -/** - * * 1. Remove default vertical scrollbar in IE 6/7/8/9. - * * 2. Improve readability and alignment in all browsers. */ -textarea { - overflow: auto; - /* 1 */ - vertical-align: top; -} - -/* 2 */ -/* ========================================================================== - * * Tables - * * ========================================================================== */ -/** - * * Remove most spacing between table cells. */ -table { - border-collapse: collapse; - border-spacing: 0; -} - -ul.tsd-descriptions > li > :first-child, .tsd-panel > :first-child, .col > :first-child, .col-11 > :first-child, .col-10 > :first-child, .col-9 > :first-child, .col-8 > :first-child, .col-7 > :first-child, .col-6 > :first-child, .col-5 > :first-child, .col-4 > :first-child, .col-3 > :first-child, .col-2 > :first-child, .col-1 > :first-child, -ul.tsd-descriptions > li > :first-child > :first-child, -.tsd-panel > :first-child > :first-child, -.col > :first-child > :first-child, -.col-11 > :first-child > :first-child, -.col-10 > :first-child > :first-child, -.col-9 > :first-child > :first-child, -.col-8 > :first-child > :first-child, -.col-7 > :first-child > :first-child, -.col-6 > :first-child > :first-child, -.col-5 > :first-child > :first-child, -.col-4 > :first-child > :first-child, -.col-3 > :first-child > :first-child, -.col-2 > :first-child > :first-child, -.col-1 > :first-child > :first-child, -ul.tsd-descriptions > li > :first-child > :first-child > :first-child, -.tsd-panel > :first-child > :first-child > :first-child, -.col > :first-child > :first-child > :first-child, -.col-11 > :first-child > :first-child > :first-child, -.col-10 > :first-child > :first-child > :first-child, -.col-9 > :first-child > :first-child > :first-child, -.col-8 > :first-child > :first-child > :first-child, -.col-7 > :first-child > :first-child > :first-child, -.col-6 > :first-child > :first-child > :first-child, -.col-5 > :first-child > :first-child > :first-child, -.col-4 > :first-child > :first-child > :first-child, -.col-3 > :first-child > :first-child > :first-child, -.col-2 > :first-child > :first-child > :first-child, -.col-1 > :first-child > :first-child > :first-child { - margin-top: 0; -} -ul.tsd-descriptions > li > :last-child, .tsd-panel > :last-child, .col > :last-child, .col-11 > :last-child, .col-10 > :last-child, .col-9 > :last-child, .col-8 > :last-child, .col-7 > :last-child, .col-6 > :last-child, .col-5 > :last-child, .col-4 > :last-child, .col-3 > :last-child, .col-2 > :last-child, .col-1 > :last-child, -ul.tsd-descriptions > li > :last-child > :last-child, -.tsd-panel > :last-child > :last-child, -.col > :last-child > :last-child, -.col-11 > :last-child > :last-child, -.col-10 > :last-child > :last-child, -.col-9 > :last-child > :last-child, -.col-8 > :last-child > :last-child, -.col-7 > :last-child > :last-child, -.col-6 > :last-child > :last-child, -.col-5 > :last-child > :last-child, -.col-4 > :last-child > :last-child, -.col-3 > :last-child > :last-child, -.col-2 > :last-child > :last-child, -.col-1 > :last-child > :last-child, -ul.tsd-descriptions > li > :last-child > :last-child > :last-child, -.tsd-panel > :last-child > :last-child > :last-child, -.col > :last-child > :last-child > :last-child, -.col-11 > :last-child > :last-child > :last-child, -.col-10 > :last-child > :last-child > :last-child, -.col-9 > :last-child > :last-child > :last-child, -.col-8 > :last-child > :last-child > :last-child, -.col-7 > :last-child > :last-child > :last-child, -.col-6 > :last-child > :last-child > :last-child, -.col-5 > :last-child > :last-child > :last-child, -.col-4 > :last-child > :last-child > :last-child, -.col-3 > :last-child > :last-child > :last-child, -.col-2 > :last-child > :last-child > :last-child, -.col-1 > :last-child > :last-child > :last-child { - margin-bottom: 0; -} - -.container { - max-width: 1200px; - margin: 0 auto; - padding: 0 40px; -} -@media (max-width: 640px) { - .container { - padding: 0 20px; - } -} - -.container-main { - padding-bottom: 200px; -} - -.row { - display: flex; - position: relative; - margin: 0 -10px; -} -.row:after { - visibility: hidden; - display: block; - content: ""; - clear: both; - height: 0; -} - -.col, .col-11, .col-10, .col-9, .col-8, .col-7, .col-6, .col-5, .col-4, .col-3, .col-2, .col-1 { - box-sizing: border-box; - float: left; - padding: 0 10px; -} - -.col-1 { - width: 8.3333333333%; -} - -.offset-1 { - margin-left: 8.3333333333%; -} - -.col-2 { - width: 16.6666666667%; -} - -.offset-2 { - margin-left: 16.6666666667%; -} - -.col-3 { - width: 25%; -} - -.offset-3 { - margin-left: 25%; -} - -.col-4 { - width: 33.3333333333%; -} - -.offset-4 { - margin-left: 33.3333333333%; -} - -.col-5 { - width: 41.6666666667%; -} - -.offset-5 { - margin-left: 41.6666666667%; -} - -.col-6 { - width: 50%; -} - -.offset-6 { - margin-left: 50%; -} - -.col-7 { - width: 58.3333333333%; -} - -.offset-7 { - margin-left: 58.3333333333%; -} - -.col-8 { - width: 66.6666666667%; -} - -.offset-8 { - margin-left: 66.6666666667%; -} - -.col-9 { - width: 75%; -} - -.offset-9 { - margin-left: 75%; -} - -.col-10 { - width: 83.3333333333%; -} - -.offset-10 { - margin-left: 83.3333333333%; -} - -.col-11 { - width: 91.6666666667%; -} - -.offset-11 { - margin-left: 91.6666666667%; -} - -.tsd-kind-icon { - display: block; - position: relative; - padding-left: 20px; - text-indent: -20px; -} -.tsd-kind-icon:before { - content: ""; - display: inline-block; - vertical-align: middle; - width: 17px; - height: 17px; - margin: 0 3px 2px 0; - background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAO4AAADMCAYAAAB0ip8fAAAABGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAACUhSURBVHja7J0PjF1VncfPTEfclm7YEGtKauoWYXVdxLqyNZqyY/gT21hBRCPoaqcLoYFV10B0dXWxZWElsCYYG0wJ2CkkxSxoA8HQlbTL2ImsCLuFlVUisdC1YbItRBIoO03q7PnN+9155553/vx+55737p07v19y+vreu+8zv3vu/d1z7jnne39DMzMzSqxjF91bnfHg5e3xQ6zXrt/5x43wYwT++e5Q2o+vNmI+B2Pnzp1JjI0bN1Y+6XOf6E3xI0edNuX8ePKONMh7r5rJymiCDcs1VEyssr1Ll/t0+a0uM/h6H34es+W6LOUyfIG7UpfbdXkBIfC6HT+nWhsYn9LlPF1WiR/CcNhJunxNlx/qsk+XD+gyhK+P4Ofw/SLPbz+J//9bLsMVuBfq8gz0Ugzn4fUq/PxCwg7NdwZU0gO6nIr/f3qB+yEMt31Ll1Fd3gN3A7ocws/h9Q78HL6/zfHbW3R5DoOSzRh2XH3uw6bbZUvx+5WRK9h8Z3wFg+VB8UMYnu/XwlCGLp/Q5VXPNq/i9xfh9uZvl+myOJVhB+6XdDklcpU5Bbfz2XxnrIDBQ7z6iR/C8DGglb5Vl1cijFdwu6ut3+6qwrAD9xLifcElid/NB8aFeP8xIX4II7AddF93Exm7cXvzt49XYdiBu4wIWZb43XxgLMfXI+KHMALbLcNjQzH7GC4zPktijDi+XEGEhL4jM8z5vSXjaYzSXOVJG6vuy5RVuQOtD2P+t5IfBedSlaFO1cZGnB9rttd3nhbzvxfDaOEb32oG0mFi8B9xBGEyw25xHyRG/4OJ3yns+r1Pl7fUzPBtB0Pwx7FbUmd9cPxoep220Y8JHDCi2EW4vfnbNVUYduDeGhjdMke5bg18H2NchqNpP1OdebOfWf3/QTF8+wJXv5uMgYO66oPjR9PrtI1+FIOGSyN+LMXtvmv99pNVGHbgHtTlYyo8NP0x3M5nMQZ0Ab+PV7whfP1+DYzQvtyEI3kX1lwfVD/mQ522zY9J1V0gEZpS+iFuN2n99lUsSQzXAgzY4GzVmfydMnbiDvz8EUKzHmIUAy+3Gle+5TUwQvtyQpcNuryO5T011QfVj/lQp2304/OqMzr8n6qzaGO58bur8PPHcTvbvqjLal1uSGEMgTqohkXkrhXbQ0vGd1Zm/KA7OMUyWNyfU5XDZDn3hfmnnYxLj1ev02NjGxtxfqzZPnCRgdMPHJwyDQIQVkCtxYCbwtYRekwHIn9jBfaqzuAwhgYp6zMOXvFHoTV5qPDlaoIrxmink2GqWrg2aDmd8fec+5IYuCUGxZ9+1umgz48cZgS30w9H4A7cRmr6u3t0WWdUxp6aGMlBN4j6oPhjBH8j67TG86Nvftyw8fkkWE4t70hqN9nVHWLY+gy+r899lGoUsK/P4E8j67SNfjRBTE9pcaEPfrjKH9EXhxU6wA9X6ero7twK3WU7HOu2tUFIn/MCIkL6vEL6pjwBIySkh5vkR1VH0PuoKqsbqAG7VpdZBrzC+4SAXavLLANe4b0SE2uWNUJIXwTsftWdcB7F96QANgK2h0ENYCNgexjMABYhfT4/hFG2+oT07xjT4b7SG7C2lQL45TnNbzBgnQxfAHsC1skgBLAtlD6kqgvYqYw2+SEMt7mE9AWnipA+yhj+Q91l/9O/VkoH8H4dwKOUS5QO2NF/V+P7H1PfK32ewrA/P+OMM/affPLJJMZLL700Ojk5uT9wJbWF0ueq7hMGUgXsVEab/BCGu2fqEsHvN36TKqSPMua6ykYAFy2wK9iUDjYFAfuSer7n+xyMpUuXqjPPPBMCWOkA9gWs0gGr9u/fr44ePeo7MC6h9CHr4KQI2CmMNvkhDM+4mXKL4FdagZcipI8yhinBFwu2fjBcAUwM2MIKAfSQUVwHhyJg5zLa5Icw/LdrhQh+xiiuwKMI6VmMkVjw/dvun6vHnvpR0lBbDkYRwI8++uhswDJsmVEhlO3MUT6wIxUYbfJDGP7PjxjBHzKKkJ7FiM7j/v4N05XHykMMc34vNM974sSJ0Ai0MVbXI/qG13/UxdVE71I0IT2XYVc4mRER0pP9CAjpSYyIkH5g9RER0g/Mj4iQHu6Hz9dliYNxr6IJ6VmMOh6IPitQ/rDaMgSlCuOjH/3oEBTPNg8aJz7cK77JOBhFMbcrzCVg5zI4fmxWdCE9l5HDjxx12kY/TBF8Ic87ZgRaUZSiCelZjDoC9zIdsDGhdJShA5Yjtn6TdXCUUVlUIT2HwfGDK6TnMHL4kaNO2+iHLYI/ZgWeMkanqUJ6MsMM3A+qstg3ZJO4vW1Rhg7amEA5ytBBmyK2Lg6OeWC5QnoOg+pHipCew8jhR446bZsfLiF9EXhmwHGF9CTGsNV8nxsJnCJgz7Wa/lk75xtqQpdzCcHnFSi/+93vntClEsPqbppC6Tep6kJ6KoPqR2hfqH7kqI9+12kb/XAJ6Y+p6kL6KGPE03c/F7sFN6rOpC8E0NddweoyCGBgPLHVySgsOOoFAQyMp556KplhXFk3Y+HaPcb/UxlUP6Yz+DHdZz9y1Gmb/DiO5+P9qrMCaqsqi+Bh4cSBwG/HcYDsZi5jJDIABAG8KtLliAbw3ofUqodmthx0KERMgXIwgPfu3btq9+7dBx1qlxKjKXlhmVpacn0QrMSgiOBjdZpDwE5hxM6PHKkuKQyHgih2XA5ggKXY4RTGCPGKVMn+7udrbQZbKH3ttddWZuQItj6ZCOnnkR+NENLf8CexiFmrb4SzK+lESE/YFxHSN9OPBSOk1yfgCn1Ci5Ce6IcI6d0MEdJ3ra9Cen0CrtVllgGv8D4hYEVIL9Z0a4eQ3gjYHgY1gEVI30g/hFG2+oT055+u1LIl3oC1rRTArx89RAlYJ8MXwH0W0h9V1QXsVEab/BCG21xC+iWqupA+yhh+88lKXfA2pXQA79cBTFp6qAN29H9+Mr7/0ERZSJ/CsD/vs5D+BtVdTJ4qYKcy2uSHMNw9U5cI/kLVFQqkCumjjLmushHARQvsCjalg01BwB478nzP9zkYfRbSH7UOToqAncJokx/C8IybKbcIfokVeClC+ihjxBd8//ua7pdNKXXkWCfYjv73PmeguSwHowjgV199Vb344ovqtddemw3YX/7ylxQRPdglxv2h6+AUi8phu89bV7tCwH5LIqNNfgjDzYBe4Zfx/5d7Aq8QDOzG3pP52y/ivXQSYyQWfA9P/Fw9O5Emgs/ByCCk30XczhzlAztSgdEmP4Th/7zQx8Ym8ChCehYjOo87fKK6kD7EMOcsQ3OpFYT0sOLqg0pZj6Ts2IyiCem5DLvCyYyIkJ7sR0BIT2JEhPQDq4+IkH5gfkSE9KtwwNZ1PzykaEJ6FqM2If3bL90yBKUKgyikX6XKz+6xn+1DEdJzGRw/4GBRhfRcRg4/ctRpG/0wRfAQ/OZzquznWFGE9CxGLUJ6HbCDFtLbD95SxogdVUjPYXD84ArpOYwcfuSo0zb6YYvg7YfMKWN0miqkJzMGLqTXQVuXkL44OOaB5QrpOQyqHylCeg4jhx856rRtfriE9EXgmQHHFdKTGFmF9JefpSZ0abKQfqWqLqSnMqh+hPaF6keO+uh3nbbRD5eQ/pCqLqSPMvoipIcABsa9vxAhPcMPEdLPPz/aKaQvAvhf96lVz96/5WCKcFyE9GwTIX3AREjPsPEviJA+YiKkn0d+NEJIf+9/RbZYtla9/VIR0vc5+EVIP4/8WHBC+iotmgjp0/ZHhPQipBchvZiY20RI7whYEdKLkL6pDBHSRwLWyZCM9JJNXi3UjPQLTEgvGemFkYvRjIz0C0RILxnphZGL0ayM9K7giwVbPxiSkV4y0jec0cyM9C0S0ktG+mp+CMP/eXMz0ouQXoT0IqQXIb1SIqQXIX07/KhXSA9LHnHZ4+n6FTY63XP18baYRSEynEL6S4/vLK7ypx84cCDKECG9COlr9qMZQnodcKP4ep7nx6Y5hfQURkxIr4N2FF+9DBHSi5BeiZB+1nbocgUOiIzpwNvqCZqQkJ7KKAZeXALlEkMHbwrD7m6KkL66HznqtI1+1Cqkh0D5uC5wx/0y3n+/oANv8vJ3zfbDC0FvSEjPYRQ2TWHo4J1cvXo1leG7soqQPo8fOeq0TX7UKqS/S3VWZDyAG92HkHEdeCdO7dxrxjS5UQZBSO9l6OCFlud0EdKTTIT0AWubkH4TtnhTeBUYx26aUnQhvZfBENJ7GSKkjwa/COkH5EcjhPRWq2m+du7YT/krtfIjoUvNFhVjOKwkUIYR5aqMHCZCehHSU/xohJB+9fGoE0EhPeVE1Tu6Ql+lAkJ6UndOhPQJ+yNC+oUrpH9BJQrp9U6u1WWWAa/wnsswZH4viJBerKHWKCH93XiPuQRf76YGsBGwPQxqABsB28MQIb2I4BvCqE1IP2IF7I3oMMwt3WMMUI3j+89gIME8EwyDT9oBazN0F3mOob+fY+j/zzL095N2wNoM3W2bY+jv5xj6/7MM/b3vwekXqvLkdnGgrsJg+Jhyz/ctUt1Jb1gf+nQCo01+CMNtIKR/u+rMr5t62kIEvwv50Krac7m3YEx9LYVhtriwagTmS2+ygrawE/j5TbidS6pTYhhBq3A0js0wgra496IwigNgCqVhnu514/sUATuH0SY/hOHumdoieGipFxvbpAjpSQy7q3wNXgHgsR1jRvO8CN8/g99fE6iQOYZuVcd0WYSt8SJ4z2XoVnVMl0XYGi+C90SGLZSGq5e9CosrYKcy2uSHMDzjZqpXBH+V6l3zzBXSkxh24EKX+EzVWclxPQaI+Xozfj/uqw3dqvYwdMD2MHA734hmD0MHbA8Dt/OZSwD9JHZJ9gS2cwnYuYw2+SEMt5ki+NIAtOosU1xnfEYR0rMYLj3uCeueFtYPb/J0n33Be8K6p51j2N3nQPCesO5p5xh299ljPgE0LKdcjxWzWtEE7FxGm/wQhv/3Pr0v3N48jBeBA4ompGcxQkL6IoB3hFpYYgDvgBYW5sDseTDzvWtFihHAO6CFhXlJe24yIqR3VcjdeFCUognpuQzTWIyIkJ7sR0BIT2JEhPQDq4+IkH5gfkSE9K7g/6zqrjGmCOlZjDqE9KYN9ZHhElHDwXhClw8HtnMJ2LkMjh+zDwVQNCE9l5HDjxx12kY/TBG8aRBo5+hiPquJIqRnMezANQekfFYMVDnNHJAKGJyMXqG0OSCVylBloTQYrIH+qerMhZojdlQhPYfB8YMrpOcwcviRo07b6IctggeDZbow/3rQGp2mCunJDDsj/RWOEWXlGFm+Qvkz0l9hjyhbDLBYRvor7BFlJkOpXqH0nY5hdq6QnsOg+pEipOcwcviRo07b5odLSH+l6p1S4grpSQxXRvrNVgArK2A3K09Gen2POqFLiYFTQMqYCioGXpwCZX0fO6FLiYFTQMqYCgoyrO6mKZQuDkgVIT2VQfUjtC9UP3LUR7/rtI1+uIT0xe+qCOmjjKF/GH9rqCsazUgfkjjpYPUxXKLIIRdLByuL8YOTNqoUy724n8mayXD/72RYyqskxrGxtDqtIDJw+rFm+8BFBk4/cHDKvjf+Gp6jpgj+JuUX0he2AntVZ3AYocAtLJiRnqJN1AG8Sm930BhBLirEFCgPhVg6gFfpltgU0jsZFOG4zwYt6zP+nnNfEgO3xKD408865ZgR3E4/cgj6KWYEt9MPR+AO3AaSkR6C1vqILZSGoK3KyBl0mU2E9PPIj6YJ6QdpkpGesC8ipG+mHwsmI30hpE+9UmF3ToT0CfsjQnoR0ouQXkzMbSKkdwSsCOlFSN9UhgjpzYBVIqRvmh/CcJsI6X0MEdKLkL6hDBHShxgipBchfUMZIqR3jGj2MERIX5sfwnCbCOk9wStC+mb4IQz/70VIj9uHAliE9Aw/REif1w8R0pdNhPR+wfZDSoT0TfajViG9KTLwiQlmrOBYZHRd7aDxMnRrOmS0rqM4HL4G+/pffpvaOhFj6BZ3yGgJehiwY5Y6CHbuJ3ijDzrH7zhG7EDWddBasQTzav+iy4scRuAkCTFOw+mAnn1h+OFkXHp850RVP46NbeQwSvUBq548K6bYfqzZPpTsB6x68qyYYvuhW9vCjz/Q5f+w8fs9fgaa3s87RqefxtZz0hhVhs7QV1MZw9YNMxhoYE9WaUJ6CgMsJFDOwRjD1wuwkg4pntj627p8qCKD6kdIsE31YypDfUz1uU7b5sdl+LrJaMA4QvobqzCcGel12abLm1U3X6cZsD4hfZBBFNIHGUQhvc24AW/wnzQOSExsPUhGjn1pCqMp9TFoP76HAbbM+F1MSP/PVRjejPQY3Q8Zrd9mxcxI72EUNp2bobvJIcY5xHvmuhjTLWKoBerHHry1jGWkr8wo7nHhCnKG6maCfw6b7BMqIqS3rmReRkxIr+9xh2IMipBeB6+XEVMAGfe4IT+oFvWDIKTn+NHD0Pe4QUahAArVqb7HDTJi4nbjHjfKCAnp9T1u0I9YpnnjHjfKCAnp9T3uUL/PD8qPB5KRniGk9zIYQvrQvqiq+8IIfo4f7H1xBH+O+qilTtvkR+RRTql+eAMXzJkJ/rSx54OAF8dLziRlk9etbWWGZVSG4jKYWtm+7YvDjxLDetZUkh/Ws6b6VqcxP6xnTdXmh/XIGieDqddN3peh21X0QT5BIT3lOUC6C7RCb1dJjF8I6WPbNUXALkJ6EdL30/oqpNcHa60uswx4hfcJAStCerGmW6OE9HtVZ33yEnzdSw1gI2B7GNQANgK2hyFCehHBN4TROCH9NtzwS9hVhhMH5pJgEtorpMeAJDH0trMM3RUKCemDDBHSiwheiZC+JGDfhjfMy3AnluH7bYougq+TURwAUygNq1Hep7qrUlIE7BxGm/wQhrtnaovgi1xDxQqsFCE9ieET0v8Orybwg7fg67fwc6oIfo6hW9XKDN2qchm2UHoSW2uzdeYK2KmMNvkhDM+4meoVwa/FxsQMUq6QnsTwCekX48a348lzO75frCJCeh2kPQzdLe5h4Ha+Ec0eBgrpSwyikB6uoE9it0Th65PGlZUiYOcy2uSHMNxmiuDhfATx+2fw/WfwfdFqUoT0LIYduDuMrkHxBIqtqvvki6KLsSMwMEVi4Ha+gSkSA7fzWbHmE27yz7EOzDn4ubmdOcqnVFm4zGW0yQ9h+H9f6GMhPecTVtA9gZ/bx9D8bTLDNar8KyNAx42WeKX1fcjmGEXLiq89DJjfK4qPUbSs+NrDKMT11pwlp0JMm0o8MD5jMQJCepYfwLHmg1mMzHWazPCcHwP3A+Z/oVw8/YJKvKCGhPRshh24sAzrbCMwdhgtcREoZ+N2vq5yiVG0rPj6K+z6naLKUia7q1xiFC0rvpIYqiuUjnVBKEJ6LoPjx+OKnpGey8jhR446baMfpgg+1t2mCOlZDFdG+ueMADWteP+cCmSk1wEaY1yGFRLMSF+VoXozjq/FA2Le9HMz0lMZHD9SMtJTGTn8yFGnbfTDlU1+EoPNHODiZqQnMXwZ6YsA3WS0xEUgkTLSFwxsgYuW+DkVFyj3MLAFLlpiCgPMzji+GLtA5jA7NyM9h0H1IyUjPYeRw48cddo2P1wZ6V/H7q05pcTNSE9i+DLSTyp3RvpJFchIr4NzQpcSA1vgoiXmZqSfZUhGeslI31A/6stIHxAZkDLSh0QGOlhZ2eRdLMlIX40hGelbmpGeoA4KCumJ6qBVeruDVTKOS0Z68kkmGekrmmSk7wa3ZKQPm2Skn0d+NCIjPfUqpq9CK3SXo5KmVnd1Vjy+eZZRJeN4oQ+WjPQERg4/ajDJSF+1xdUBW6h11ur/z95j6gCeZHY95hg6eJMYhmpo7l7XpQqSjPTl/REh/QIT0kOw6fKoKieWntXD4uekgK3K8CS4ntPlKjGx+q1+Ib0j2M7EQAF94pewmzrKDFg2wxGwbAaaCOnz+SGMstUmpHe1uKYeFqRHsATMTrMZs6YwLsTfXG0ciEIo/Qx+7zKopAdURwsL/386gdEmP4Thtm9h4wHz67CqqcitW4jg34Pf3+b4LQjpn8OgZDN8XWVTDzsXKLqfP864mvWNYYkNQldSUyhtW4qAncNokx/C6DWXkN62FCE9iTHsuREvuqaLzWDT3V9TbBC7ma/MsHS5cwFriA1CVgilz1e9c6JD+DlVwM5ltMkPYXjGzVRXBL9X9S7WmMHPqUJ6FmPYc49q6mHtYDubODBVmWHpcu2AjTEKAfQ+T4Xss7Yzu0+2gJ3LaJMfwnCbKYI/zxP85+H/KUJ6FiP0eNZfWa9n61bTFBtQrC8MQ2wQsmVEfkomeM7fmu9+CMP/+REiIyUjfZDh6yqbeti5YNOt5pjqLvKPdZWjjEKcXBRHV7nEKALWFBuYgm+P6JtSIaZNJR6YlO96tosI6cl+BIT0JEbmOk1mRIT0A/MjIqSnBH9MSM9i+LrKY0aLZgZbMUBE6Sr7GB/Cm+zoTLilyzUDlsIohNLrPF2QddZ2hbkE7FwGxw8YOacK6bmMHH7kqNM2+mGK4Pd4utvFUk2KkJ7F8HWVrzda1mcco8IU8zFgTc+fqbBQOgejEEo/7KmQhxVdSM9lcPw4pOhCei4jhx856rSNfpgi+PWe4F+v6EJ6FsMXuGcaLevNjlHhVwiB28NQ3WdYxYTSORi2UNo1zM4V0nMYVD9ShPQcRg4/ctRp2/xwCeltSxHSkxi+wF1ZtKxWwD6BLQFF19TDUN1nWFGE0rMMx4PiOAwR0ufxI0edttGP+oT0MzMz9r3pjdg9gyvMGLZwF2EzfasOwmhrG2F8XXkEyuZicH0/m8QQIX2ZIUL6lgrp7cDFnYOJ52sxYO6hBmyMYXSxnQJlO6u4Dl42Q4T0IqSvavNWSI9B+g0sqVe5HoZRISShtD5hehjGSSZCeiVC+jr8aISQvqYK6bvom9N6mgGSW89L5PVdSE/U5a4ntoisbnICYz2xRWR1kxMY63MFIgR7EfCpAWxeMAYauL5K5FjGbttyY0CCY+ZEeCrD6QfzAuL0o0KvYY5RoY6z1keFrnFWPyqct307x4bVwrQ7VWcdMNdgEOJzFRlt8kMYNR3bhRi4IJKGVSuHmL+DJxHAZP1kBUab/BBGjceW8sypU/AKAHNKML+1LXGEuRIDR5hLDBy84tjt+PtvJ1Toj1Vn7u2SREab/BBGzcc29MypU3SBeaXfqM4c05X4+hv9+fXUgK3KgIDVxcnAnLmcCi30jI8wfvdOo0JHExlt8kMYDTi2w4Rg+4AlxYMlWFuZActmOAL2A5acL8ow7DtGZcAKpH2MCgUh83WqMzGewmiTH8JoyLF1tbigW4JHpnwag+14ggg+KwMD9jhTSF/YbcbNPthivH9YTrwKXof3GimMNvkhjAYdW1fgwr3k/bo8oINtr0oTwWdl6IAtMYhCerD3q07mP9vgwXO/xu999k3VSXf42wqMNvkhjAYdW9/KqU064G7GYHmHfv+sfr8INbVfUWWlg0pl2JPg9nwZBKgO2jmGfv+sfr8IdbmzDHthgTUH+Rj8TnWeqPcpy8W78HufXYy/gVVbX9DlggQGyw/P3C3LD5thzeuS/OhjnbIY9mINa153YH5EztNazjGukB6uCpu14+cSBqZ8DEge/Beqk6ozNjBVYhhCejJDddRMV6puvtHZcwIHAmK2CyttSwVGm/wQRkOOrStwP6jKiaVLAavLBMEZL0N15El/ruJC+hyMws5T3YTFUBnXMA4KcCcqMmJ+jBL2JebHaIb6GB1QnYofFc+xYUcXdwJbVAiQe5gBG2So7qM3okJ6K8H1LAPfkxlWxYDdwazQU/H+Yk8FBsWP2L5Q/MhRH4OoU/Ejwzk2Ego+5UhkzbEAwxYo3+hjQABXZaiOwuMuvAhwr8SvYKV+JZFB8SO2LxQ/ctTHIOpU/MhwjtWlDgKbHhBjJY7cXZnAh3Wj8GDspRUYVD+mM/gx3Wc/ctSp+JHhHKt7rfKGATDguT6bEtnbVOfpA1UYHD82ZPBjQx/9yFGn4keGc6yuwC2E0VVF3xTGyxX8nMrAoPgR25epDAw1IMYg6qNNfiSdY0Pj4+OV9hrm+KjJk8+aHgt+/4s3jlc+ClX0un/5T09W/vs/+fv3kreNaW5/dzDuzx+tCv895qNrstcpx2Ii+xoeXeMbu0lm53gKBgjqB3qP6wtMTvDHTq7U4OMEXD8vAuAH57e+4C72RzLS581IXyX4Uh95w+kqV8mw3TSGmFjrzA7cKhm2m8YwJ899xTWpDhPgoPRYWoHRJj+E0cBjawdulQzbTWPAZPmayIVrjeqdVIeF3aDSeLUCo01+CCPM+Co2Kr7yVcKxZTPMwHVl2N6uukuwlPJn2G4aA4wqy7K3OzUDo01+CCP8XUx3u49wbNkMM3DN7NiFweMz9qtucmml3Bm2m8YQE1sw97hmduzSgJrq5C9ZZ3y2W/kXwjeBISa2YAI3lEAZmnZ4+txqfO9LyNsUhphYq82cxy2C4LBjO1jV8VnVTT7kC64khiPreQXGWfP6gORYBGJyrliR9vvyMdlYW32Y879rttd3XErzvw3IHWS2uGZ2bNMgSM7R5UfGZ3aG7RQGBOZb+sSYTwb7C5nPh1rAaEp9tMmPaOCa2bELA4kRzJ2aCYJdGba5jJBAOQdjPtllKp6Bfb4wmlIfbfIjGriuDNv2ozR8GbY5DDBupm8uQ3m62i477OjuV2Vw/PBlPj+SgaEGzOhnfTTVj3URzjrCOcZm2AswqmTYpjKK/1fJ9E1hXKniCZemVK/+cReWFRUYXD9c+8L1I0d99KtO2+zHDhVe9bSDcI6xGbbI4LjqZHuHx6LCksKtqpwd+xMqnmE7xrgDt5vuMwMkWKcl9EKgZf+0cTVMYaT4MZ3Bj+k++JGjTsWPzOeYTx10AIO0ilEYZqbvLIzcKp9Uo/jhGEGO1QfFSgyKJM+hICoxcsjpKAyHgqjkR440rRSGQ0FU8iOnyifVRnJoLamMWDZ55kmWPWt5jUHv3Bdm8EtG+nngR66gb21G+hQbtJA+ti9MfxpZp+JH2ealkH4QrftCE9LH9keE9O0U0o9UqVj7viUHI+VEG9SjVcTEmmJtzkgvQvo8fgijgcfWFbgzhBKzJjBESJ/HD2GEGbUL6UvdcexGF8+T3YDvb+B06Wtm2JPl8HT41wnbnZqB0SY/hBFmmCJ4+4EPSvGF9CSGK3BhgQOk/TthfX4CP58kBE1TGKbBog3IPXSoQvdbGMIImeuBD31huAI3lrqSktqyKQzbYLgWnldVZT5OGMIImeuBD9kZbR6c8hloemF+7oAwhNEnhv3Ah+yMkbqjyJxCSl1aV55COotSIXdnqNS+MJhzuF4/GEJ6J4MppO9bfTCF9H3xY2j4JPUfd76xu8UbTqME/2czXEC8jIXW4sLBeEKXDzeIkSrYbiKjKfWRzQ8dtFw/XA98ULkZdQVuDhE8lwHZ7H+qy6oKfveDkSLYbiqjKfWRxQ8dtFw/XA984BqJEQvcRdZrirkYnEzfqQxbvHyn6h1md213JAOD40eKkJ7KUANm9LM+BuqHDtoUIb3rgQ9cIT2JEQrc21U3A/dt+J5rPkZMoJyDIUL6PH7kqNM2+9EIIb1p12ToEocY031miJA+jx856nRe+QGDUU0/x+oeVc4uHBchvQjpQ0ZhlEaQHX40Qkg/yINjHBivQDl2oomQ3hv8IqSfB36IkD7C4MyHmgGSW89L5PVdSE+US65ntojsiziREfSDo6n1tbAhhtFVDvrB0eWaAZtDzzvQwM3RqmfU3i4nDE64zMzikMpw+sG8gDj9qNBrmGNUqOOs9VHhfKnkx8zvj5cYFbrofTvHFqqQHob+b0ioUJigv0R1RA6pjDb5IYyaju1CXKsMC+dAZ8lVgbxLddaOTlZgtMkPYdR4bNsspHcZzAGDbGpfQoX+WJcv4tUwhdEmP4RR87Fts5DeVaFFEuxHGL97p1Gho4mMNvkhjAYc24UipP+OURmvM66GUKF7dblOl7WJjDb5IYyGHNuFIKSHZZKfM94vxvuH5cSr4HV4r5HCaJMfwmjQsW374NT7VUf1YRs8rOvX+L3Pvqk6T0T4bQVGm/wQRoOObeuE9NbU0GO6vEOXW3T5lPWzu/B7n12Mv4Fu+Rd0uSCBwfLDM3fL8sNmWPO6JD/sKbmMdcpi2NOL1vkxMD/sxRrWvG4t59hCmA6CRdy2VOq7OBAQs11YaVsqMNrkhzAacmyH4aqWmh6iuComMHpE8EvGd3IXX3CE9OeprtYSKuMa5t+ZqMiI+UHZl5gfOepjUHUqflQ8x8wWdwxfzb42V0hPZYQEyjkYrooBu4NZoafi/cWeCgyKH7F9ofiRoz4GUafiR4ZzrAjcHRgoyzFwdiDwb4xRs5iQnsPwCZRzMFy2Du8VNidciV9RXZVICoPiR2xfKH7kqI9B1Kn4keEcG8FA+bgub1WdJ8vBDfMLqjNP+iHiH09hTPeB4bKVOHJ3ZcIBhXWj56tOjpdUBtWP6Qx+TPfZjxx1Kn5kOMeGMcLv1+UBvKI8gO/HGX88lbEhM8NlkJ9lU+JB3aY6T9yrwuD4sSGDHxv66EeOOhU/MpxjxXTQJmzxpjBQoMyuWGJM0UQZBCG9l1FMSSQI6V+ucFCnMjAofsT2ZSoDQw2IMYj6aJMfSefY/wswAKmMl4i8NCtXAAAAAElFTkSuQmCC); -} -@media (-webkit-min-device-pixel-ratio: 1.5), (min-resolution: 144dpi) { - .tsd-kind-icon:before { - background-image: url(data:image/png;base64,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); - background-size: 238px 204px; - } -} - -.tsd-signature.tsd-kind-icon:before { - background-position: 0 -153px; -} - -.tsd-kind-object-literal > .tsd-kind-icon:before { - background-position: 0px -17px; -} -.tsd-kind-object-literal.tsd-is-protected > .tsd-kind-icon:before { - background-position: -17px -17px; -} -.tsd-kind-object-literal.tsd-is-private > .tsd-kind-icon:before { - background-position: -34px -17px; -} - -.tsd-kind-class > .tsd-kind-icon:before { - background-position: 0px -34px; -} -.tsd-kind-class.tsd-is-protected > .tsd-kind-icon:before { - background-position: -17px -34px; -} -.tsd-kind-class.tsd-is-private > .tsd-kind-icon:before { - background-position: -34px -34px; -} - -.tsd-kind-class.tsd-has-type-parameter > .tsd-kind-icon:before { - background-position: 0px -51px; -} -.tsd-kind-class.tsd-has-type-parameter.tsd-is-protected > .tsd-kind-icon:before { - background-position: -17px -51px; -} -.tsd-kind-class.tsd-has-type-parameter.tsd-is-private > .tsd-kind-icon:before { - background-position: -34px -51px; -} - -.tsd-kind-interface > .tsd-kind-icon:before { - background-position: 0px -68px; -} -.tsd-kind-interface.tsd-is-protected > .tsd-kind-icon:before { - background-position: -17px -68px; -} -.tsd-kind-interface.tsd-is-private > .tsd-kind-icon:before { - background-position: -34px -68px; -} - -.tsd-kind-interface.tsd-has-type-parameter > .tsd-kind-icon:before { - background-position: 0px -85px; -} -.tsd-kind-interface.tsd-has-type-parameter.tsd-is-protected > .tsd-kind-icon:before { - background-position: -17px -85px; -} -.tsd-kind-interface.tsd-has-type-parameter.tsd-is-private > .tsd-kind-icon:before { - background-position: -34px -85px; -} - -.tsd-kind-namespace > .tsd-kind-icon:before { - background-position: 0px -102px; -} -.tsd-kind-namespace.tsd-is-protected > .tsd-kind-icon:before { - background-position: -17px -102px; -} -.tsd-kind-namespace.tsd-is-private > .tsd-kind-icon:before { - background-position: -34px -102px; -} - -.tsd-kind-module > .tsd-kind-icon:before { - background-position: 0px -102px; -} -.tsd-kind-module.tsd-is-protected > .tsd-kind-icon:before { - background-position: -17px -102px; -} -.tsd-kind-module.tsd-is-private > .tsd-kind-icon:before { - background-position: -34px -102px; -} - -.tsd-kind-enum > .tsd-kind-icon:before { - background-position: 0px -119px; -} -.tsd-kind-enum.tsd-is-protected > .tsd-kind-icon:before { - background-position: -17px -119px; -} -.tsd-kind-enum.tsd-is-private > .tsd-kind-icon:before { - background-position: -34px -119px; -} - -.tsd-kind-enum-member > .tsd-kind-icon:before { - background-position: 0px -136px; -} -.tsd-kind-enum-member.tsd-is-protected > .tsd-kind-icon:before { - background-position: -17px -136px; -} -.tsd-kind-enum-member.tsd-is-private > .tsd-kind-icon:before { - background-position: -34px -136px; -} - -.tsd-kind-signature > .tsd-kind-icon:before { - background-position: 0px -153px; -} -.tsd-kind-signature.tsd-is-protected > .tsd-kind-icon:before { - background-position: -17px -153px; -} -.tsd-kind-signature.tsd-is-private > .tsd-kind-icon:before { - background-position: -34px -153px; -} - -.tsd-kind-type-alias > .tsd-kind-icon:before { - background-position: 0px -170px; -} -.tsd-kind-type-alias.tsd-is-protected > .tsd-kind-icon:before { - background-position: -17px -170px; -} -.tsd-kind-type-alias.tsd-is-private > .tsd-kind-icon:before { - background-position: -34px -170px; -} - -.tsd-kind-type-alias.tsd-has-type-parameter > .tsd-kind-icon:before { - background-position: 0px -187px; -} -.tsd-kind-type-alias.tsd-has-type-parameter.tsd-is-protected > .tsd-kind-icon:before { - background-position: -17px -187px; -} -.tsd-kind-type-alias.tsd-has-type-parameter.tsd-is-private > .tsd-kind-icon:before { - background-position: -34px -187px; -} - -.tsd-kind-variable > .tsd-kind-icon:before { - background-position: -136px -0px; -} -.tsd-kind-variable.tsd-is-protected > .tsd-kind-icon:before { - background-position: -153px -0px; -} -.tsd-kind-variable.tsd-is-private > .tsd-kind-icon:before { - background-position: -119px -0px; -} -.tsd-kind-variable.tsd-parent-kind-class > .tsd-kind-icon:before { - background-position: -51px -0px; -} -.tsd-kind-variable.tsd-parent-kind-class.tsd-is-inherited > .tsd-kind-icon:before { - background-position: -68px -0px; -} -.tsd-kind-variable.tsd-parent-kind-class.tsd-is-protected > .tsd-kind-icon:before { - background-position: -85px -0px; -} -.tsd-kind-variable.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited > .tsd-kind-icon:before { - background-position: -102px -0px; -} -.tsd-kind-variable.tsd-parent-kind-class.tsd-is-private > .tsd-kind-icon:before { - background-position: -119px -0px; -} -.tsd-kind-variable.tsd-parent-kind-enum > .tsd-kind-icon:before { - background-position: -170px -0px; -} -.tsd-kind-variable.tsd-parent-kind-enum.tsd-is-protected > .tsd-kind-icon:before { - background-position: -187px -0px; -} -.tsd-kind-variable.tsd-parent-kind-enum.tsd-is-private > .tsd-kind-icon:before { - background-position: -119px -0px; -} -.tsd-kind-variable.tsd-parent-kind-interface > .tsd-kind-icon:before { - background-position: -204px -0px; -} -.tsd-kind-variable.tsd-parent-kind-interface.tsd-is-inherited > .tsd-kind-icon:before { - background-position: -221px -0px; -} - -.tsd-kind-property > .tsd-kind-icon:before { - background-position: -136px -0px; -} -.tsd-kind-property.tsd-is-protected > .tsd-kind-icon:before { - background-position: -153px -0px; -} -.tsd-kind-property.tsd-is-private > .tsd-kind-icon:before { - background-position: -119px -0px; -} -.tsd-kind-property.tsd-parent-kind-class > .tsd-kind-icon:before { - background-position: -51px -0px; -} -.tsd-kind-property.tsd-parent-kind-class.tsd-is-inherited > .tsd-kind-icon:before { - background-position: -68px -0px; -} -.tsd-kind-property.tsd-parent-kind-class.tsd-is-protected > .tsd-kind-icon:before { - background-position: -85px -0px; -} -.tsd-kind-property.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited > .tsd-kind-icon:before { - background-position: -102px -0px; -} -.tsd-kind-property.tsd-parent-kind-class.tsd-is-private > .tsd-kind-icon:before { - background-position: -119px -0px; -} -.tsd-kind-property.tsd-parent-kind-enum > .tsd-kind-icon:before { - background-position: -170px -0px; -} -.tsd-kind-property.tsd-parent-kind-enum.tsd-is-protected > .tsd-kind-icon:before { - background-position: -187px -0px; -} -.tsd-kind-property.tsd-parent-kind-enum.tsd-is-private > .tsd-kind-icon:before { - background-position: -119px -0px; -} -.tsd-kind-property.tsd-parent-kind-interface > .tsd-kind-icon:before { - background-position: -204px -0px; -} -.tsd-kind-property.tsd-parent-kind-interface.tsd-is-inherited > .tsd-kind-icon:before { - background-position: -221px -0px; -} - -.tsd-kind-get-signature > .tsd-kind-icon:before { - background-position: -136px -17px; -} -.tsd-kind-get-signature.tsd-is-protected > .tsd-kind-icon:before { - background-position: -153px -17px; -} -.tsd-kind-get-signature.tsd-is-private > .tsd-kind-icon:before { - background-position: -119px -17px; -} -.tsd-kind-get-signature.tsd-parent-kind-class > .tsd-kind-icon:before { - background-position: -51px -17px; -} -.tsd-kind-get-signature.tsd-parent-kind-class.tsd-is-inherited > .tsd-kind-icon:before { - background-position: -68px -17px; -} -.tsd-kind-get-signature.tsd-parent-kind-class.tsd-is-protected > .tsd-kind-icon:before { - background-position: -85px -17px; -} -.tsd-kind-get-signature.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited > .tsd-kind-icon:before { - background-position: -102px -17px; -} -.tsd-kind-get-signature.tsd-parent-kind-class.tsd-is-private > .tsd-kind-icon:before { - background-position: -119px -17px; -} -.tsd-kind-get-signature.tsd-parent-kind-enum > .tsd-kind-icon:before { - background-position: -170px -17px; -} -.tsd-kind-get-signature.tsd-parent-kind-enum.tsd-is-protected > .tsd-kind-icon:before { - background-position: -187px -17px; -} -.tsd-kind-get-signature.tsd-parent-kind-enum.tsd-is-private > .tsd-kind-icon:before { - background-position: -119px -17px; -} -.tsd-kind-get-signature.tsd-parent-kind-interface > .tsd-kind-icon:before { - background-position: -204px -17px; -} -.tsd-kind-get-signature.tsd-parent-kind-interface.tsd-is-inherited > .tsd-kind-icon:before { - background-position: -221px -17px; -} - -.tsd-kind-set-signature > .tsd-kind-icon:before { - background-position: -136px -34px; -} -.tsd-kind-set-signature.tsd-is-protected > .tsd-kind-icon:before { - background-position: -153px -34px; -} -.tsd-kind-set-signature.tsd-is-private > .tsd-kind-icon:before { - background-position: -119px -34px; -} -.tsd-kind-set-signature.tsd-parent-kind-class > .tsd-kind-icon:before { - background-position: -51px -34px; -} -.tsd-kind-set-signature.tsd-parent-kind-class.tsd-is-inherited > .tsd-kind-icon:before { - background-position: -68px -34px; -} -.tsd-kind-set-signature.tsd-parent-kind-class.tsd-is-protected > .tsd-kind-icon:before { - background-position: -85px -34px; -} -.tsd-kind-set-signature.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited > .tsd-kind-icon:before { - background-position: -102px -34px; -} -.tsd-kind-set-signature.tsd-parent-kind-class.tsd-is-private > .tsd-kind-icon:before { - background-position: -119px -34px; -} -.tsd-kind-set-signature.tsd-parent-kind-enum > .tsd-kind-icon:before { - background-position: -170px -34px; -} -.tsd-kind-set-signature.tsd-parent-kind-enum.tsd-is-protected > .tsd-kind-icon:before { - background-position: -187px -34px; -} -.tsd-kind-set-signature.tsd-parent-kind-enum.tsd-is-private > .tsd-kind-icon:before { - background-position: -119px -34px; -} -.tsd-kind-set-signature.tsd-parent-kind-interface > .tsd-kind-icon:before { - background-position: -204px -34px; -} -.tsd-kind-set-signature.tsd-parent-kind-interface.tsd-is-inherited > .tsd-kind-icon:before { - background-position: -221px -34px; -} - -.tsd-kind-accessor > .tsd-kind-icon:before { - background-position: -136px -51px; -} -.tsd-kind-accessor.tsd-is-protected > .tsd-kind-icon:before { - background-position: -153px -51px; -} -.tsd-kind-accessor.tsd-is-private > .tsd-kind-icon:before { - background-position: -119px -51px; -} -.tsd-kind-accessor.tsd-parent-kind-class > .tsd-kind-icon:before { - background-position: -51px -51px; -} -.tsd-kind-accessor.tsd-parent-kind-class.tsd-is-inherited > .tsd-kind-icon:before { - background-position: -68px -51px; -} -.tsd-kind-accessor.tsd-parent-kind-class.tsd-is-protected > .tsd-kind-icon:before { - background-position: -85px -51px; -} -.tsd-kind-accessor.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited > .tsd-kind-icon:before { - background-position: -102px -51px; -} -.tsd-kind-accessor.tsd-parent-kind-class.tsd-is-private > .tsd-kind-icon:before { - background-position: -119px -51px; -} -.tsd-kind-accessor.tsd-parent-kind-enum > .tsd-kind-icon:before { - background-position: -170px -51px; -} -.tsd-kind-accessor.tsd-parent-kind-enum.tsd-is-protected > .tsd-kind-icon:before { - background-position: -187px -51px; -} -.tsd-kind-accessor.tsd-parent-kind-enum.tsd-is-private > .tsd-kind-icon:before { - background-position: -119px -51px; -} -.tsd-kind-accessor.tsd-parent-kind-interface > .tsd-kind-icon:before { - background-position: -204px -51px; -} -.tsd-kind-accessor.tsd-parent-kind-interface.tsd-is-inherited > .tsd-kind-icon:before { - background-position: -221px -51px; -} - -.tsd-kind-function > .tsd-kind-icon:before { - background-position: -136px -68px; -} -.tsd-kind-function.tsd-is-protected > .tsd-kind-icon:before { - background-position: -153px -68px; -} -.tsd-kind-function.tsd-is-private > .tsd-kind-icon:before { - background-position: -119px -68px; -} -.tsd-kind-function.tsd-parent-kind-class > .tsd-kind-icon:before { - background-position: -51px -68px; -} -.tsd-kind-function.tsd-parent-kind-class.tsd-is-inherited > .tsd-kind-icon:before { - background-position: -68px -68px; -} -.tsd-kind-function.tsd-parent-kind-class.tsd-is-protected > .tsd-kind-icon:before { - background-position: -85px -68px; -} -.tsd-kind-function.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited > .tsd-kind-icon:before { - background-position: -102px -68px; -} -.tsd-kind-function.tsd-parent-kind-class.tsd-is-private > .tsd-kind-icon:before { - background-position: -119px -68px; -} -.tsd-kind-function.tsd-parent-kind-enum > .tsd-kind-icon:before { - background-position: -170px -68px; -} -.tsd-kind-function.tsd-parent-kind-enum.tsd-is-protected > .tsd-kind-icon:before { - background-position: -187px -68px; -} -.tsd-kind-function.tsd-parent-kind-enum.tsd-is-private > .tsd-kind-icon:before { - background-position: -119px -68px; -} -.tsd-kind-function.tsd-parent-kind-interface > .tsd-kind-icon:before { - background-position: -204px -68px; -} -.tsd-kind-function.tsd-parent-kind-interface.tsd-is-inherited > .tsd-kind-icon:before { - background-position: -221px -68px; -} - -.tsd-kind-method > .tsd-kind-icon:before { - background-position: -136px -68px; -} -.tsd-kind-method.tsd-is-protected > .tsd-kind-icon:before { - background-position: -153px -68px; -} -.tsd-kind-method.tsd-is-private > .tsd-kind-icon:before { - background-position: -119px -68px; -} -.tsd-kind-method.tsd-parent-kind-class > .tsd-kind-icon:before { - background-position: -51px -68px; -} -.tsd-kind-method.tsd-parent-kind-class.tsd-is-inherited > .tsd-kind-icon:before { - background-position: -68px -68px; -} -.tsd-kind-method.tsd-parent-kind-class.tsd-is-protected > .tsd-kind-icon:before { - background-position: -85px -68px; -} -.tsd-kind-method.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited > .tsd-kind-icon:before { - background-position: -102px -68px; -} -.tsd-kind-method.tsd-parent-kind-class.tsd-is-private > .tsd-kind-icon:before { - background-position: -119px -68px; -} -.tsd-kind-method.tsd-parent-kind-enum > .tsd-kind-icon:before { - background-position: -170px -68px; -} -.tsd-kind-method.tsd-parent-kind-enum.tsd-is-protected > .tsd-kind-icon:before { - background-position: -187px -68px; -} -.tsd-kind-method.tsd-parent-kind-enum.tsd-is-private > .tsd-kind-icon:before { - background-position: -119px -68px; -} -.tsd-kind-method.tsd-parent-kind-interface > .tsd-kind-icon:before { - background-position: -204px -68px; -} -.tsd-kind-method.tsd-parent-kind-interface.tsd-is-inherited > .tsd-kind-icon:before { - background-position: -221px -68px; -} - -.tsd-kind-call-signature > .tsd-kind-icon:before { - background-position: -136px -68px; -} -.tsd-kind-call-signature.tsd-is-protected > .tsd-kind-icon:before { - background-position: -153px -68px; -} -.tsd-kind-call-signature.tsd-is-private > .tsd-kind-icon:before { - background-position: -119px -68px; -} -.tsd-kind-call-signature.tsd-parent-kind-class > .tsd-kind-icon:before { - background-position: -51px -68px; -} -.tsd-kind-call-signature.tsd-parent-kind-class.tsd-is-inherited > .tsd-kind-icon:before { - background-position: -68px -68px; -} -.tsd-kind-call-signature.tsd-parent-kind-class.tsd-is-protected > .tsd-kind-icon:before { - background-position: -85px -68px; -} -.tsd-kind-call-signature.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited > .tsd-kind-icon:before { - background-position: -102px -68px; -} -.tsd-kind-call-signature.tsd-parent-kind-class.tsd-is-private > .tsd-kind-icon:before { - background-position: -119px -68px; -} -.tsd-kind-call-signature.tsd-parent-kind-enum > .tsd-kind-icon:before { - background-position: -170px -68px; -} -.tsd-kind-call-signature.tsd-parent-kind-enum.tsd-is-protected > .tsd-kind-icon:before { - background-position: -187px -68px; -} -.tsd-kind-call-signature.tsd-parent-kind-enum.tsd-is-private > .tsd-kind-icon:before { - background-position: -119px -68px; -} -.tsd-kind-call-signature.tsd-parent-kind-interface > .tsd-kind-icon:before { - background-position: -204px -68px; -} -.tsd-kind-call-signature.tsd-parent-kind-interface.tsd-is-inherited > .tsd-kind-icon:before { - background-position: -221px -68px; -} - -.tsd-kind-function.tsd-has-type-parameter > .tsd-kind-icon:before { - background-position: -136px -85px; -} -.tsd-kind-function.tsd-has-type-parameter.tsd-is-protected > .tsd-kind-icon:before { - background-position: -153px -85px; -} -.tsd-kind-function.tsd-has-type-parameter.tsd-is-private > .tsd-kind-icon:before { - background-position: -119px -85px; -} -.tsd-kind-function.tsd-has-type-parameter.tsd-parent-kind-class > .tsd-kind-icon:before { - background-position: -51px -85px; -} -.tsd-kind-function.tsd-has-type-parameter.tsd-parent-kind-class.tsd-is-inherited > .tsd-kind-icon:before { - background-position: -68px -85px; -} -.tsd-kind-function.tsd-has-type-parameter.tsd-parent-kind-class.tsd-is-protected > .tsd-kind-icon:before { - background-position: -85px -85px; -} -.tsd-kind-function.tsd-has-type-parameter.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited > .tsd-kind-icon:before { - background-position: -102px -85px; -} -.tsd-kind-function.tsd-has-type-parameter.tsd-parent-kind-class.tsd-is-private > .tsd-kind-icon:before { - background-position: -119px -85px; -} -.tsd-kind-function.tsd-has-type-parameter.tsd-parent-kind-enum > .tsd-kind-icon:before { - background-position: -170px -85px; -} -.tsd-kind-function.tsd-has-type-parameter.tsd-parent-kind-enum.tsd-is-protected > .tsd-kind-icon:before { - background-position: -187px -85px; -} -.tsd-kind-function.tsd-has-type-parameter.tsd-parent-kind-enum.tsd-is-private > .tsd-kind-icon:before { - background-position: -119px -85px; -} -.tsd-kind-function.tsd-has-type-parameter.tsd-parent-kind-interface > .tsd-kind-icon:before { - background-position: -204px -85px; -} -.tsd-kind-function.tsd-has-type-parameter.tsd-parent-kind-interface.tsd-is-inherited > .tsd-kind-icon:before { - background-position: -221px -85px; -} - -.tsd-kind-method.tsd-has-type-parameter > .tsd-kind-icon:before { - background-position: -136px -85px; -} -.tsd-kind-method.tsd-has-type-parameter.tsd-is-protected > .tsd-kind-icon:before { - background-position: -153px -85px; -} -.tsd-kind-method.tsd-has-type-parameter.tsd-is-private > .tsd-kind-icon:before { - background-position: -119px -85px; -} -.tsd-kind-method.tsd-has-type-parameter.tsd-parent-kind-class > .tsd-kind-icon:before { - background-position: -51px -85px; -} -.tsd-kind-method.tsd-has-type-parameter.tsd-parent-kind-class.tsd-is-inherited > .tsd-kind-icon:before { - background-position: -68px -85px; -} -.tsd-kind-method.tsd-has-type-parameter.tsd-parent-kind-class.tsd-is-protected > .tsd-kind-icon:before { - background-position: -85px -85px; -} -.tsd-kind-method.tsd-has-type-parameter.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited > .tsd-kind-icon:before { - background-position: -102px -85px; -} -.tsd-kind-method.tsd-has-type-parameter.tsd-parent-kind-class.tsd-is-private > .tsd-kind-icon:before { - background-position: -119px -85px; -} -.tsd-kind-method.tsd-has-type-parameter.tsd-parent-kind-enum > .tsd-kind-icon:before { - background-position: -170px -85px; -} -.tsd-kind-method.tsd-has-type-parameter.tsd-parent-kind-enum.tsd-is-protected > .tsd-kind-icon:before { - background-position: -187px -85px; -} -.tsd-kind-method.tsd-has-type-parameter.tsd-parent-kind-enum.tsd-is-private > .tsd-kind-icon:before { - background-position: -119px -85px; -} -.tsd-kind-method.tsd-has-type-parameter.tsd-parent-kind-interface > .tsd-kind-icon:before { - background-position: -204px -85px; -} -.tsd-kind-method.tsd-has-type-parameter.tsd-parent-kind-interface.tsd-is-inherited > .tsd-kind-icon:before { - background-position: -221px -85px; -} - -.tsd-kind-constructor > .tsd-kind-icon:before { - background-position: -136px -102px; -} -.tsd-kind-constructor.tsd-is-protected > .tsd-kind-icon:before { - background-position: -153px -102px; -} -.tsd-kind-constructor.tsd-is-private > .tsd-kind-icon:before { - background-position: -119px -102px; -} -.tsd-kind-constructor.tsd-parent-kind-class > .tsd-kind-icon:before { - background-position: -51px -102px; -} -.tsd-kind-constructor.tsd-parent-kind-class.tsd-is-inherited > .tsd-kind-icon:before { - background-position: -68px -102px; -} -.tsd-kind-constructor.tsd-parent-kind-class.tsd-is-protected > .tsd-kind-icon:before { - background-position: -85px -102px; -} -.tsd-kind-constructor.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited > .tsd-kind-icon:before { - background-position: -102px -102px; -} -.tsd-kind-constructor.tsd-parent-kind-class.tsd-is-private > .tsd-kind-icon:before { - background-position: -119px -102px; -} -.tsd-kind-constructor.tsd-parent-kind-enum > .tsd-kind-icon:before { - background-position: -170px -102px; -} -.tsd-kind-constructor.tsd-parent-kind-enum.tsd-is-protected > .tsd-kind-icon:before { - background-position: -187px -102px; -} -.tsd-kind-constructor.tsd-parent-kind-enum.tsd-is-private > .tsd-kind-icon:before { - background-position: -119px -102px; -} -.tsd-kind-constructor.tsd-parent-kind-interface > .tsd-kind-icon:before { - background-position: -204px -102px; -} -.tsd-kind-constructor.tsd-parent-kind-interface.tsd-is-inherited > .tsd-kind-icon:before { - background-position: -221px -102px; -} - -.tsd-kind-constructor-signature > .tsd-kind-icon:before { - background-position: -136px -102px; -} -.tsd-kind-constructor-signature.tsd-is-protected > .tsd-kind-icon:before { - background-position: -153px -102px; -} -.tsd-kind-constructor-signature.tsd-is-private > .tsd-kind-icon:before { - background-position: -119px -102px; -} -.tsd-kind-constructor-signature.tsd-parent-kind-class > .tsd-kind-icon:before { - background-position: -51px -102px; -} -.tsd-kind-constructor-signature.tsd-parent-kind-class.tsd-is-inherited > .tsd-kind-icon:before { - background-position: -68px -102px; -} -.tsd-kind-constructor-signature.tsd-parent-kind-class.tsd-is-protected > .tsd-kind-icon:before { - background-position: -85px -102px; -} -.tsd-kind-constructor-signature.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited > .tsd-kind-icon:before { - background-position: -102px -102px; -} -.tsd-kind-constructor-signature.tsd-parent-kind-class.tsd-is-private > .tsd-kind-icon:before { - background-position: -119px -102px; -} -.tsd-kind-constructor-signature.tsd-parent-kind-enum > .tsd-kind-icon:before { - background-position: -170px -102px; -} -.tsd-kind-constructor-signature.tsd-parent-kind-enum.tsd-is-protected > .tsd-kind-icon:before { - background-position: -187px -102px; -} -.tsd-kind-constructor-signature.tsd-parent-kind-enum.tsd-is-private > .tsd-kind-icon:before { - background-position: -119px -102px; -} -.tsd-kind-constructor-signature.tsd-parent-kind-interface > .tsd-kind-icon:before { - background-position: -204px -102px; -} -.tsd-kind-constructor-signature.tsd-parent-kind-interface.tsd-is-inherited > .tsd-kind-icon:before { - background-position: -221px -102px; -} - -.tsd-kind-index-signature > .tsd-kind-icon:before { - background-position: -136px -119px; -} -.tsd-kind-index-signature.tsd-is-protected > .tsd-kind-icon:before { - background-position: -153px -119px; -} -.tsd-kind-index-signature.tsd-is-private > .tsd-kind-icon:before { - background-position: -119px -119px; -} -.tsd-kind-index-signature.tsd-parent-kind-class > .tsd-kind-icon:before { - background-position: -51px -119px; -} -.tsd-kind-index-signature.tsd-parent-kind-class.tsd-is-inherited > .tsd-kind-icon:before { - background-position: -68px -119px; -} -.tsd-kind-index-signature.tsd-parent-kind-class.tsd-is-protected > .tsd-kind-icon:before { - background-position: -85px -119px; -} -.tsd-kind-index-signature.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited > .tsd-kind-icon:before { - background-position: -102px -119px; -} -.tsd-kind-index-signature.tsd-parent-kind-class.tsd-is-private > .tsd-kind-icon:before { - background-position: -119px -119px; -} -.tsd-kind-index-signature.tsd-parent-kind-enum > .tsd-kind-icon:before { - background-position: -170px -119px; -} -.tsd-kind-index-signature.tsd-parent-kind-enum.tsd-is-protected > .tsd-kind-icon:before { - background-position: -187px -119px; -} -.tsd-kind-index-signature.tsd-parent-kind-enum.tsd-is-private > .tsd-kind-icon:before { - background-position: -119px -119px; -} -.tsd-kind-index-signature.tsd-parent-kind-interface > .tsd-kind-icon:before { - background-position: -204px -119px; -} -.tsd-kind-index-signature.tsd-parent-kind-interface.tsd-is-inherited > .tsd-kind-icon:before { - background-position: -221px -119px; -} - -.tsd-kind-event > .tsd-kind-icon:before { - background-position: -136px -136px; -} -.tsd-kind-event.tsd-is-protected > .tsd-kind-icon:before { - background-position: -153px -136px; -} -.tsd-kind-event.tsd-is-private > .tsd-kind-icon:before { - background-position: -119px -136px; -} -.tsd-kind-event.tsd-parent-kind-class > .tsd-kind-icon:before { - background-position: -51px -136px; -} -.tsd-kind-event.tsd-parent-kind-class.tsd-is-inherited > .tsd-kind-icon:before { - background-position: -68px -136px; -} -.tsd-kind-event.tsd-parent-kind-class.tsd-is-protected > .tsd-kind-icon:before { - background-position: -85px -136px; -} -.tsd-kind-event.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited > .tsd-kind-icon:before { - background-position: -102px -136px; -} -.tsd-kind-event.tsd-parent-kind-class.tsd-is-private > .tsd-kind-icon:before { - background-position: -119px -136px; -} -.tsd-kind-event.tsd-parent-kind-enum > .tsd-kind-icon:before { - background-position: -170px -136px; -} -.tsd-kind-event.tsd-parent-kind-enum.tsd-is-protected > .tsd-kind-icon:before { - background-position: -187px -136px; -} -.tsd-kind-event.tsd-parent-kind-enum.tsd-is-private > .tsd-kind-icon:before { - background-position: -119px -136px; -} -.tsd-kind-event.tsd-parent-kind-interface > .tsd-kind-icon:before { - background-position: -204px -136px; -} -.tsd-kind-event.tsd-parent-kind-interface.tsd-is-inherited > .tsd-kind-icon:before { - background-position: -221px -136px; -} - -.tsd-is-static > .tsd-kind-icon:before { - background-position: -136px -153px; -} -.tsd-is-static.tsd-is-protected > .tsd-kind-icon:before { - background-position: -153px -153px; -} -.tsd-is-static.tsd-is-private > .tsd-kind-icon:before { - background-position: -119px -153px; -} -.tsd-is-static.tsd-parent-kind-class > .tsd-kind-icon:before { - background-position: -51px -153px; -} -.tsd-is-static.tsd-parent-kind-class.tsd-is-inherited > .tsd-kind-icon:before { - background-position: -68px -153px; -} -.tsd-is-static.tsd-parent-kind-class.tsd-is-protected > .tsd-kind-icon:before { - background-position: -85px -153px; -} -.tsd-is-static.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited > .tsd-kind-icon:before { - background-position: -102px -153px; -} -.tsd-is-static.tsd-parent-kind-class.tsd-is-private > .tsd-kind-icon:before { - background-position: -119px -153px; -} -.tsd-is-static.tsd-parent-kind-enum > .tsd-kind-icon:before { - background-position: -170px -153px; -} -.tsd-is-static.tsd-parent-kind-enum.tsd-is-protected > .tsd-kind-icon:before { - background-position: -187px -153px; -} -.tsd-is-static.tsd-parent-kind-enum.tsd-is-private > .tsd-kind-icon:before { - background-position: -119px -153px; -} -.tsd-is-static.tsd-parent-kind-interface > .tsd-kind-icon:before { - background-position: -204px -153px; -} -.tsd-is-static.tsd-parent-kind-interface.tsd-is-inherited > .tsd-kind-icon:before { - background-position: -221px -153px; -} - -.tsd-is-static.tsd-kind-function > .tsd-kind-icon:before { - background-position: -136px -170px; -} -.tsd-is-static.tsd-kind-function.tsd-is-protected > .tsd-kind-icon:before { - background-position: -153px -170px; -} -.tsd-is-static.tsd-kind-function.tsd-is-private > .tsd-kind-icon:before { - background-position: -119px -170px; -} -.tsd-is-static.tsd-kind-function.tsd-parent-kind-class > .tsd-kind-icon:before { - background-position: -51px -170px; -} -.tsd-is-static.tsd-kind-function.tsd-parent-kind-class.tsd-is-inherited > .tsd-kind-icon:before { - background-position: -68px -170px; -} -.tsd-is-static.tsd-kind-function.tsd-parent-kind-class.tsd-is-protected > .tsd-kind-icon:before { - background-position: -85px -170px; -} -.tsd-is-static.tsd-kind-function.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited > .tsd-kind-icon:before { - background-position: -102px -170px; -} -.tsd-is-static.tsd-kind-function.tsd-parent-kind-class.tsd-is-private > .tsd-kind-icon:before { - background-position: -119px -170px; -} -.tsd-is-static.tsd-kind-function.tsd-parent-kind-enum > .tsd-kind-icon:before { - background-position: -170px -170px; -} -.tsd-is-static.tsd-kind-function.tsd-parent-kind-enum.tsd-is-protected > .tsd-kind-icon:before { - background-position: -187px -170px; -} -.tsd-is-static.tsd-kind-function.tsd-parent-kind-enum.tsd-is-private > .tsd-kind-icon:before { - background-position: -119px -170px; -} -.tsd-is-static.tsd-kind-function.tsd-parent-kind-interface > .tsd-kind-icon:before { - background-position: -204px -170px; -} -.tsd-is-static.tsd-kind-function.tsd-parent-kind-interface.tsd-is-inherited > .tsd-kind-icon:before { - background-position: -221px -170px; -} - -.tsd-is-static.tsd-kind-method > .tsd-kind-icon:before { - background-position: -136px -170px; -} -.tsd-is-static.tsd-kind-method.tsd-is-protected > .tsd-kind-icon:before { - background-position: -153px -170px; -} -.tsd-is-static.tsd-kind-method.tsd-is-private > .tsd-kind-icon:before { - background-position: -119px -170px; -} -.tsd-is-static.tsd-kind-method.tsd-parent-kind-class > .tsd-kind-icon:before { - background-position: -51px -170px; -} -.tsd-is-static.tsd-kind-method.tsd-parent-kind-class.tsd-is-inherited > .tsd-kind-icon:before { - background-position: -68px -170px; -} -.tsd-is-static.tsd-kind-method.tsd-parent-kind-class.tsd-is-protected > .tsd-kind-icon:before { - background-position: -85px -170px; -} -.tsd-is-static.tsd-kind-method.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited > .tsd-kind-icon:before { - background-position: -102px -170px; -} -.tsd-is-static.tsd-kind-method.tsd-parent-kind-class.tsd-is-private > .tsd-kind-icon:before { - background-position: -119px -170px; -} -.tsd-is-static.tsd-kind-method.tsd-parent-kind-enum > .tsd-kind-icon:before { - background-position: -170px -170px; -} -.tsd-is-static.tsd-kind-method.tsd-parent-kind-enum.tsd-is-protected > .tsd-kind-icon:before { - background-position: -187px -170px; -} -.tsd-is-static.tsd-kind-method.tsd-parent-kind-enum.tsd-is-private > .tsd-kind-icon:before { - background-position: -119px -170px; -} -.tsd-is-static.tsd-kind-method.tsd-parent-kind-interface > .tsd-kind-icon:before { - background-position: -204px -170px; -} -.tsd-is-static.tsd-kind-method.tsd-parent-kind-interface.tsd-is-inherited > .tsd-kind-icon:before { - background-position: -221px -170px; -} - -.tsd-is-static.tsd-kind-call-signature > .tsd-kind-icon:before { - background-position: -136px -170px; -} -.tsd-is-static.tsd-kind-call-signature.tsd-is-protected > .tsd-kind-icon:before { - background-position: -153px -170px; -} -.tsd-is-static.tsd-kind-call-signature.tsd-is-private > .tsd-kind-icon:before { - background-position: -119px -170px; -} -.tsd-is-static.tsd-kind-call-signature.tsd-parent-kind-class > .tsd-kind-icon:before { - background-position: -51px -170px; -} -.tsd-is-static.tsd-kind-call-signature.tsd-parent-kind-class.tsd-is-inherited > .tsd-kind-icon:before { - background-position: -68px -170px; -} -.tsd-is-static.tsd-kind-call-signature.tsd-parent-kind-class.tsd-is-protected > .tsd-kind-icon:before { - background-position: -85px -170px; -} -.tsd-is-static.tsd-kind-call-signature.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited > .tsd-kind-icon:before { - background-position: -102px -170px; -} -.tsd-is-static.tsd-kind-call-signature.tsd-parent-kind-class.tsd-is-private > .tsd-kind-icon:before { - background-position: -119px -170px; -} -.tsd-is-static.tsd-kind-call-signature.tsd-parent-kind-enum > .tsd-kind-icon:before { - background-position: -170px -170px; -} -.tsd-is-static.tsd-kind-call-signature.tsd-parent-kind-enum.tsd-is-protected > .tsd-kind-icon:before { - background-position: -187px -170px; -} -.tsd-is-static.tsd-kind-call-signature.tsd-parent-kind-enum.tsd-is-private > .tsd-kind-icon:before { - background-position: -119px -170px; -} -.tsd-is-static.tsd-kind-call-signature.tsd-parent-kind-interface > .tsd-kind-icon:before { - background-position: -204px -170px; -} -.tsd-is-static.tsd-kind-call-signature.tsd-parent-kind-interface.tsd-is-inherited > .tsd-kind-icon:before { - background-position: -221px -170px; -} - -.tsd-is-static.tsd-kind-event > .tsd-kind-icon:before { - background-position: -136px -187px; -} -.tsd-is-static.tsd-kind-event.tsd-is-protected > .tsd-kind-icon:before { - background-position: -153px -187px; -} -.tsd-is-static.tsd-kind-event.tsd-is-private > .tsd-kind-icon:before { - background-position: -119px -187px; -} -.tsd-is-static.tsd-kind-event.tsd-parent-kind-class > .tsd-kind-icon:before { - background-position: -51px -187px; -} -.tsd-is-static.tsd-kind-event.tsd-parent-kind-class.tsd-is-inherited > .tsd-kind-icon:before { - background-position: -68px -187px; -} -.tsd-is-static.tsd-kind-event.tsd-parent-kind-class.tsd-is-protected > .tsd-kind-icon:before { - background-position: -85px -187px; -} -.tsd-is-static.tsd-kind-event.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited > .tsd-kind-icon:before { - background-position: -102px -187px; -} -.tsd-is-static.tsd-kind-event.tsd-parent-kind-class.tsd-is-private > .tsd-kind-icon:before { - background-position: -119px -187px; -} -.tsd-is-static.tsd-kind-event.tsd-parent-kind-enum > .tsd-kind-icon:before { - background-position: -170px -187px; -} -.tsd-is-static.tsd-kind-event.tsd-parent-kind-enum.tsd-is-protected > .tsd-kind-icon:before { - background-position: -187px -187px; -} -.tsd-is-static.tsd-kind-event.tsd-parent-kind-enum.tsd-is-private > .tsd-kind-icon:before { - background-position: -119px -187px; -} -.tsd-is-static.tsd-kind-event.tsd-parent-kind-interface > .tsd-kind-icon:before { - background-position: -204px -187px; -} -.tsd-is-static.tsd-kind-event.tsd-parent-kind-interface.tsd-is-inherited > .tsd-kind-icon:before { - background-position: -221px -187px; -} - -@keyframes fade-in { - from { - opacity: 0; - } - to { - opacity: 1; - } -} -@keyframes fade-out { - from { - opacity: 1; - visibility: visible; - } - to { - opacity: 0; - } -} -@keyframes fade-in-delayed { - 0% { - opacity: 0; - } - 33% { - opacity: 0; - } - 100% { - opacity: 1; - } -} -@keyframes fade-out-delayed { - 0% { - opacity: 1; - visibility: visible; - } - 66% { - opacity: 0; - } - 100% { - opacity: 0; - } -} -@keyframes shift-to-left { - from { - transform: translate(0, 0); - } - to { - transform: translate(-25%, 0); - } -} -@keyframes unshift-to-left { - from { - transform: translate(-25%, 0); - } - to { - transform: translate(0, 0); - } -} -@keyframes pop-in-from-right { - from { - transform: translate(100%, 0); - } - to { - transform: translate(0, 0); - } -} -@keyframes pop-out-to-right { - from { - transform: translate(0, 0); - visibility: visible; - } - to { - transform: translate(100%, 0); - } -} -body { - background: var(--color-background); - font-family: "Segoe UI", sans-serif; - font-size: 16px; - color: var(--color-text); -} - -a { - color: var(--color-link); - text-decoration: none; -} -a:hover { - text-decoration: underline; -} - -code, pre { - font-family: Menlo, Monaco, Consolas, "Courier New", monospace; - padding: 0.2em; - margin: 0; - font-size: 14px; - background-color: var(--color-code-background); -} - -pre { - padding: 10px; -} -pre code { - padding: 0; - font-size: 100%; - background-color: transparent; -} - -blockquote { - margin: 1em 0; - padding-left: 1em; - border-left: 4px solid gray; -} - -.tsd-typography { - line-height: 1.333em; -} -.tsd-typography ul { - list-style: square; - padding: 0 0 0 20px; - margin: 0; -} -.tsd-typography h4, .tsd-typography .tsd-index-panel h3, .tsd-index-panel .tsd-typography h3, .tsd-typography h5, .tsd-typography h6 { - font-size: 1em; - margin: 0; -} -.tsd-typography h5, .tsd-typography h6 { - font-weight: normal; -} -.tsd-typography p, .tsd-typography ul, .tsd-typography ol { - margin: 1em 0; -} - -@media (min-width: 901px) and (max-width: 1024px) { - html.default .col-content { - width: 72%; - } - html.default .col-menu { - width: 28%; - } - html.default .tsd-navigation { - padding-left: 10px; - } -} -@media (max-width: 900px) { - html.default .col-content { - float: none; - width: 100%; - } - html.default .col-menu { - position: fixed !important; - overflow: auto; - -webkit-overflow-scrolling: touch; - z-index: 1024; - top: 0 !important; - bottom: 0 !important; - left: auto !important; - right: 0 !important; - width: 100%; - padding: 20px 20px 0 0; - max-width: 450px; - visibility: hidden; - background-color: var(--color-panel); - transform: translate(100%, 0); - } - html.default .col-menu > *:last-child { - padding-bottom: 20px; - } - html.default .overlay { - content: ""; - display: block; - position: fixed; - z-index: 1023; - top: 0; - left: 0; - right: 0; - bottom: 0; - background-color: rgba(0, 0, 0, 0.75); - visibility: hidden; - } - html.default.to-has-menu .overlay { - animation: fade-in 0.4s; - } - html.default.to-has-menu header, -html.default.to-has-menu footer, -html.default.to-has-menu .col-content { - animation: shift-to-left 0.4s; - } - html.default.to-has-menu .col-menu { - animation: pop-in-from-right 0.4s; - } - html.default.from-has-menu .overlay { - animation: fade-out 0.4s; - } - html.default.from-has-menu header, -html.default.from-has-menu footer, -html.default.from-has-menu .col-content { - animation: unshift-to-left 0.4s; - } - html.default.from-has-menu .col-menu { - animation: pop-out-to-right 0.4s; - } - html.default.has-menu body { - overflow: hidden; - } - html.default.has-menu .overlay { - visibility: visible; - } - html.default.has-menu header, -html.default.has-menu footer, -html.default.has-menu .col-content { - transform: translate(-25%, 0); - } - html.default.has-menu .col-menu { - visibility: visible; - transform: translate(0, 0); - } -} - -.tsd-page-title { - padding: 70px 0 20px 0; - margin: 0 0 40px 0; - background: var(--color-panel); - box-shadow: 0 0 5px rgba(0, 0, 0, 0.35); -} -.tsd-page-title h1 { - margin: 0; -} - -.tsd-breadcrumb { - margin: 0; - padding: 0; - color: var(--color-text-aside); -} -.tsd-breadcrumb a { - color: var(--color-text-aside); - text-decoration: none; -} -.tsd-breadcrumb a:hover { - text-decoration: underline; -} -.tsd-breadcrumb li { - display: inline; -} -.tsd-breadcrumb li:after { - content: " / "; -} - -html.minimal .container { - margin: 0; -} -html.minimal .container-main { - padding-top: 50px; - padding-bottom: 0; -} -html.minimal .content-wrap { - padding-left: 300px; -} -html.minimal .tsd-navigation { - position: fixed !important; - overflow: auto; - -webkit-overflow-scrolling: touch; - box-sizing: border-box; - z-index: 1; - left: 0; - top: 40px; - bottom: 0; - width: 300px; - padding: 20px; - margin: 0; -} -html.minimal .tsd-member .tsd-member { - margin-left: 0; -} -html.minimal .tsd-page-toolbar { - position: fixed; - z-index: 2; -} -html.minimal #tsd-filter .tsd-filter-group { - right: 0; - transform: none; -} -html.minimal footer { - background-color: transparent; -} -html.minimal footer .container { - padding: 0; -} -html.minimal .tsd-generator { - padding: 0; -} -@media (max-width: 900px) { - html.minimal .tsd-navigation { - display: none; - } - html.minimal .content-wrap { - padding-left: 0; - } -} - -dl.tsd-comment-tags { - overflow: hidden; -} -dl.tsd-comment-tags dt { - float: left; - padding: 1px 5px; - margin: 0 10px 0 0; - border-radius: 4px; - border: 1px solid var(--color-comment-tag); - color: var(--color-comment-tag); - font-size: 0.8em; - font-weight: normal; -} -dl.tsd-comment-tags dd { - margin: 0 0 10px 0; -} -dl.tsd-comment-tags dd:before, dl.tsd-comment-tags dd:after { - display: table; - content: " "; -} -dl.tsd-comment-tags dd pre, dl.tsd-comment-tags dd:after { - clear: both; -} -dl.tsd-comment-tags p { - margin: 0; -} - -.tsd-panel.tsd-comment .lead { - font-size: 1.1em; - line-height: 1.333em; - margin-bottom: 2em; -} -.tsd-panel.tsd-comment .lead:last-child { - margin-bottom: 0; -} - -.toggle-protected .tsd-is-private { - display: none; -} - -.toggle-public .tsd-is-private, -.toggle-public .tsd-is-protected, -.toggle-public .tsd-is-private-protected { - display: none; -} - -.toggle-inherited .tsd-is-inherited { - display: none; -} - -.toggle-externals .tsd-is-external { - display: none; -} - -#tsd-filter { - position: relative; - display: inline-block; - height: 40px; - vertical-align: bottom; -} -.no-filter #tsd-filter { - display: none; -} -#tsd-filter .tsd-filter-group { - display: inline-block; - height: 40px; - vertical-align: bottom; - white-space: nowrap; -} -#tsd-filter input { - display: none; -} -@media (max-width: 900px) { - #tsd-filter .tsd-filter-group { - display: block; - position: absolute; - top: 40px; - right: 20px; - height: auto; - background-color: var(--color-panel); - visibility: hidden; - transform: translate(50%, 0); - box-shadow: 0 0 4px rgba(0, 0, 0, 0.25); - } - .has-options #tsd-filter .tsd-filter-group { - visibility: visible; - } - .to-has-options #tsd-filter .tsd-filter-group { - animation: fade-in 0.2s; - } - .from-has-options #tsd-filter .tsd-filter-group { - animation: fade-out 0.2s; - } - #tsd-filter label, -#tsd-filter .tsd-select { - display: block; - padding-right: 20px; - } -} - -footer { - border-top: 1px solid var(--color-panel-divider); - background-color: var(--color-panel); -} -footer.with-border-bottom { - border-bottom: 1px solid var(--color-panel-divider); -} -footer .tsd-legend-group { - font-size: 0; -} -footer .tsd-legend { - display: inline-block; - width: 25%; - padding: 0; - font-size: 16px; - list-style: none; - line-height: 1.333em; - vertical-align: top; -} -@media (max-width: 900px) { - footer .tsd-legend { - width: 50%; - } -} - -.tsd-hierarchy { - list-style: square; - padding: 0 0 0 20px; - margin: 0; -} -.tsd-hierarchy .target { - font-weight: bold; -} - -.tsd-index-panel .tsd-index-content { - margin-bottom: -30px !important; -} -.tsd-index-panel .tsd-index-section { - margin-bottom: 30px !important; -} -.tsd-index-panel h3 { - margin: 0 -20px 10px -20px; - padding: 0 20px 10px 20px; - border-bottom: 1px solid var(--color-panel-divider); -} -.tsd-index-panel ul.tsd-index-list { - -webkit-column-count: 3; - -moz-column-count: 3; - -ms-column-count: 3; - -o-column-count: 3; - column-count: 3; - -webkit-column-gap: 20px; - -moz-column-gap: 20px; - -ms-column-gap: 20px; - -o-column-gap: 20px; - column-gap: 20px; - padding: 0; - list-style: none; - line-height: 1.333em; -} -@media (max-width: 900px) { - .tsd-index-panel ul.tsd-index-list { - -webkit-column-count: 1; - -moz-column-count: 1; - -ms-column-count: 1; - -o-column-count: 1; - column-count: 1; - } -} -@media (min-width: 901px) and (max-width: 1024px) { - .tsd-index-panel ul.tsd-index-list { - -webkit-column-count: 2; - -moz-column-count: 2; - -ms-column-count: 2; - -o-column-count: 2; - column-count: 2; - } -} -.tsd-index-panel ul.tsd-index-list li { - -webkit-page-break-inside: avoid; - -moz-page-break-inside: avoid; - -ms-page-break-inside: avoid; - -o-page-break-inside: avoid; - page-break-inside: avoid; -} -.tsd-index-panel a, -.tsd-index-panel .tsd-parent-kind-module a { - color: var(--color-ts); -} -.tsd-index-panel .tsd-parent-kind-interface a { - color: var(--color-ts-interface); -} -.tsd-index-panel .tsd-parent-kind-enum a { - color: var(--color-ts-enum); -} -.tsd-index-panel .tsd-parent-kind-class a { - color: var(--color-ts-class); -} -.tsd-index-panel .tsd-kind-module a { - color: var(--color-ts); -} -.tsd-index-panel .tsd-kind-interface a { - color: var(--color-ts-interface); -} -.tsd-index-panel .tsd-kind-enum a { - color: var(--color-ts-enum); -} -.tsd-index-panel .tsd-kind-class a { - color: var(--color-ts-class); -} -.tsd-index-panel .tsd-is-private a { - color: var(--color-ts-private); -} - -.tsd-flag { - display: inline-block; - padding: 1px 5px; - border-radius: 4px; - color: var(--color-comment-tag-text); - background-color: var(--color-comment-tag); - text-indent: 0; - font-size: 14px; - font-weight: normal; -} - -.tsd-anchor { - position: absolute; - top: -100px; -} - -.tsd-member { - position: relative; -} -.tsd-member .tsd-anchor + h3 { - margin-top: 0; - margin-bottom: 0; - border-bottom: none; -} -.tsd-member a[data-tsd-kind] { - color: var(--color-ts); -} -.tsd-member a[data-tsd-kind=Interface] { - color: var(--color-ts-interface); -} -.tsd-member a[data-tsd-kind=Enum] { - color: var(--color-ts-enum); -} -.tsd-member a[data-tsd-kind=Class] { - color: var(--color-ts-class); -} -.tsd-member a[data-tsd-kind=Private] { - color: var(--color-ts-private); -} - -.tsd-navigation { - margin: 0 0 0 40px; -} -.tsd-navigation a { - display: block; - padding-top: 2px; - padding-bottom: 2px; - border-left: 2px solid transparent; - color: var(--color-text); - text-decoration: none; - transition: border-left-color 0.1s; -} -.tsd-navigation a:hover { - text-decoration: underline; -} -.tsd-navigation ul { - margin: 0; - padding: 0; - list-style: none; -} -.tsd-navigation li { - padding: 0; -} - -.tsd-navigation.primary { - padding-bottom: 40px; -} -.tsd-navigation.primary a { - display: block; - padding-top: 6px; - padding-bottom: 6px; -} -.tsd-navigation.primary ul li a { - padding-left: 5px; -} -.tsd-navigation.primary ul li li a { - padding-left: 25px; -} -.tsd-navigation.primary ul li li li a { - padding-left: 45px; -} -.tsd-navigation.primary ul li li li li a { - padding-left: 65px; -} -.tsd-navigation.primary ul li li li li li a { - padding-left: 85px; -} -.tsd-navigation.primary ul li li li li li li a { - padding-left: 105px; -} -.tsd-navigation.primary > ul { - border-bottom: 1px solid var(--color-panel-divider); -} -.tsd-navigation.primary li { - border-top: 1px solid var(--color-panel-divider); -} -.tsd-navigation.primary li.current > a { - font-weight: bold; -} -.tsd-navigation.primary li.label span { - display: block; - padding: 20px 0 6px 5px; - color: var(--color-menu-label); -} -.tsd-navigation.primary li.globals + li > span, .tsd-navigation.primary li.globals + li > a { - padding-top: 20px; -} - -.tsd-navigation.secondary { - max-height: calc(100vh - 1rem - 40px); - overflow: auto; - position: -webkit-sticky; - position: sticky; - top: calc(.5rem + 40px); - transition: 0.3s; -} -.tsd-navigation.secondary.tsd-navigation--toolbar-hide { - max-height: calc(100vh - 1rem); - top: 0.5rem; -} -.tsd-navigation.secondary ul { - transition: opacity 0.2s; -} -.tsd-navigation.secondary ul li a { - padding-left: 25px; -} -.tsd-navigation.secondary ul li li a { - padding-left: 45px; -} -.tsd-navigation.secondary ul li li li a { - padding-left: 65px; -} -.tsd-navigation.secondary ul li li li li a { - padding-left: 85px; -} -.tsd-navigation.secondary ul li li li li li a { - padding-left: 105px; -} -.tsd-navigation.secondary ul li li li li li li a { - padding-left: 125px; -} -.tsd-navigation.secondary ul.current a { - border-left-color: var(--color-panel-divider); -} -.tsd-navigation.secondary li.focus > a, -.tsd-navigation.secondary ul.current li.focus > a { - border-left-color: var(--color-menu-divider-focus); -} -.tsd-navigation.secondary li.current { - margin-top: 20px; - margin-bottom: 20px; - border-left-color: var(--color-panel-divider); -} -.tsd-navigation.secondary li.current > a { - font-weight: bold; -} - -@media (min-width: 901px) { - .menu-sticky-wrap { - position: static; - } -} - -.tsd-panel { - margin: 20px 0; - padding: 20px; - background-color: var(--color-panel); - box-shadow: 0 0 4px rgba(0, 0, 0, 0.25); -} -.tsd-panel:empty { - display: none; -} -.tsd-panel > h1, .tsd-panel > h2, .tsd-panel > h3 { - margin: 1.5em -20px 10px -20px; - padding: 0 20px 10px 20px; - border-bottom: 1px solid var(--color-panel-divider); -} -.tsd-panel > h1.tsd-before-signature, .tsd-panel > h2.tsd-before-signature, .tsd-panel > h3.tsd-before-signature { - margin-bottom: 0; - border-bottom: 0; -} -.tsd-panel table { - display: block; - width: 100%; - overflow: auto; - margin-top: 10px; - word-break: normal; - word-break: keep-all; -} -.tsd-panel table th { - font-weight: bold; -} -.tsd-panel table th, .tsd-panel table td { - padding: 6px 13px; - border: 1px solid #ddd; -} -.tsd-panel table tr { - background-color: #fff; - border-top: 1px solid #ccc; -} -.tsd-panel table tr:nth-child(2n) { - background-color: #f8f8f8; -} - -.tsd-panel-group { - margin: 60px 0; -} -.tsd-panel-group > h1, .tsd-panel-group > h2, .tsd-panel-group > h3 { - padding-left: 20px; - padding-right: 20px; -} - -#tsd-search { - transition: background-color 0.2s; -} -#tsd-search .title { - position: relative; - z-index: 2; -} -#tsd-search .field { - position: absolute; - left: 0; - top: 0; - right: 40px; - height: 40px; -} -#tsd-search .field input { - box-sizing: border-box; - position: relative; - top: -50px; - z-index: 1; - width: 100%; - padding: 0 10px; - opacity: 0; - outline: 0; - border: 0; - background: transparent; - color: var(--color-text); -} -#tsd-search .field label { - position: absolute; - overflow: hidden; - right: -40px; -} -#tsd-search .field input, -#tsd-search .title { - transition: opacity 0.2s; -} -#tsd-search .results { - position: absolute; - visibility: hidden; - top: 40px; - width: 100%; - margin: 0; - padding: 0; - list-style: none; - box-shadow: 0 0 4px rgba(0, 0, 0, 0.25); -} -#tsd-search .results li { - padding: 0 10px; - background-color: var(--color-background); -} -#tsd-search .results li:nth-child(even) { - background-color: var(--color-panel); -} -#tsd-search .results li.state { - display: none; -} -#tsd-search .results li.current, -#tsd-search .results li:hover { - background-color: var(--color-panel-divider); -} -#tsd-search .results a { - display: block; -} -#tsd-search .results a:before { - top: 10px; -} -#tsd-search .results span.parent { - color: var(--color-text-aside); - font-weight: normal; -} -#tsd-search.has-focus { - background-color: var(--color-panel-divider); -} -#tsd-search.has-focus .field input { - top: 0; - opacity: 1; -} -#tsd-search.has-focus .title { - z-index: 0; - opacity: 0; -} -#tsd-search.has-focus .results { - visibility: visible; -} -#tsd-search.loading .results li.state.loading { - display: block; -} -#tsd-search.failure .results li.state.failure { - display: block; -} - -.tsd-signature { - margin: 0 0 1em 0; - padding: 10px; - border: 1px solid var(--color-panel-divider); - font-family: Menlo, Monaco, Consolas, "Courier New", monospace; - font-size: 14px; - overflow-x: auto; -} -.tsd-signature.tsd-kind-icon { - padding-left: 30px; -} -.tsd-signature.tsd-kind-icon:before { - top: 10px; - left: 10px; -} -.tsd-panel > .tsd-signature { - margin-left: -20px; - margin-right: -20px; - border-width: 1px 0; -} -.tsd-panel > .tsd-signature.tsd-kind-icon { - padding-left: 40px; -} -.tsd-panel > .tsd-signature.tsd-kind-icon:before { - left: 20px; -} - -.tsd-signature-symbol { - color: var(--color-text-aside); - font-weight: normal; -} - -.tsd-signature-type { - font-style: italic; - font-weight: normal; -} - -.tsd-signatures { - padding: 0; - margin: 0 0 1em 0; - border: 1px solid var(--color-panel-divider); -} -.tsd-signatures .tsd-signature { - margin: 0; - border-width: 1px 0 0 0; - transition: background-color 0.1s; -} -.tsd-signatures .tsd-signature:first-child { - border-top-width: 0; -} -.tsd-signatures .tsd-signature.current { - background-color: var(--color-panel-divider); -} -.tsd-signatures.active > .tsd-signature { - cursor: pointer; -} -.tsd-panel > .tsd-signatures { - margin-left: -20px; - margin-right: -20px; - border-width: 1px 0; -} -.tsd-panel > .tsd-signatures .tsd-signature.tsd-kind-icon { - padding-left: 40px; -} -.tsd-panel > .tsd-signatures .tsd-signature.tsd-kind-icon:before { - left: 20px; -} -.tsd-panel > a.anchor + .tsd-signatures { - border-top-width: 0; - margin-top: -20px; -} - -ul.tsd-descriptions { - position: relative; - overflow: hidden; - padding: 0; - list-style: none; -} -ul.tsd-descriptions.active > .tsd-description { - display: none; -} -ul.tsd-descriptions.active > .tsd-description.current { - display: block; -} -ul.tsd-descriptions.active > .tsd-description.fade-in { - animation: fade-in-delayed 0.3s; -} -ul.tsd-descriptions.active > .tsd-description.fade-out { - animation: fade-out-delayed 0.3s; - position: absolute; - display: block; - top: 0; - left: 0; - right: 0; - opacity: 0; - visibility: hidden; -} -ul.tsd-descriptions h4, ul.tsd-descriptions .tsd-index-panel h3, .tsd-index-panel ul.tsd-descriptions h3 { - font-size: 16px; - margin: 1em 0 0.5em 0; -} - -ul.tsd-parameters, -ul.tsd-type-parameters { - list-style: square; - margin: 0; - padding-left: 20px; -} -ul.tsd-parameters > li.tsd-parameter-signature, -ul.tsd-type-parameters > li.tsd-parameter-signature { - list-style: none; - margin-left: -20px; -} -ul.tsd-parameters h5, -ul.tsd-type-parameters h5 { - font-size: 16px; - margin: 1em 0 0.5em 0; -} -ul.tsd-parameters .tsd-comment, -ul.tsd-type-parameters .tsd-comment { - margin-top: -0.5em; -} - -.tsd-sources { - font-size: 14px; - color: var(--color-text-aside); - margin: 0 0 1em 0; -} -.tsd-sources a { - color: var(--color-text-aside); - text-decoration: underline; -} -.tsd-sources ul, .tsd-sources p { - margin: 0 !important; -} -.tsd-sources ul { - list-style: none; - padding: 0; -} - -.tsd-page-toolbar { - position: fixed; - z-index: 1; - top: 0; - left: 0; - width: 100%; - height: 40px; - color: var(--color-toolbar-text); - background: var(--color-toolbar); - border-bottom: 1px solid var(--color-panel-divider); - transition: transform 0.3s linear; -} -.tsd-page-toolbar a { - color: var(--color-toolbar-text); - text-decoration: none; -} -.tsd-page-toolbar a.title { - font-weight: bold; -} -.tsd-page-toolbar a.title:hover { - text-decoration: underline; -} -.tsd-page-toolbar .table-wrap { - display: table; - width: 100%; - height: 40px; -} -.tsd-page-toolbar .table-cell { - display: table-cell; - position: relative; - white-space: nowrap; - line-height: 40px; -} -.tsd-page-toolbar .table-cell:first-child { - width: 100%; -} - -.tsd-page-toolbar--hide { - transform: translateY(-100%); -} - -.tsd-select .tsd-select-list li:before, .tsd-select .tsd-select-label:before, .tsd-widget:before { - content: ""; - display: inline-block; - width: 40px; - height: 40px; - margin: 0 -8px 0 0; - background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAUAAAAAoCAQAAAAlSeuiAAABp0lEQVR4Ae3aUa3jQAyF4QNhIBTCQiiEQlgIhRAGhTAQBkIgBEIgDITZZGXNjZTePiSWYqn/54dGfbAq+SiTutWXAgAAAAAAAAAAAAA8NCz1UFSD2lKDS5d3NVzZj/BVNasaLoRZRUmj2lLrVVHWMUntQ13Wj/i1pWa9lprX6xMRnH4dx6Rjsn26+v+12ms+EcB37P0r+qH+DNQGXgMFcHzbregQ78B8eQCTJk0e979ZW7PdA2O49ceDsYexKgUNoI3EKYDWL3D8miaPh/uXtl6BHqEHFQvgXau/FsCiIWAAbST2fpQRT0sl70j3z5ZiBdD7CG5WZX8kxwmgjbiP5GQA9/3O2XaxnnHi53AEE0AbRh+JQwC3/fzC4hcb6xPvS4i3QaMdwX+0utsRPEY6gm2wNhKHAG77eUi7SIcK4G4NY4GMIan2u2Cxqzncl5DUn7Q8ArjvZ8JFOsl/Ed0jyBom+BomQKSto+9PcblHMM4iuu4X0QQw5hrGQY/gUxFkjZuf4m4alXVU+1De/VhEn5CvDSB/RsBzqWgAAAAAAAAAAAAAAACAfyyYJ5nhVuwIAAAAAElFTkSuQmCC); - background-repeat: no-repeat; - text-indent: -1024px; - vertical-align: bottom; -} -@media (-webkit-min-device-pixel-ratio: 1.5), (min-resolution: 144dpi) { - .tsd-select .tsd-select-list li:before, .tsd-select .tsd-select-label:before, .tsd-widget:before { - background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAoAAAABQCAMAAAC+sjQXAAAAM1BMVEUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACjBUbJAAAAEXRSTlMA3/+/UCBw7xCPYIBAMM+vn1qYQ7QAAALCSURBVHgB7MGBAAAAAICg/akXqQIAAAAAAAAAAAAAAAAAAJids9mdE4bhoDNZCITP93/aSmhV/9uwPWyi8jtkblws2IxsYpz9LwSAaJW8AreE16PxOsMYE6Q4DiYKF7X+8ZHXc/E608xv5snEyIuZrVwMZjbnujR6T3gsXmcLOIRNzD+Ig2UuVtt2+NbAiX/wVLzOlviD9L2BOfGBlL/3D1I+uDjGBJArBPxU3x+K15kCQFo2s21JAOHrKpz4SPrWv4IKA+uFaR6vMwMcb+emA2DWEfDglrkLqEBOKVslA8Dx14oPMiV4CtywWxdQgAwkq2QE0uTXUwJGk2G9s3mTFNBzAkC7HKPsX72AEVjMnAWIpsPCRRjXdQxcjCYpoOcEgHY5Rtk/slWSgM3M2aSeeVgjAOeVpKcdgGMdNAXMuIAqOcZzqF8L+WcAsi8wkTeheCWMegL6mgCorHHyEJ5TVfxrLWDrTUjZdhnhjYqAnlN8TaoELOLVC0gucmoz/3RKcPs2jAs4+J5ET8AEZF+TSgGLeC1V8YuGQQU2IV1Asq9JCwE9XitZVPxr34bpJRj8PqsFLOK108W9aVrWZRrR7Sm2HL4JCToCujHZ6gUs4jUz0P1TEvD+U5wMa363YeziBODIq1YbJrsv9QKW8Ry1nNp+GAHvuingRTfmYcjBf0QpAS37bdUL6PFKtHJq63EsZ5cxcKMkDVIClu1dAK1PcJ5TFQ0M9wZKDCPs3BD7MIJGTs3WfiTfDVQYx5q5ZekCauTU3P5Q0ukGCgh49oFURdobWBY9N/CxEuwGjpGLuPhTdwH1x7HqDDxNgRP2zQ8lraFyF/yJ9vH6QGqtgSbBOU8/j2VORz+Wqfle2d5Ae4R+ML0z7Y+W4P7XHN3AU+tzyK/24EAGAAAAYJC/9T2+CgAAAAAAAAAAAAAAAAAAAADgJpfzHyIKFFBKAAAAAElFTkSuQmCC); - background-size: 320px 40px; - } -} - -.tsd-widget { - display: inline-block; - overflow: hidden; - opacity: 0.6; - height: 40px; - transition: opacity 0.1s, background-color 0.2s; - vertical-align: bottom; - cursor: pointer; -} -.tsd-widget:hover { - opacity: 0.8; -} -.tsd-widget.active { - opacity: 1; - background-color: var(--color-panel-divider); -} -.tsd-widget.no-caption { - width: 40px; -} -.tsd-widget.no-caption:before { - margin: 0; -} -.tsd-widget.search:before { - background-position: 0 0; -} -.tsd-widget.menu:before { - background-position: -40px 0; -} -.tsd-widget.options:before { - background-position: -80px 0; -} -.tsd-widget.options, .tsd-widget.menu { - display: none; -} -@media (max-width: 900px) { - .tsd-widget.options, .tsd-widget.menu { - display: inline-block; - } -} -input[type=checkbox] + .tsd-widget:before { - background-position: -120px 0; -} -input[type=checkbox]:checked + .tsd-widget:before { - background-position: -160px 0; -} - -.tsd-select { - position: relative; - display: inline-block; - height: 40px; - transition: opacity 0.1s, background-color 0.2s; - vertical-align: bottom; - cursor: pointer; -} -.tsd-select .tsd-select-label { - opacity: 0.6; - transition: opacity 0.2s; -} -.tsd-select .tsd-select-label:before { - background-position: -240px 0; -} -.tsd-select.active .tsd-select-label { - opacity: 0.8; -} -.tsd-select.active .tsd-select-list { - visibility: visible; - opacity: 1; - transition-delay: 0s; -} -.tsd-select .tsd-select-list { - position: absolute; - visibility: hidden; - top: 40px; - left: 0; - margin: 0; - padding: 0; - opacity: 0; - list-style: none; - box-shadow: 0 0 4px rgba(0, 0, 0, 0.25); - transition: visibility 0s 0.2s, opacity 0.2s; -} -.tsd-select .tsd-select-list li { - padding: 0 20px 0 0; - background-color: var(--color-background); -} -.tsd-select .tsd-select-list li:before { - background-position: 40px 0; -} -.tsd-select .tsd-select-list li:nth-child(even) { - background-color: var(--color-panel); -} -.tsd-select .tsd-select-list li:hover { - background-color: var(--color-panel-divider); -} -.tsd-select .tsd-select-list li.selected:before { - background-position: -200px 0; -} -@media (max-width: 900px) { - .tsd-select .tsd-select-list { - top: 0; - left: auto; - right: 100%; - margin-right: -5px; - } - .tsd-select .tsd-select-label:before { - background-position: -280px 0; - } -} - -img { - max-width: 100%; -} diff --git a/docs/assets/highlight.css b/docs/assets/highlight.css new file mode 100644 index 00000000..30cc4194 --- /dev/null +++ b/docs/assets/highlight.css @@ -0,0 +1,120 @@ +:root { + --light-hl-0: #AF00DB; + --dark-hl-0: #C586C0; + --light-hl-1: #000000; + --dark-hl-1: #D4D4D4; + --light-hl-2: #0000FF; + --dark-hl-2: #569CD6; + --light-hl-3: #001080; + --dark-hl-3: #9CDCFE; + --light-hl-4: #A31515; + --dark-hl-4: #CE9178; + --light-hl-5: #008000; + --dark-hl-5: #6A9955; + --light-hl-6: #795E26; + --dark-hl-6: #DCDCAA; + --light-hl-7: #098658; + --dark-hl-7: #B5CEA8; + --light-hl-8: #0070C1; + --dark-hl-8: #4FC1FF; + --light-hl-9: #800000; + --dark-hl-9: #808080; + --light-hl-10: #800000; + --dark-hl-10: #569CD6; + --light-hl-11: #000000FF; + --dark-hl-11: #D4D4D4; + --light-hl-12: #FF0000; + --dark-hl-12: #9CDCFE; + --light-hl-13: #0000FF; + --dark-hl-13: #CE9178; + --light-code-background: #FFFFFF; + --dark-code-background: #1E1E1E; +} + +@media (prefers-color-scheme: light) { :root { + --hl-0: var(--light-hl-0); + --hl-1: var(--light-hl-1); + --hl-2: var(--light-hl-2); + --hl-3: var(--light-hl-3); + --hl-4: var(--light-hl-4); + --hl-5: var(--light-hl-5); + --hl-6: var(--light-hl-6); + --hl-7: var(--light-hl-7); + --hl-8: var(--light-hl-8); + --hl-9: var(--light-hl-9); + --hl-10: var(--light-hl-10); + --hl-11: var(--light-hl-11); + --hl-12: var(--light-hl-12); + --hl-13: var(--light-hl-13); + --code-background: var(--light-code-background); +} } + +@media (prefers-color-scheme: dark) { :root { + --hl-0: var(--dark-hl-0); + --hl-1: var(--dark-hl-1); + --hl-2: var(--dark-hl-2); + --hl-3: var(--dark-hl-3); + --hl-4: var(--dark-hl-4); + --hl-5: var(--dark-hl-5); + --hl-6: var(--dark-hl-6); + --hl-7: var(--dark-hl-7); + --hl-8: var(--dark-hl-8); + --hl-9: var(--dark-hl-9); + --hl-10: var(--dark-hl-10); + --hl-11: var(--dark-hl-11); + --hl-12: var(--dark-hl-12); + --hl-13: var(--dark-hl-13); + --code-background: var(--dark-code-background); +} } + +body.light { + --hl-0: var(--light-hl-0); + --hl-1: var(--light-hl-1); + --hl-2: var(--light-hl-2); + --hl-3: var(--light-hl-3); + --hl-4: var(--light-hl-4); + --hl-5: var(--light-hl-5); + --hl-6: var(--light-hl-6); + --hl-7: var(--light-hl-7); + --hl-8: var(--light-hl-8); + --hl-9: var(--light-hl-9); + --hl-10: var(--light-hl-10); + --hl-11: var(--light-hl-11); + --hl-12: var(--light-hl-12); + --hl-13: var(--light-hl-13); + --code-background: var(--light-code-background); +} + +body.dark { + --hl-0: var(--dark-hl-0); + --hl-1: var(--dark-hl-1); + --hl-2: var(--dark-hl-2); + --hl-3: var(--dark-hl-3); + --hl-4: var(--dark-hl-4); + --hl-5: var(--dark-hl-5); + --hl-6: var(--dark-hl-6); + --hl-7: var(--dark-hl-7); + --hl-8: var(--dark-hl-8); + --hl-9: var(--dark-hl-9); + --hl-10: var(--dark-hl-10); + --hl-11: var(--dark-hl-11); + --hl-12: var(--dark-hl-12); + --hl-13: var(--dark-hl-13); + --code-background: var(--dark-code-background); +} + +.hl-0 { color: var(--hl-0); } +.hl-1 { color: var(--hl-1); } +.hl-2 { color: var(--hl-2); } +.hl-3 { color: var(--hl-3); } +.hl-4 { color: var(--hl-4); } +.hl-5 { color: var(--hl-5); } +.hl-6 { color: var(--hl-6); } +.hl-7 { color: var(--hl-7); } +.hl-8 { color: var(--hl-8); } +.hl-9 { color: var(--hl-9); } +.hl-10 { color: var(--hl-10); } +.hl-11 { color: var(--hl-11); } +.hl-12 { color: var(--hl-12); } +.hl-13 { color: var(--hl-13); } +pre, code { background: var(--code-background); } diff --git a/docs/assets/icons.css b/docs/assets/icons.css new file mode 100644 index 00000000..776a3562 --- /dev/null +++ b/docs/assets/icons.css @@ -0,0 +1,1043 @@ +.tsd-kind-icon { + display: block; + position: relative; + padding-left: 20px; + text-indent: -20px; +} +.tsd-kind-icon:before { + content: ""; + display: inline-block; + vertical-align: middle; + width: 17px; + height: 17px; + margin: 0 3px 2px 0; + background-image: url(./icons.png); +} +@media (-webkit-min-device-pixel-ratio: 1.5), (min-resolution: 144dpi) { + .tsd-kind-icon:before { + background-image: url(./icons@2x.png); + background-size: 238px 204px; + } +} + +.tsd-signature.tsd-kind-icon:before { + background-position: 0 -153px; +} + +.tsd-kind-object-literal > .tsd-kind-icon:before { + background-position: 0px -17px; +} +.tsd-kind-object-literal.tsd-is-protected > .tsd-kind-icon:before { + background-position: -17px -17px; +} +.tsd-kind-object-literal.tsd-is-private > .tsd-kind-icon:before { + background-position: -34px -17px; +} + +.tsd-kind-class > .tsd-kind-icon:before { + background-position: 0px -34px; +} +.tsd-kind-class.tsd-is-protected > .tsd-kind-icon:before { + background-position: -17px -34px; +} +.tsd-kind-class.tsd-is-private > .tsd-kind-icon:before { + background-position: -34px -34px; +} + +.tsd-kind-class.tsd-has-type-parameter > .tsd-kind-icon:before { + background-position: 0px -51px; +} +.tsd-kind-class.tsd-has-type-parameter.tsd-is-protected + > .tsd-kind-icon:before { + background-position: -17px -51px; +} +.tsd-kind-class.tsd-has-type-parameter.tsd-is-private > .tsd-kind-icon:before { + background-position: -34px -51px; +} + +.tsd-kind-interface > .tsd-kind-icon:before { + background-position: 0px -68px; +} +.tsd-kind-interface.tsd-is-protected > .tsd-kind-icon:before { + background-position: -17px -68px; +} +.tsd-kind-interface.tsd-is-private > .tsd-kind-icon:before { + background-position: -34px -68px; +} + +.tsd-kind-interface.tsd-has-type-parameter > .tsd-kind-icon:before { + background-position: 0px -85px; +} +.tsd-kind-interface.tsd-has-type-parameter.tsd-is-protected + > .tsd-kind-icon:before { + background-position: -17px -85px; +} +.tsd-kind-interface.tsd-has-type-parameter.tsd-is-private + > .tsd-kind-icon:before { + background-position: -34px -85px; +} + +.tsd-kind-namespace > .tsd-kind-icon:before { + background-position: 0px -102px; +} +.tsd-kind-namespace.tsd-is-protected > .tsd-kind-icon:before { + background-position: -17px -102px; +} +.tsd-kind-namespace.tsd-is-private > .tsd-kind-icon:before { + background-position: -34px -102px; +} + +.tsd-kind-module > .tsd-kind-icon:before { + background-position: 0px -102px; +} +.tsd-kind-module.tsd-is-protected > .tsd-kind-icon:before { + background-position: -17px -102px; +} +.tsd-kind-module.tsd-is-private > .tsd-kind-icon:before { + background-position: -34px -102px; +} + +.tsd-kind-enum > .tsd-kind-icon:before { + background-position: 0px -119px; +} +.tsd-kind-enum.tsd-is-protected > .tsd-kind-icon:before { + background-position: -17px -119px; +} +.tsd-kind-enum.tsd-is-private > .tsd-kind-icon:before { + background-position: -34px -119px; +} + +.tsd-kind-enum-member > .tsd-kind-icon:before { + background-position: 0px -136px; +} +.tsd-kind-enum-member.tsd-is-protected > .tsd-kind-icon:before { + background-position: -17px -136px; +} +.tsd-kind-enum-member.tsd-is-private > .tsd-kind-icon:before { + background-position: -34px -136px; +} + +.tsd-kind-signature > .tsd-kind-icon:before { + background-position: 0px -153px; +} +.tsd-kind-signature.tsd-is-protected > .tsd-kind-icon:before { + background-position: -17px -153px; +} +.tsd-kind-signature.tsd-is-private > .tsd-kind-icon:before { + background-position: -34px -153px; +} + +.tsd-kind-type-alias > .tsd-kind-icon:before { + background-position: 0px -170px; +} +.tsd-kind-type-alias.tsd-is-protected > .tsd-kind-icon:before { + background-position: -17px -170px; +} +.tsd-kind-type-alias.tsd-is-private > .tsd-kind-icon:before { + background-position: -34px -170px; +} + +.tsd-kind-type-alias.tsd-has-type-parameter > .tsd-kind-icon:before { + background-position: 0px -187px; +} +.tsd-kind-type-alias.tsd-has-type-parameter.tsd-is-protected + > .tsd-kind-icon:before { + background-position: -17px -187px; +} +.tsd-kind-type-alias.tsd-has-type-parameter.tsd-is-private + > .tsd-kind-icon:before { + background-position: -34px -187px; +} + +.tsd-kind-variable > .tsd-kind-icon:before { + background-position: -136px -0px; +} +.tsd-kind-variable.tsd-is-protected > .tsd-kind-icon:before { + background-position: -153px -0px; +} +.tsd-kind-variable.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -0px; +} +.tsd-kind-variable.tsd-parent-kind-class > .tsd-kind-icon:before { + background-position: -51px -0px; +} +.tsd-kind-variable.tsd-parent-kind-class.tsd-is-inherited + > .tsd-kind-icon:before { + background-position: -68px -0px; +} +.tsd-kind-variable.tsd-parent-kind-class.tsd-is-protected + > .tsd-kind-icon:before { + background-position: -85px -0px; +} +.tsd-kind-variable.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited + > .tsd-kind-icon:before { + background-position: -102px -0px; +} +.tsd-kind-variable.tsd-parent-kind-class.tsd-is-private + > .tsd-kind-icon:before { + background-position: -119px -0px; +} +.tsd-kind-variable.tsd-parent-kind-enum > .tsd-kind-icon:before { + background-position: -170px -0px; +} +.tsd-kind-variable.tsd-parent-kind-enum.tsd-is-protected + > .tsd-kind-icon:before { + background-position: -187px -0px; +} +.tsd-kind-variable.tsd-parent-kind-enum.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -0px; +} +.tsd-kind-variable.tsd-parent-kind-interface > .tsd-kind-icon:before { + background-position: -204px -0px; +} +.tsd-kind-variable.tsd-parent-kind-interface.tsd-is-inherited + > .tsd-kind-icon:before { + background-position: -221px -0px; +} + +.tsd-kind-property > .tsd-kind-icon:before { + background-position: -136px -0px; +} +.tsd-kind-property.tsd-is-protected > .tsd-kind-icon:before { + background-position: -153px -0px; +} +.tsd-kind-property.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -0px; +} +.tsd-kind-property.tsd-parent-kind-class > .tsd-kind-icon:before { + background-position: -51px -0px; +} +.tsd-kind-property.tsd-parent-kind-class.tsd-is-inherited + > .tsd-kind-icon:before { + background-position: -68px -0px; +} +.tsd-kind-property.tsd-parent-kind-class.tsd-is-protected + > .tsd-kind-icon:before { + background-position: -85px -0px; +} +.tsd-kind-property.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited + > .tsd-kind-icon:before { + background-position: -102px -0px; +} +.tsd-kind-property.tsd-parent-kind-class.tsd-is-private + > .tsd-kind-icon:before { + background-position: -119px -0px; +} +.tsd-kind-property.tsd-parent-kind-enum > .tsd-kind-icon:before { + background-position: -170px -0px; +} +.tsd-kind-property.tsd-parent-kind-enum.tsd-is-protected + > .tsd-kind-icon:before { + background-position: -187px -0px; +} +.tsd-kind-property.tsd-parent-kind-enum.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -0px; +} +.tsd-kind-property.tsd-parent-kind-interface > .tsd-kind-icon:before { + background-position: -204px -0px; +} +.tsd-kind-property.tsd-parent-kind-interface.tsd-is-inherited + > .tsd-kind-icon:before { + background-position: -221px -0px; +} + +.tsd-kind-get-signature > .tsd-kind-icon:before { + background-position: -136px -17px; +} +.tsd-kind-get-signature.tsd-is-protected > .tsd-kind-icon:before { + background-position: -153px -17px; +} +.tsd-kind-get-signature.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -17px; +} +.tsd-kind-get-signature.tsd-parent-kind-class > .tsd-kind-icon:before { + background-position: -51px -17px; +} +.tsd-kind-get-signature.tsd-parent-kind-class.tsd-is-inherited + > .tsd-kind-icon:before { + background-position: -68px -17px; +} +.tsd-kind-get-signature.tsd-parent-kind-class.tsd-is-protected + > .tsd-kind-icon:before { + background-position: -85px -17px; +} +.tsd-kind-get-signature.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited + > .tsd-kind-icon:before { + background-position: -102px -17px; +} +.tsd-kind-get-signature.tsd-parent-kind-class.tsd-is-private + > .tsd-kind-icon:before { + background-position: -119px -17px; +} +.tsd-kind-get-signature.tsd-parent-kind-enum > .tsd-kind-icon:before { + background-position: -170px -17px; +} +.tsd-kind-get-signature.tsd-parent-kind-enum.tsd-is-protected + > .tsd-kind-icon:before { + background-position: -187px -17px; +} +.tsd-kind-get-signature.tsd-parent-kind-enum.tsd-is-private + > .tsd-kind-icon:before { + background-position: -119px -17px; +} +.tsd-kind-get-signature.tsd-parent-kind-interface > .tsd-kind-icon:before { + background-position: -204px -17px; +} +.tsd-kind-get-signature.tsd-parent-kind-interface.tsd-is-inherited + > .tsd-kind-icon:before { + background-position: -221px -17px; +} + +.tsd-kind-set-signature > .tsd-kind-icon:before { + background-position: -136px -34px; +} +.tsd-kind-set-signature.tsd-is-protected > .tsd-kind-icon:before { + background-position: -153px -34px; +} +.tsd-kind-set-signature.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -34px; +} +.tsd-kind-set-signature.tsd-parent-kind-class > .tsd-kind-icon:before { + background-position: -51px -34px; +} +.tsd-kind-set-signature.tsd-parent-kind-class.tsd-is-inherited + > .tsd-kind-icon:before { + background-position: -68px -34px; +} +.tsd-kind-set-signature.tsd-parent-kind-class.tsd-is-protected + > .tsd-kind-icon:before { + background-position: -85px -34px; +} +.tsd-kind-set-signature.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited + > .tsd-kind-icon:before { + background-position: -102px -34px; +} +.tsd-kind-set-signature.tsd-parent-kind-class.tsd-is-private + > .tsd-kind-icon:before { + background-position: -119px -34px; +} +.tsd-kind-set-signature.tsd-parent-kind-enum > .tsd-kind-icon:before { + background-position: -170px -34px; +} +.tsd-kind-set-signature.tsd-parent-kind-enum.tsd-is-protected + > .tsd-kind-icon:before { + background-position: -187px -34px; +} +.tsd-kind-set-signature.tsd-parent-kind-enum.tsd-is-private + > .tsd-kind-icon:before { + background-position: -119px -34px; +} +.tsd-kind-set-signature.tsd-parent-kind-interface > .tsd-kind-icon:before { + background-position: -204px -34px; +} +.tsd-kind-set-signature.tsd-parent-kind-interface.tsd-is-inherited + > .tsd-kind-icon:before { + background-position: -221px -34px; +} + +.tsd-kind-accessor > .tsd-kind-icon:before { + background-position: -136px -51px; +} +.tsd-kind-accessor.tsd-is-protected > .tsd-kind-icon:before { + background-position: -153px -51px; +} +.tsd-kind-accessor.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -51px; +} +.tsd-kind-accessor.tsd-parent-kind-class > .tsd-kind-icon:before { + background-position: -51px -51px; +} +.tsd-kind-accessor.tsd-parent-kind-class.tsd-is-inherited + > .tsd-kind-icon:before { + background-position: -68px -51px; +} +.tsd-kind-accessor.tsd-parent-kind-class.tsd-is-protected + > .tsd-kind-icon:before { + background-position: -85px -51px; +} +.tsd-kind-accessor.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited + > .tsd-kind-icon:before { + background-position: -102px -51px; +} +.tsd-kind-accessor.tsd-parent-kind-class.tsd-is-private + > .tsd-kind-icon:before { + background-position: -119px -51px; +} +.tsd-kind-accessor.tsd-parent-kind-enum > .tsd-kind-icon:before { + background-position: -170px -51px; +} +.tsd-kind-accessor.tsd-parent-kind-enum.tsd-is-protected + > .tsd-kind-icon:before { + background-position: -187px -51px; +} +.tsd-kind-accessor.tsd-parent-kind-enum.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -51px; +} +.tsd-kind-accessor.tsd-parent-kind-interface > .tsd-kind-icon:before { + background-position: -204px -51px; +} +.tsd-kind-accessor.tsd-parent-kind-interface.tsd-is-inherited + > .tsd-kind-icon:before { + background-position: -221px -51px; +} + +.tsd-kind-function > .tsd-kind-icon:before { + background-position: -136px -68px; +} +.tsd-kind-function.tsd-is-protected > .tsd-kind-icon:before { + background-position: -153px -68px; +} +.tsd-kind-function.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -68px; +} +.tsd-kind-function.tsd-parent-kind-class > .tsd-kind-icon:before { + background-position: -51px -68px; +} +.tsd-kind-function.tsd-parent-kind-class.tsd-is-inherited + > .tsd-kind-icon:before { + background-position: -68px -68px; +} +.tsd-kind-function.tsd-parent-kind-class.tsd-is-protected + > .tsd-kind-icon:before { + background-position: -85px -68px; +} +.tsd-kind-function.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited + > .tsd-kind-icon:before { + background-position: -102px -68px; +} +.tsd-kind-function.tsd-parent-kind-class.tsd-is-private + > .tsd-kind-icon:before { + background-position: -119px -68px; +} +.tsd-kind-function.tsd-parent-kind-enum > .tsd-kind-icon:before { + background-position: -170px -68px; +} +.tsd-kind-function.tsd-parent-kind-enum.tsd-is-protected + > .tsd-kind-icon:before { + background-position: -187px -68px; +} +.tsd-kind-function.tsd-parent-kind-enum.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -68px; +} +.tsd-kind-function.tsd-parent-kind-interface > .tsd-kind-icon:before { + background-position: -204px -68px; +} +.tsd-kind-function.tsd-parent-kind-interface.tsd-is-inherited + > .tsd-kind-icon:before { + background-position: -221px -68px; +} + +.tsd-kind-method > .tsd-kind-icon:before { + background-position: -136px -68px; +} +.tsd-kind-method.tsd-is-protected > .tsd-kind-icon:before { + background-position: -153px -68px; +} +.tsd-kind-method.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -68px; +} +.tsd-kind-method.tsd-parent-kind-class > .tsd-kind-icon:before { + background-position: -51px -68px; +} +.tsd-kind-method.tsd-parent-kind-class.tsd-is-inherited + > .tsd-kind-icon:before { + background-position: -68px -68px; +} +.tsd-kind-method.tsd-parent-kind-class.tsd-is-protected + > .tsd-kind-icon:before { + background-position: -85px -68px; +} +.tsd-kind-method.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited + > .tsd-kind-icon:before { + background-position: -102px -68px; +} +.tsd-kind-method.tsd-parent-kind-class.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -68px; +} +.tsd-kind-method.tsd-parent-kind-enum > .tsd-kind-icon:before { + background-position: -170px -68px; +} +.tsd-kind-method.tsd-parent-kind-enum.tsd-is-protected > .tsd-kind-icon:before { + background-position: -187px -68px; +} +.tsd-kind-method.tsd-parent-kind-enum.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -68px; +} +.tsd-kind-method.tsd-parent-kind-interface > .tsd-kind-icon:before { + background-position: -204px -68px; +} +.tsd-kind-method.tsd-parent-kind-interface.tsd-is-inherited + > .tsd-kind-icon:before { + background-position: -221px -68px; +} + +.tsd-kind-call-signature > .tsd-kind-icon:before { + background-position: -136px -68px; +} +.tsd-kind-call-signature.tsd-is-protected > .tsd-kind-icon:before { + background-position: -153px -68px; +} +.tsd-kind-call-signature.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -68px; +} +.tsd-kind-call-signature.tsd-parent-kind-class > .tsd-kind-icon:before { + background-position: -51px -68px; +} +.tsd-kind-call-signature.tsd-parent-kind-class.tsd-is-inherited + > .tsd-kind-icon:before { + background-position: -68px -68px; +} +.tsd-kind-call-signature.tsd-parent-kind-class.tsd-is-protected + > .tsd-kind-icon:before { + background-position: -85px -68px; +} +.tsd-kind-call-signature.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited + > .tsd-kind-icon:before { + background-position: -102px -68px; +} +.tsd-kind-call-signature.tsd-parent-kind-class.tsd-is-private + > .tsd-kind-icon:before { + background-position: -119px -68px; +} +.tsd-kind-call-signature.tsd-parent-kind-enum > .tsd-kind-icon:before { + background-position: -170px -68px; +} +.tsd-kind-call-signature.tsd-parent-kind-enum.tsd-is-protected + > .tsd-kind-icon:before { + background-position: -187px -68px; +} +.tsd-kind-call-signature.tsd-parent-kind-enum.tsd-is-private + > .tsd-kind-icon:before { + background-position: -119px -68px; +} +.tsd-kind-call-signature.tsd-parent-kind-interface > .tsd-kind-icon:before { + background-position: -204px -68px; +} +.tsd-kind-call-signature.tsd-parent-kind-interface.tsd-is-inherited + > .tsd-kind-icon:before { + background-position: -221px -68px; +} + +.tsd-kind-function.tsd-has-type-parameter > .tsd-kind-icon:before { + background-position: -136px -85px; +} +.tsd-kind-function.tsd-has-type-parameter.tsd-is-protected + > .tsd-kind-icon:before { + background-position: -153px -85px; +} +.tsd-kind-function.tsd-has-type-parameter.tsd-is-private + > .tsd-kind-icon:before { + background-position: -119px -85px; +} +.tsd-kind-function.tsd-has-type-parameter.tsd-parent-kind-class + > .tsd-kind-icon:before { + background-position: -51px -85px; +} +.tsd-kind-function.tsd-has-type-parameter.tsd-parent-kind-class.tsd-is-inherited + > .tsd-kind-icon:before { + background-position: -68px -85px; +} +.tsd-kind-function.tsd-has-type-parameter.tsd-parent-kind-class.tsd-is-protected + > .tsd-kind-icon:before { + background-position: -85px -85px; +} +.tsd-kind-function.tsd-has-type-parameter.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited + > .tsd-kind-icon:before { + background-position: -102px -85px; +} +.tsd-kind-function.tsd-has-type-parameter.tsd-parent-kind-class.tsd-is-private + > .tsd-kind-icon:before { + background-position: -119px -85px; +} +.tsd-kind-function.tsd-has-type-parameter.tsd-parent-kind-enum + > .tsd-kind-icon:before { + background-position: -170px -85px; +} +.tsd-kind-function.tsd-has-type-parameter.tsd-parent-kind-enum.tsd-is-protected + > .tsd-kind-icon:before { + background-position: -187px -85px; +} +.tsd-kind-function.tsd-has-type-parameter.tsd-parent-kind-enum.tsd-is-private + > .tsd-kind-icon:before { + background-position: -119px -85px; +} +.tsd-kind-function.tsd-has-type-parameter.tsd-parent-kind-interface + > .tsd-kind-icon:before { + background-position: -204px -85px; +} +.tsd-kind-function.tsd-has-type-parameter.tsd-parent-kind-interface.tsd-is-inherited + > .tsd-kind-icon:before { + background-position: -221px -85px; +} + +.tsd-kind-method.tsd-has-type-parameter > .tsd-kind-icon:before { + background-position: -136px -85px; +} +.tsd-kind-method.tsd-has-type-parameter.tsd-is-protected + > .tsd-kind-icon:before { + background-position: -153px -85px; +} +.tsd-kind-method.tsd-has-type-parameter.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -85px; +} +.tsd-kind-method.tsd-has-type-parameter.tsd-parent-kind-class + > .tsd-kind-icon:before { + background-position: -51px -85px; +} +.tsd-kind-method.tsd-has-type-parameter.tsd-parent-kind-class.tsd-is-inherited + > .tsd-kind-icon:before { + background-position: -68px -85px; +} +.tsd-kind-method.tsd-has-type-parameter.tsd-parent-kind-class.tsd-is-protected + > .tsd-kind-icon:before { + background-position: -85px -85px; +} +.tsd-kind-method.tsd-has-type-parameter.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited + > .tsd-kind-icon:before { + background-position: -102px -85px; +} +.tsd-kind-method.tsd-has-type-parameter.tsd-parent-kind-class.tsd-is-private + > .tsd-kind-icon:before { + background-position: -119px -85px; +} +.tsd-kind-method.tsd-has-type-parameter.tsd-parent-kind-enum + > .tsd-kind-icon:before { + background-position: -170px -85px; +} +.tsd-kind-method.tsd-has-type-parameter.tsd-parent-kind-enum.tsd-is-protected + > .tsd-kind-icon:before { + background-position: -187px -85px; +} +.tsd-kind-method.tsd-has-type-parameter.tsd-parent-kind-enum.tsd-is-private + > .tsd-kind-icon:before { + background-position: -119px -85px; +} +.tsd-kind-method.tsd-has-type-parameter.tsd-parent-kind-interface + > .tsd-kind-icon:before { + background-position: -204px -85px; +} +.tsd-kind-method.tsd-has-type-parameter.tsd-parent-kind-interface.tsd-is-inherited + > .tsd-kind-icon:before { + background-position: -221px -85px; +} + +.tsd-kind-constructor > .tsd-kind-icon:before { + background-position: -136px -102px; +} +.tsd-kind-constructor.tsd-is-protected > .tsd-kind-icon:before { + background-position: -153px -102px; +} +.tsd-kind-constructor.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -102px; +} +.tsd-kind-constructor.tsd-parent-kind-class > .tsd-kind-icon:before { + background-position: -51px -102px; +} +.tsd-kind-constructor.tsd-parent-kind-class.tsd-is-inherited + > .tsd-kind-icon:before { + background-position: -68px -102px; +} +.tsd-kind-constructor.tsd-parent-kind-class.tsd-is-protected + > .tsd-kind-icon:before { + background-position: -85px -102px; +} +.tsd-kind-constructor.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited + > .tsd-kind-icon:before { + background-position: -102px -102px; +} +.tsd-kind-constructor.tsd-parent-kind-class.tsd-is-private + > .tsd-kind-icon:before { + background-position: -119px -102px; +} +.tsd-kind-constructor.tsd-parent-kind-enum > .tsd-kind-icon:before { + background-position: -170px -102px; +} +.tsd-kind-constructor.tsd-parent-kind-enum.tsd-is-protected + > .tsd-kind-icon:before { + background-position: -187px -102px; +} +.tsd-kind-constructor.tsd-parent-kind-enum.tsd-is-private + > .tsd-kind-icon:before { + background-position: -119px -102px; +} +.tsd-kind-constructor.tsd-parent-kind-interface > .tsd-kind-icon:before { + background-position: -204px -102px; +} +.tsd-kind-constructor.tsd-parent-kind-interface.tsd-is-inherited + > .tsd-kind-icon:before { + background-position: -221px -102px; +} + +.tsd-kind-constructor-signature > .tsd-kind-icon:before { + background-position: -136px -102px; +} +.tsd-kind-constructor-signature.tsd-is-protected > .tsd-kind-icon:before { + background-position: -153px -102px; +} +.tsd-kind-constructor-signature.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -102px; +} +.tsd-kind-constructor-signature.tsd-parent-kind-class > .tsd-kind-icon:before { + background-position: -51px -102px; +} +.tsd-kind-constructor-signature.tsd-parent-kind-class.tsd-is-inherited + > .tsd-kind-icon:before { + background-position: -68px -102px; +} +.tsd-kind-constructor-signature.tsd-parent-kind-class.tsd-is-protected + > .tsd-kind-icon:before { + background-position: -85px -102px; +} +.tsd-kind-constructor-signature.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited + > .tsd-kind-icon:before { + background-position: -102px -102px; +} +.tsd-kind-constructor-signature.tsd-parent-kind-class.tsd-is-private + > .tsd-kind-icon:before { + background-position: -119px -102px; +} +.tsd-kind-constructor-signature.tsd-parent-kind-enum > .tsd-kind-icon:before { + background-position: -170px -102px; +} +.tsd-kind-constructor-signature.tsd-parent-kind-enum.tsd-is-protected + > .tsd-kind-icon:before { + background-position: -187px -102px; +} +.tsd-kind-constructor-signature.tsd-parent-kind-enum.tsd-is-private + > .tsd-kind-icon:before { + background-position: -119px -102px; +} +.tsd-kind-constructor-signature.tsd-parent-kind-interface + > .tsd-kind-icon:before { + background-position: -204px -102px; +} +.tsd-kind-constructor-signature.tsd-parent-kind-interface.tsd-is-inherited + > .tsd-kind-icon:before { + background-position: -221px -102px; +} + +.tsd-kind-index-signature > .tsd-kind-icon:before { + background-position: -136px -119px; +} +.tsd-kind-index-signature.tsd-is-protected > .tsd-kind-icon:before { + background-position: -153px -119px; +} +.tsd-kind-index-signature.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -119px; +} +.tsd-kind-index-signature.tsd-parent-kind-class > .tsd-kind-icon:before { + background-position: -51px -119px; +} +.tsd-kind-index-signature.tsd-parent-kind-class.tsd-is-inherited + > .tsd-kind-icon:before { + background-position: -68px -119px; +} +.tsd-kind-index-signature.tsd-parent-kind-class.tsd-is-protected + > .tsd-kind-icon:before { + background-position: -85px -119px; +} +.tsd-kind-index-signature.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited + > .tsd-kind-icon:before { + background-position: -102px -119px; +} +.tsd-kind-index-signature.tsd-parent-kind-class.tsd-is-private + > .tsd-kind-icon:before { + background-position: -119px -119px; +} +.tsd-kind-index-signature.tsd-parent-kind-enum > .tsd-kind-icon:before { + background-position: -170px -119px; +} +.tsd-kind-index-signature.tsd-parent-kind-enum.tsd-is-protected + > .tsd-kind-icon:before { + background-position: -187px -119px; +} +.tsd-kind-index-signature.tsd-parent-kind-enum.tsd-is-private + > .tsd-kind-icon:before { + background-position: -119px -119px; +} +.tsd-kind-index-signature.tsd-parent-kind-interface > .tsd-kind-icon:before { + background-position: -204px -119px; +} +.tsd-kind-index-signature.tsd-parent-kind-interface.tsd-is-inherited + > .tsd-kind-icon:before { + background-position: -221px -119px; +} + +.tsd-kind-event > .tsd-kind-icon:before { + background-position: -136px -136px; +} +.tsd-kind-event.tsd-is-protected > .tsd-kind-icon:before { + background-position: -153px -136px; +} +.tsd-kind-event.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -136px; +} +.tsd-kind-event.tsd-parent-kind-class > .tsd-kind-icon:before { + background-position: -51px -136px; +} +.tsd-kind-event.tsd-parent-kind-class.tsd-is-inherited > .tsd-kind-icon:before { + background-position: -68px -136px; +} +.tsd-kind-event.tsd-parent-kind-class.tsd-is-protected > .tsd-kind-icon:before { + background-position: -85px -136px; +} +.tsd-kind-event.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited + > .tsd-kind-icon:before { + background-position: -102px -136px; +} +.tsd-kind-event.tsd-parent-kind-class.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -136px; +} +.tsd-kind-event.tsd-parent-kind-enum > .tsd-kind-icon:before { + background-position: -170px -136px; +} +.tsd-kind-event.tsd-parent-kind-enum.tsd-is-protected > .tsd-kind-icon:before { + background-position: -187px -136px; +} +.tsd-kind-event.tsd-parent-kind-enum.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -136px; +} +.tsd-kind-event.tsd-parent-kind-interface > .tsd-kind-icon:before { + background-position: -204px -136px; +} +.tsd-kind-event.tsd-parent-kind-interface.tsd-is-inherited + > .tsd-kind-icon:before { + background-position: -221px -136px; +} + +.tsd-is-static > .tsd-kind-icon:before { + background-position: -136px -153px; +} +.tsd-is-static.tsd-is-protected > .tsd-kind-icon:before { + background-position: -153px -153px; +} +.tsd-is-static.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -153px; +} +.tsd-is-static.tsd-parent-kind-class > .tsd-kind-icon:before { + background-position: -51px -153px; +} +.tsd-is-static.tsd-parent-kind-class.tsd-is-inherited > .tsd-kind-icon:before { + background-position: -68px -153px; +} +.tsd-is-static.tsd-parent-kind-class.tsd-is-protected > .tsd-kind-icon:before { + background-position: -85px -153px; +} +.tsd-is-static.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited + > .tsd-kind-icon:before { + background-position: -102px -153px; +} +.tsd-is-static.tsd-parent-kind-class.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -153px; +} +.tsd-is-static.tsd-parent-kind-enum > .tsd-kind-icon:before { + background-position: -170px -153px; +} +.tsd-is-static.tsd-parent-kind-enum.tsd-is-protected > .tsd-kind-icon:before { + background-position: -187px -153px; +} +.tsd-is-static.tsd-parent-kind-enum.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -153px; +} +.tsd-is-static.tsd-parent-kind-interface > .tsd-kind-icon:before { + background-position: -204px -153px; +} +.tsd-is-static.tsd-parent-kind-interface.tsd-is-inherited + > .tsd-kind-icon:before { + background-position: -221px -153px; +} + +.tsd-is-static.tsd-kind-function > .tsd-kind-icon:before { + background-position: -136px -170px; +} +.tsd-is-static.tsd-kind-function.tsd-is-protected > .tsd-kind-icon:before { + background-position: -153px -170px; +} +.tsd-is-static.tsd-kind-function.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -170px; +} +.tsd-is-static.tsd-kind-function.tsd-parent-kind-class > .tsd-kind-icon:before { + background-position: -51px -170px; +} +.tsd-is-static.tsd-kind-function.tsd-parent-kind-class.tsd-is-inherited + > .tsd-kind-icon:before { + background-position: -68px -170px; +} +.tsd-is-static.tsd-kind-function.tsd-parent-kind-class.tsd-is-protected + > .tsd-kind-icon:before { + background-position: -85px -170px; +} +.tsd-is-static.tsd-kind-function.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited + > .tsd-kind-icon:before { + background-position: -102px -170px; +} +.tsd-is-static.tsd-kind-function.tsd-parent-kind-class.tsd-is-private + > .tsd-kind-icon:before { + background-position: -119px -170px; +} +.tsd-is-static.tsd-kind-function.tsd-parent-kind-enum > .tsd-kind-icon:before { + background-position: -170px -170px; +} +.tsd-is-static.tsd-kind-function.tsd-parent-kind-enum.tsd-is-protected + > .tsd-kind-icon:before { + background-position: -187px -170px; +} +.tsd-is-static.tsd-kind-function.tsd-parent-kind-enum.tsd-is-private + > .tsd-kind-icon:before { + background-position: -119px -170px; +} +.tsd-is-static.tsd-kind-function.tsd-parent-kind-interface + > .tsd-kind-icon:before { + background-position: -204px -170px; +} +.tsd-is-static.tsd-kind-function.tsd-parent-kind-interface.tsd-is-inherited + > .tsd-kind-icon:before { + background-position: -221px -170px; +} + +.tsd-is-static.tsd-kind-method > .tsd-kind-icon:before { + background-position: -136px -170px; +} +.tsd-is-static.tsd-kind-method.tsd-is-protected > .tsd-kind-icon:before { + background-position: -153px -170px; +} +.tsd-is-static.tsd-kind-method.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -170px; +} +.tsd-is-static.tsd-kind-method.tsd-parent-kind-class > .tsd-kind-icon:before { + background-position: -51px -170px; +} +.tsd-is-static.tsd-kind-method.tsd-parent-kind-class.tsd-is-inherited + > .tsd-kind-icon:before { + background-position: -68px -170px; +} +.tsd-is-static.tsd-kind-method.tsd-parent-kind-class.tsd-is-protected + > .tsd-kind-icon:before { + background-position: -85px -170px; +} +.tsd-is-static.tsd-kind-method.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited + > .tsd-kind-icon:before { + background-position: -102px -170px; +} +.tsd-is-static.tsd-kind-method.tsd-parent-kind-class.tsd-is-private + > .tsd-kind-icon:before { + background-position: -119px -170px; +} +.tsd-is-static.tsd-kind-method.tsd-parent-kind-enum > .tsd-kind-icon:before { + background-position: -170px -170px; +} +.tsd-is-static.tsd-kind-method.tsd-parent-kind-enum.tsd-is-protected + > .tsd-kind-icon:before { + background-position: -187px -170px; +} +.tsd-is-static.tsd-kind-method.tsd-parent-kind-enum.tsd-is-private + > .tsd-kind-icon:before { + background-position: -119px -170px; +} +.tsd-is-static.tsd-kind-method.tsd-parent-kind-interface + > .tsd-kind-icon:before { + background-position: -204px -170px; +} +.tsd-is-static.tsd-kind-method.tsd-parent-kind-interface.tsd-is-inherited + > .tsd-kind-icon:before { + background-position: -221px -170px; +} + +.tsd-is-static.tsd-kind-call-signature > .tsd-kind-icon:before { + background-position: -136px -170px; +} +.tsd-is-static.tsd-kind-call-signature.tsd-is-protected + > .tsd-kind-icon:before { + background-position: -153px -170px; +} +.tsd-is-static.tsd-kind-call-signature.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -170px; +} +.tsd-is-static.tsd-kind-call-signature.tsd-parent-kind-class + > .tsd-kind-icon:before { + background-position: -51px -170px; +} +.tsd-is-static.tsd-kind-call-signature.tsd-parent-kind-class.tsd-is-inherited + > .tsd-kind-icon:before { + background-position: -68px -170px; +} +.tsd-is-static.tsd-kind-call-signature.tsd-parent-kind-class.tsd-is-protected + > .tsd-kind-icon:before { + background-position: -85px -170px; +} +.tsd-is-static.tsd-kind-call-signature.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited + > .tsd-kind-icon:before { + background-position: -102px -170px; +} +.tsd-is-static.tsd-kind-call-signature.tsd-parent-kind-class.tsd-is-private + > .tsd-kind-icon:before { + background-position: -119px -170px; +} +.tsd-is-static.tsd-kind-call-signature.tsd-parent-kind-enum + > .tsd-kind-icon:before { + background-position: -170px -170px; +} +.tsd-is-static.tsd-kind-call-signature.tsd-parent-kind-enum.tsd-is-protected + > .tsd-kind-icon:before { + background-position: -187px -170px; +} +.tsd-is-static.tsd-kind-call-signature.tsd-parent-kind-enum.tsd-is-private + > .tsd-kind-icon:before { + background-position: -119px -170px; +} +.tsd-is-static.tsd-kind-call-signature.tsd-parent-kind-interface + > .tsd-kind-icon:before { + background-position: -204px -170px; +} +.tsd-is-static.tsd-kind-call-signature.tsd-parent-kind-interface.tsd-is-inherited + > .tsd-kind-icon:before { + background-position: -221px -170px; +} + +.tsd-is-static.tsd-kind-event > .tsd-kind-icon:before { + background-position: -136px -187px; +} +.tsd-is-static.tsd-kind-event.tsd-is-protected > .tsd-kind-icon:before { + background-position: -153px -187px; +} +.tsd-is-static.tsd-kind-event.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -187px; +} +.tsd-is-static.tsd-kind-event.tsd-parent-kind-class > .tsd-kind-icon:before { + background-position: -51px -187px; +} +.tsd-is-static.tsd-kind-event.tsd-parent-kind-class.tsd-is-inherited + > .tsd-kind-icon:before { + background-position: -68px -187px; +} +.tsd-is-static.tsd-kind-event.tsd-parent-kind-class.tsd-is-protected + > .tsd-kind-icon:before { + background-position: -85px -187px; +} +.tsd-is-static.tsd-kind-event.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited + > .tsd-kind-icon:before { + background-position: -102px -187px; +} +.tsd-is-static.tsd-kind-event.tsd-parent-kind-class.tsd-is-private + > .tsd-kind-icon:before { + background-position: -119px -187px; +} +.tsd-is-static.tsd-kind-event.tsd-parent-kind-enum > .tsd-kind-icon:before { + background-position: -170px -187px; +} +.tsd-is-static.tsd-kind-event.tsd-parent-kind-enum.tsd-is-protected + > .tsd-kind-icon:before { + background-position: -187px -187px; +} +.tsd-is-static.tsd-kind-event.tsd-parent-kind-enum.tsd-is-private + > .tsd-kind-icon:before { + background-position: -119px -187px; +} +.tsd-is-static.tsd-kind-event.tsd-parent-kind-interface + > .tsd-kind-icon:before { + background-position: -204px -187px; +} +.tsd-is-static.tsd-kind-event.tsd-parent-kind-interface.tsd-is-inherited + > .tsd-kind-icon:before { + background-position: -221px -187px; +} diff --git a/docs/assets/images/icons.png b/docs/assets/icons.png similarity index 100% rename from docs/assets/images/icons.png rename to docs/assets/icons.png diff --git a/docs/assets/images/icons@2x.png b/docs/assets/icons@2x.png similarity index 100% rename from docs/assets/images/icons@2x.png rename to docs/assets/icons@2x.png diff --git a/docs/assets/js/main.js b/docs/assets/js/main.js deleted file mode 100644 index dc257a86..00000000 --- a/docs/assets/js/main.js +++ /dev/null @@ -1,248 +0,0 @@ -/* - * ATTENTION: The "eval" devtool has been used (maybe by default in mode: "development"). - * This devtool is not neither made for production nor for readable output files. - * It uses "eval()" calls to create a separate source file in the browser devtools. - * If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/) - * or disable the default devtool with "devtool: false". - * If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/). - */ -/******/ (() => { // webpackBootstrap -/******/ var __webpack_modules__ = ({ - -/***/ "../node_modules/lunr/lunr.js": -/*!************************************!*\ - !*** ../node_modules/lunr/lunr.js ***! - \************************************/ -/***/ ((module, exports, __webpack_require__) => { - -eval("var __WEBPACK_AMD_DEFINE_FACTORY__, __WEBPACK_AMD_DEFINE_RESULT__;/**\n * lunr - http://lunrjs.com - A bit like Solr, but much smaller and not as bright - 2.3.9\n * Copyright (C) 2020 Oliver Nightingale\n * @license MIT\n */\n\n;(function(){\n\n/**\n * A convenience function for configuring and constructing\n * a new lunr Index.\n *\n * A lunr.Builder instance is created and the pipeline setup\n * with a trimmer, stop word filter and stemmer.\n *\n * This builder object is yielded to the configuration function\n * that is passed as a parameter, allowing the list of fields\n * and other builder parameters to be customised.\n *\n * All documents _must_ be added within the passed config function.\n *\n * @example\n * var idx = lunr(function () {\n * this.field('title')\n * this.field('body')\n * this.ref('id')\n *\n * documents.forEach(function (doc) {\n * this.add(doc)\n * }, this)\n * })\n *\n * @see {@link lunr.Builder}\n * @see {@link lunr.Pipeline}\n * @see {@link lunr.trimmer}\n * @see {@link lunr.stopWordFilter}\n * @see {@link lunr.stemmer}\n * @namespace {function} lunr\n */\nvar lunr = function (config) {\n var builder = new lunr.Builder\n\n builder.pipeline.add(\n lunr.trimmer,\n lunr.stopWordFilter,\n lunr.stemmer\n )\n\n builder.searchPipeline.add(\n lunr.stemmer\n )\n\n config.call(builder, builder)\n return builder.build()\n}\n\nlunr.version = \"2.3.9\"\n/*!\n * lunr.utils\n * Copyright (C) 2020 Oliver Nightingale\n */\n\n/**\n * A namespace containing utils for the rest of the lunr library\n * @namespace lunr.utils\n */\nlunr.utils = {}\n\n/**\n * Print a warning message to the console.\n *\n * @param {String} message The message to be printed.\n * @memberOf lunr.utils\n * @function\n */\nlunr.utils.warn = (function (global) {\n /* eslint-disable no-console */\n return function (message) {\n if (global.console && console.warn) {\n console.warn(message)\n }\n }\n /* eslint-enable no-console */\n})(this)\n\n/**\n * Convert an object to a string.\n *\n * In the case of `null` and `undefined` the function returns\n * the empty string, in all other cases the result of calling\n * `toString` on the passed object is returned.\n *\n * @param {Any} obj The object to convert to a string.\n * @return {String} string representation of the passed object.\n * @memberOf lunr.utils\n */\nlunr.utils.asString = function (obj) {\n if (obj === void 0 || obj === null) {\n return \"\"\n } else {\n return obj.toString()\n }\n}\n\n/**\n * Clones an object.\n *\n * Will create a copy of an existing object such that any mutations\n * on the copy cannot affect the original.\n *\n * Only shallow objects are supported, passing a nested object to this\n * function will cause a TypeError.\n *\n * Objects with primitives, and arrays of primitives are supported.\n *\n * @param {Object} obj The object to clone.\n * @return {Object} a clone of the passed object.\n * @throws {TypeError} when a nested object is passed.\n * @memberOf Utils\n */\nlunr.utils.clone = function (obj) {\n if (obj === null || obj === undefined) {\n return obj\n }\n\n var clone = Object.create(null),\n keys = Object.keys(obj)\n\n for (var i = 0; i < keys.length; i++) {\n var key = keys[i],\n val = obj[key]\n\n if (Array.isArray(val)) {\n clone[key] = val.slice()\n continue\n }\n\n if (typeof val === 'string' ||\n typeof val === 'number' ||\n typeof val === 'boolean') {\n clone[key] = val\n continue\n }\n\n throw new TypeError(\"clone is not deep and does not support nested objects\")\n }\n\n return clone\n}\nlunr.FieldRef = function (docRef, fieldName, stringValue) {\n this.docRef = docRef\n this.fieldName = fieldName\n this._stringValue = stringValue\n}\n\nlunr.FieldRef.joiner = \"/\"\n\nlunr.FieldRef.fromString = function (s) {\n var n = s.indexOf(lunr.FieldRef.joiner)\n\n if (n === -1) {\n throw \"malformed field ref string\"\n }\n\n var fieldRef = s.slice(0, n),\n docRef = s.slice(n + 1)\n\n return new lunr.FieldRef (docRef, fieldRef, s)\n}\n\nlunr.FieldRef.prototype.toString = function () {\n if (this._stringValue == undefined) {\n this._stringValue = this.fieldName + lunr.FieldRef.joiner + this.docRef\n }\n\n return this._stringValue\n}\n/*!\n * lunr.Set\n * Copyright (C) 2020 Oliver Nightingale\n */\n\n/**\n * A lunr set.\n *\n * @constructor\n */\nlunr.Set = function (elements) {\n this.elements = Object.create(null)\n\n if (elements) {\n this.length = elements.length\n\n for (var i = 0; i < this.length; i++) {\n this.elements[elements[i]] = true\n }\n } else {\n this.length = 0\n }\n}\n\n/**\n * A complete set that contains all elements.\n *\n * @static\n * @readonly\n * @type {lunr.Set}\n */\nlunr.Set.complete = {\n intersect: function (other) {\n return other\n },\n\n union: function () {\n return this\n },\n\n contains: function () {\n return true\n }\n}\n\n/**\n * An empty set that contains no elements.\n *\n * @static\n * @readonly\n * @type {lunr.Set}\n */\nlunr.Set.empty = {\n intersect: function () {\n return this\n },\n\n union: function (other) {\n return other\n },\n\n contains: function () {\n return false\n }\n}\n\n/**\n * Returns true if this set contains the specified object.\n *\n * @param {object} object - Object whose presence in this set is to be tested.\n * @returns {boolean} - True if this set contains the specified object.\n */\nlunr.Set.prototype.contains = function (object) {\n return !!this.elements[object]\n}\n\n/**\n * Returns a new set containing only the elements that are present in both\n * this set and the specified set.\n *\n * @param {lunr.Set} other - set to intersect with this set.\n * @returns {lunr.Set} a new set that is the intersection of this and the specified set.\n */\n\nlunr.Set.prototype.intersect = function (other) {\n var a, b, elements, intersection = []\n\n if (other === lunr.Set.complete) {\n return this\n }\n\n if (other === lunr.Set.empty) {\n return other\n }\n\n if (this.length < other.length) {\n a = this\n b = other\n } else {\n a = other\n b = this\n }\n\n elements = Object.keys(a.elements)\n\n for (var i = 0; i < elements.length; i++) {\n var element = elements[i]\n if (element in b.elements) {\n intersection.push(element)\n }\n }\n\n return new lunr.Set (intersection)\n}\n\n/**\n * Returns a new set combining the elements of this and the specified set.\n *\n * @param {lunr.Set} other - set to union with this set.\n * @return {lunr.Set} a new set that is the union of this and the specified set.\n */\n\nlunr.Set.prototype.union = function (other) {\n if (other === lunr.Set.complete) {\n return lunr.Set.complete\n }\n\n if (other === lunr.Set.empty) {\n return this\n }\n\n return new lunr.Set(Object.keys(this.elements).concat(Object.keys(other.elements)))\n}\n/**\n * A function to calculate the inverse document frequency for\n * a posting. This is shared between the builder and the index\n *\n * @private\n * @param {object} posting - The posting for a given term\n * @param {number} documentCount - The total number of documents.\n */\nlunr.idf = function (posting, documentCount) {\n var documentsWithTerm = 0\n\n for (var fieldName in posting) {\n if (fieldName == '_index') continue // Ignore the term index, its not a field\n documentsWithTerm += Object.keys(posting[fieldName]).length\n }\n\n var x = (documentCount - documentsWithTerm + 0.5) / (documentsWithTerm + 0.5)\n\n return Math.log(1 + Math.abs(x))\n}\n\n/**\n * A token wraps a string representation of a token\n * as it is passed through the text processing pipeline.\n *\n * @constructor\n * @param {string} [str=''] - The string token being wrapped.\n * @param {object} [metadata={}] - Metadata associated with this token.\n */\nlunr.Token = function (str, metadata) {\n this.str = str || \"\"\n this.metadata = metadata || {}\n}\n\n/**\n * Returns the token string that is being wrapped by this object.\n *\n * @returns {string}\n */\nlunr.Token.prototype.toString = function () {\n return this.str\n}\n\n/**\n * A token update function is used when updating or optionally\n * when cloning a token.\n *\n * @callback lunr.Token~updateFunction\n * @param {string} str - The string representation of the token.\n * @param {Object} metadata - All metadata associated with this token.\n */\n\n/**\n * Applies the given function to the wrapped string token.\n *\n * @example\n * token.update(function (str, metadata) {\n * return str.toUpperCase()\n * })\n *\n * @param {lunr.Token~updateFunction} fn - A function to apply to the token string.\n * @returns {lunr.Token}\n */\nlunr.Token.prototype.update = function (fn) {\n this.str = fn(this.str, this.metadata)\n return this\n}\n\n/**\n * Creates a clone of this token. Optionally a function can be\n * applied to the cloned token.\n *\n * @param {lunr.Token~updateFunction} [fn] - An optional function to apply to the cloned token.\n * @returns {lunr.Token}\n */\nlunr.Token.prototype.clone = function (fn) {\n fn = fn || function (s) { return s }\n return new lunr.Token (fn(this.str, this.metadata), this.metadata)\n}\n/*!\n * lunr.tokenizer\n * Copyright (C) 2020 Oliver Nightingale\n */\n\n/**\n * A function for splitting a string into tokens ready to be inserted into\n * the search index. Uses `lunr.tokenizer.separator` to split strings, change\n * the value of this property to change how strings are split into tokens.\n *\n * This tokenizer will convert its parameter to a string by calling `toString` and\n * then will split this string on the character in `lunr.tokenizer.separator`.\n * Arrays will have their elements converted to strings and wrapped in a lunr.Token.\n *\n * Optional metadata can be passed to the tokenizer, this metadata will be cloned and\n * added as metadata to every token that is created from the object to be tokenized.\n *\n * @static\n * @param {?(string|object|object[])} obj - The object to convert into tokens\n * @param {?object} metadata - Optional metadata to associate with every token\n * @returns {lunr.Token[]}\n * @see {@link lunr.Pipeline}\n */\nlunr.tokenizer = function (obj, metadata) {\n if (obj == null || obj == undefined) {\n return []\n }\n\n if (Array.isArray(obj)) {\n return obj.map(function (t) {\n return new lunr.Token(\n lunr.utils.asString(t).toLowerCase(),\n lunr.utils.clone(metadata)\n )\n })\n }\n\n var str = obj.toString().toLowerCase(),\n len = str.length,\n tokens = []\n\n for (var sliceEnd = 0, sliceStart = 0; sliceEnd <= len; sliceEnd++) {\n var char = str.charAt(sliceEnd),\n sliceLength = sliceEnd - sliceStart\n\n if ((char.match(lunr.tokenizer.separator) || sliceEnd == len)) {\n\n if (sliceLength > 0) {\n var tokenMetadata = lunr.utils.clone(metadata) || {}\n tokenMetadata[\"position\"] = [sliceStart, sliceLength]\n tokenMetadata[\"index\"] = tokens.length\n\n tokens.push(\n new lunr.Token (\n str.slice(sliceStart, sliceEnd),\n tokenMetadata\n )\n )\n }\n\n sliceStart = sliceEnd + 1\n }\n\n }\n\n return tokens\n}\n\n/**\n * The separator used to split a string into tokens. Override this property to change the behaviour of\n * `lunr.tokenizer` behaviour when tokenizing strings. By default this splits on whitespace and hyphens.\n *\n * @static\n * @see lunr.tokenizer\n */\nlunr.tokenizer.separator = /[\\s\\-]+/\n/*!\n * lunr.Pipeline\n * Copyright (C) 2020 Oliver Nightingale\n */\n\n/**\n * lunr.Pipelines maintain an ordered list of functions to be applied to all\n * tokens in documents entering the search index and queries being ran against\n * the index.\n *\n * An instance of lunr.Index created with the lunr shortcut will contain a\n * pipeline with a stop word filter and an English language stemmer. Extra\n * functions can be added before or after either of these functions or these\n * default functions can be removed.\n *\n * When run the pipeline will call each function in turn, passing a token, the\n * index of that token in the original list of all tokens and finally a list of\n * all the original tokens.\n *\n * The output of functions in the pipeline will be passed to the next function\n * in the pipeline. To exclude a token from entering the index the function\n * should return undefined, the rest of the pipeline will not be called with\n * this token.\n *\n * For serialisation of pipelines to work, all functions used in an instance of\n * a pipeline should be registered with lunr.Pipeline. Registered functions can\n * then be loaded. If trying to load a serialised pipeline that uses functions\n * that are not registered an error will be thrown.\n *\n * If not planning on serialising the pipeline then registering pipeline functions\n * is not necessary.\n *\n * @constructor\n */\nlunr.Pipeline = function () {\n this._stack = []\n}\n\nlunr.Pipeline.registeredFunctions = Object.create(null)\n\n/**\n * A pipeline function maps lunr.Token to lunr.Token. A lunr.Token contains the token\n * string as well as all known metadata. A pipeline function can mutate the token string\n * or mutate (or add) metadata for a given token.\n *\n * A pipeline function can indicate that the passed token should be discarded by returning\n * null, undefined or an empty string. This token will not be passed to any downstream pipeline\n * functions and will not be added to the index.\n *\n * Multiple tokens can be returned by returning an array of tokens. Each token will be passed\n * to any downstream pipeline functions and all will returned tokens will be added to the index.\n *\n * Any number of pipeline functions may be chained together using a lunr.Pipeline.\n *\n * @interface lunr.PipelineFunction\n * @param {lunr.Token} token - A token from the document being processed.\n * @param {number} i - The index of this token in the complete list of tokens for this document/field.\n * @param {lunr.Token[]} tokens - All tokens for this document/field.\n * @returns {(?lunr.Token|lunr.Token[])}\n */\n\n/**\n * Register a function with the pipeline.\n *\n * Functions that are used in the pipeline should be registered if the pipeline\n * needs to be serialised, or a serialised pipeline needs to be loaded.\n *\n * Registering a function does not add it to a pipeline, functions must still be\n * added to instances of the pipeline for them to be used when running a pipeline.\n *\n * @param {lunr.PipelineFunction} fn - The function to check for.\n * @param {String} label - The label to register this function with\n */\nlunr.Pipeline.registerFunction = function (fn, label) {\n if (label in this.registeredFunctions) {\n lunr.utils.warn('Overwriting existing registered function: ' + label)\n }\n\n fn.label = label\n lunr.Pipeline.registeredFunctions[fn.label] = fn\n}\n\n/**\n * Warns if the function is not registered as a Pipeline function.\n *\n * @param {lunr.PipelineFunction} fn - The function to check for.\n * @private\n */\nlunr.Pipeline.warnIfFunctionNotRegistered = function (fn) {\n var isRegistered = fn.label && (fn.label in this.registeredFunctions)\n\n if (!isRegistered) {\n lunr.utils.warn('Function is not registered with pipeline. This may cause problems when serialising the index.\\n', fn)\n }\n}\n\n/**\n * Loads a previously serialised pipeline.\n *\n * All functions to be loaded must already be registered with lunr.Pipeline.\n * If any function from the serialised data has not been registered then an\n * error will be thrown.\n *\n * @param {Object} serialised - The serialised pipeline to load.\n * @returns {lunr.Pipeline}\n */\nlunr.Pipeline.load = function (serialised) {\n var pipeline = new lunr.Pipeline\n\n serialised.forEach(function (fnName) {\n var fn = lunr.Pipeline.registeredFunctions[fnName]\n\n if (fn) {\n pipeline.add(fn)\n } else {\n throw new Error('Cannot load unregistered function: ' + fnName)\n }\n })\n\n return pipeline\n}\n\n/**\n * Adds new functions to the end of the pipeline.\n *\n * Logs a warning if the function has not been registered.\n *\n * @param {lunr.PipelineFunction[]} functions - Any number of functions to add to the pipeline.\n */\nlunr.Pipeline.prototype.add = function () {\n var fns = Array.prototype.slice.call(arguments)\n\n fns.forEach(function (fn) {\n lunr.Pipeline.warnIfFunctionNotRegistered(fn)\n this._stack.push(fn)\n }, this)\n}\n\n/**\n * Adds a single function after a function that already exists in the\n * pipeline.\n *\n * Logs a warning if the function has not been registered.\n *\n * @param {lunr.PipelineFunction} existingFn - A function that already exists in the pipeline.\n * @param {lunr.PipelineFunction} newFn - The new function to add to the pipeline.\n */\nlunr.Pipeline.prototype.after = function (existingFn, newFn) {\n lunr.Pipeline.warnIfFunctionNotRegistered(newFn)\n\n var pos = this._stack.indexOf(existingFn)\n if (pos == -1) {\n throw new Error('Cannot find existingFn')\n }\n\n pos = pos + 1\n this._stack.splice(pos, 0, newFn)\n}\n\n/**\n * Adds a single function before a function that already exists in the\n * pipeline.\n *\n * Logs a warning if the function has not been registered.\n *\n * @param {lunr.PipelineFunction} existingFn - A function that already exists in the pipeline.\n * @param {lunr.PipelineFunction} newFn - The new function to add to the pipeline.\n */\nlunr.Pipeline.prototype.before = function (existingFn, newFn) {\n lunr.Pipeline.warnIfFunctionNotRegistered(newFn)\n\n var pos = this._stack.indexOf(existingFn)\n if (pos == -1) {\n throw new Error('Cannot find existingFn')\n }\n\n this._stack.splice(pos, 0, newFn)\n}\n\n/**\n * Removes a function from the pipeline.\n *\n * @param {lunr.PipelineFunction} fn The function to remove from the pipeline.\n */\nlunr.Pipeline.prototype.remove = function (fn) {\n var pos = this._stack.indexOf(fn)\n if (pos == -1) {\n return\n }\n\n this._stack.splice(pos, 1)\n}\n\n/**\n * Runs the current list of functions that make up the pipeline against the\n * passed tokens.\n *\n * @param {Array} tokens The tokens to run through the pipeline.\n * @returns {Array}\n */\nlunr.Pipeline.prototype.run = function (tokens) {\n var stackLength = this._stack.length\n\n for (var i = 0; i < stackLength; i++) {\n var fn = this._stack[i]\n var memo = []\n\n for (var j = 0; j < tokens.length; j++) {\n var result = fn(tokens[j], j, tokens)\n\n if (result === null || result === void 0 || result === '') continue\n\n if (Array.isArray(result)) {\n for (var k = 0; k < result.length; k++) {\n memo.push(result[k])\n }\n } else {\n memo.push(result)\n }\n }\n\n tokens = memo\n }\n\n return tokens\n}\n\n/**\n * Convenience method for passing a string through a pipeline and getting\n * strings out. This method takes care of wrapping the passed string in a\n * token and mapping the resulting tokens back to strings.\n *\n * @param {string} str - The string to pass through the pipeline.\n * @param {?object} metadata - Optional metadata to associate with the token\n * passed to the pipeline.\n * @returns {string[]}\n */\nlunr.Pipeline.prototype.runString = function (str, metadata) {\n var token = new lunr.Token (str, metadata)\n\n return this.run([token]).map(function (t) {\n return t.toString()\n })\n}\n\n/**\n * Resets the pipeline by removing any existing processors.\n *\n */\nlunr.Pipeline.prototype.reset = function () {\n this._stack = []\n}\n\n/**\n * Returns a representation of the pipeline ready for serialisation.\n *\n * Logs a warning if the function has not been registered.\n *\n * @returns {Array}\n */\nlunr.Pipeline.prototype.toJSON = function () {\n return this._stack.map(function (fn) {\n lunr.Pipeline.warnIfFunctionNotRegistered(fn)\n\n return fn.label\n })\n}\n/*!\n * lunr.Vector\n * Copyright (C) 2020 Oliver Nightingale\n */\n\n/**\n * A vector is used to construct the vector space of documents and queries. These\n * vectors support operations to determine the similarity between two documents or\n * a document and a query.\n *\n * Normally no parameters are required for initializing a vector, but in the case of\n * loading a previously dumped vector the raw elements can be provided to the constructor.\n *\n * For performance reasons vectors are implemented with a flat array, where an elements\n * index is immediately followed by its value. E.g. [index, value, index, value]. This\n * allows the underlying array to be as sparse as possible and still offer decent\n * performance when being used for vector calculations.\n *\n * @constructor\n * @param {Number[]} [elements] - The flat list of element index and element value pairs.\n */\nlunr.Vector = function (elements) {\n this._magnitude = 0\n this.elements = elements || []\n}\n\n\n/**\n * Calculates the position within the vector to insert a given index.\n *\n * This is used internally by insert and upsert. If there are duplicate indexes then\n * the position is returned as if the value for that index were to be updated, but it\n * is the callers responsibility to check whether there is a duplicate at that index\n *\n * @param {Number} insertIdx - The index at which the element should be inserted.\n * @returns {Number}\n */\nlunr.Vector.prototype.positionForIndex = function (index) {\n // For an empty vector the tuple can be inserted at the beginning\n if (this.elements.length == 0) {\n return 0\n }\n\n var start = 0,\n end = this.elements.length / 2,\n sliceLength = end - start,\n pivotPoint = Math.floor(sliceLength / 2),\n pivotIndex = this.elements[pivotPoint * 2]\n\n while (sliceLength > 1) {\n if (pivotIndex < index) {\n start = pivotPoint\n }\n\n if (pivotIndex > index) {\n end = pivotPoint\n }\n\n if (pivotIndex == index) {\n break\n }\n\n sliceLength = end - start\n pivotPoint = start + Math.floor(sliceLength / 2)\n pivotIndex = this.elements[pivotPoint * 2]\n }\n\n if (pivotIndex == index) {\n return pivotPoint * 2\n }\n\n if (pivotIndex > index) {\n return pivotPoint * 2\n }\n\n if (pivotIndex < index) {\n return (pivotPoint + 1) * 2\n }\n}\n\n/**\n * Inserts an element at an index within the vector.\n *\n * Does not allow duplicates, will throw an error if there is already an entry\n * for this index.\n *\n * @param {Number} insertIdx - The index at which the element should be inserted.\n * @param {Number} val - The value to be inserted into the vector.\n */\nlunr.Vector.prototype.insert = function (insertIdx, val) {\n this.upsert(insertIdx, val, function () {\n throw \"duplicate index\"\n })\n}\n\n/**\n * Inserts or updates an existing index within the vector.\n *\n * @param {Number} insertIdx - The index at which the element should be inserted.\n * @param {Number} val - The value to be inserted into the vector.\n * @param {function} fn - A function that is called for updates, the existing value and the\n * requested value are passed as arguments\n */\nlunr.Vector.prototype.upsert = function (insertIdx, val, fn) {\n this._magnitude = 0\n var position = this.positionForIndex(insertIdx)\n\n if (this.elements[position] == insertIdx) {\n this.elements[position + 1] = fn(this.elements[position + 1], val)\n } else {\n this.elements.splice(position, 0, insertIdx, val)\n }\n}\n\n/**\n * Calculates the magnitude of this vector.\n *\n * @returns {Number}\n */\nlunr.Vector.prototype.magnitude = function () {\n if (this._magnitude) return this._magnitude\n\n var sumOfSquares = 0,\n elementsLength = this.elements.length\n\n for (var i = 1; i < elementsLength; i += 2) {\n var val = this.elements[i]\n sumOfSquares += val * val\n }\n\n return this._magnitude = Math.sqrt(sumOfSquares)\n}\n\n/**\n * Calculates the dot product of this vector and another vector.\n *\n * @param {lunr.Vector} otherVector - The vector to compute the dot product with.\n * @returns {Number}\n */\nlunr.Vector.prototype.dot = function (otherVector) {\n var dotProduct = 0,\n a = this.elements, b = otherVector.elements,\n aLen = a.length, bLen = b.length,\n aVal = 0, bVal = 0,\n i = 0, j = 0\n\n while (i < aLen && j < bLen) {\n aVal = a[i], bVal = b[j]\n if (aVal < bVal) {\n i += 2\n } else if (aVal > bVal) {\n j += 2\n } else if (aVal == bVal) {\n dotProduct += a[i + 1] * b[j + 1]\n i += 2\n j += 2\n }\n }\n\n return dotProduct\n}\n\n/**\n * Calculates the similarity between this vector and another vector.\n *\n * @param {lunr.Vector} otherVector - The other vector to calculate the\n * similarity with.\n * @returns {Number}\n */\nlunr.Vector.prototype.similarity = function (otherVector) {\n return this.dot(otherVector) / this.magnitude() || 0\n}\n\n/**\n * Converts the vector to an array of the elements within the vector.\n *\n * @returns {Number[]}\n */\nlunr.Vector.prototype.toArray = function () {\n var output = new Array (this.elements.length / 2)\n\n for (var i = 1, j = 0; i < this.elements.length; i += 2, j++) {\n output[j] = this.elements[i]\n }\n\n return output\n}\n\n/**\n * A JSON serializable representation of the vector.\n *\n * @returns {Number[]}\n */\nlunr.Vector.prototype.toJSON = function () {\n return this.elements\n}\n/* eslint-disable */\n/*!\n * lunr.stemmer\n * Copyright (C) 2020 Oliver Nightingale\n * Includes code from - http://tartarus.org/~martin/PorterStemmer/js.txt\n */\n\n/**\n * lunr.stemmer is an english language stemmer, this is a JavaScript\n * implementation of the PorterStemmer taken from http://tartarus.org/~martin\n *\n * @static\n * @implements {lunr.PipelineFunction}\n * @param {lunr.Token} token - The string to stem\n * @returns {lunr.Token}\n * @see {@link lunr.Pipeline}\n * @function\n */\nlunr.stemmer = (function(){\n var step2list = {\n \"ational\" : \"ate\",\n \"tional\" : \"tion\",\n \"enci\" : \"ence\",\n \"anci\" : \"ance\",\n \"izer\" : \"ize\",\n \"bli\" : \"ble\",\n \"alli\" : \"al\",\n \"entli\" : \"ent\",\n \"eli\" : \"e\",\n \"ousli\" : \"ous\",\n \"ization\" : \"ize\",\n \"ation\" : \"ate\",\n \"ator\" : \"ate\",\n \"alism\" : \"al\",\n \"iveness\" : \"ive\",\n \"fulness\" : \"ful\",\n \"ousness\" : \"ous\",\n \"aliti\" : \"al\",\n \"iviti\" : \"ive\",\n \"biliti\" : \"ble\",\n \"logi\" : \"log\"\n },\n\n step3list = {\n \"icate\" : \"ic\",\n \"ative\" : \"\",\n \"alize\" : \"al\",\n \"iciti\" : \"ic\",\n \"ical\" : \"ic\",\n \"ful\" : \"\",\n \"ness\" : \"\"\n },\n\n c = \"[^aeiou]\", // consonant\n v = \"[aeiouy]\", // vowel\n C = c + \"[^aeiouy]*\", // consonant sequence\n V = v + \"[aeiou]*\", // vowel sequence\n\n mgr0 = \"^(\" + C + \")?\" + V + C, // [C]VC... is m>0\n meq1 = \"^(\" + C + \")?\" + V + C + \"(\" + V + \")?$\", // [C]VC[V] is m=1\n mgr1 = \"^(\" + C + \")?\" + V + C + V + C, // [C]VCVC... is m>1\n s_v = \"^(\" + C + \")?\" + v; // vowel in stem\n\n var re_mgr0 = new RegExp(mgr0);\n var re_mgr1 = new RegExp(mgr1);\n var re_meq1 = new RegExp(meq1);\n var re_s_v = new RegExp(s_v);\n\n var re_1a = /^(.+?)(ss|i)es$/;\n var re2_1a = /^(.+?)([^s])s$/;\n var re_1b = /^(.+?)eed$/;\n var re2_1b = /^(.+?)(ed|ing)$/;\n var re_1b_2 = /.$/;\n var re2_1b_2 = /(at|bl|iz)$/;\n var re3_1b_2 = new RegExp(\"([^aeiouylsz])\\\\1$\");\n var re4_1b_2 = new RegExp(\"^\" + C + v + \"[^aeiouwxy]$\");\n\n var re_1c = /^(.+?[^aeiou])y$/;\n var re_2 = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/;\n\n var re_3 = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/;\n\n var re_4 = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/;\n var re2_4 = /^(.+?)(s|t)(ion)$/;\n\n var re_5 = /^(.+?)e$/;\n var re_5_1 = /ll$/;\n var re3_5 = new RegExp(\"^\" + C + v + \"[^aeiouwxy]$\");\n\n var porterStemmer = function porterStemmer(w) {\n var stem,\n suffix,\n firstch,\n re,\n re2,\n re3,\n re4;\n\n if (w.length < 3) { return w; }\n\n firstch = w.substr(0,1);\n if (firstch == \"y\") {\n w = firstch.toUpperCase() + w.substr(1);\n }\n\n // Step 1a\n re = re_1a\n re2 = re2_1a;\n\n if (re.test(w)) { w = w.replace(re,\"$1$2\"); }\n else if (re2.test(w)) { w = w.replace(re2,\"$1$2\"); }\n\n // Step 1b\n re = re_1b;\n re2 = re2_1b;\n if (re.test(w)) {\n var fp = re.exec(w);\n re = re_mgr0;\n if (re.test(fp[1])) {\n re = re_1b_2;\n w = w.replace(re,\"\");\n }\n } else if (re2.test(w)) {\n var fp = re2.exec(w);\n stem = fp[1];\n re2 = re_s_v;\n if (re2.test(stem)) {\n w = stem;\n re2 = re2_1b_2;\n re3 = re3_1b_2;\n re4 = re4_1b_2;\n if (re2.test(w)) { w = w + \"e\"; }\n else if (re3.test(w)) { re = re_1b_2; w = w.replace(re,\"\"); }\n else if (re4.test(w)) { w = w + \"e\"; }\n }\n }\n\n // Step 1c - replace suffix y or Y by i if preceded by a non-vowel which is not the first letter of the word (so cry -> cri, by -> by, say -> say)\n re = re_1c;\n if (re.test(w)) {\n var fp = re.exec(w);\n stem = fp[1];\n w = stem + \"i\";\n }\n\n // Step 2\n re = re_2;\n if (re.test(w)) {\n var fp = re.exec(w);\n stem = fp[1];\n suffix = fp[2];\n re = re_mgr0;\n if (re.test(stem)) {\n w = stem + step2list[suffix];\n }\n }\n\n // Step 3\n re = re_3;\n if (re.test(w)) {\n var fp = re.exec(w);\n stem = fp[1];\n suffix = fp[2];\n re = re_mgr0;\n if (re.test(stem)) {\n w = stem + step3list[suffix];\n }\n }\n\n // Step 4\n re = re_4;\n re2 = re2_4;\n if (re.test(w)) {\n var fp = re.exec(w);\n stem = fp[1];\n re = re_mgr1;\n if (re.test(stem)) {\n w = stem;\n }\n } else if (re2.test(w)) {\n var fp = re2.exec(w);\n stem = fp[1] + fp[2];\n re2 = re_mgr1;\n if (re2.test(stem)) {\n w = stem;\n }\n }\n\n // Step 5\n re = re_5;\n if (re.test(w)) {\n var fp = re.exec(w);\n stem = fp[1];\n re = re_mgr1;\n re2 = re_meq1;\n re3 = re3_5;\n if (re.test(stem) || (re2.test(stem) && !(re3.test(stem)))) {\n w = stem;\n }\n }\n\n re = re_5_1;\n re2 = re_mgr1;\n if (re.test(w) && re2.test(w)) {\n re = re_1b_2;\n w = w.replace(re,\"\");\n }\n\n // and turn initial Y back to y\n\n if (firstch == \"y\") {\n w = firstch.toLowerCase() + w.substr(1);\n }\n\n return w;\n };\n\n return function (token) {\n return token.update(porterStemmer);\n }\n})();\n\nlunr.Pipeline.registerFunction(lunr.stemmer, 'stemmer')\n/*!\n * lunr.stopWordFilter\n * Copyright (C) 2020 Oliver Nightingale\n */\n\n/**\n * lunr.generateStopWordFilter builds a stopWordFilter function from the provided\n * list of stop words.\n *\n * The built in lunr.stopWordFilter is built using this generator and can be used\n * to generate custom stopWordFilters for applications or non English languages.\n *\n * @function\n * @param {Array} token The token to pass through the filter\n * @returns {lunr.PipelineFunction}\n * @see lunr.Pipeline\n * @see lunr.stopWordFilter\n */\nlunr.generateStopWordFilter = function (stopWords) {\n var words = stopWords.reduce(function (memo, stopWord) {\n memo[stopWord] = stopWord\n return memo\n }, {})\n\n return function (token) {\n if (token && words[token.toString()] !== token.toString()) return token\n }\n}\n\n/**\n * lunr.stopWordFilter is an English language stop word list filter, any words\n * contained in the list will not be passed through the filter.\n *\n * This is intended to be used in the Pipeline. If the token does not pass the\n * filter then undefined will be returned.\n *\n * @function\n * @implements {lunr.PipelineFunction}\n * @params {lunr.Token} token - A token to check for being a stop word.\n * @returns {lunr.Token}\n * @see {@link lunr.Pipeline}\n */\nlunr.stopWordFilter = lunr.generateStopWordFilter([\n 'a',\n 'able',\n 'about',\n 'across',\n 'after',\n 'all',\n 'almost',\n 'also',\n 'am',\n 'among',\n 'an',\n 'and',\n 'any',\n 'are',\n 'as',\n 'at',\n 'be',\n 'because',\n 'been',\n 'but',\n 'by',\n 'can',\n 'cannot',\n 'could',\n 'dear',\n 'did',\n 'do',\n 'does',\n 'either',\n 'else',\n 'ever',\n 'every',\n 'for',\n 'from',\n 'get',\n 'got',\n 'had',\n 'has',\n 'have',\n 'he',\n 'her',\n 'hers',\n 'him',\n 'his',\n 'how',\n 'however',\n 'i',\n 'if',\n 'in',\n 'into',\n 'is',\n 'it',\n 'its',\n 'just',\n 'least',\n 'let',\n 'like',\n 'likely',\n 'may',\n 'me',\n 'might',\n 'most',\n 'must',\n 'my',\n 'neither',\n 'no',\n 'nor',\n 'not',\n 'of',\n 'off',\n 'often',\n 'on',\n 'only',\n 'or',\n 'other',\n 'our',\n 'own',\n 'rather',\n 'said',\n 'say',\n 'says',\n 'she',\n 'should',\n 'since',\n 'so',\n 'some',\n 'than',\n 'that',\n 'the',\n 'their',\n 'them',\n 'then',\n 'there',\n 'these',\n 'they',\n 'this',\n 'tis',\n 'to',\n 'too',\n 'twas',\n 'us',\n 'wants',\n 'was',\n 'we',\n 'were',\n 'what',\n 'when',\n 'where',\n 'which',\n 'while',\n 'who',\n 'whom',\n 'why',\n 'will',\n 'with',\n 'would',\n 'yet',\n 'you',\n 'your'\n])\n\nlunr.Pipeline.registerFunction(lunr.stopWordFilter, 'stopWordFilter')\n/*!\n * lunr.trimmer\n * Copyright (C) 2020 Oliver Nightingale\n */\n\n/**\n * lunr.trimmer is a pipeline function for trimming non word\n * characters from the beginning and end of tokens before they\n * enter the index.\n *\n * This implementation may not work correctly for non latin\n * characters and should either be removed or adapted for use\n * with languages with non-latin characters.\n *\n * @static\n * @implements {lunr.PipelineFunction}\n * @param {lunr.Token} token The token to pass through the filter\n * @returns {lunr.Token}\n * @see lunr.Pipeline\n */\nlunr.trimmer = function (token) {\n return token.update(function (s) {\n return s.replace(/^\\W+/, '').replace(/\\W+$/, '')\n })\n}\n\nlunr.Pipeline.registerFunction(lunr.trimmer, 'trimmer')\n/*!\n * lunr.TokenSet\n * Copyright (C) 2020 Oliver Nightingale\n */\n\n/**\n * A token set is used to store the unique list of all tokens\n * within an index. Token sets are also used to represent an\n * incoming query to the index, this query token set and index\n * token set are then intersected to find which tokens to look\n * up in the inverted index.\n *\n * A token set can hold multiple tokens, as in the case of the\n * index token set, or it can hold a single token as in the\n * case of a simple query token set.\n *\n * Additionally token sets are used to perform wildcard matching.\n * Leading, contained and trailing wildcards are supported, and\n * from this edit distance matching can also be provided.\n *\n * Token sets are implemented as a minimal finite state automata,\n * where both common prefixes and suffixes are shared between tokens.\n * This helps to reduce the space used for storing the token set.\n *\n * @constructor\n */\nlunr.TokenSet = function () {\n this.final = false\n this.edges = {}\n this.id = lunr.TokenSet._nextId\n lunr.TokenSet._nextId += 1\n}\n\n/**\n * Keeps track of the next, auto increment, identifier to assign\n * to a new tokenSet.\n *\n * TokenSets require a unique identifier to be correctly minimised.\n *\n * @private\n */\nlunr.TokenSet._nextId = 1\n\n/**\n * Creates a TokenSet instance from the given sorted array of words.\n *\n * @param {String[]} arr - A sorted array of strings to create the set from.\n * @returns {lunr.TokenSet}\n * @throws Will throw an error if the input array is not sorted.\n */\nlunr.TokenSet.fromArray = function (arr) {\n var builder = new lunr.TokenSet.Builder\n\n for (var i = 0, len = arr.length; i < len; i++) {\n builder.insert(arr[i])\n }\n\n builder.finish()\n return builder.root\n}\n\n/**\n * Creates a token set from a query clause.\n *\n * @private\n * @param {Object} clause - A single clause from lunr.Query.\n * @param {string} clause.term - The query clause term.\n * @param {number} [clause.editDistance] - The optional edit distance for the term.\n * @returns {lunr.TokenSet}\n */\nlunr.TokenSet.fromClause = function (clause) {\n if ('editDistance' in clause) {\n return lunr.TokenSet.fromFuzzyString(clause.term, clause.editDistance)\n } else {\n return lunr.TokenSet.fromString(clause.term)\n }\n}\n\n/**\n * Creates a token set representing a single string with a specified\n * edit distance.\n *\n * Insertions, deletions, substitutions and transpositions are each\n * treated as an edit distance of 1.\n *\n * Increasing the allowed edit distance will have a dramatic impact\n * on the performance of both creating and intersecting these TokenSets.\n * It is advised to keep the edit distance less than 3.\n *\n * @param {string} str - The string to create the token set from.\n * @param {number} editDistance - The allowed edit distance to match.\n * @returns {lunr.Vector}\n */\nlunr.TokenSet.fromFuzzyString = function (str, editDistance) {\n var root = new lunr.TokenSet\n\n var stack = [{\n node: root,\n editsRemaining: editDistance,\n str: str\n }]\n\n while (stack.length) {\n var frame = stack.pop()\n\n // no edit\n if (frame.str.length > 0) {\n var char = frame.str.charAt(0),\n noEditNode\n\n if (char in frame.node.edges) {\n noEditNode = frame.node.edges[char]\n } else {\n noEditNode = new lunr.TokenSet\n frame.node.edges[char] = noEditNode\n }\n\n if (frame.str.length == 1) {\n noEditNode.final = true\n }\n\n stack.push({\n node: noEditNode,\n editsRemaining: frame.editsRemaining,\n str: frame.str.slice(1)\n })\n }\n\n if (frame.editsRemaining == 0) {\n continue\n }\n\n // insertion\n if (\"*\" in frame.node.edges) {\n var insertionNode = frame.node.edges[\"*\"]\n } else {\n var insertionNode = new lunr.TokenSet\n frame.node.edges[\"*\"] = insertionNode\n }\n\n if (frame.str.length == 0) {\n insertionNode.final = true\n }\n\n stack.push({\n node: insertionNode,\n editsRemaining: frame.editsRemaining - 1,\n str: frame.str\n })\n\n // deletion\n // can only do a deletion if we have enough edits remaining\n // and if there are characters left to delete in the string\n if (frame.str.length > 1) {\n stack.push({\n node: frame.node,\n editsRemaining: frame.editsRemaining - 1,\n str: frame.str.slice(1)\n })\n }\n\n // deletion\n // just removing the last character from the str\n if (frame.str.length == 1) {\n frame.node.final = true\n }\n\n // substitution\n // can only do a substitution if we have enough edits remaining\n // and if there are characters left to substitute\n if (frame.str.length >= 1) {\n if (\"*\" in frame.node.edges) {\n var substitutionNode = frame.node.edges[\"*\"]\n } else {\n var substitutionNode = new lunr.TokenSet\n frame.node.edges[\"*\"] = substitutionNode\n }\n\n if (frame.str.length == 1) {\n substitutionNode.final = true\n }\n\n stack.push({\n node: substitutionNode,\n editsRemaining: frame.editsRemaining - 1,\n str: frame.str.slice(1)\n })\n }\n\n // transposition\n // can only do a transposition if there are edits remaining\n // and there are enough characters to transpose\n if (frame.str.length > 1) {\n var charA = frame.str.charAt(0),\n charB = frame.str.charAt(1),\n transposeNode\n\n if (charB in frame.node.edges) {\n transposeNode = frame.node.edges[charB]\n } else {\n transposeNode = new lunr.TokenSet\n frame.node.edges[charB] = transposeNode\n }\n\n if (frame.str.length == 1) {\n transposeNode.final = true\n }\n\n stack.push({\n node: transposeNode,\n editsRemaining: frame.editsRemaining - 1,\n str: charA + frame.str.slice(2)\n })\n }\n }\n\n return root\n}\n\n/**\n * Creates a TokenSet from a string.\n *\n * The string may contain one or more wildcard characters (*)\n * that will allow wildcard matching when intersecting with\n * another TokenSet.\n *\n * @param {string} str - The string to create a TokenSet from.\n * @returns {lunr.TokenSet}\n */\nlunr.TokenSet.fromString = function (str) {\n var node = new lunr.TokenSet,\n root = node\n\n /*\n * Iterates through all characters within the passed string\n * appending a node for each character.\n *\n * When a wildcard character is found then a self\n * referencing edge is introduced to continually match\n * any number of any characters.\n */\n for (var i = 0, len = str.length; i < len; i++) {\n var char = str[i],\n final = (i == len - 1)\n\n if (char == \"*\") {\n node.edges[char] = node\n node.final = final\n\n } else {\n var next = new lunr.TokenSet\n next.final = final\n\n node.edges[char] = next\n node = next\n }\n }\n\n return root\n}\n\n/**\n * Converts this TokenSet into an array of strings\n * contained within the TokenSet.\n *\n * This is not intended to be used on a TokenSet that\n * contains wildcards, in these cases the results are\n * undefined and are likely to cause an infinite loop.\n *\n * @returns {string[]}\n */\nlunr.TokenSet.prototype.toArray = function () {\n var words = []\n\n var stack = [{\n prefix: \"\",\n node: this\n }]\n\n while (stack.length) {\n var frame = stack.pop(),\n edges = Object.keys(frame.node.edges),\n len = edges.length\n\n if (frame.node.final) {\n /* In Safari, at this point the prefix is sometimes corrupted, see:\n * https://github.com/olivernn/lunr.js/issues/279 Calling any\n * String.prototype method forces Safari to \"cast\" this string to what\n * it's supposed to be, fixing the bug. */\n frame.prefix.charAt(0)\n words.push(frame.prefix)\n }\n\n for (var i = 0; i < len; i++) {\n var edge = edges[i]\n\n stack.push({\n prefix: frame.prefix.concat(edge),\n node: frame.node.edges[edge]\n })\n }\n }\n\n return words\n}\n\n/**\n * Generates a string representation of a TokenSet.\n *\n * This is intended to allow TokenSets to be used as keys\n * in objects, largely to aid the construction and minimisation\n * of a TokenSet. As such it is not designed to be a human\n * friendly representation of the TokenSet.\n *\n * @returns {string}\n */\nlunr.TokenSet.prototype.toString = function () {\n // NOTE: Using Object.keys here as this.edges is very likely\n // to enter 'hash-mode' with many keys being added\n //\n // avoiding a for-in loop here as it leads to the function\n // being de-optimised (at least in V8). From some simple\n // benchmarks the performance is comparable, but allowing\n // V8 to optimize may mean easy performance wins in the future.\n\n if (this._str) {\n return this._str\n }\n\n var str = this.final ? '1' : '0',\n labels = Object.keys(this.edges).sort(),\n len = labels.length\n\n for (var i = 0; i < len; i++) {\n var label = labels[i],\n node = this.edges[label]\n\n str = str + label + node.id\n }\n\n return str\n}\n\n/**\n * Returns a new TokenSet that is the intersection of\n * this TokenSet and the passed TokenSet.\n *\n * This intersection will take into account any wildcards\n * contained within the TokenSet.\n *\n * @param {lunr.TokenSet} b - An other TokenSet to intersect with.\n * @returns {lunr.TokenSet}\n */\nlunr.TokenSet.prototype.intersect = function (b) {\n var output = new lunr.TokenSet,\n frame = undefined\n\n var stack = [{\n qNode: b,\n output: output,\n node: this\n }]\n\n while (stack.length) {\n frame = stack.pop()\n\n // NOTE: As with the #toString method, we are using\n // Object.keys and a for loop instead of a for-in loop\n // as both of these objects enter 'hash' mode, causing\n // the function to be de-optimised in V8\n var qEdges = Object.keys(frame.qNode.edges),\n qLen = qEdges.length,\n nEdges = Object.keys(frame.node.edges),\n nLen = nEdges.length\n\n for (var q = 0; q < qLen; q++) {\n var qEdge = qEdges[q]\n\n for (var n = 0; n < nLen; n++) {\n var nEdge = nEdges[n]\n\n if (nEdge == qEdge || qEdge == '*') {\n var node = frame.node.edges[nEdge],\n qNode = frame.qNode.edges[qEdge],\n final = node.final && qNode.final,\n next = undefined\n\n if (nEdge in frame.output.edges) {\n // an edge already exists for this character\n // no need to create a new node, just set the finality\n // bit unless this node is already final\n next = frame.output.edges[nEdge]\n next.final = next.final || final\n\n } else {\n // no edge exists yet, must create one\n // set the finality bit and insert it\n // into the output\n next = new lunr.TokenSet\n next.final = final\n frame.output.edges[nEdge] = next\n }\n\n stack.push({\n qNode: qNode,\n output: next,\n node: node\n })\n }\n }\n }\n }\n\n return output\n}\nlunr.TokenSet.Builder = function () {\n this.previousWord = \"\"\n this.root = new lunr.TokenSet\n this.uncheckedNodes = []\n this.minimizedNodes = {}\n}\n\nlunr.TokenSet.Builder.prototype.insert = function (word) {\n var node,\n commonPrefix = 0\n\n if (word < this.previousWord) {\n throw new Error (\"Out of order word insertion\")\n }\n\n for (var i = 0; i < word.length && i < this.previousWord.length; i++) {\n if (word[i] != this.previousWord[i]) break\n commonPrefix++\n }\n\n this.minimize(commonPrefix)\n\n if (this.uncheckedNodes.length == 0) {\n node = this.root\n } else {\n node = this.uncheckedNodes[this.uncheckedNodes.length - 1].child\n }\n\n for (var i = commonPrefix; i < word.length; i++) {\n var nextNode = new lunr.TokenSet,\n char = word[i]\n\n node.edges[char] = nextNode\n\n this.uncheckedNodes.push({\n parent: node,\n char: char,\n child: nextNode\n })\n\n node = nextNode\n }\n\n node.final = true\n this.previousWord = word\n}\n\nlunr.TokenSet.Builder.prototype.finish = function () {\n this.minimize(0)\n}\n\nlunr.TokenSet.Builder.prototype.minimize = function (downTo) {\n for (var i = this.uncheckedNodes.length - 1; i >= downTo; i--) {\n var node = this.uncheckedNodes[i],\n childKey = node.child.toString()\n\n if (childKey in this.minimizedNodes) {\n node.parent.edges[node.char] = this.minimizedNodes[childKey]\n } else {\n // Cache the key for this node since\n // we know it can't change anymore\n node.child._str = childKey\n\n this.minimizedNodes[childKey] = node.child\n }\n\n this.uncheckedNodes.pop()\n }\n}\n/*!\n * lunr.Index\n * Copyright (C) 2020 Oliver Nightingale\n */\n\n/**\n * An index contains the built index of all documents and provides a query interface\n * to the index.\n *\n * Usually instances of lunr.Index will not be created using this constructor, instead\n * lunr.Builder should be used to construct new indexes, or lunr.Index.load should be\n * used to load previously built and serialized indexes.\n *\n * @constructor\n * @param {Object} attrs - The attributes of the built search index.\n * @param {Object} attrs.invertedIndex - An index of term/field to document reference.\n * @param {Object} attrs.fieldVectors - Field vectors\n * @param {lunr.TokenSet} attrs.tokenSet - An set of all corpus tokens.\n * @param {string[]} attrs.fields - The names of indexed document fields.\n * @param {lunr.Pipeline} attrs.pipeline - The pipeline to use for search terms.\n */\nlunr.Index = function (attrs) {\n this.invertedIndex = attrs.invertedIndex\n this.fieldVectors = attrs.fieldVectors\n this.tokenSet = attrs.tokenSet\n this.fields = attrs.fields\n this.pipeline = attrs.pipeline\n}\n\n/**\n * A result contains details of a document matching a search query.\n * @typedef {Object} lunr.Index~Result\n * @property {string} ref - The reference of the document this result represents.\n * @property {number} score - A number between 0 and 1 representing how similar this document is to the query.\n * @property {lunr.MatchData} matchData - Contains metadata about this match including which term(s) caused the match.\n */\n\n/**\n * Although lunr provides the ability to create queries using lunr.Query, it also provides a simple\n * query language which itself is parsed into an instance of lunr.Query.\n *\n * For programmatically building queries it is advised to directly use lunr.Query, the query language\n * is best used for human entered text rather than program generated text.\n *\n * At its simplest queries can just be a single term, e.g. `hello`, multiple terms are also supported\n * and will be combined with OR, e.g `hello world` will match documents that contain either 'hello'\n * or 'world', though those that contain both will rank higher in the results.\n *\n * Wildcards can be included in terms to match one or more unspecified characters, these wildcards can\n * be inserted anywhere within the term, and more than one wildcard can exist in a single term. Adding\n * wildcards will increase the number of documents that will be found but can also have a negative\n * impact on query performance, especially with wildcards at the beginning of a term.\n *\n * Terms can be restricted to specific fields, e.g. `title:hello`, only documents with the term\n * hello in the title field will match this query. Using a field not present in the index will lead\n * to an error being thrown.\n *\n * Modifiers can also be added to terms, lunr supports edit distance and boost modifiers on terms. A term\n * boost will make documents matching that term score higher, e.g. `foo^5`. Edit distance is also supported\n * to provide fuzzy matching, e.g. 'hello~2' will match documents with hello with an edit distance of 2.\n * Avoid large values for edit distance to improve query performance.\n *\n * Each term also supports a presence modifier. By default a term's presence in document is optional, however\n * this can be changed to either required or prohibited. For a term's presence to be required in a document the\n * term should be prefixed with a '+', e.g. `+foo bar` is a search for documents that must contain 'foo' and\n * optionally contain 'bar'. Conversely a leading '-' sets the terms presence to prohibited, i.e. it must not\n * appear in a document, e.g. `-foo bar` is a search for documents that do not contain 'foo' but may contain 'bar'.\n *\n * To escape special characters the backslash character '\\' can be used, this allows searches to include\n * characters that would normally be considered modifiers, e.g. `foo\\~2` will search for a term \"foo~2\" instead\n * of attempting to apply a boost of 2 to the search term \"foo\".\n *\n * @typedef {string} lunr.Index~QueryString\n * @example Simple single term query\n * hello\n * @example Multiple term query\n * hello world\n * @example term scoped to a field\n * title:hello\n * @example term with a boost of 10\n * hello^10\n * @example term with an edit distance of 2\n * hello~2\n * @example terms with presence modifiers\n * -foo +bar baz\n */\n\n/**\n * Performs a search against the index using lunr query syntax.\n *\n * Results will be returned sorted by their score, the most relevant results\n * will be returned first. For details on how the score is calculated, please see\n * the {@link https://lunrjs.com/guides/searching.html#scoring|guide}.\n *\n * For more programmatic querying use lunr.Index#query.\n *\n * @param {lunr.Index~QueryString} queryString - A string containing a lunr query.\n * @throws {lunr.QueryParseError} If the passed query string cannot be parsed.\n * @returns {lunr.Index~Result[]}\n */\nlunr.Index.prototype.search = function (queryString) {\n return this.query(function (query) {\n var parser = new lunr.QueryParser(queryString, query)\n parser.parse()\n })\n}\n\n/**\n * A query builder callback provides a query object to be used to express\n * the query to perform on the index.\n *\n * @callback lunr.Index~queryBuilder\n * @param {lunr.Query} query - The query object to build up.\n * @this lunr.Query\n */\n\n/**\n * Performs a query against the index using the yielded lunr.Query object.\n *\n * If performing programmatic queries against the index, this method is preferred\n * over lunr.Index#search so as to avoid the additional query parsing overhead.\n *\n * A query object is yielded to the supplied function which should be used to\n * express the query to be run against the index.\n *\n * Note that although this function takes a callback parameter it is _not_ an\n * asynchronous operation, the callback is just yielded a query object to be\n * customized.\n *\n * @param {lunr.Index~queryBuilder} fn - A function that is used to build the query.\n * @returns {lunr.Index~Result[]}\n */\nlunr.Index.prototype.query = function (fn) {\n // for each query clause\n // * process terms\n // * expand terms from token set\n // * find matching documents and metadata\n // * get document vectors\n // * score documents\n\n var query = new lunr.Query(this.fields),\n matchingFields = Object.create(null),\n queryVectors = Object.create(null),\n termFieldCache = Object.create(null),\n requiredMatches = Object.create(null),\n prohibitedMatches = Object.create(null)\n\n /*\n * To support field level boosts a query vector is created per\n * field. An empty vector is eagerly created to support negated\n * queries.\n */\n for (var i = 0; i < this.fields.length; i++) {\n queryVectors[this.fields[i]] = new lunr.Vector\n }\n\n fn.call(query, query)\n\n for (var i = 0; i < query.clauses.length; i++) {\n /*\n * Unless the pipeline has been disabled for this term, which is\n * the case for terms with wildcards, we need to pass the clause\n * term through the search pipeline. A pipeline returns an array\n * of processed terms. Pipeline functions may expand the passed\n * term, which means we may end up performing multiple index lookups\n * for a single query term.\n */\n var clause = query.clauses[i],\n terms = null,\n clauseMatches = lunr.Set.empty\n\n if (clause.usePipeline) {\n terms = this.pipeline.runString(clause.term, {\n fields: clause.fields\n })\n } else {\n terms = [clause.term]\n }\n\n for (var m = 0; m < terms.length; m++) {\n var term = terms[m]\n\n /*\n * Each term returned from the pipeline needs to use the same query\n * clause object, e.g. the same boost and or edit distance. The\n * simplest way to do this is to re-use the clause object but mutate\n * its term property.\n */\n clause.term = term\n\n /*\n * From the term in the clause we create a token set which will then\n * be used to intersect the indexes token set to get a list of terms\n * to lookup in the inverted index\n */\n var termTokenSet = lunr.TokenSet.fromClause(clause),\n expandedTerms = this.tokenSet.intersect(termTokenSet).toArray()\n\n /*\n * If a term marked as required does not exist in the tokenSet it is\n * impossible for the search to return any matches. We set all the field\n * scoped required matches set to empty and stop examining any further\n * clauses.\n */\n if (expandedTerms.length === 0 && clause.presence === lunr.Query.presence.REQUIRED) {\n for (var k = 0; k < clause.fields.length; k++) {\n var field = clause.fields[k]\n requiredMatches[field] = lunr.Set.empty\n }\n\n break\n }\n\n for (var j = 0; j < expandedTerms.length; j++) {\n /*\n * For each term get the posting and termIndex, this is required for\n * building the query vector.\n */\n var expandedTerm = expandedTerms[j],\n posting = this.invertedIndex[expandedTerm],\n termIndex = posting._index\n\n for (var k = 0; k < clause.fields.length; k++) {\n /*\n * For each field that this query term is scoped by (by default\n * all fields are in scope) we need to get all the document refs\n * that have this term in that field.\n *\n * The posting is the entry in the invertedIndex for the matching\n * term from above.\n */\n var field = clause.fields[k],\n fieldPosting = posting[field],\n matchingDocumentRefs = Object.keys(fieldPosting),\n termField = expandedTerm + \"/\" + field,\n matchingDocumentsSet = new lunr.Set(matchingDocumentRefs)\n\n /*\n * if the presence of this term is required ensure that the matching\n * documents are added to the set of required matches for this clause.\n *\n */\n if (clause.presence == lunr.Query.presence.REQUIRED) {\n clauseMatches = clauseMatches.union(matchingDocumentsSet)\n\n if (requiredMatches[field] === undefined) {\n requiredMatches[field] = lunr.Set.complete\n }\n }\n\n /*\n * if the presence of this term is prohibited ensure that the matching\n * documents are added to the set of prohibited matches for this field,\n * creating that set if it does not yet exist.\n */\n if (clause.presence == lunr.Query.presence.PROHIBITED) {\n if (prohibitedMatches[field] === undefined) {\n prohibitedMatches[field] = lunr.Set.empty\n }\n\n prohibitedMatches[field] = prohibitedMatches[field].union(matchingDocumentsSet)\n\n /*\n * Prohibited matches should not be part of the query vector used for\n * similarity scoring and no metadata should be extracted so we continue\n * to the next field\n */\n continue\n }\n\n /*\n * The query field vector is populated using the termIndex found for\n * the term and a unit value with the appropriate boost applied.\n * Using upsert because there could already be an entry in the vector\n * for the term we are working with. In that case we just add the scores\n * together.\n */\n queryVectors[field].upsert(termIndex, clause.boost, function (a, b) { return a + b })\n\n /**\n * If we've already seen this term, field combo then we've already collected\n * the matching documents and metadata, no need to go through all that again\n */\n if (termFieldCache[termField]) {\n continue\n }\n\n for (var l = 0; l < matchingDocumentRefs.length; l++) {\n /*\n * All metadata for this term/field/document triple\n * are then extracted and collected into an instance\n * of lunr.MatchData ready to be returned in the query\n * results\n */\n var matchingDocumentRef = matchingDocumentRefs[l],\n matchingFieldRef = new lunr.FieldRef (matchingDocumentRef, field),\n metadata = fieldPosting[matchingDocumentRef],\n fieldMatch\n\n if ((fieldMatch = matchingFields[matchingFieldRef]) === undefined) {\n matchingFields[matchingFieldRef] = new lunr.MatchData (expandedTerm, field, metadata)\n } else {\n fieldMatch.add(expandedTerm, field, metadata)\n }\n\n }\n\n termFieldCache[termField] = true\n }\n }\n }\n\n /**\n * If the presence was required we need to update the requiredMatches field sets.\n * We do this after all fields for the term have collected their matches because\n * the clause terms presence is required in _any_ of the fields not _all_ of the\n * fields.\n */\n if (clause.presence === lunr.Query.presence.REQUIRED) {\n for (var k = 0; k < clause.fields.length; k++) {\n var field = clause.fields[k]\n requiredMatches[field] = requiredMatches[field].intersect(clauseMatches)\n }\n }\n }\n\n /**\n * Need to combine the field scoped required and prohibited\n * matching documents into a global set of required and prohibited\n * matches\n */\n var allRequiredMatches = lunr.Set.complete,\n allProhibitedMatches = lunr.Set.empty\n\n for (var i = 0; i < this.fields.length; i++) {\n var field = this.fields[i]\n\n if (requiredMatches[field]) {\n allRequiredMatches = allRequiredMatches.intersect(requiredMatches[field])\n }\n\n if (prohibitedMatches[field]) {\n allProhibitedMatches = allProhibitedMatches.union(prohibitedMatches[field])\n }\n }\n\n var matchingFieldRefs = Object.keys(matchingFields),\n results = [],\n matches = Object.create(null)\n\n /*\n * If the query is negated (contains only prohibited terms)\n * we need to get _all_ fieldRefs currently existing in the\n * index. This is only done when we know that the query is\n * entirely prohibited terms to avoid any cost of getting all\n * fieldRefs unnecessarily.\n *\n * Additionally, blank MatchData must be created to correctly\n * populate the results.\n */\n if (query.isNegated()) {\n matchingFieldRefs = Object.keys(this.fieldVectors)\n\n for (var i = 0; i < matchingFieldRefs.length; i++) {\n var matchingFieldRef = matchingFieldRefs[i]\n var fieldRef = lunr.FieldRef.fromString(matchingFieldRef)\n matchingFields[matchingFieldRef] = new lunr.MatchData\n }\n }\n\n for (var i = 0; i < matchingFieldRefs.length; i++) {\n /*\n * Currently we have document fields that match the query, but we\n * need to return documents. The matchData and scores are combined\n * from multiple fields belonging to the same document.\n *\n * Scores are calculated by field, using the query vectors created\n * above, and combined into a final document score using addition.\n */\n var fieldRef = lunr.FieldRef.fromString(matchingFieldRefs[i]),\n docRef = fieldRef.docRef\n\n if (!allRequiredMatches.contains(docRef)) {\n continue\n }\n\n if (allProhibitedMatches.contains(docRef)) {\n continue\n }\n\n var fieldVector = this.fieldVectors[fieldRef],\n score = queryVectors[fieldRef.fieldName].similarity(fieldVector),\n docMatch\n\n if ((docMatch = matches[docRef]) !== undefined) {\n docMatch.score += score\n docMatch.matchData.combine(matchingFields[fieldRef])\n } else {\n var match = {\n ref: docRef,\n score: score,\n matchData: matchingFields[fieldRef]\n }\n matches[docRef] = match\n results.push(match)\n }\n }\n\n /*\n * Sort the results objects by score, highest first.\n */\n return results.sort(function (a, b) {\n return b.score - a.score\n })\n}\n\n/**\n * Prepares the index for JSON serialization.\n *\n * The schema for this JSON blob will be described in a\n * separate JSON schema file.\n *\n * @returns {Object}\n */\nlunr.Index.prototype.toJSON = function () {\n var invertedIndex = Object.keys(this.invertedIndex)\n .sort()\n .map(function (term) {\n return [term, this.invertedIndex[term]]\n }, this)\n\n var fieldVectors = Object.keys(this.fieldVectors)\n .map(function (ref) {\n return [ref, this.fieldVectors[ref].toJSON()]\n }, this)\n\n return {\n version: lunr.version,\n fields: this.fields,\n fieldVectors: fieldVectors,\n invertedIndex: invertedIndex,\n pipeline: this.pipeline.toJSON()\n }\n}\n\n/**\n * Loads a previously serialized lunr.Index\n *\n * @param {Object} serializedIndex - A previously serialized lunr.Index\n * @returns {lunr.Index}\n */\nlunr.Index.load = function (serializedIndex) {\n var attrs = {},\n fieldVectors = {},\n serializedVectors = serializedIndex.fieldVectors,\n invertedIndex = Object.create(null),\n serializedInvertedIndex = serializedIndex.invertedIndex,\n tokenSetBuilder = new lunr.TokenSet.Builder,\n pipeline = lunr.Pipeline.load(serializedIndex.pipeline)\n\n if (serializedIndex.version != lunr.version) {\n lunr.utils.warn(\"Version mismatch when loading serialised index. Current version of lunr '\" + lunr.version + \"' does not match serialized index '\" + serializedIndex.version + \"'\")\n }\n\n for (var i = 0; i < serializedVectors.length; i++) {\n var tuple = serializedVectors[i],\n ref = tuple[0],\n elements = tuple[1]\n\n fieldVectors[ref] = new lunr.Vector(elements)\n }\n\n for (var i = 0; i < serializedInvertedIndex.length; i++) {\n var tuple = serializedInvertedIndex[i],\n term = tuple[0],\n posting = tuple[1]\n\n tokenSetBuilder.insert(term)\n invertedIndex[term] = posting\n }\n\n tokenSetBuilder.finish()\n\n attrs.fields = serializedIndex.fields\n\n attrs.fieldVectors = fieldVectors\n attrs.invertedIndex = invertedIndex\n attrs.tokenSet = tokenSetBuilder.root\n attrs.pipeline = pipeline\n\n return new lunr.Index(attrs)\n}\n/*!\n * lunr.Builder\n * Copyright (C) 2020 Oliver Nightingale\n */\n\n/**\n * lunr.Builder performs indexing on a set of documents and\n * returns instances of lunr.Index ready for querying.\n *\n * All configuration of the index is done via the builder, the\n * fields to index, the document reference, the text processing\n * pipeline and document scoring parameters are all set on the\n * builder before indexing.\n *\n * @constructor\n * @property {string} _ref - Internal reference to the document reference field.\n * @property {string[]} _fields - Internal reference to the document fields to index.\n * @property {object} invertedIndex - The inverted index maps terms to document fields.\n * @property {object} documentTermFrequencies - Keeps track of document term frequencies.\n * @property {object} documentLengths - Keeps track of the length of documents added to the index.\n * @property {lunr.tokenizer} tokenizer - Function for splitting strings into tokens for indexing.\n * @property {lunr.Pipeline} pipeline - The pipeline performs text processing on tokens before indexing.\n * @property {lunr.Pipeline} searchPipeline - A pipeline for processing search terms before querying the index.\n * @property {number} documentCount - Keeps track of the total number of documents indexed.\n * @property {number} _b - A parameter to control field length normalization, setting this to 0 disabled normalization, 1 fully normalizes field lengths, the default value is 0.75.\n * @property {number} _k1 - A parameter to control how quickly an increase in term frequency results in term frequency saturation, the default value is 1.2.\n * @property {number} termIndex - A counter incremented for each unique term, used to identify a terms position in the vector space.\n * @property {array} metadataWhitelist - A list of metadata keys that have been whitelisted for entry in the index.\n */\nlunr.Builder = function () {\n this._ref = \"id\"\n this._fields = Object.create(null)\n this._documents = Object.create(null)\n this.invertedIndex = Object.create(null)\n this.fieldTermFrequencies = {}\n this.fieldLengths = {}\n this.tokenizer = lunr.tokenizer\n this.pipeline = new lunr.Pipeline\n this.searchPipeline = new lunr.Pipeline\n this.documentCount = 0\n this._b = 0.75\n this._k1 = 1.2\n this.termIndex = 0\n this.metadataWhitelist = []\n}\n\n/**\n * Sets the document field used as the document reference. Every document must have this field.\n * The type of this field in the document should be a string, if it is not a string it will be\n * coerced into a string by calling toString.\n *\n * The default ref is 'id'.\n *\n * The ref should _not_ be changed during indexing, it should be set before any documents are\n * added to the index. Changing it during indexing can lead to inconsistent results.\n *\n * @param {string} ref - The name of the reference field in the document.\n */\nlunr.Builder.prototype.ref = function (ref) {\n this._ref = ref\n}\n\n/**\n * A function that is used to extract a field from a document.\n *\n * Lunr expects a field to be at the top level of a document, if however the field\n * is deeply nested within a document an extractor function can be used to extract\n * the right field for indexing.\n *\n * @callback fieldExtractor\n * @param {object} doc - The document being added to the index.\n * @returns {?(string|object|object[])} obj - The object that will be indexed for this field.\n * @example Extracting a nested field\n * function (doc) { return doc.nested.field }\n */\n\n/**\n * Adds a field to the list of document fields that will be indexed. Every document being\n * indexed should have this field. Null values for this field in indexed documents will\n * not cause errors but will limit the chance of that document being retrieved by searches.\n *\n * All fields should be added before adding documents to the index. Adding fields after\n * a document has been indexed will have no effect on already indexed documents.\n *\n * Fields can be boosted at build time. This allows terms within that field to have more\n * importance when ranking search results. Use a field boost to specify that matches within\n * one field are more important than other fields.\n *\n * @param {string} fieldName - The name of a field to index in all documents.\n * @param {object} attributes - Optional attributes associated with this field.\n * @param {number} [attributes.boost=1] - Boost applied to all terms within this field.\n * @param {fieldExtractor} [attributes.extractor] - Function to extract a field from a document.\n * @throws {RangeError} fieldName cannot contain unsupported characters '/'\n */\nlunr.Builder.prototype.field = function (fieldName, attributes) {\n if (/\\//.test(fieldName)) {\n throw new RangeError (\"Field '\" + fieldName + \"' contains illegal character '/'\")\n }\n\n this._fields[fieldName] = attributes || {}\n}\n\n/**\n * A parameter to tune the amount of field length normalisation that is applied when\n * calculating relevance scores. A value of 0 will completely disable any normalisation\n * and a value of 1 will fully normalise field lengths. The default is 0.75. Values of b\n * will be clamped to the range 0 - 1.\n *\n * @param {number} number - The value to set for this tuning parameter.\n */\nlunr.Builder.prototype.b = function (number) {\n if (number < 0) {\n this._b = 0\n } else if (number > 1) {\n this._b = 1\n } else {\n this._b = number\n }\n}\n\n/**\n * A parameter that controls the speed at which a rise in term frequency results in term\n * frequency saturation. The default value is 1.2. Setting this to a higher value will give\n * slower saturation levels, a lower value will result in quicker saturation.\n *\n * @param {number} number - The value to set for this tuning parameter.\n */\nlunr.Builder.prototype.k1 = function (number) {\n this._k1 = number\n}\n\n/**\n * Adds a document to the index.\n *\n * Before adding fields to the index the index should have been fully setup, with the document\n * ref and all fields to index already having been specified.\n *\n * The document must have a field name as specified by the ref (by default this is 'id') and\n * it should have all fields defined for indexing, though null or undefined values will not\n * cause errors.\n *\n * Entire documents can be boosted at build time. Applying a boost to a document indicates that\n * this document should rank higher in search results than other documents.\n *\n * @param {object} doc - The document to add to the index.\n * @param {object} attributes - Optional attributes associated with this document.\n * @param {number} [attributes.boost=1] - Boost applied to all terms within this document.\n */\nlunr.Builder.prototype.add = function (doc, attributes) {\n var docRef = doc[this._ref],\n fields = Object.keys(this._fields)\n\n this._documents[docRef] = attributes || {}\n this.documentCount += 1\n\n for (var i = 0; i < fields.length; i++) {\n var fieldName = fields[i],\n extractor = this._fields[fieldName].extractor,\n field = extractor ? extractor(doc) : doc[fieldName],\n tokens = this.tokenizer(field, {\n fields: [fieldName]\n }),\n terms = this.pipeline.run(tokens),\n fieldRef = new lunr.FieldRef (docRef, fieldName),\n fieldTerms = Object.create(null)\n\n this.fieldTermFrequencies[fieldRef] = fieldTerms\n this.fieldLengths[fieldRef] = 0\n\n // store the length of this field for this document\n this.fieldLengths[fieldRef] += terms.length\n\n // calculate term frequencies for this field\n for (var j = 0; j < terms.length; j++) {\n var term = terms[j]\n\n if (fieldTerms[term] == undefined) {\n fieldTerms[term] = 0\n }\n\n fieldTerms[term] += 1\n\n // add to inverted index\n // create an initial posting if one doesn't exist\n if (this.invertedIndex[term] == undefined) {\n var posting = Object.create(null)\n posting[\"_index\"] = this.termIndex\n this.termIndex += 1\n\n for (var k = 0; k < fields.length; k++) {\n posting[fields[k]] = Object.create(null)\n }\n\n this.invertedIndex[term] = posting\n }\n\n // add an entry for this term/fieldName/docRef to the invertedIndex\n if (this.invertedIndex[term][fieldName][docRef] == undefined) {\n this.invertedIndex[term][fieldName][docRef] = Object.create(null)\n }\n\n // store all whitelisted metadata about this token in the\n // inverted index\n for (var l = 0; l < this.metadataWhitelist.length; l++) {\n var metadataKey = this.metadataWhitelist[l],\n metadata = term.metadata[metadataKey]\n\n if (this.invertedIndex[term][fieldName][docRef][metadataKey] == undefined) {\n this.invertedIndex[term][fieldName][docRef][metadataKey] = []\n }\n\n this.invertedIndex[term][fieldName][docRef][metadataKey].push(metadata)\n }\n }\n\n }\n}\n\n/**\n * Calculates the average document length for this index\n *\n * @private\n */\nlunr.Builder.prototype.calculateAverageFieldLengths = function () {\n\n var fieldRefs = Object.keys(this.fieldLengths),\n numberOfFields = fieldRefs.length,\n accumulator = {},\n documentsWithField = {}\n\n for (var i = 0; i < numberOfFields; i++) {\n var fieldRef = lunr.FieldRef.fromString(fieldRefs[i]),\n field = fieldRef.fieldName\n\n documentsWithField[field] || (documentsWithField[field] = 0)\n documentsWithField[field] += 1\n\n accumulator[field] || (accumulator[field] = 0)\n accumulator[field] += this.fieldLengths[fieldRef]\n }\n\n var fields = Object.keys(this._fields)\n\n for (var i = 0; i < fields.length; i++) {\n var fieldName = fields[i]\n accumulator[fieldName] = accumulator[fieldName] / documentsWithField[fieldName]\n }\n\n this.averageFieldLength = accumulator\n}\n\n/**\n * Builds a vector space model of every document using lunr.Vector\n *\n * @private\n */\nlunr.Builder.prototype.createFieldVectors = function () {\n var fieldVectors = {},\n fieldRefs = Object.keys(this.fieldTermFrequencies),\n fieldRefsLength = fieldRefs.length,\n termIdfCache = Object.create(null)\n\n for (var i = 0; i < fieldRefsLength; i++) {\n var fieldRef = lunr.FieldRef.fromString(fieldRefs[i]),\n fieldName = fieldRef.fieldName,\n fieldLength = this.fieldLengths[fieldRef],\n fieldVector = new lunr.Vector,\n termFrequencies = this.fieldTermFrequencies[fieldRef],\n terms = Object.keys(termFrequencies),\n termsLength = terms.length\n\n\n var fieldBoost = this._fields[fieldName].boost || 1,\n docBoost = this._documents[fieldRef.docRef].boost || 1\n\n for (var j = 0; j < termsLength; j++) {\n var term = terms[j],\n tf = termFrequencies[term],\n termIndex = this.invertedIndex[term]._index,\n idf, score, scoreWithPrecision\n\n if (termIdfCache[term] === undefined) {\n idf = lunr.idf(this.invertedIndex[term], this.documentCount)\n termIdfCache[term] = idf\n } else {\n idf = termIdfCache[term]\n }\n\n score = idf * ((this._k1 + 1) * tf) / (this._k1 * (1 - this._b + this._b * (fieldLength / this.averageFieldLength[fieldName])) + tf)\n score *= fieldBoost\n score *= docBoost\n scoreWithPrecision = Math.round(score * 1000) / 1000\n // Converts 1.23456789 to 1.234.\n // Reducing the precision so that the vectors take up less\n // space when serialised. Doing it now so that they behave\n // the same before and after serialisation. Also, this is\n // the fastest approach to reducing a number's precision in\n // JavaScript.\n\n fieldVector.insert(termIndex, scoreWithPrecision)\n }\n\n fieldVectors[fieldRef] = fieldVector\n }\n\n this.fieldVectors = fieldVectors\n}\n\n/**\n * Creates a token set of all tokens in the index using lunr.TokenSet\n *\n * @private\n */\nlunr.Builder.prototype.createTokenSet = function () {\n this.tokenSet = lunr.TokenSet.fromArray(\n Object.keys(this.invertedIndex).sort()\n )\n}\n\n/**\n * Builds the index, creating an instance of lunr.Index.\n *\n * This completes the indexing process and should only be called\n * once all documents have been added to the index.\n *\n * @returns {lunr.Index}\n */\nlunr.Builder.prototype.build = function () {\n this.calculateAverageFieldLengths()\n this.createFieldVectors()\n this.createTokenSet()\n\n return new lunr.Index({\n invertedIndex: this.invertedIndex,\n fieldVectors: this.fieldVectors,\n tokenSet: this.tokenSet,\n fields: Object.keys(this._fields),\n pipeline: this.searchPipeline\n })\n}\n\n/**\n * Applies a plugin to the index builder.\n *\n * A plugin is a function that is called with the index builder as its context.\n * Plugins can be used to customise or extend the behaviour of the index\n * in some way. A plugin is just a function, that encapsulated the custom\n * behaviour that should be applied when building the index.\n *\n * The plugin function will be called with the index builder as its argument, additional\n * arguments can also be passed when calling use. The function will be called\n * with the index builder as its context.\n *\n * @param {Function} plugin The plugin to apply.\n */\nlunr.Builder.prototype.use = function (fn) {\n var args = Array.prototype.slice.call(arguments, 1)\n args.unshift(this)\n fn.apply(this, args)\n}\n/**\n * Contains and collects metadata about a matching document.\n * A single instance of lunr.MatchData is returned as part of every\n * lunr.Index~Result.\n *\n * @constructor\n * @param {string} term - The term this match data is associated with\n * @param {string} field - The field in which the term was found\n * @param {object} metadata - The metadata recorded about this term in this field\n * @property {object} metadata - A cloned collection of metadata associated with this document.\n * @see {@link lunr.Index~Result}\n */\nlunr.MatchData = function (term, field, metadata) {\n var clonedMetadata = Object.create(null),\n metadataKeys = Object.keys(metadata || {})\n\n // Cloning the metadata to prevent the original\n // being mutated during match data combination.\n // Metadata is kept in an array within the inverted\n // index so cloning the data can be done with\n // Array#slice\n for (var i = 0; i < metadataKeys.length; i++) {\n var key = metadataKeys[i]\n clonedMetadata[key] = metadata[key].slice()\n }\n\n this.metadata = Object.create(null)\n\n if (term !== undefined) {\n this.metadata[term] = Object.create(null)\n this.metadata[term][field] = clonedMetadata\n }\n}\n\n/**\n * An instance of lunr.MatchData will be created for every term that matches a\n * document. However only one instance is required in a lunr.Index~Result. This\n * method combines metadata from another instance of lunr.MatchData with this\n * objects metadata.\n *\n * @param {lunr.MatchData} otherMatchData - Another instance of match data to merge with this one.\n * @see {@link lunr.Index~Result}\n */\nlunr.MatchData.prototype.combine = function (otherMatchData) {\n var terms = Object.keys(otherMatchData.metadata)\n\n for (var i = 0; i < terms.length; i++) {\n var term = terms[i],\n fields = Object.keys(otherMatchData.metadata[term])\n\n if (this.metadata[term] == undefined) {\n this.metadata[term] = Object.create(null)\n }\n\n for (var j = 0; j < fields.length; j++) {\n var field = fields[j],\n keys = Object.keys(otherMatchData.metadata[term][field])\n\n if (this.metadata[term][field] == undefined) {\n this.metadata[term][field] = Object.create(null)\n }\n\n for (var k = 0; k < keys.length; k++) {\n var key = keys[k]\n\n if (this.metadata[term][field][key] == undefined) {\n this.metadata[term][field][key] = otherMatchData.metadata[term][field][key]\n } else {\n this.metadata[term][field][key] = this.metadata[term][field][key].concat(otherMatchData.metadata[term][field][key])\n }\n\n }\n }\n }\n}\n\n/**\n * Add metadata for a term/field pair to this instance of match data.\n *\n * @param {string} term - The term this match data is associated with\n * @param {string} field - The field in which the term was found\n * @param {object} metadata - The metadata recorded about this term in this field\n */\nlunr.MatchData.prototype.add = function (term, field, metadata) {\n if (!(term in this.metadata)) {\n this.metadata[term] = Object.create(null)\n this.metadata[term][field] = metadata\n return\n }\n\n if (!(field in this.metadata[term])) {\n this.metadata[term][field] = metadata\n return\n }\n\n var metadataKeys = Object.keys(metadata)\n\n for (var i = 0; i < metadataKeys.length; i++) {\n var key = metadataKeys[i]\n\n if (key in this.metadata[term][field]) {\n this.metadata[term][field][key] = this.metadata[term][field][key].concat(metadata[key])\n } else {\n this.metadata[term][field][key] = metadata[key]\n }\n }\n}\n/**\n * A lunr.Query provides a programmatic way of defining queries to be performed\n * against a {@link lunr.Index}.\n *\n * Prefer constructing a lunr.Query using the {@link lunr.Index#query} method\n * so the query object is pre-initialized with the right index fields.\n *\n * @constructor\n * @property {lunr.Query~Clause[]} clauses - An array of query clauses.\n * @property {string[]} allFields - An array of all available fields in a lunr.Index.\n */\nlunr.Query = function (allFields) {\n this.clauses = []\n this.allFields = allFields\n}\n\n/**\n * Constants for indicating what kind of automatic wildcard insertion will be used when constructing a query clause.\n *\n * This allows wildcards to be added to the beginning and end of a term without having to manually do any string\n * concatenation.\n *\n * The wildcard constants can be bitwise combined to select both leading and trailing wildcards.\n *\n * @constant\n * @default\n * @property {number} wildcard.NONE - The term will have no wildcards inserted, this is the default behaviour\n * @property {number} wildcard.LEADING - Prepend the term with a wildcard, unless a leading wildcard already exists\n * @property {number} wildcard.TRAILING - Append a wildcard to the term, unless a trailing wildcard already exists\n * @see lunr.Query~Clause\n * @see lunr.Query#clause\n * @see lunr.Query#term\n * @example query term with trailing wildcard\n * query.term('foo', { wildcard: lunr.Query.wildcard.TRAILING })\n * @example query term with leading and trailing wildcard\n * query.term('foo', {\n * wildcard: lunr.Query.wildcard.LEADING | lunr.Query.wildcard.TRAILING\n * })\n */\n\nlunr.Query.wildcard = new String (\"*\")\nlunr.Query.wildcard.NONE = 0\nlunr.Query.wildcard.LEADING = 1\nlunr.Query.wildcard.TRAILING = 2\n\n/**\n * Constants for indicating what kind of presence a term must have in matching documents.\n *\n * @constant\n * @enum {number}\n * @see lunr.Query~Clause\n * @see lunr.Query#clause\n * @see lunr.Query#term\n * @example query term with required presence\n * query.term('foo', { presence: lunr.Query.presence.REQUIRED })\n */\nlunr.Query.presence = {\n /**\n * Term's presence in a document is optional, this is the default value.\n */\n OPTIONAL: 1,\n\n /**\n * Term's presence in a document is required, documents that do not contain\n * this term will not be returned.\n */\n REQUIRED: 2,\n\n /**\n * Term's presence in a document is prohibited, documents that do contain\n * this term will not be returned.\n */\n PROHIBITED: 3\n}\n\n/**\n * A single clause in a {@link lunr.Query} contains a term and details on how to\n * match that term against a {@link lunr.Index}.\n *\n * @typedef {Object} lunr.Query~Clause\n * @property {string[]} fields - The fields in an index this clause should be matched against.\n * @property {number} [boost=1] - Any boost that should be applied when matching this clause.\n * @property {number} [editDistance] - Whether the term should have fuzzy matching applied, and how fuzzy the match should be.\n * @property {boolean} [usePipeline] - Whether the term should be passed through the search pipeline.\n * @property {number} [wildcard=lunr.Query.wildcard.NONE] - Whether the term should have wildcards appended or prepended.\n * @property {number} [presence=lunr.Query.presence.OPTIONAL] - The terms presence in any matching documents.\n */\n\n/**\n * Adds a {@link lunr.Query~Clause} to this query.\n *\n * Unless the clause contains the fields to be matched all fields will be matched. In addition\n * a default boost of 1 is applied to the clause.\n *\n * @param {lunr.Query~Clause} clause - The clause to add to this query.\n * @see lunr.Query~Clause\n * @returns {lunr.Query}\n */\nlunr.Query.prototype.clause = function (clause) {\n if (!('fields' in clause)) {\n clause.fields = this.allFields\n }\n\n if (!('boost' in clause)) {\n clause.boost = 1\n }\n\n if (!('usePipeline' in clause)) {\n clause.usePipeline = true\n }\n\n if (!('wildcard' in clause)) {\n clause.wildcard = lunr.Query.wildcard.NONE\n }\n\n if ((clause.wildcard & lunr.Query.wildcard.LEADING) && (clause.term.charAt(0) != lunr.Query.wildcard)) {\n clause.term = \"*\" + clause.term\n }\n\n if ((clause.wildcard & lunr.Query.wildcard.TRAILING) && (clause.term.slice(-1) != lunr.Query.wildcard)) {\n clause.term = \"\" + clause.term + \"*\"\n }\n\n if (!('presence' in clause)) {\n clause.presence = lunr.Query.presence.OPTIONAL\n }\n\n this.clauses.push(clause)\n\n return this\n}\n\n/**\n * A negated query is one in which every clause has a presence of\n * prohibited. These queries require some special processing to return\n * the expected results.\n *\n * @returns boolean\n */\nlunr.Query.prototype.isNegated = function () {\n for (var i = 0; i < this.clauses.length; i++) {\n if (this.clauses[i].presence != lunr.Query.presence.PROHIBITED) {\n return false\n }\n }\n\n return true\n}\n\n/**\n * Adds a term to the current query, under the covers this will create a {@link lunr.Query~Clause}\n * to the list of clauses that make up this query.\n *\n * The term is used as is, i.e. no tokenization will be performed by this method. Instead conversion\n * to a token or token-like string should be done before calling this method.\n *\n * The term will be converted to a string by calling `toString`. Multiple terms can be passed as an\n * array, each term in the array will share the same options.\n *\n * @param {object|object[]} term - The term(s) to add to the query.\n * @param {object} [options] - Any additional properties to add to the query clause.\n * @returns {lunr.Query}\n * @see lunr.Query#clause\n * @see lunr.Query~Clause\n * @example adding a single term to a query\n * query.term(\"foo\")\n * @example adding a single term to a query and specifying search fields, term boost and automatic trailing wildcard\n * query.term(\"foo\", {\n * fields: [\"title\"],\n * boost: 10,\n * wildcard: lunr.Query.wildcard.TRAILING\n * })\n * @example using lunr.tokenizer to convert a string to tokens before using them as terms\n * query.term(lunr.tokenizer(\"foo bar\"))\n */\nlunr.Query.prototype.term = function (term, options) {\n if (Array.isArray(term)) {\n term.forEach(function (t) { this.term(t, lunr.utils.clone(options)) }, this)\n return this\n }\n\n var clause = options || {}\n clause.term = term.toString()\n\n this.clause(clause)\n\n return this\n}\nlunr.QueryParseError = function (message, start, end) {\n this.name = \"QueryParseError\"\n this.message = message\n this.start = start\n this.end = end\n}\n\nlunr.QueryParseError.prototype = new Error\nlunr.QueryLexer = function (str) {\n this.lexemes = []\n this.str = str\n this.length = str.length\n this.pos = 0\n this.start = 0\n this.escapeCharPositions = []\n}\n\nlunr.QueryLexer.prototype.run = function () {\n var state = lunr.QueryLexer.lexText\n\n while (state) {\n state = state(this)\n }\n}\n\nlunr.QueryLexer.prototype.sliceString = function () {\n var subSlices = [],\n sliceStart = this.start,\n sliceEnd = this.pos\n\n for (var i = 0; i < this.escapeCharPositions.length; i++) {\n sliceEnd = this.escapeCharPositions[i]\n subSlices.push(this.str.slice(sliceStart, sliceEnd))\n sliceStart = sliceEnd + 1\n }\n\n subSlices.push(this.str.slice(sliceStart, this.pos))\n this.escapeCharPositions.length = 0\n\n return subSlices.join('')\n}\n\nlunr.QueryLexer.prototype.emit = function (type) {\n this.lexemes.push({\n type: type,\n str: this.sliceString(),\n start: this.start,\n end: this.pos\n })\n\n this.start = this.pos\n}\n\nlunr.QueryLexer.prototype.escapeCharacter = function () {\n this.escapeCharPositions.push(this.pos - 1)\n this.pos += 1\n}\n\nlunr.QueryLexer.prototype.next = function () {\n if (this.pos >= this.length) {\n return lunr.QueryLexer.EOS\n }\n\n var char = this.str.charAt(this.pos)\n this.pos += 1\n return char\n}\n\nlunr.QueryLexer.prototype.width = function () {\n return this.pos - this.start\n}\n\nlunr.QueryLexer.prototype.ignore = function () {\n if (this.start == this.pos) {\n this.pos += 1\n }\n\n this.start = this.pos\n}\n\nlunr.QueryLexer.prototype.backup = function () {\n this.pos -= 1\n}\n\nlunr.QueryLexer.prototype.acceptDigitRun = function () {\n var char, charCode\n\n do {\n char = this.next()\n charCode = char.charCodeAt(0)\n } while (charCode > 47 && charCode < 58)\n\n if (char != lunr.QueryLexer.EOS) {\n this.backup()\n }\n}\n\nlunr.QueryLexer.prototype.more = function () {\n return this.pos < this.length\n}\n\nlunr.QueryLexer.EOS = 'EOS'\nlunr.QueryLexer.FIELD = 'FIELD'\nlunr.QueryLexer.TERM = 'TERM'\nlunr.QueryLexer.EDIT_DISTANCE = 'EDIT_DISTANCE'\nlunr.QueryLexer.BOOST = 'BOOST'\nlunr.QueryLexer.PRESENCE = 'PRESENCE'\n\nlunr.QueryLexer.lexField = function (lexer) {\n lexer.backup()\n lexer.emit(lunr.QueryLexer.FIELD)\n lexer.ignore()\n return lunr.QueryLexer.lexText\n}\n\nlunr.QueryLexer.lexTerm = function (lexer) {\n if (lexer.width() > 1) {\n lexer.backup()\n lexer.emit(lunr.QueryLexer.TERM)\n }\n\n lexer.ignore()\n\n if (lexer.more()) {\n return lunr.QueryLexer.lexText\n }\n}\n\nlunr.QueryLexer.lexEditDistance = function (lexer) {\n lexer.ignore()\n lexer.acceptDigitRun()\n lexer.emit(lunr.QueryLexer.EDIT_DISTANCE)\n return lunr.QueryLexer.lexText\n}\n\nlunr.QueryLexer.lexBoost = function (lexer) {\n lexer.ignore()\n lexer.acceptDigitRun()\n lexer.emit(lunr.QueryLexer.BOOST)\n return lunr.QueryLexer.lexText\n}\n\nlunr.QueryLexer.lexEOS = function (lexer) {\n if (lexer.width() > 0) {\n lexer.emit(lunr.QueryLexer.TERM)\n }\n}\n\n// This matches the separator used when tokenising fields\n// within a document. These should match otherwise it is\n// not possible to search for some tokens within a document.\n//\n// It is possible for the user to change the separator on the\n// tokenizer so it _might_ clash with any other of the special\n// characters already used within the search string, e.g. :.\n//\n// This means that it is possible to change the separator in\n// such a way that makes some words unsearchable using a search\n// string.\nlunr.QueryLexer.termSeparator = lunr.tokenizer.separator\n\nlunr.QueryLexer.lexText = function (lexer) {\n while (true) {\n var char = lexer.next()\n\n if (char == lunr.QueryLexer.EOS) {\n return lunr.QueryLexer.lexEOS\n }\n\n // Escape character is '\\'\n if (char.charCodeAt(0) == 92) {\n lexer.escapeCharacter()\n continue\n }\n\n if (char == \":\") {\n return lunr.QueryLexer.lexField\n }\n\n if (char == \"~\") {\n lexer.backup()\n if (lexer.width() > 0) {\n lexer.emit(lunr.QueryLexer.TERM)\n }\n return lunr.QueryLexer.lexEditDistance\n }\n\n if (char == \"^\") {\n lexer.backup()\n if (lexer.width() > 0) {\n lexer.emit(lunr.QueryLexer.TERM)\n }\n return lunr.QueryLexer.lexBoost\n }\n\n // \"+\" indicates term presence is required\n // checking for length to ensure that only\n // leading \"+\" are considered\n if (char == \"+\" && lexer.width() === 1) {\n lexer.emit(lunr.QueryLexer.PRESENCE)\n return lunr.QueryLexer.lexText\n }\n\n // \"-\" indicates term presence is prohibited\n // checking for length to ensure that only\n // leading \"-\" are considered\n if (char == \"-\" && lexer.width() === 1) {\n lexer.emit(lunr.QueryLexer.PRESENCE)\n return lunr.QueryLexer.lexText\n }\n\n if (char.match(lunr.QueryLexer.termSeparator)) {\n return lunr.QueryLexer.lexTerm\n }\n }\n}\n\nlunr.QueryParser = function (str, query) {\n this.lexer = new lunr.QueryLexer (str)\n this.query = query\n this.currentClause = {}\n this.lexemeIdx = 0\n}\n\nlunr.QueryParser.prototype.parse = function () {\n this.lexer.run()\n this.lexemes = this.lexer.lexemes\n\n var state = lunr.QueryParser.parseClause\n\n while (state) {\n state = state(this)\n }\n\n return this.query\n}\n\nlunr.QueryParser.prototype.peekLexeme = function () {\n return this.lexemes[this.lexemeIdx]\n}\n\nlunr.QueryParser.prototype.consumeLexeme = function () {\n var lexeme = this.peekLexeme()\n this.lexemeIdx += 1\n return lexeme\n}\n\nlunr.QueryParser.prototype.nextClause = function () {\n var completedClause = this.currentClause\n this.query.clause(completedClause)\n this.currentClause = {}\n}\n\nlunr.QueryParser.parseClause = function (parser) {\n var lexeme = parser.peekLexeme()\n\n if (lexeme == undefined) {\n return\n }\n\n switch (lexeme.type) {\n case lunr.QueryLexer.PRESENCE:\n return lunr.QueryParser.parsePresence\n case lunr.QueryLexer.FIELD:\n return lunr.QueryParser.parseField\n case lunr.QueryLexer.TERM:\n return lunr.QueryParser.parseTerm\n default:\n var errorMessage = \"expected either a field or a term, found \" + lexeme.type\n\n if (lexeme.str.length >= 1) {\n errorMessage += \" with value '\" + lexeme.str + \"'\"\n }\n\n throw new lunr.QueryParseError (errorMessage, lexeme.start, lexeme.end)\n }\n}\n\nlunr.QueryParser.parsePresence = function (parser) {\n var lexeme = parser.consumeLexeme()\n\n if (lexeme == undefined) {\n return\n }\n\n switch (lexeme.str) {\n case \"-\":\n parser.currentClause.presence = lunr.Query.presence.PROHIBITED\n break\n case \"+\":\n parser.currentClause.presence = lunr.Query.presence.REQUIRED\n break\n default:\n var errorMessage = \"unrecognised presence operator'\" + lexeme.str + \"'\"\n throw new lunr.QueryParseError (errorMessage, lexeme.start, lexeme.end)\n }\n\n var nextLexeme = parser.peekLexeme()\n\n if (nextLexeme == undefined) {\n var errorMessage = \"expecting term or field, found nothing\"\n throw new lunr.QueryParseError (errorMessage, lexeme.start, lexeme.end)\n }\n\n switch (nextLexeme.type) {\n case lunr.QueryLexer.FIELD:\n return lunr.QueryParser.parseField\n case lunr.QueryLexer.TERM:\n return lunr.QueryParser.parseTerm\n default:\n var errorMessage = \"expecting term or field, found '\" + nextLexeme.type + \"'\"\n throw new lunr.QueryParseError (errorMessage, nextLexeme.start, nextLexeme.end)\n }\n}\n\nlunr.QueryParser.parseField = function (parser) {\n var lexeme = parser.consumeLexeme()\n\n if (lexeme == undefined) {\n return\n }\n\n if (parser.query.allFields.indexOf(lexeme.str) == -1) {\n var possibleFields = parser.query.allFields.map(function (f) { return \"'\" + f + \"'\" }).join(', '),\n errorMessage = \"unrecognised field '\" + lexeme.str + \"', possible fields: \" + possibleFields\n\n throw new lunr.QueryParseError (errorMessage, lexeme.start, lexeme.end)\n }\n\n parser.currentClause.fields = [lexeme.str]\n\n var nextLexeme = parser.peekLexeme()\n\n if (nextLexeme == undefined) {\n var errorMessage = \"expecting term, found nothing\"\n throw new lunr.QueryParseError (errorMessage, lexeme.start, lexeme.end)\n }\n\n switch (nextLexeme.type) {\n case lunr.QueryLexer.TERM:\n return lunr.QueryParser.parseTerm\n default:\n var errorMessage = \"expecting term, found '\" + nextLexeme.type + \"'\"\n throw new lunr.QueryParseError (errorMessage, nextLexeme.start, nextLexeme.end)\n }\n}\n\nlunr.QueryParser.parseTerm = function (parser) {\n var lexeme = parser.consumeLexeme()\n\n if (lexeme == undefined) {\n return\n }\n\n parser.currentClause.term = lexeme.str.toLowerCase()\n\n if (lexeme.str.indexOf(\"*\") != -1) {\n parser.currentClause.usePipeline = false\n }\n\n var nextLexeme = parser.peekLexeme()\n\n if (nextLexeme == undefined) {\n parser.nextClause()\n return\n }\n\n switch (nextLexeme.type) {\n case lunr.QueryLexer.TERM:\n parser.nextClause()\n return lunr.QueryParser.parseTerm\n case lunr.QueryLexer.FIELD:\n parser.nextClause()\n return lunr.QueryParser.parseField\n case lunr.QueryLexer.EDIT_DISTANCE:\n return lunr.QueryParser.parseEditDistance\n case lunr.QueryLexer.BOOST:\n return lunr.QueryParser.parseBoost\n case lunr.QueryLexer.PRESENCE:\n parser.nextClause()\n return lunr.QueryParser.parsePresence\n default:\n var errorMessage = \"Unexpected lexeme type '\" + nextLexeme.type + \"'\"\n throw new lunr.QueryParseError (errorMessage, nextLexeme.start, nextLexeme.end)\n }\n}\n\nlunr.QueryParser.parseEditDistance = function (parser) {\n var lexeme = parser.consumeLexeme()\n\n if (lexeme == undefined) {\n return\n }\n\n var editDistance = parseInt(lexeme.str, 10)\n\n if (isNaN(editDistance)) {\n var errorMessage = \"edit distance must be numeric\"\n throw new lunr.QueryParseError (errorMessage, lexeme.start, lexeme.end)\n }\n\n parser.currentClause.editDistance = editDistance\n\n var nextLexeme = parser.peekLexeme()\n\n if (nextLexeme == undefined) {\n parser.nextClause()\n return\n }\n\n switch (nextLexeme.type) {\n case lunr.QueryLexer.TERM:\n parser.nextClause()\n return lunr.QueryParser.parseTerm\n case lunr.QueryLexer.FIELD:\n parser.nextClause()\n return lunr.QueryParser.parseField\n case lunr.QueryLexer.EDIT_DISTANCE:\n return lunr.QueryParser.parseEditDistance\n case lunr.QueryLexer.BOOST:\n return lunr.QueryParser.parseBoost\n case lunr.QueryLexer.PRESENCE:\n parser.nextClause()\n return lunr.QueryParser.parsePresence\n default:\n var errorMessage = \"Unexpected lexeme type '\" + nextLexeme.type + \"'\"\n throw new lunr.QueryParseError (errorMessage, nextLexeme.start, nextLexeme.end)\n }\n}\n\nlunr.QueryParser.parseBoost = function (parser) {\n var lexeme = parser.consumeLexeme()\n\n if (lexeme == undefined) {\n return\n }\n\n var boost = parseInt(lexeme.str, 10)\n\n if (isNaN(boost)) {\n var errorMessage = \"boost must be numeric\"\n throw new lunr.QueryParseError (errorMessage, lexeme.start, lexeme.end)\n }\n\n parser.currentClause.boost = boost\n\n var nextLexeme = parser.peekLexeme()\n\n if (nextLexeme == undefined) {\n parser.nextClause()\n return\n }\n\n switch (nextLexeme.type) {\n case lunr.QueryLexer.TERM:\n parser.nextClause()\n return lunr.QueryParser.parseTerm\n case lunr.QueryLexer.FIELD:\n parser.nextClause()\n return lunr.QueryParser.parseField\n case lunr.QueryLexer.EDIT_DISTANCE:\n return lunr.QueryParser.parseEditDistance\n case lunr.QueryLexer.BOOST:\n return lunr.QueryParser.parseBoost\n case lunr.QueryLexer.PRESENCE:\n parser.nextClause()\n return lunr.QueryParser.parsePresence\n default:\n var errorMessage = \"Unexpected lexeme type '\" + nextLexeme.type + \"'\"\n throw new lunr.QueryParseError (errorMessage, nextLexeme.start, nextLexeme.end)\n }\n}\n\n /**\n * export the module via AMD, CommonJS or as a browser global\n * Export code from https://github.com/umdjs/umd/blob/master/returnExports.js\n */\n ;(function (root, factory) {\n if (true) {\n // AMD. Register as an anonymous module.\n !(__WEBPACK_AMD_DEFINE_FACTORY__ = (factory),\n\t\t__WEBPACK_AMD_DEFINE_RESULT__ = (typeof __WEBPACK_AMD_DEFINE_FACTORY__ === 'function' ?\n\t\t(__WEBPACK_AMD_DEFINE_FACTORY__.call(exports, __webpack_require__, exports, module)) :\n\t\t__WEBPACK_AMD_DEFINE_FACTORY__),\n\t\t__WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__))\n } else {}\n }(this, function () {\n /**\n * Just return a value to define the module export.\n * This example returns an object, but the module\n * can return a function as the exported value.\n */\n return lunr\n }))\n})();\n\n\n//# sourceURL=webpack:///../node_modules/lunr/lunr.js?"); - -/***/ }), - -/***/ "./default/assets/css/main.sass": -/*!**************************************!*\ - !*** ./default/assets/css/main.sass ***! - \**************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n// extracted by mini-css-extract-plugin\n\n\n//# sourceURL=webpack:///./default/assets/css/main.sass?"); - -/***/ }), - -/***/ "./default/assets/js/src/bootstrap.ts": -/*!********************************************!*\ - !*** ./default/assets/js/src/bootstrap.ts ***! - \********************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony import */ var _typedoc_Application__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./typedoc/Application */ \"./default/assets/js/src/typedoc/Application.ts\");\n/* harmony import */ var _typedoc_components_MenuHighlight__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./typedoc/components/MenuHighlight */ \"./default/assets/js/src/typedoc/components/MenuHighlight.ts\");\n/* harmony import */ var _typedoc_components_Search__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./typedoc/components/Search */ \"./default/assets/js/src/typedoc/components/Search.ts\");\n/* harmony import */ var _typedoc_components_Signature__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./typedoc/components/Signature */ \"./default/assets/js/src/typedoc/components/Signature.ts\");\n/* harmony import */ var _typedoc_components_Toggle__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./typedoc/components/Toggle */ \"./default/assets/js/src/typedoc/components/Toggle.ts\");\n/* harmony import */ var _typedoc_components_Filter__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./typedoc/components/Filter */ \"./default/assets/js/src/typedoc/components/Filter.ts\");\n/* harmony import */ var _css_main_sass__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../../css/main.sass */ \"./default/assets/css/main.sass\");\n\n\n\n\n\n\n\n(0,_typedoc_components_Search__WEBPACK_IMPORTED_MODULE_2__.initSearch)();\n(0,_typedoc_Application__WEBPACK_IMPORTED_MODULE_0__.registerComponent)(_typedoc_components_MenuHighlight__WEBPACK_IMPORTED_MODULE_1__.MenuHighlight, \".menu-highlight\");\n(0,_typedoc_Application__WEBPACK_IMPORTED_MODULE_0__.registerComponent)(_typedoc_components_Signature__WEBPACK_IMPORTED_MODULE_3__.Signature, \".tsd-signatures\");\n(0,_typedoc_Application__WEBPACK_IMPORTED_MODULE_0__.registerComponent)(_typedoc_components_Toggle__WEBPACK_IMPORTED_MODULE_4__.Toggle, \"a[data-toggle]\");\nif (_typedoc_components_Filter__WEBPACK_IMPORTED_MODULE_5__.Filter.isSupported()) {\n (0,_typedoc_Application__WEBPACK_IMPORTED_MODULE_0__.registerComponent)(_typedoc_components_Filter__WEBPACK_IMPORTED_MODULE_5__.Filter, \"#tsd-filter\");\n}\nelse {\n document.documentElement.classList.add(\"no-filter\");\n}\nvar app = new _typedoc_Application__WEBPACK_IMPORTED_MODULE_0__.Application();\nObject.defineProperty(window, \"app\", { value: app });\n\n\n//# sourceURL=webpack:///./default/assets/js/src/bootstrap.ts?"); - -/***/ }), - -/***/ "./default/assets/js/src/typedoc/Application.ts": -/*!******************************************************!*\ - !*** ./default/assets/js/src/typedoc/Application.ts ***! - \******************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"registerComponent\": () => /* binding */ registerComponent,\n/* harmony export */ \"Application\": () => /* binding */ Application\n/* harmony export */ });\n/**\n * List of all known components.\n */\nvar components = [];\n/**\n * Register a new component.\n */\nfunction registerComponent(constructor, selector) {\n components.push({\n selector: selector,\n constructor: constructor,\n });\n}\n/**\n * TypeDoc application class.\n */\nvar Application = /** @class */ (function () {\n /**\n * Create a new Application instance.\n */\n function Application() {\n this.createComponents(document.body);\n }\n /**\n * Create all components beneath the given jQuery element.\n */\n Application.prototype.createComponents = function (context) {\n components.forEach(function (c) {\n context.querySelectorAll(c.selector).forEach(function (el) {\n if (!el.dataset.hasInstance) {\n new c.constructor({ el: el });\n el.dataset.hasInstance = String(true);\n }\n });\n });\n };\n return Application;\n}());\n\n\n\n//# sourceURL=webpack:///./default/assets/js/src/typedoc/Application.ts?"); - -/***/ }), - -/***/ "./default/assets/js/src/typedoc/Component.ts": -/*!****************************************************!*\ - !*** ./default/assets/js/src/typedoc/Component.ts ***! - \****************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"Component\": () => /* binding */ Component\n/* harmony export */ });\n/**\n * TypeDoc component class.\n */\nvar Component = /** @class */ (function () {\n function Component(options) {\n this.el = options.el;\n }\n return Component;\n}());\n\n\n\n//# sourceURL=webpack:///./default/assets/js/src/typedoc/Component.ts?"); - -/***/ }), - -/***/ "./default/assets/js/src/typedoc/EventTarget.ts": -/*!******************************************************!*\ - !*** ./default/assets/js/src/typedoc/EventTarget.ts ***! - \******************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"EventTarget\": () => /* binding */ EventTarget\n/* harmony export */ });\n/**\n * TypeDoc event target class.\n */\nvar EventTarget = /** @class */ (function () {\n function EventTarget() {\n this.listeners = {};\n }\n EventTarget.prototype.addEventListener = function (type, callback) {\n if (!(type in this.listeners)) {\n this.listeners[type] = [];\n }\n this.listeners[type].push(callback);\n };\n EventTarget.prototype.removeEventListener = function (type, callback) {\n if (!(type in this.listeners)) {\n return;\n }\n var stack = this.listeners[type];\n for (var i = 0, l = stack.length; i < l; i++) {\n if (stack[i] === callback) {\n stack.splice(i, 1);\n return;\n }\n }\n };\n EventTarget.prototype.dispatchEvent = function (event) {\n if (!(event.type in this.listeners)) {\n return true;\n }\n var stack = this.listeners[event.type].slice();\n for (var i = 0, l = stack.length; i < l; i++) {\n stack[i].call(this, event);\n }\n return !event.defaultPrevented;\n };\n return EventTarget;\n}());\n\n\n\n//# sourceURL=webpack:///./default/assets/js/src/typedoc/EventTarget.ts?"); - -/***/ }), - -/***/ "./default/assets/js/src/typedoc/components/Filter.ts": -/*!************************************************************!*\ - !*** ./default/assets/js/src/typedoc/components/Filter.ts ***! - \************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"Filter\": () => /* binding */ Filter\n/* harmony export */ });\n/* harmony import */ var _Component__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Component */ \"./default/assets/js/src/typedoc/Component.ts\");\n/* harmony import */ var _utils_pointer__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../utils/pointer */ \"./default/assets/js/src/typedoc/utils/pointer.ts\");\nvar __extends = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\n\n\nvar FilterItem = /** @class */ (function () {\n function FilterItem(key, value) {\n this.key = key;\n this.value = value;\n this.defaultValue = value;\n this.initialize();\n if (window.localStorage[this.key]) {\n this.setValue(this.fromLocalStorage(window.localStorage[this.key]));\n }\n }\n FilterItem.prototype.initialize = function () { };\n FilterItem.prototype.setValue = function (value) {\n if (this.value == value)\n return;\n var oldValue = this.value;\n this.value = value;\n window.localStorage[this.key] = this.toLocalStorage(value);\n this.handleValueChange(oldValue, value);\n };\n return FilterItem;\n}());\nvar FilterItemCheckbox = /** @class */ (function (_super) {\n __extends(FilterItemCheckbox, _super);\n function FilterItemCheckbox() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n FilterItemCheckbox.prototype.initialize = function () {\n var _this = this;\n var checkbox = document.querySelector(\"#tsd-filter-\" + this.key);\n if (!checkbox)\n return;\n this.checkbox = checkbox;\n this.checkbox.addEventListener(\"change\", function () {\n _this.setValue(_this.checkbox.checked);\n });\n };\n FilterItemCheckbox.prototype.handleValueChange = function (oldValue, newValue) {\n if (!this.checkbox)\n return;\n this.checkbox.checked = this.value;\n document.documentElement.classList.toggle(\"toggle-\" + this.key, this.value != this.defaultValue);\n };\n FilterItemCheckbox.prototype.fromLocalStorage = function (value) {\n return value == \"true\";\n };\n FilterItemCheckbox.prototype.toLocalStorage = function (value) {\n return value ? \"true\" : \"false\";\n };\n return FilterItemCheckbox;\n}(FilterItem));\nvar FilterItemSelect = /** @class */ (function (_super) {\n __extends(FilterItemSelect, _super);\n function FilterItemSelect() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n FilterItemSelect.prototype.initialize = function () {\n var _this = this;\n document.documentElement.classList.add(\"toggle-\" + this.key + this.value);\n var select = document.querySelector(\"#tsd-filter-\" + this.key);\n if (!select)\n return;\n this.select = select;\n var onActivate = function () {\n _this.select.classList.add(\"active\");\n };\n var onDeactivate = function () {\n _this.select.classList.remove(\"active\");\n };\n this.select.addEventListener(_utils_pointer__WEBPACK_IMPORTED_MODULE_1__.pointerDown, onActivate);\n this.select.addEventListener(\"mouseover\", onActivate);\n this.select.addEventListener(\"mouseleave\", onDeactivate);\n this.select.querySelectorAll(\"li\").forEach(function (el) {\n el.addEventListener(_utils_pointer__WEBPACK_IMPORTED_MODULE_1__.pointerUp, function (e) {\n select.classList.remove(\"active\");\n _this.setValue(e.target.dataset.value || \"\");\n });\n });\n document.addEventListener(_utils_pointer__WEBPACK_IMPORTED_MODULE_1__.pointerDown, function (e) {\n if (_this.select.contains(e.target))\n return;\n _this.select.classList.remove(\"active\");\n });\n };\n FilterItemSelect.prototype.handleValueChange = function (oldValue, newValue) {\n this.select.querySelectorAll(\"li.selected\").forEach(function (el) {\n el.classList.remove(\"selected\");\n });\n var selected = this.select.querySelector('li[data-value=\"' + newValue + '\"]');\n var label = this.select.querySelector(\".tsd-select-label\");\n if (selected && label) {\n selected.classList.add(\"selected\");\n label.textContent = selected.textContent;\n }\n document.documentElement.classList.remove(\"toggle-\" + oldValue);\n document.documentElement.classList.add(\"toggle-\" + newValue);\n };\n FilterItemSelect.prototype.fromLocalStorage = function (value) {\n return value;\n };\n FilterItemSelect.prototype.toLocalStorage = function (value) {\n return value;\n };\n return FilterItemSelect;\n}(FilterItem));\nvar Filter = /** @class */ (function (_super) {\n __extends(Filter, _super);\n function Filter(options) {\n var _this = _super.call(this, options) || this;\n _this.optionVisibility = new FilterItemSelect(\"visibility\", \"private\");\n _this.optionInherited = new FilterItemCheckbox(\"inherited\", true);\n _this.optionExternals = new FilterItemCheckbox(\"externals\", true);\n return _this;\n }\n Filter.isSupported = function () {\n try {\n return typeof window.localStorage != \"undefined\";\n }\n catch (e) {\n return false;\n }\n };\n return Filter;\n}(_Component__WEBPACK_IMPORTED_MODULE_0__.Component));\n\n\n\n//# sourceURL=webpack:///./default/assets/js/src/typedoc/components/Filter.ts?"); - -/***/ }), - -/***/ "./default/assets/js/src/typedoc/components/MenuHighlight.ts": -/*!*******************************************************************!*\ - !*** ./default/assets/js/src/typedoc/components/MenuHighlight.ts ***! - \*******************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"MenuHighlight\": () => /* binding */ MenuHighlight\n/* harmony export */ });\n/* harmony import */ var _Component__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Component */ \"./default/assets/js/src/typedoc/Component.ts\");\n/* harmony import */ var _services_Viewport__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../services/Viewport */ \"./default/assets/js/src/typedoc/services/Viewport.ts\");\nvar __extends = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\n\n\n/**\n * Manages the sticky state of the navigation and moves the highlight\n * to the current navigation item.\n */\nvar MenuHighlight = /** @class */ (function (_super) {\n __extends(MenuHighlight, _super);\n /**\n * Create a new MenuHighlight instance.\n *\n * @param options Backbone view constructor options.\n */\n function MenuHighlight(options) {\n var _this = _super.call(this, options) || this;\n /**\n * List of all discovered anchors.\n */\n _this.anchors = [];\n /**\n * Index of the currently highlighted anchor.\n */\n _this.index = -1;\n _services_Viewport__WEBPACK_IMPORTED_MODULE_1__.Viewport.instance.addEventListener(\"resize\", function () { return _this.onResize(); });\n _services_Viewport__WEBPACK_IMPORTED_MODULE_1__.Viewport.instance.addEventListener(\"scroll\", function (e) { return _this.onScroll(e); });\n _this.createAnchors();\n return _this;\n }\n /**\n * Find all anchors on the current page.\n */\n MenuHighlight.prototype.createAnchors = function () {\n var _this = this;\n var base = window.location.href;\n if (base.indexOf(\"#\") != -1) {\n base = base.substr(0, base.indexOf(\"#\"));\n }\n this.el.querySelectorAll(\"a\").forEach(function (el) {\n var href = el.href;\n if (href.indexOf(\"#\") == -1)\n return;\n if (href.substr(0, base.length) != base)\n return;\n var hash = href.substr(href.indexOf(\"#\") + 1);\n var anchor = document.querySelector(\"a.tsd-anchor[name=\" + hash + \"]\");\n var link = el.parentNode;\n if (!anchor || !link)\n return;\n _this.anchors.push({\n link: link,\n anchor: anchor,\n position: 0,\n });\n });\n this.onResize();\n };\n /**\n * Triggered after the viewport was resized.\n */\n MenuHighlight.prototype.onResize = function () {\n var anchor;\n for (var index = 0, count = this.anchors.length; index < count; index++) {\n anchor = this.anchors[index];\n var rect = anchor.anchor.getBoundingClientRect();\n anchor.position = rect.top + document.body.scrollTop;\n }\n this.anchors.sort(function (a, b) {\n return a.position - b.position;\n });\n var event = new CustomEvent(\"scroll\", {\n detail: {\n scrollTop: _services_Viewport__WEBPACK_IMPORTED_MODULE_1__.Viewport.instance.scrollTop,\n },\n });\n this.onScroll(event);\n };\n /**\n * Triggered after the viewport was scrolled.\n *\n * @param event The custom event with the current vertical scroll position.\n */\n MenuHighlight.prototype.onScroll = function (event) {\n var scrollTop = event.detail.scrollTop + 5;\n var anchors = this.anchors;\n var count = anchors.length - 1;\n var index = this.index;\n while (index > -1 && anchors[index].position > scrollTop) {\n index -= 1;\n }\n while (index < count && anchors[index + 1].position < scrollTop) {\n index += 1;\n }\n if (this.index != index) {\n if (this.index > -1)\n this.anchors[this.index].link.classList.remove(\"focus\");\n this.index = index;\n if (this.index > -1)\n this.anchors[this.index].link.classList.add(\"focus\");\n }\n };\n return MenuHighlight;\n}(_Component__WEBPACK_IMPORTED_MODULE_0__.Component));\n\n\n\n//# sourceURL=webpack:///./default/assets/js/src/typedoc/components/MenuHighlight.ts?"); - -/***/ }), - -/***/ "./default/assets/js/src/typedoc/components/Search.ts": -/*!************************************************************!*\ - !*** ./default/assets/js/src/typedoc/components/Search.ts ***! - \************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"initSearch\": () => /* binding */ initSearch\n/* harmony export */ });\n/* harmony import */ var _utils_debounce__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../utils/debounce */ \"./default/assets/js/src/typedoc/utils/debounce.ts\");\n/* harmony import */ var lunr__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! lunr */ \"../node_modules/lunr/lunr.js\");\n/* harmony import */ var lunr__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(lunr__WEBPACK_IMPORTED_MODULE_1__);\n\n\nfunction initSearch() {\n var searchEl = document.getElementById(\"tsd-search\");\n if (!searchEl)\n return;\n var searchScript = document.getElementById(\"search-script\");\n searchEl.classList.add(\"loading\");\n if (searchScript) {\n searchScript.addEventListener(\"error\", function () {\n searchEl.classList.remove(\"loading\");\n searchEl.classList.add(\"failure\");\n });\n searchScript.addEventListener(\"load\", function () {\n searchEl.classList.remove(\"loading\");\n searchEl.classList.add(\"ready\");\n });\n if (window.searchData) {\n searchEl.classList.remove(\"loading\");\n }\n }\n var field = document.querySelector(\"#tsd-search-field\");\n var results = document.querySelector(\".results\");\n if (!field || !results) {\n throw new Error(\"The input field or the result list wrapper was not found\");\n }\n var resultClicked = false;\n results.addEventListener(\"mousedown\", function () { return (resultClicked = true); });\n results.addEventListener(\"mouseup\", function () {\n resultClicked = false;\n searchEl.classList.remove(\"has-focus\");\n });\n field.addEventListener(\"focus\", function () { return searchEl.classList.add(\"has-focus\"); });\n field.addEventListener(\"blur\", function () {\n if (!resultClicked) {\n resultClicked = false;\n searchEl.classList.remove(\"has-focus\");\n }\n });\n var state = {\n base: searchEl.dataset.base + \"/\",\n };\n bindEvents(searchEl, results, field, state);\n}\nfunction bindEvents(searchEl, results, field, state) {\n field.addEventListener(\"input\", (0,_utils_debounce__WEBPACK_IMPORTED_MODULE_0__.debounce)(function () {\n updateResults(searchEl, results, field, state);\n }, 200));\n var preventPress = false;\n field.addEventListener(\"keydown\", function (e) {\n preventPress = true;\n if (e.key == \"Enter\") {\n gotoCurrentResult(results, field);\n }\n else if (e.key == \"Escape\") {\n field.blur();\n }\n else if (e.key == \"ArrowUp\") {\n setCurrentResult(results, -1);\n }\n else if (e.key === \"ArrowDown\") {\n setCurrentResult(results, 1);\n }\n else {\n preventPress = false;\n }\n });\n field.addEventListener(\"keypress\", function (e) {\n if (preventPress)\n e.preventDefault();\n });\n /**\n * Start searching by pressing slash.\n */\n document.body.addEventListener(\"keydown\", function (e) {\n if (e.altKey || e.ctrlKey || e.metaKey)\n return;\n if (!field.matches(\":focus\") && e.key === \"/\") {\n field.focus();\n e.preventDefault();\n }\n });\n}\nfunction checkIndex(state, searchEl) {\n if (state.index)\n return;\n if (window.searchData) {\n searchEl.classList.remove(\"loading\");\n searchEl.classList.add(\"ready\");\n state.data = window.searchData;\n state.index = lunr__WEBPACK_IMPORTED_MODULE_1__.Index.load(window.searchData.index);\n }\n}\nfunction updateResults(searchEl, results, query, state) {\n checkIndex(state, searchEl);\n // Don't clear results if loading state is not ready,\n // because loading or error message can be removed.\n if (!state.index || !state.data)\n return;\n results.textContent = \"\";\n var searchText = query.value.trim();\n // Perform a wildcard search\n var res = state.index.search(\"*\" + searchText + \"*\");\n for (var i = 0, c = Math.min(10, res.length); i < c; i++) {\n var row = state.data.rows[Number(res[i].ref)];\n // Bold the matched part of the query in the search results\n var name_1 = boldMatches(row.name, searchText);\n if (row.parent) {\n name_1 = \"\" + boldMatches(row.parent, searchText) + \".\" + name_1;\n }\n var item = document.createElement(\"li\");\n item.classList.value = row.classes;\n var anchor = document.createElement(\"a\");\n anchor.href = state.base + row.url;\n anchor.classList.add(\"tsd-kind-icon\");\n anchor.innerHTML = name_1;\n item.append(anchor);\n results.appendChild(item);\n }\n}\n/**\n * Move the highlight within the result set.\n */\nfunction setCurrentResult(results, dir) {\n var current = results.querySelector(\".current\");\n if (!current) {\n current = results.querySelector(dir == 1 ? \"li:first-child\" : \"li:last-child\");\n if (current) {\n current.classList.add(\"current\");\n }\n }\n else {\n var rel = dir == 1\n ? current.nextElementSibling\n : current.previousElementSibling;\n if (rel) {\n current.classList.remove(\"current\");\n rel.classList.add(\"current\");\n }\n }\n}\n/**\n * Navigate to the highlighted result.\n */\nfunction gotoCurrentResult(results, field) {\n var current = results.querySelector(\".current\");\n if (!current) {\n current = results.querySelector(\"li:first-child\");\n }\n if (current) {\n var link = current.querySelector(\"a\");\n if (link) {\n window.location.href = link.href;\n }\n field.blur();\n }\n}\nfunction boldMatches(text, search) {\n if (search === \"\") {\n return text;\n }\n var lowerText = text.toLocaleLowerCase();\n var lowerSearch = search.toLocaleLowerCase();\n var parts = [];\n var lastIndex = 0;\n var index = lowerText.indexOf(lowerSearch);\n while (index != -1) {\n parts.push(escapeHtml(text.substring(lastIndex, index)), \"\" + escapeHtml(text.substring(index, index + lowerSearch.length)) + \"\");\n lastIndex = index + lowerSearch.length;\n index = lowerText.indexOf(lowerSearch, lastIndex);\n }\n parts.push(escapeHtml(text.substring(lastIndex)));\n return parts.join(\"\");\n}\nvar SPECIAL_HTML = {\n \"&\": \"&\",\n \"<\": \"<\",\n \">\": \">\",\n \"'\": \"'\",\n '\"': \""\",\n};\nfunction escapeHtml(text) {\n return text.replace(/[&<>\"'\"]/g, function (match) { return SPECIAL_HTML[match]; });\n}\n\n\n//# sourceURL=webpack:///./default/assets/js/src/typedoc/components/Search.ts?"); - -/***/ }), - -/***/ "./default/assets/js/src/typedoc/components/Signature.ts": -/*!***************************************************************!*\ - !*** ./default/assets/js/src/typedoc/components/Signature.ts ***! - \***************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"Signature\": () => /* binding */ Signature\n/* harmony export */ });\n/* harmony import */ var _Component__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Component */ \"./default/assets/js/src/typedoc/Component.ts\");\n/* harmony import */ var _services_Viewport__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../services/Viewport */ \"./default/assets/js/src/typedoc/services/Viewport.ts\");\nvar __extends = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\n\n\n/**\n * Holds a signature and its description.\n */\nvar SignatureGroup = /** @class */ (function () {\n /**\n * Create a new SignatureGroup instance.\n *\n * @param signature The target signature.\n * @param description The description for the signature.\n */\n function SignatureGroup(signature, description) {\n this.signature = signature;\n this.description = description;\n }\n /**\n * Add the given class to all elements of the group.\n *\n * @param className The class name to add.\n */\n SignatureGroup.prototype.addClass = function (className) {\n this.signature.classList.add(className);\n this.description.classList.add(className);\n return this;\n };\n /**\n * Remove the given class from all elements of the group.\n *\n * @param className The class name to remove.\n */\n SignatureGroup.prototype.removeClass = function (className) {\n this.signature.classList.remove(className);\n this.description.classList.remove(className);\n return this;\n };\n return SignatureGroup;\n}());\n/**\n * Controls the tab like behaviour of methods and functions with multiple signatures.\n */\nvar Signature = /** @class */ (function (_super) {\n __extends(Signature, _super);\n /**\n * Create a new Signature instance.\n *\n * @param options Backbone view constructor options.\n */\n function Signature(options) {\n var _this = _super.call(this, options) || this;\n /**\n * List of found signature groups.\n */\n _this.groups = [];\n /**\n * The index of the currently displayed signature.\n */\n _this.index = -1;\n _this.createGroups();\n if (_this.container) {\n _this.el.classList.add(\"active\");\n Array.from(_this.el.children).forEach(function (signature) {\n signature.addEventListener(\"touchstart\", function (event) {\n return _this.onClick(event);\n });\n signature.addEventListener(\"click\", function (event) {\n return _this.onClick(event);\n });\n });\n _this.container.classList.add(\"active\");\n _this.setIndex(0);\n }\n return _this;\n }\n /**\n * Set the index of the active signature.\n *\n * @param index The index of the signature to activate.\n */\n Signature.prototype.setIndex = function (index) {\n if (index < 0)\n index = 0;\n if (index > this.groups.length - 1)\n index = this.groups.length - 1;\n if (this.index == index)\n return;\n var to = this.groups[index];\n if (this.index > -1) {\n var from_1 = this.groups[this.index];\n from_1.removeClass(\"current\").addClass(\"fade-out\");\n to.addClass(\"current\");\n to.addClass(\"fade-in\");\n _services_Viewport__WEBPACK_IMPORTED_MODULE_1__.Viewport.instance.triggerResize();\n setTimeout(function () {\n from_1.removeClass(\"fade-out\");\n to.removeClass(\"fade-in\");\n }, 300);\n }\n else {\n to.addClass(\"current\");\n _services_Viewport__WEBPACK_IMPORTED_MODULE_1__.Viewport.instance.triggerResize();\n }\n this.index = index;\n };\n /**\n * Find all signature/description groups.\n */\n Signature.prototype.createGroups = function () {\n var signatures = this.el.children;\n if (signatures.length < 2)\n return;\n this.container = this.el.nextElementSibling;\n var descriptions = this.container.children;\n this.groups = [];\n for (var index = 0; index < signatures.length; index++) {\n this.groups.push(new SignatureGroup(signatures[index], descriptions[index]));\n }\n };\n /**\n * Triggered when the user clicks onto a signature header.\n *\n * @param e The related event object.\n */\n Signature.prototype.onClick = function (e) {\n var _this = this;\n this.groups.forEach(function (group, index) {\n if (group.signature === e.currentTarget) {\n _this.setIndex(index);\n }\n });\n };\n return Signature;\n}(_Component__WEBPACK_IMPORTED_MODULE_0__.Component));\n\n\n\n//# sourceURL=webpack:///./default/assets/js/src/typedoc/components/Signature.ts?"); - -/***/ }), - -/***/ "./default/assets/js/src/typedoc/components/Toggle.ts": -/*!************************************************************!*\ - !*** ./default/assets/js/src/typedoc/components/Toggle.ts ***! - \************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"Toggle\": () => /* binding */ Toggle\n/* harmony export */ });\n/* harmony import */ var _Component__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../Component */ \"./default/assets/js/src/typedoc/Component.ts\");\n/* harmony import */ var _utils_pointer__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../utils/pointer */ \"./default/assets/js/src/typedoc/utils/pointer.ts\");\nvar __extends = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\n\n\nvar Toggle = /** @class */ (function (_super) {\n __extends(Toggle, _super);\n function Toggle(options) {\n var _this = _super.call(this, options) || this;\n _this.className = _this.el.dataset.toggle || \"\";\n _this.el.addEventListener(_utils_pointer__WEBPACK_IMPORTED_MODULE_1__.pointerUp, function (e) { return _this.onPointerUp(e); });\n _this.el.addEventListener(\"click\", function (e) { return e.preventDefault(); });\n document.addEventListener(_utils_pointer__WEBPACK_IMPORTED_MODULE_1__.pointerDown, function (e) {\n return _this.onDocumentPointerDown(e);\n });\n document.addEventListener(_utils_pointer__WEBPACK_IMPORTED_MODULE_1__.pointerUp, function (e) {\n return _this.onDocumentPointerUp(e);\n });\n return _this;\n }\n Toggle.prototype.setActive = function (value) {\n if (this.active == value)\n return;\n this.active = value;\n document.documentElement.classList.toggle(\"has-\" + this.className, value);\n this.el.classList.toggle(\"active\", value);\n var transition = (this.active ? \"to-has-\" : \"from-has-\") + this.className;\n document.documentElement.classList.add(transition);\n setTimeout(function () { return document.documentElement.classList.remove(transition); }, 500);\n };\n Toggle.prototype.onPointerUp = function (event) {\n if (_utils_pointer__WEBPACK_IMPORTED_MODULE_1__.hasPointerMoved)\n return;\n this.setActive(true);\n event.preventDefault();\n };\n Toggle.prototype.onDocumentPointerDown = function (e) {\n if (this.active) {\n if (e.target.closest(\".col-menu, .tsd-filter-group\")) {\n return;\n }\n this.setActive(false);\n }\n };\n Toggle.prototype.onDocumentPointerUp = function (e) {\n var _this = this;\n if (_utils_pointer__WEBPACK_IMPORTED_MODULE_1__.hasPointerMoved)\n return;\n if (this.active) {\n if (e.target.closest(\".col-menu\")) {\n var link = e.target.closest(\"a\");\n if (link) {\n var href = window.location.href;\n if (href.indexOf(\"#\") != -1) {\n href = href.substr(0, href.indexOf(\"#\"));\n }\n if (link.href.substr(0, href.length) == href) {\n setTimeout(function () { return _this.setActive(false); }, 250);\n }\n }\n }\n }\n };\n return Toggle;\n}(_Component__WEBPACK_IMPORTED_MODULE_0__.Component));\n\n\n\n//# sourceURL=webpack:///./default/assets/js/src/typedoc/components/Toggle.ts?"); - -/***/ }), - -/***/ "./default/assets/js/src/typedoc/services/Viewport.ts": -/*!************************************************************!*\ - !*** ./default/assets/js/src/typedoc/services/Viewport.ts ***! - \************************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"Viewport\": () => /* binding */ Viewport\n/* harmony export */ });\n/* harmony import */ var _EventTarget__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../EventTarget */ \"./default/assets/js/src/typedoc/EventTarget.ts\");\n/* harmony import */ var _utils_trottle__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../utils/trottle */ \"./default/assets/js/src/typedoc/utils/trottle.ts\");\nvar __extends = (undefined && undefined.__extends) || (function () {\n var extendStatics = function (d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n };\n return function (d, b) {\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n };\n})();\n\n\n/**\n * A global service that monitors the window size and scroll position.\n */\nvar Viewport = /** @class */ (function (_super) {\n __extends(Viewport, _super);\n /**\n * Create new Viewport instance.\n */\n function Viewport() {\n var _this = _super.call(this) || this;\n /**\n * The current scroll position.\n */\n _this.scrollTop = 0;\n /**\n * The previous scrollTop.\n */\n _this.lastY = 0;\n /**\n * The width of the window.\n */\n _this.width = 0;\n /**\n * The height of the window.\n */\n _this.height = 0;\n /**\n * Boolean indicating whether the toolbar is shown.\n */\n _this.showToolbar = true;\n _this.toolbar = (document.querySelector(\".tsd-page-toolbar\"));\n _this.secondaryNav = (document.querySelector(\".tsd-navigation.secondary\"));\n window.addEventListener(\"scroll\", (0,_utils_trottle__WEBPACK_IMPORTED_MODULE_1__.throttle)(function () { return _this.onScroll(); }, 10));\n window.addEventListener(\"resize\", (0,_utils_trottle__WEBPACK_IMPORTED_MODULE_1__.throttle)(function () { return _this.onResize(); }, 10));\n _this.onResize();\n _this.onScroll();\n return _this;\n }\n /**\n * Trigger a resize event.\n */\n Viewport.prototype.triggerResize = function () {\n var event = new CustomEvent(\"resize\", {\n detail: {\n width: this.width,\n height: this.height,\n },\n });\n this.dispatchEvent(event);\n };\n /**\n * Triggered when the size of the window has changed.\n */\n Viewport.prototype.onResize = function () {\n this.width = window.innerWidth || 0;\n this.height = window.innerHeight || 0;\n var event = new CustomEvent(\"resize\", {\n detail: {\n width: this.width,\n height: this.height,\n },\n });\n this.dispatchEvent(event);\n };\n /**\n * Triggered when the user scrolled the viewport.\n */\n Viewport.prototype.onScroll = function () {\n this.scrollTop = window.scrollY || 0;\n var event = new CustomEvent(\"scroll\", {\n detail: {\n scrollTop: this.scrollTop,\n },\n });\n this.dispatchEvent(event);\n this.hideShowToolbar();\n };\n /**\n * Handle hiding/showing of the toolbar.\n */\n Viewport.prototype.hideShowToolbar = function () {\n var isShown = this.showToolbar;\n this.showToolbar = this.lastY >= this.scrollTop || this.scrollTop <= 0;\n if (isShown !== this.showToolbar) {\n this.toolbar.classList.toggle(\"tsd-page-toolbar--hide\");\n this.secondaryNav.classList.toggle(\"tsd-navigation--toolbar-hide\");\n }\n this.lastY = this.scrollTop;\n };\n Viewport.instance = new Viewport();\n return Viewport;\n}(_EventTarget__WEBPACK_IMPORTED_MODULE_0__.EventTarget));\n\n\n\n//# sourceURL=webpack:///./default/assets/js/src/typedoc/services/Viewport.ts?"); - -/***/ }), - -/***/ "./default/assets/js/src/typedoc/utils/debounce.ts": -/*!*********************************************************!*\ - !*** ./default/assets/js/src/typedoc/utils/debounce.ts ***! - \*********************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"debounce\": () => /* binding */ debounce\n/* harmony export */ });\nvar debounce = function (fn, wait) {\n if (wait === void 0) { wait = 100; }\n var timeout;\n return function () {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n clearTimeout(timeout);\n timeout = setTimeout(function () { return fn(args); }, wait);\n };\n};\n\n\n//# sourceURL=webpack:///./default/assets/js/src/typedoc/utils/debounce.ts?"); - -/***/ }), - -/***/ "./default/assets/js/src/typedoc/utils/pointer.ts": -/*!********************************************************!*\ - !*** ./default/assets/js/src/typedoc/utils/pointer.ts ***! - \********************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"pointerDown\": () => /* binding */ pointerDown,\n/* harmony export */ \"pointerMove\": () => /* binding */ pointerMove,\n/* harmony export */ \"pointerUp\": () => /* binding */ pointerUp,\n/* harmony export */ \"pointerDownPosition\": () => /* binding */ pointerDownPosition,\n/* harmony export */ \"preventNextClick\": () => /* binding */ preventNextClick,\n/* harmony export */ \"isPointerDown\": () => /* binding */ isPointerDown,\n/* harmony export */ \"isPointerTouch\": () => /* binding */ isPointerTouch,\n/* harmony export */ \"hasPointerMoved\": () => /* binding */ hasPointerMoved,\n/* harmony export */ \"isMobile\": () => /* binding */ isMobile\n/* harmony export */ });\n/**\n * Event name of the pointer down event.\n */\nvar pointerDown = \"mousedown\";\n/**\n * Event name of the pointer move event.\n */\nvar pointerMove = \"mousemove\";\n/**\n * Event name of the pointer up event.\n */\nvar pointerUp = \"mouseup\";\n/**\n * Position the pointer was pressed at.\n */\nvar pointerDownPosition = { x: 0, y: 0 };\n/**\n * Should the next click on the document be supressed?\n */\nvar preventNextClick = false;\n/**\n * Is the pointer down?\n */\nvar isPointerDown = false;\n/**\n * Is the pointer a touch point?\n */\nvar isPointerTouch = false;\n/**\n * Did the pointer move since the last down event?\n */\nvar hasPointerMoved = false;\n/**\n * Is the user agent a mobile agent?\n */\nvar isMobile = /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);\ndocument.documentElement.classList.add(isMobile ? \"is-mobile\" : \"not-mobile\");\nif (isMobile && \"ontouchstart\" in document.documentElement) {\n isPointerTouch = true;\n pointerDown = \"touchstart\";\n pointerMove = \"touchmove\";\n pointerUp = \"touchend\";\n}\ndocument.addEventListener(pointerDown, function (e) {\n isPointerDown = true;\n hasPointerMoved = false;\n var t = pointerDown == \"touchstart\"\n ? e.targetTouches[0]\n : e;\n pointerDownPosition.y = t.pageY || 0;\n pointerDownPosition.x = t.pageX || 0;\n});\ndocument.addEventListener(pointerMove, function (e) {\n if (!isPointerDown)\n return;\n if (!hasPointerMoved) {\n var t = pointerDown == \"touchstart\"\n ? e.targetTouches[0]\n : e;\n var x = pointerDownPosition.x - (t.pageX || 0);\n var y = pointerDownPosition.y - (t.pageY || 0);\n hasPointerMoved = Math.sqrt(x * x + y * y) > 10;\n }\n});\ndocument.addEventListener(pointerUp, function () {\n isPointerDown = false;\n});\ndocument.addEventListener(\"click\", function (e) {\n if (preventNextClick) {\n e.preventDefault();\n e.stopImmediatePropagation();\n preventNextClick = false;\n }\n});\n\n\n//# sourceURL=webpack:///./default/assets/js/src/typedoc/utils/pointer.ts?"); - -/***/ }), - -/***/ "./default/assets/js/src/typedoc/utils/trottle.ts": -/*!********************************************************!*\ - !*** ./default/assets/js/src/typedoc/utils/trottle.ts ***! - \********************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -"use strict"; -eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ \"throttle\": () => /* binding */ throttle\n/* harmony export */ });\nvar throttle = function (fn, wait) {\n if (wait === void 0) { wait = 100; }\n var time = Date.now();\n return function () {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n if (time + wait - Date.now() < 0) {\n fn.apply(void 0, args);\n time = Date.now();\n }\n };\n};\n\n\n//# sourceURL=webpack:///./default/assets/js/src/typedoc/utils/trottle.ts?"); - -/***/ }) - -/******/ }); -/************************************************************************/ -/******/ // The module cache -/******/ var __webpack_module_cache__ = {}; -/******/ -/******/ // The require function -/******/ function __webpack_require__(moduleId) { -/******/ // Check if module is in cache -/******/ if(__webpack_module_cache__[moduleId]) { -/******/ return __webpack_module_cache__[moduleId].exports; -/******/ } -/******/ // Create a new module (and put it into the cache) -/******/ var module = __webpack_module_cache__[moduleId] = { -/******/ // no module.id needed -/******/ // no module.loaded needed -/******/ exports: {} -/******/ }; -/******/ -/******/ // Execute the module function -/******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__); -/******/ -/******/ // Return the exports of the module -/******/ return module.exports; -/******/ } -/******/ -/************************************************************************/ -/******/ /* webpack/runtime/compat get default export */ -/******/ (() => { -/******/ // getDefaultExport function for compatibility with non-harmony modules -/******/ __webpack_require__.n = (module) => { -/******/ var getter = module && module.__esModule ? -/******/ () => module['default'] : -/******/ () => module; -/******/ __webpack_require__.d(getter, { a: getter }); -/******/ return getter; -/******/ }; -/******/ })(); -/******/ -/******/ /* webpack/runtime/define property getters */ -/******/ (() => { -/******/ // define getter functions for harmony exports -/******/ __webpack_require__.d = (exports, definition) => { -/******/ for(var key in definition) { -/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) { -/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] }); -/******/ } -/******/ } -/******/ }; -/******/ })(); -/******/ -/******/ /* webpack/runtime/hasOwnProperty shorthand */ -/******/ (() => { -/******/ __webpack_require__.o = (obj, prop) => Object.prototype.hasOwnProperty.call(obj, prop) -/******/ })(); -/******/ -/******/ /* webpack/runtime/make namespace object */ -/******/ (() => { -/******/ // define __esModule on exports -/******/ __webpack_require__.r = (exports) => { -/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { -/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); -/******/ } -/******/ Object.defineProperty(exports, '__esModule', { value: true }); -/******/ }; -/******/ })(); -/******/ -/************************************************************************/ -/******/ // startup -/******/ // Load entry module -/******/ __webpack_require__("./default/assets/js/src/bootstrap.ts"); -/******/ // This entry module used 'exports' so it can't be inlined -/******/ })() -; \ No newline at end of file diff --git a/docs/assets/main.js b/docs/assets/main.js new file mode 100644 index 00000000..21898f46 --- /dev/null +++ b/docs/assets/main.js @@ -0,0 +1,52 @@ +(()=>{var Ce=Object.create;var J=Object.defineProperty;var Pe=Object.getOwnPropertyDescriptor;var Oe=Object.getOwnPropertyNames;var Re=Object.getPrototypeOf,_e=Object.prototype.hasOwnProperty;var Me=t=>J(t,"__esModule",{value:!0});var $e=typeof require!="undefined"?require:t=>{throw new Error('Dynamic require of "'+t+'" is not supported')};var Fe=(t,e)=>()=>(e||t((e={exports:{}}).exports,e),e.exports);var De=(t,e,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of Oe(e))!_e.call(t,n)&&n!=="default"&&J(t,n,{get:()=>e[n],enumerable:!(r=Pe(e,n))||r.enumerable});return t},Ae=t=>De(Me(J(t!=null?Ce(Re(t)):{},"default",t&&t.__esModule&&"default"in t?{get:()=>t.default,enumerable:!0}:{value:t,enumerable:!0})),t);var de=Fe((ue,he)=>{(function(){var t=function(e){var r=new t.Builder;return r.pipeline.add(t.trimmer,t.stopWordFilter,t.stemmer),r.searchPipeline.add(t.stemmer),e.call(r,r),r.build()};t.version="2.3.9";t.utils={},t.utils.warn=function(e){return function(r){e.console&&console.warn&&console.warn(r)}}(this),t.utils.asString=function(e){return e==null?"":e.toString()},t.utils.clone=function(e){if(e==null)return e;for(var r=Object.create(null),n=Object.keys(e),i=0;i0){var h=t.utils.clone(r)||{};h.position=[a,l],h.index=s.length,s.push(new t.Token(n.slice(a,o),h))}a=o+1}}return s},t.tokenizer.separator=/[\s\-]+/;t.Pipeline=function(){this._stack=[]},t.Pipeline.registeredFunctions=Object.create(null),t.Pipeline.registerFunction=function(e,r){r in this.registeredFunctions&&t.utils.warn("Overwriting existing registered function: "+r),e.label=r,t.Pipeline.registeredFunctions[e.label]=e},t.Pipeline.warnIfFunctionNotRegistered=function(e){var r=e.label&&e.label in this.registeredFunctions;r||t.utils.warn(`Function is not registered with pipeline. This may cause problems when serialising the index. +`,e)},t.Pipeline.load=function(e){var r=new t.Pipeline;return e.forEach(function(n){var i=t.Pipeline.registeredFunctions[n];if(i)r.add(i);else throw new Error("Cannot load unregistered function: "+n)}),r},t.Pipeline.prototype.add=function(){var e=Array.prototype.slice.call(arguments);e.forEach(function(r){t.Pipeline.warnIfFunctionNotRegistered(r),this._stack.push(r)},this)},t.Pipeline.prototype.after=function(e,r){t.Pipeline.warnIfFunctionNotRegistered(r);var n=this._stack.indexOf(e);if(n==-1)throw new Error("Cannot find existingFn");n=n+1,this._stack.splice(n,0,r)},t.Pipeline.prototype.before=function(e,r){t.Pipeline.warnIfFunctionNotRegistered(r);var n=this._stack.indexOf(e);if(n==-1)throw new Error("Cannot find existingFn");this._stack.splice(n,0,r)},t.Pipeline.prototype.remove=function(e){var r=this._stack.indexOf(e);r!=-1&&this._stack.splice(r,1)},t.Pipeline.prototype.run=function(e){for(var r=this._stack.length,n=0;n1&&(oe&&(n=s),o!=e);)i=n-r,s=r+Math.floor(i/2),o=this.elements[s*2];if(o==e||o>e)return s*2;if(oc?h+=2:a==c&&(r+=n[l+1]*i[h+1],l+=2,h+=2);return r},t.Vector.prototype.similarity=function(e){return this.dot(e)/this.magnitude()||0},t.Vector.prototype.toArray=function(){for(var e=new Array(this.elements.length/2),r=1,n=0;r0){var o=s.str.charAt(0),a;o in s.node.edges?a=s.node.edges[o]:(a=new t.TokenSet,s.node.edges[o]=a),s.str.length==1&&(a.final=!0),i.push({node:a,editsRemaining:s.editsRemaining,str:s.str.slice(1)})}if(s.editsRemaining!=0){if("*"in s.node.edges)var c=s.node.edges["*"];else{var c=new t.TokenSet;s.node.edges["*"]=c}if(s.str.length==0&&(c.final=!0),i.push({node:c,editsRemaining:s.editsRemaining-1,str:s.str}),s.str.length>1&&i.push({node:s.node,editsRemaining:s.editsRemaining-1,str:s.str.slice(1)}),s.str.length==1&&(s.node.final=!0),s.str.length>=1){if("*"in s.node.edges)var l=s.node.edges["*"];else{var l=new t.TokenSet;s.node.edges["*"]=l}s.str.length==1&&(l.final=!0),i.push({node:l,editsRemaining:s.editsRemaining-1,str:s.str.slice(1)})}if(s.str.length>1){var h=s.str.charAt(0),f=s.str.charAt(1),v;f in s.node.edges?v=s.node.edges[f]:(v=new t.TokenSet,s.node.edges[f]=v),s.str.length==1&&(v.final=!0),i.push({node:v,editsRemaining:s.editsRemaining-1,str:h+s.str.slice(2)})}}}return n},t.TokenSet.fromString=function(e){for(var r=new t.TokenSet,n=r,i=0,s=e.length;i=e;r--){var n=this.uncheckedNodes[r],i=n.child.toString();i in this.minimizedNodes?n.parent.edges[n.char]=this.minimizedNodes[i]:(n.child._str=i,this.minimizedNodes[i]=n.child),this.uncheckedNodes.pop()}};t.Index=function(e){this.invertedIndex=e.invertedIndex,this.fieldVectors=e.fieldVectors,this.tokenSet=e.tokenSet,this.fields=e.fields,this.pipeline=e.pipeline},t.Index.prototype.search=function(e){return this.query(function(r){var n=new t.QueryParser(e,r);n.parse()})},t.Index.prototype.query=function(e){for(var r=new t.Query(this.fields),n=Object.create(null),i=Object.create(null),s=Object.create(null),o=Object.create(null),a=Object.create(null),c=0;c1?this._b=1:this._b=e},t.Builder.prototype.k1=function(e){this._k1=e},t.Builder.prototype.add=function(e,r){var n=e[this._ref],i=Object.keys(this._fields);this._documents[n]=r||{},this.documentCount+=1;for(var s=0;s=this.length)return t.QueryLexer.EOS;var e=this.str.charAt(this.pos);return this.pos+=1,e},t.QueryLexer.prototype.width=function(){return this.pos-this.start},t.QueryLexer.prototype.ignore=function(){this.start==this.pos&&(this.pos+=1),this.start=this.pos},t.QueryLexer.prototype.backup=function(){this.pos-=1},t.QueryLexer.prototype.acceptDigitRun=function(){var e,r;do e=this.next(),r=e.charCodeAt(0);while(r>47&&r<58);e!=t.QueryLexer.EOS&&this.backup()},t.QueryLexer.prototype.more=function(){return this.pos1&&(e.backup(),e.emit(t.QueryLexer.TERM)),e.ignore(),e.more())return t.QueryLexer.lexText},t.QueryLexer.lexEditDistance=function(e){return e.ignore(),e.acceptDigitRun(),e.emit(t.QueryLexer.EDIT_DISTANCE),t.QueryLexer.lexText},t.QueryLexer.lexBoost=function(e){return e.ignore(),e.acceptDigitRun(),e.emit(t.QueryLexer.BOOST),t.QueryLexer.lexText},t.QueryLexer.lexEOS=function(e){e.width()>0&&e.emit(t.QueryLexer.TERM)},t.QueryLexer.termSeparator=t.tokenizer.separator,t.QueryLexer.lexText=function(e){for(;;){var r=e.next();if(r==t.QueryLexer.EOS)return t.QueryLexer.lexEOS;if(r.charCodeAt(0)==92){e.escapeCharacter();continue}if(r==":")return t.QueryLexer.lexField;if(r=="~")return e.backup(),e.width()>0&&e.emit(t.QueryLexer.TERM),t.QueryLexer.lexEditDistance;if(r=="^")return e.backup(),e.width()>0&&e.emit(t.QueryLexer.TERM),t.QueryLexer.lexBoost;if(r=="+"&&e.width()===1||r=="-"&&e.width()===1)return e.emit(t.QueryLexer.PRESENCE),t.QueryLexer.lexText;if(r.match(t.QueryLexer.termSeparator))return t.QueryLexer.lexTerm}},t.QueryParser=function(e,r){this.lexer=new t.QueryLexer(e),this.query=r,this.currentClause={},this.lexemeIdx=0},t.QueryParser.prototype.parse=function(){this.lexer.run(),this.lexemes=this.lexer.lexemes;for(var e=t.QueryParser.parseClause;e;)e=e(this);return this.query},t.QueryParser.prototype.peekLexeme=function(){return this.lexemes[this.lexemeIdx]},t.QueryParser.prototype.consumeLexeme=function(){var e=this.peekLexeme();return this.lexemeIdx+=1,e},t.QueryParser.prototype.nextClause=function(){var e=this.currentClause;this.query.clause(e),this.currentClause={}},t.QueryParser.parseClause=function(e){var r=e.peekLexeme();if(r!=null)switch(r.type){case t.QueryLexer.PRESENCE:return t.QueryParser.parsePresence;case t.QueryLexer.FIELD:return t.QueryParser.parseField;case t.QueryLexer.TERM:return t.QueryParser.parseTerm;default:var n="expected either a field or a term, found "+r.type;throw r.str.length>=1&&(n+=" with value '"+r.str+"'"),new t.QueryParseError(n,r.start,r.end)}},t.QueryParser.parsePresence=function(e){var r=e.consumeLexeme();if(r!=null){switch(r.str){case"-":e.currentClause.presence=t.Query.presence.PROHIBITED;break;case"+":e.currentClause.presence=t.Query.presence.REQUIRED;break;default:var n="unrecognised presence operator'"+r.str+"'";throw new t.QueryParseError(n,r.start,r.end)}var i=e.peekLexeme();if(i==null){var n="expecting term or field, found nothing";throw new t.QueryParseError(n,r.start,r.end)}switch(i.type){case t.QueryLexer.FIELD:return t.QueryParser.parseField;case t.QueryLexer.TERM:return t.QueryParser.parseTerm;default:var n="expecting term or field, found '"+i.type+"'";throw new t.QueryParseError(n,i.start,i.end)}}},t.QueryParser.parseField=function(e){var r=e.consumeLexeme();if(r!=null){if(e.query.allFields.indexOf(r.str)==-1){var n=e.query.allFields.map(function(o){return"'"+o+"'"}).join(", "),i="unrecognised field '"+r.str+"', possible fields: "+n;throw new t.QueryParseError(i,r.start,r.end)}e.currentClause.fields=[r.str];var s=e.peekLexeme();if(s==null){var i="expecting term, found nothing";throw new t.QueryParseError(i,r.start,r.end)}switch(s.type){case t.QueryLexer.TERM:return t.QueryParser.parseTerm;default:var i="expecting term, found '"+s.type+"'";throw new t.QueryParseError(i,s.start,s.end)}}},t.QueryParser.parseTerm=function(e){var r=e.consumeLexeme();if(r!=null){e.currentClause.term=r.str.toLowerCase(),r.str.indexOf("*")!=-1&&(e.currentClause.usePipeline=!1);var n=e.peekLexeme();if(n==null){e.nextClause();return}switch(n.type){case t.QueryLexer.TERM:return e.nextClause(),t.QueryParser.parseTerm;case t.QueryLexer.FIELD:return e.nextClause(),t.QueryParser.parseField;case t.QueryLexer.EDIT_DISTANCE:return t.QueryParser.parseEditDistance;case t.QueryLexer.BOOST:return t.QueryParser.parseBoost;case t.QueryLexer.PRESENCE:return e.nextClause(),t.QueryParser.parsePresence;default:var i="Unexpected lexeme type '"+n.type+"'";throw new t.QueryParseError(i,n.start,n.end)}}},t.QueryParser.parseEditDistance=function(e){var r=e.consumeLexeme();if(r!=null){var n=parseInt(r.str,10);if(isNaN(n)){var i="edit distance must be numeric";throw new t.QueryParseError(i,r.start,r.end)}e.currentClause.editDistance=n;var s=e.peekLexeme();if(s==null){e.nextClause();return}switch(s.type){case t.QueryLexer.TERM:return e.nextClause(),t.QueryParser.parseTerm;case t.QueryLexer.FIELD:return e.nextClause(),t.QueryParser.parseField;case t.QueryLexer.EDIT_DISTANCE:return t.QueryParser.parseEditDistance;case t.QueryLexer.BOOST:return t.QueryParser.parseBoost;case t.QueryLexer.PRESENCE:return e.nextClause(),t.QueryParser.parsePresence;default:var i="Unexpected lexeme type '"+s.type+"'";throw new t.QueryParseError(i,s.start,s.end)}}},t.QueryParser.parseBoost=function(e){var r=e.consumeLexeme();if(r!=null){var n=parseInt(r.str,10);if(isNaN(n)){var i="boost must be numeric";throw new t.QueryParseError(i,r.start,r.end)}e.currentClause.boost=n;var s=e.peekLexeme();if(s==null){e.nextClause();return}switch(s.type){case t.QueryLexer.TERM:return e.nextClause(),t.QueryParser.parseTerm;case t.QueryLexer.FIELD:return e.nextClause(),t.QueryParser.parseField;case t.QueryLexer.EDIT_DISTANCE:return t.QueryParser.parseEditDistance;case t.QueryLexer.BOOST:return t.QueryParser.parseBoost;case t.QueryLexer.PRESENCE:return e.nextClause(),t.QueryParser.parsePresence;default:var i="Unexpected lexeme type '"+s.type+"'";throw new t.QueryParseError(i,s.start,s.end)}}},function(e,r){typeof define=="function"&&define.amd?define(r):typeof ue=="object"?he.exports=r():e.lunr=r()}(this,function(){return t})})()});var le=[];function N(t,e){le.push({selector:e,constructor:t})}var X=class{constructor(){this.createComponents(document.body)}createComponents(e){le.forEach(r=>{e.querySelectorAll(r.selector).forEach(n=>{n.dataset.hasInstance||(new r.constructor({el:n}),n.dataset.hasInstance=String(!0))})})}};var Q=class{constructor(e){this.el=e.el}};var Z=class{constructor(){this.listeners={}}addEventListener(e,r){e in this.listeners||(this.listeners[e]=[]),this.listeners[e].push(r)}removeEventListener(e,r){if(!(e in this.listeners))return;let n=this.listeners[e];for(let i=0,s=n.length;i{let r=Date.now();return(...n)=>{r+e-Date.now()<0&&(t(...n),r=Date.now())}};var ee=class extends Z{constructor(){super();this.scrollTop=0;this.lastY=0;this.width=0;this.height=0;this.showToolbar=!0;this.toolbar=document.querySelector(".tsd-page-toolbar"),this.secondaryNav=document.querySelector(".tsd-navigation.secondary"),window.addEventListener("scroll",K(()=>this.onScroll(),10)),window.addEventListener("resize",K(()=>this.onResize(),10)),this.onResize(),this.onScroll()}triggerResize(){let e=new CustomEvent("resize",{detail:{width:this.width,height:this.height}});this.dispatchEvent(e)}onResize(){this.width=window.innerWidth||0,this.height=window.innerHeight||0;let e=new CustomEvent("resize",{detail:{width:this.width,height:this.height}});this.dispatchEvent(e)}onScroll(){this.scrollTop=window.scrollY||0;let e=new CustomEvent("scroll",{detail:{scrollTop:this.scrollTop}});this.dispatchEvent(e),this.hideShowToolbar()}hideShowToolbar(){let e=this.showToolbar;this.showToolbar=this.lastY>=this.scrollTop||this.scrollTop<=0,e!==this.showToolbar&&(this.toolbar.classList.toggle("tsd-page-toolbar--hide"),this.secondaryNav.classList.toggle("tsd-navigation--toolbar-hide")),this.lastY=this.scrollTop}},I=ee;I.instance=new ee;var te=class extends Q{constructor(e){super(e);this.anchors=[];this.index=-1;I.instance.addEventListener("resize",()=>this.onResize()),I.instance.addEventListener("scroll",r=>this.onScroll(r)),this.createAnchors()}createAnchors(){let e=window.location.href;e.indexOf("#")!=-1&&(e=e.substr(0,e.indexOf("#"))),this.el.querySelectorAll("a").forEach(r=>{let n=r.href;if(n.indexOf("#")==-1||n.substr(0,e.length)!=e)return;let i=n.substr(n.indexOf("#")+1),s=document.querySelector("a.tsd-anchor[name="+i+"]"),o=r.parentNode;!s||!o||this.anchors.push({link:o,anchor:s,position:0})}),this.onResize()}onResize(){let e;for(let n=0,i=this.anchors.length;nn.position-i.position);let r=new CustomEvent("scroll",{detail:{scrollTop:I.instance.scrollTop}});this.onScroll(r)}onScroll(e){let r=e.detail.scrollTop+5,n=this.anchors,i=n.length-1,s=this.index;for(;s>-1&&n[s].position>r;)s-=1;for(;s-1&&this.anchors[this.index].link.classList.remove("focus"),this.index=s,this.index>-1&&this.anchors[this.index].link.classList.add("focus"))}};var ce=(t,e=100)=>{let r;return(...n)=>{clearTimeout(r),r=setTimeout(()=>t(n),e)}};var pe=Ae(de());function fe(){let t=document.getElementById("tsd-search");if(!t)return;let e=document.getElementById("search-script");t.classList.add("loading"),e&&(e.addEventListener("error",()=>{t.classList.remove("loading"),t.classList.add("failure")}),e.addEventListener("load",()=>{t.classList.remove("loading"),t.classList.add("ready")}),window.searchData&&t.classList.remove("loading"));let r=document.querySelector("#tsd-search input"),n=document.querySelector("#tsd-search .results");if(!r||!n)throw new Error("The input field or the result list wrapper was not found");let i=!1;n.addEventListener("mousedown",()=>i=!0),n.addEventListener("mouseup",()=>{i=!1,t.classList.remove("has-focus")}),r.addEventListener("focus",()=>t.classList.add("has-focus")),r.addEventListener("blur",()=>{i||(i=!1,t.classList.remove("has-focus"))});let s={base:t.dataset.base+"/"};Ve(t,n,r,s)}function Ve(t,e,r,n){r.addEventListener("input",ce(()=>{ze(t,e,r,n)},200));let i=!1;r.addEventListener("keydown",s=>{i=!0,s.key=="Enter"?Ne(e,r):s.key=="Escape"?r.blur():s.key=="ArrowUp"?me(e,-1):s.key==="ArrowDown"?me(e,1):i=!1}),r.addEventListener("keypress",s=>{i&&s.preventDefault()}),document.body.addEventListener("keydown",s=>{s.altKey||s.ctrlKey||s.metaKey||!r.matches(":focus")&&s.key==="/"&&(r.focus(),s.preventDefault())})}function He(t,e){t.index||window.searchData&&(e.classList.remove("loading"),e.classList.add("ready"),t.data=window.searchData,t.index=pe.Index.load(window.searchData.index))}function ze(t,e,r,n){if(He(n,t),!n.index||!n.data)return;e.textContent="";let i=r.value.trim(),s=n.index.search(`*${i}*`);for(let o=0,a=Math.min(10,s.length);o${ve(c.parent,i)}.${l}`);let h=document.createElement("li");h.classList.value=c.classes;let f=document.createElement("a");f.href=n.base+c.url,f.classList.add("tsd-kind-icon"),f.innerHTML=l,h.append(f),e.appendChild(h)}}function me(t,e){let r=t.querySelector(".current");if(!r)r=t.querySelector(e==1?"li:first-child":"li:last-child"),r&&r.classList.add("current");else{let n=r;if(e===1)do n=n.nextElementSibling;while(n instanceof HTMLElement&&n.offsetParent==null);else do n=n.previousElementSibling;while(n instanceof HTMLElement&&n.offsetParent==null);n&&(r.classList.remove("current"),n.classList.add("current"))}}function Ne(t,e){let r=t.querySelector(".current");if(r||(r=t.querySelector("li:first-child")),r){let n=r.querySelector("a");n&&(window.location.href=n.href),e.blur()}}function ve(t,e){if(e==="")return t;let r=t.toLocaleLowerCase(),n=e.toLocaleLowerCase(),i=[],s=0,o=r.indexOf(n);for(;o!=-1;)i.push(re(t.substring(s,o)),`${re(t.substring(o,o+n.length))}`),s=o+n.length,o=r.indexOf(n,s);return i.push(re(t.substring(s))),i.join("")}var je={"&":"&","<":"<",">":">","'":"'",'"':"""};function re(t){return t.replace(/[&<>"'"]/g,e=>je[e])}var ge=class{constructor(e,r){this.signature=e,this.description=r}addClass(e){return this.signature.classList.add(e),this.description.classList.add(e),this}removeClass(e){return this.signature.classList.remove(e),this.description.classList.remove(e),this}},ne=class extends Q{constructor(e){super(e);this.groups=[];this.index=-1;this.createGroups(),this.container&&(this.el.classList.add("active"),Array.from(this.el.children).forEach(r=>{r.addEventListener("touchstart",n=>this.onClick(n)),r.addEventListener("click",n=>this.onClick(n))}),this.container.classList.add("active"),this.setIndex(0))}setIndex(e){if(e<0&&(e=0),e>this.groups.length-1&&(e=this.groups.length-1),this.index==e)return;let r=this.groups[e];if(this.index>-1){let n=this.groups[this.index];n.removeClass("current").addClass("fade-out"),r.addClass("current"),r.addClass("fade-in"),I.instance.triggerResize(),setTimeout(()=>{n.removeClass("fade-out"),r.removeClass("fade-in")},300)}else r.addClass("current"),I.instance.triggerResize();this.index=e}createGroups(){let e=this.el.children;if(e.length<2)return;this.container=this.el.nextElementSibling;let r=this.container.children;this.groups=[];for(let n=0;n{r.signature===e.currentTarget&&this.setIndex(n)})}};var C="mousedown",ye="mousemove",_="mouseup",G={x:0,y:0},xe=!1,ie=!1,Be=!1,A=!1,Le=/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);document.documentElement.classList.add(Le?"is-mobile":"not-mobile");Le&&"ontouchstart"in document.documentElement&&(Be=!0,C="touchstart",ye="touchmove",_="touchend");document.addEventListener(C,t=>{ie=!0,A=!1;let e=C=="touchstart"?t.targetTouches[0]:t;G.y=e.pageY||0,G.x=e.pageX||0});document.addEventListener(ye,t=>{if(!!ie&&!A){let e=C=="touchstart"?t.targetTouches[0]:t,r=G.x-(e.pageX||0),n=G.y-(e.pageY||0);A=Math.sqrt(r*r+n*n)>10}});document.addEventListener(_,()=>{ie=!1});document.addEventListener("click",t=>{xe&&(t.preventDefault(),t.stopImmediatePropagation(),xe=!1)});var se=class extends Q{constructor(e){super(e);this.className=this.el.dataset.toggle||"",this.el.addEventListener(_,r=>this.onPointerUp(r)),this.el.addEventListener("click",r=>r.preventDefault()),document.addEventListener(C,r=>this.onDocumentPointerDown(r)),document.addEventListener(_,r=>this.onDocumentPointerUp(r))}setActive(e){if(this.active==e)return;this.active=e,document.documentElement.classList.toggle("has-"+this.className,e),this.el.classList.toggle("active",e);let r=(this.active?"to-has-":"from-has-")+this.className;document.documentElement.classList.add(r),setTimeout(()=>document.documentElement.classList.remove(r),500)}onPointerUp(e){A||(this.setActive(!0),e.preventDefault())}onDocumentPointerDown(e){if(this.active){if(e.target.closest(".col-menu, .tsd-filter-group"))return;this.setActive(!1)}}onDocumentPointerUp(e){if(!A&&this.active&&e.target.closest(".col-menu")){let r=e.target.closest("a");if(r){let n=window.location.href;n.indexOf("#")!=-1&&(n=n.substr(0,n.indexOf("#"))),r.href.substr(0,n.length)==n&&setTimeout(()=>this.setActive(!1),250)}}}};var oe=class{constructor(e,r){this.key=e,this.value=r,this.defaultValue=r,this.initialize(),window.localStorage[this.key]&&this.setValue(this.fromLocalStorage(window.localStorage[this.key]))}initialize(){}setValue(e){if(this.value==e)return;let r=this.value;this.value=e,window.localStorage[this.key]=this.toLocalStorage(e),this.handleValueChange(r,e)}},ae=class extends oe{initialize(){let e=document.querySelector("#tsd-filter-"+this.key);!e||(this.checkbox=e,this.checkbox.addEventListener("change",()=>{this.setValue(this.checkbox.checked)}))}handleValueChange(e,r){!this.checkbox||(this.checkbox.checked=this.value,document.documentElement.classList.toggle("toggle-"+this.key,this.value!=this.defaultValue))}fromLocalStorage(e){return e=="true"}toLocalStorage(e){return e?"true":"false"}},Ee=class extends oe{initialize(){document.documentElement.classList.add("toggle-"+this.key+this.value);let e=document.querySelector("#tsd-filter-"+this.key);if(!e)return;this.select=e;let r=()=>{this.select.classList.add("active")},n=()=>{this.select.classList.remove("active")};this.select.addEventListener(C,r),this.select.addEventListener("mouseover",r),this.select.addEventListener("mouseleave",n),this.select.querySelectorAll("li").forEach(i=>{i.addEventListener(_,s=>{e.classList.remove("active"),this.setValue(s.target.dataset.value||"")})}),document.addEventListener(C,i=>{this.select.contains(i.target)||this.select.classList.remove("active")})}handleValueChange(e,r){this.select.querySelectorAll("li.selected").forEach(s=>{s.classList.remove("selected")});let n=this.select.querySelector('li[data-value="'+r+'"]'),i=this.select.querySelector(".tsd-select-label");n&&i&&(n.classList.add("selected"),i.textContent=n.textContent),document.documentElement.classList.remove("toggle-"+e),document.documentElement.classList.add("toggle-"+r)}fromLocalStorage(e){return e}toLocalStorage(e){return e}},Y=class extends Q{constructor(e){super(e);this.optionVisibility=new Ee("visibility","private"),this.optionInherited=new ae("inherited",!0),this.optionExternals=new ae("externals",!0)}static isSupported(){try{return typeof window.localStorage!="undefined"}catch(e){return!1}}};function be(t){let e=localStorage.getItem("tsd-theme")||"os";t.value=e,we(e),t.addEventListener("change",()=>{localStorage.setItem("tsd-theme",t.value),we(t.value)})}function we(t){switch(t){case"os":document.body.classList.remove("light","dark");break;case"light":document.body.classList.remove("dark"),document.body.classList.add("light");break;case"dark":document.body.classList.remove("light"),document.body.classList.add("dark");break}}fe();N(te,".menu-highlight");N(ne,".tsd-signatures");N(se,"a[data-toggle]");Y.isSupported()?N(Y,"#tsd-filter"):document.documentElement.classList.add("no-filter");var Te=document.getElementById("theme");Te&&be(Te);var qe=new X;Object.defineProperty(window,"app",{value:qe});})(); +/*! + * lunr.Builder + * Copyright (C) 2020 Oliver Nightingale + */ +/*! + * lunr.Index + * Copyright (C) 2020 Oliver Nightingale + */ +/*! + * lunr.Pipeline + * Copyright (C) 2020 Oliver Nightingale + */ +/*! + * lunr.Set + * Copyright (C) 2020 Oliver Nightingale + */ +/*! + * lunr.TokenSet + * Copyright (C) 2020 Oliver Nightingale + */ +/*! + * lunr.Vector + * Copyright (C) 2020 Oliver Nightingale + */ +/*! + * lunr.stemmer + * Copyright (C) 2020 Oliver Nightingale + * Includes code from - http://tartarus.org/~martin/PorterStemmer/js.txt + */ +/*! + * lunr.stopWordFilter + * Copyright (C) 2020 Oliver Nightingale + */ +/*! + * lunr.tokenizer + * Copyright (C) 2020 Oliver Nightingale + */ +/*! + * lunr.trimmer + * Copyright (C) 2020 Oliver Nightingale + */ +/*! + * lunr.utils + * Copyright (C) 2020 Oliver Nightingale + */ +/** + * lunr - http://lunrjs.com - A bit like Solr, but much smaller and not as bright - 2.3.9 + * Copyright (C) 2020 Oliver Nightingale + * @license MIT + */ diff --git a/docs/assets/js/search.js b/docs/assets/search.js similarity index 100% rename from docs/assets/js/search.js rename to docs/assets/search.js diff --git a/docs/assets/style.css b/docs/assets/style.css new file mode 100644 index 00000000..2e409a97 --- /dev/null +++ b/docs/assets/style.css @@ -0,0 +1,1341 @@ +@import url("./icons.css"); + +:root { + /* Light */ + --light-color-background: #fcfcfc; + --light-color-secondary-background: #fff; + --light-color-text: #222; + --light-color-text-aside: #707070; + --light-color-link: #4da6ff; + --light-color-menu-divider: #eee; + --light-color-menu-divider-focus: #000; + --light-color-menu-label: #707070; + --light-color-panel: var(--light-color-secondary-background); + --light-color-panel-divider: #eee; + --light-color-comment-tag: #707070; + --light-color-comment-tag-text: #fff; + --light-color-ts: #9600ff; + --light-color-ts-interface: #647f1b; + --light-color-ts-enum: #937210; + --light-color-ts-class: #0672de; + --light-color-ts-private: #707070; + --light-color-toolbar: #fff; + --light-color-toolbar-text: #333; + --light-icon-filter: invert(0); + --light-external-icon: url("data:image/svg+xml;utf8,"); + + /* Dark */ + --dark-color-background: #36393f; + --dark-color-secondary-background: #2f3136; + --dark-color-text: #ffffff; + --dark-color-text-aside: #e6e4e4; + --dark-color-link: #00aff4; + --dark-color-menu-divider: #eee; + --dark-color-menu-divider-focus: #000; + --dark-color-menu-label: #707070; + --dark-color-panel: var(--dark-color-secondary-background); + --dark-color-panel-divider: #818181; + --dark-color-comment-tag: #dcddde; + --dark-color-comment-tag-text: #2f3136; + --dark-color-ts: #c97dff; + --dark-color-ts-interface: #9cbe3c; + --dark-color-ts-enum: #d6ab29; + --dark-color-ts-class: #3695f3; + --dark-color-ts-private: #e2e2e2; + --dark-color-toolbar: #34373c; + --dark-color-toolbar-text: #ffffff; + --dark-icon-filter: invert(1); + --dark-external-icon: url("data:image/svg+xml;utf8,"); +} + +@media (prefers-color-scheme: light) { + :root { + --color-background: var(--light-color-background); + --color-secondary-background: var(--light-color-secondary-background); + --color-text: var(--light-color-text); + --color-text-aside: var(--light-color-text-aside); + --color-link: var(--light-color-link); + --color-menu-divider: var(--light-color-menu-divider); + --color-menu-divider-focus: var(--light-color-menu-divider-focus); + --color-menu-label: var(--light-color-menu-label); + --color-panel: var(--light-color-panel); + --color-panel-divider: var(--light-color-panel-divider); + --color-comment-tag: var(--light-color-comment-tag); + --color-comment-tag-text: var(--light-color-comment-tag-text); + --color-ts: var(--light-color-ts); + --color-ts-interface: var(--light-color-ts-interface); + --color-ts-enum: var(--light-color-ts-enum); + --color-ts-class: var(--light-color-ts-class); + --color-ts-private: var(--light-color-ts-private); + --color-toolbar: var(--light-color-toolbar); + --color-toolbar-text: var(--light-color-toolbar-text); + --icon-filter: var(--light-icon-filter); + --external-icon: var(--light-external-icon); + } +} + +@media (prefers-color-scheme: dark) { + :root { + --color-background: var(--dark-color-background); + --color-secondary-background: var(--dark-color-secondary-background); + --color-text: var(--dark-color-text); + --color-text-aside: var(--dark-color-text-aside); + --color-link: var(--dark-color-link); + --color-menu-divider: var(--dark-color-menu-divider); + --color-menu-divider-focus: var(--dark-color-menu-divider-focus); + --color-menu-label: var(--dark-color-menu-label); + --color-panel: var(--dark-color-panel); + --color-panel-divider: var(--dark-color-panel-divider); + --color-comment-tag: var(--dark-color-comment-tag); + --color-comment-tag-text: var(--dark-color-comment-tag-text); + --color-ts: var(--dark-color-ts); + --color-ts-interface: var(--dark-color-ts-interface); + --color-ts-enum: var(--dark-color-ts-enum); + --color-ts-class: var(--dark-color-ts-class); + --color-ts-private: var(--dark-color-ts-private); + --color-toolbar: var(--dark-color-toolbar); + --color-toolbar-text: var(--dark-color-toolbar-text); + --icon-filter: var(--dark-icon-filter); + --external-icon: var(--dark-external-icon); + } +} + +body { + margin: 0; +} + +body.light { + --color-background: var(--light-color-background); + --color-secondary-background: var(--light-color-secondary-background); + --color-text: var(--light-color-text); + --color-text-aside: var(--light-color-text-aside); + --color-link: var(--light-color-link); + --color-menu-divider: var(--light-color-menu-divider); + --color-menu-divider-focus: var(--light-color-menu-divider-focus); + --color-menu-label: var(--light-color-menu-label); + --color-panel: var(--light-color-panel); + --color-panel-divider: var(--light-color-panel-divider); + --color-comment-tag: var(--light-color-comment-tag); + --color-comment-tag-text: var(--light-color-comment-tag-text); + --color-ts: var(--light-color-ts); + --color-ts-interface: var(--light-color-ts-interface); + --color-ts-enum: var(--light-color-ts-enum); + --color-ts-class: var(--light-color-ts-class); + --color-ts-private: var(--light-color-ts-private); + --color-toolbar: var(--light-color-toolbar); + --color-toolbar-text: var(--light-color-toolbar-text); + --icon-filter: var(--light-icon-filter); + --external-icon: var(--light-external-icon); +} + +body.dark { + --color-background: var(--dark-color-background); + --color-secondary-background: var(--dark-color-secondary-background); + --color-text: var(--dark-color-text); + --color-text-aside: var(--dark-color-text-aside); + --color-link: var(--dark-color-link); + --color-menu-divider: var(--dark-color-menu-divider); + --color-menu-divider-focus: var(--dark-color-menu-divider-focus); + --color-menu-label: var(--dark-color-menu-label); + --color-panel: var(--dark-color-panel); + --color-panel-divider: var(--dark-color-panel-divider); + --color-comment-tag: var(--dark-color-comment-tag); + --color-comment-tag-text: var(--dark-color-comment-tag-text); + --color-ts: var(--dark-color-ts); + --color-ts-interface: var(--dark-color-ts-interface); + --color-ts-enum: var(--dark-color-ts-enum); + --color-ts-class: var(--dark-color-ts-class); + --color-ts-private: var(--dark-color-ts-private); + --color-toolbar: var(--dark-color-toolbar); + --color-toolbar-text: var(--dark-color-toolbar-text); + --icon-filter: var(--dark-icon-filter); + --external-icon: var(--dark-external-icon); +} + +h1 { + font-size: 2em; + margin: 0.67em 0; +} + +h2 { + font-size: 1.5em; + margin: 0.83em 0; +} + +h3 { + font-size: 1.17em; + margin: 1em 0; +} + +h4, +.tsd-index-panel h3 { + font-size: 1em; + margin: 1.33em 0; +} + +h5 { + font-size: 0.83em; + margin: 1.67em 0; +} + +h6 { + font-size: 0.67em; + margin: 2.33em 0; +} + +pre { + white-space: pre; + white-space: pre-wrap; + word-wrap: break-word; +} + +dl, +menu, +ol, +ul { + margin: 1em 0; +} + +dd { + margin: 0 0 0 40px; +} + +.container { + max-width: 1200px; + margin: 0 auto; + padding: 0 40px; +} +@media (max-width: 640px) { + .container { + padding: 0 20px; + } +} + +.container-main { + padding-bottom: 200px; +} + +.row { + display: flex; + position: relative; + margin: 0 -10px; +} +.row:after { + visibility: hidden; + display: block; + content: ""; + clear: both; + height: 0; +} + +.col-4, +.col-8 { + box-sizing: border-box; + float: left; + padding: 0 10px; +} + +.col-4 { + width: 33.3333333333%; +} +.col-8 { + width: 66.6666666667%; +} + +ul.tsd-descriptions > li > :first-child, +.tsd-panel > :first-child, +.col-8 > :first-child, +.col-4 > :first-child, +ul.tsd-descriptions > li > :first-child > :first-child, +.tsd-panel > :first-child > :first-child, +.col-8 > :first-child > :first-child, +.col-4 > :first-child > :first-child, +ul.tsd-descriptions > li > :first-child > :first-child > :first-child, +.tsd-panel > :first-child > :first-child > :first-child, +.col-8 > :first-child > :first-child > :first-child, +.col-4 > :first-child > :first-child > :first-child { + margin-top: 0; +} +ul.tsd-descriptions > li > :last-child, +.tsd-panel > :last-child, +.col-8 > :last-child, +.col-4 > :last-child, +ul.tsd-descriptions > li > :last-child > :last-child, +.tsd-panel > :last-child > :last-child, +.col-8 > :last-child > :last-child, +.col-4 > :last-child > :last-child, +ul.tsd-descriptions > li > :last-child > :last-child > :last-child, +.tsd-panel > :last-child > :last-child > :last-child, +.col-8 > :last-child > :last-child > :last-child, +.col-4 > :last-child > :last-child > :last-child { + margin-bottom: 0; +} + +@keyframes fade-in { + from { + opacity: 0; + } + to { + opacity: 1; + } +} +@keyframes fade-out { + from { + opacity: 1; + visibility: visible; + } + to { + opacity: 0; + } +} +@keyframes fade-in-delayed { + 0% { + opacity: 0; + } + 33% { + opacity: 0; + } + 100% { + opacity: 1; + } +} +@keyframes fade-out-delayed { + 0% { + opacity: 1; + visibility: visible; + } + 66% { + opacity: 0; + } + 100% { + opacity: 0; + } +} +@keyframes shift-to-left { + from { + transform: translate(0, 0); + } + to { + transform: translate(-25%, 0); + } +} +@keyframes unshift-to-left { + from { + transform: translate(-25%, 0); + } + to { + transform: translate(0, 0); + } +} +@keyframes pop-in-from-right { + from { + transform: translate(100%, 0); + } + to { + transform: translate(0, 0); + } +} +@keyframes pop-out-to-right { + from { + transform: translate(0, 0); + visibility: visible; + } + to { + transform: translate(100%, 0); + } +} +body { + background: var(--color-background); + font-family: "Segoe UI", sans-serif; + font-size: 16px; + color: var(--color-text); +} + +a { + color: var(--color-link); + text-decoration: none; +} +a:hover { + text-decoration: underline; +} +a.external[target="_blank"] { + background-image: var(--external-icon); + background-position: top 3px right; + background-repeat: no-repeat; + padding-right: 13px; +} + +code, +pre { + font-family: Menlo, Monaco, Consolas, "Courier New", monospace; + padding: 0.2em; + margin: 0; + font-size: 14px; +} + +pre { + padding: 10px; +} +pre code { + padding: 0; + font-size: 100%; +} + +blockquote { + margin: 1em 0; + padding-left: 1em; + border-left: 4px solid gray; +} + +.tsd-typography { + line-height: 1.333em; +} +.tsd-typography ul { + list-style: square; + padding: 0 0 0 20px; + margin: 0; +} +.tsd-typography h4, +.tsd-typography .tsd-index-panel h3, +.tsd-index-panel .tsd-typography h3, +.tsd-typography h5, +.tsd-typography h6 { + font-size: 1em; + margin: 0; +} +.tsd-typography h5, +.tsd-typography h6 { + font-weight: normal; +} +.tsd-typography p, +.tsd-typography ul, +.tsd-typography ol { + margin: 1em 0; +} + +@media (min-width: 901px) and (max-width: 1024px) { + html.default .col-content { + width: 72%; + } + html.default .col-menu { + width: 28%; + } + html.default .tsd-navigation { + padding-left: 10px; + } +} +@media (max-width: 900px) { + html.default .col-content { + float: none; + width: 100%; + } + html.default .col-menu { + position: fixed !important; + overflow: auto; + -webkit-overflow-scrolling: touch; + z-index: 1024; + top: 0 !important; + bottom: 0 !important; + left: auto !important; + right: 0 !important; + width: 100%; + padding: 20px 20px 0 0; + max-width: 450px; + visibility: hidden; + background-color: var(--color-panel); + transform: translate(100%, 0); + } + html.default .col-menu > *:last-child { + padding-bottom: 20px; + } + html.default .overlay { + content: ""; + display: block; + position: fixed; + z-index: 1023; + top: 0; + left: 0; + right: 0; + bottom: 0; + background-color: rgba(0, 0, 0, 0.75); + visibility: hidden; + } +} + +.tsd-page-title { + padding: 70px 0 20px 0; + margin: 0 0 40px 0; + background: var(--color-panel); + box-shadow: 0 0 5px rgba(0, 0, 0, 0.35); +} +.tsd-page-title h1 { + margin: 0; +} + +.tsd-breadcrumb { + margin: 0; + padding: 0; + color: var(--color-text-aside); +} +.tsd-breadcrumb a { + color: var(--color-text-aside); + text-decoration: none; +} +.tsd-breadcrumb a:hover { + text-decoration: underline; +} +.tsd-breadcrumb li { + display: inline; +} +.tsd-breadcrumb li:after { + content: " / "; +} + +dl.tsd-comment-tags { + overflow: hidden; +} +dl.tsd-comment-tags dt { + float: left; + padding: 1px 5px; + margin: 0 10px 0 0; + border-radius: 4px; + border: 1px solid var(--color-comment-tag); + color: var(--color-comment-tag); + font-size: 0.8em; + font-weight: normal; +} +dl.tsd-comment-tags dd { + margin: 0 0 10px 0; +} +dl.tsd-comment-tags dd:before, +dl.tsd-comment-tags dd:after { + display: table; + content: " "; +} +dl.tsd-comment-tags dd pre, +dl.tsd-comment-tags dd:after { + clear: both; +} +dl.tsd-comment-tags p { + margin: 0; +} + +.tsd-panel.tsd-comment .lead { + font-size: 1.1em; + line-height: 1.333em; + margin-bottom: 2em; +} +.tsd-panel.tsd-comment .lead:last-child { + margin-bottom: 0; +} + +.toggle-protected .tsd-is-private { + display: none; +} + +.toggle-public .tsd-is-private, +.toggle-public .tsd-is-protected, +.toggle-public .tsd-is-private-protected { + display: none; +} + +.toggle-inherited .tsd-is-inherited { + display: none; +} + +.toggle-externals .tsd-is-external { + display: none; +} + +#tsd-filter { + position: relative; + display: inline-block; + height: 40px; + vertical-align: bottom; +} +.no-filter #tsd-filter { + display: none; +} +#tsd-filter .tsd-filter-group { + display: inline-block; + height: 40px; + vertical-align: bottom; + white-space: nowrap; +} +#tsd-filter input { + display: none; +} +@media (max-width: 900px) { + #tsd-filter .tsd-filter-group { + display: block; + position: absolute; + top: 40px; + right: 20px; + height: auto; + background-color: var(--color-panel); + visibility: hidden; + transform: translate(50%, 0); + box-shadow: 0 0 4px rgba(0, 0, 0, 0.25); + } + .has-options #tsd-filter .tsd-filter-group { + visibility: visible; + } + .to-has-options #tsd-filter .tsd-filter-group { + animation: fade-in 0.2s; + } + .from-has-options #tsd-filter .tsd-filter-group { + animation: fade-out 0.2s; + } + #tsd-filter label, + #tsd-filter .tsd-select { + display: block; + padding-right: 20px; + } +} + +footer { + border-top: 1px solid var(--color-panel-divider); + background-color: var(--color-panel); +} +footer.with-border-bottom { + border-bottom: 1px solid var(--color-panel-divider); +} +footer .tsd-legend-group { + font-size: 0; +} +footer .tsd-legend { + display: inline-block; + width: 25%; + padding: 0; + font-size: 16px; + list-style: none; + line-height: 1.333em; + vertical-align: top; +} +@media (max-width: 900px) { + footer .tsd-legend { + width: 50%; + } +} + +.tsd-hierarchy { + list-style: square; + padding: 0 0 0 20px; + margin: 0; +} +.tsd-hierarchy .target { + font-weight: bold; +} + +.tsd-index-panel .tsd-index-content { + margin-bottom: -30px !important; +} +.tsd-index-panel .tsd-index-section { + margin-bottom: 30px !important; +} +.tsd-index-panel h3 { + margin: 0 -20px 10px -20px; + padding: 0 20px 10px 20px; + border-bottom: 1px solid var(--color-panel-divider); +} +.tsd-index-panel ul.tsd-index-list { + -webkit-column-count: 3; + -moz-column-count: 3; + -ms-column-count: 3; + -o-column-count: 3; + column-count: 3; + -webkit-column-gap: 20px; + -moz-column-gap: 20px; + -ms-column-gap: 20px; + -o-column-gap: 20px; + column-gap: 20px; + padding: 0; + list-style: none; + line-height: 1.333em; +} +@media (max-width: 900px) { + .tsd-index-panel ul.tsd-index-list { + -webkit-column-count: 1; + -moz-column-count: 1; + -ms-column-count: 1; + -o-column-count: 1; + column-count: 1; + } +} +@media (min-width: 901px) and (max-width: 1024px) { + .tsd-index-panel ul.tsd-index-list { + -webkit-column-count: 2; + -moz-column-count: 2; + -ms-column-count: 2; + -o-column-count: 2; + column-count: 2; + } +} +.tsd-index-panel ul.tsd-index-list li { + -webkit-page-break-inside: avoid; + -moz-page-break-inside: avoid; + -ms-page-break-inside: avoid; + -o-page-break-inside: avoid; + page-break-inside: avoid; +} +.tsd-index-panel a, +.tsd-index-panel .tsd-parent-kind-module a { + color: var(--color-ts); +} +.tsd-index-panel .tsd-parent-kind-interface a { + color: var(--color-ts-interface); +} +.tsd-index-panel .tsd-parent-kind-enum a { + color: var(--color-ts-enum); +} +.tsd-index-panel .tsd-parent-kind-class a { + color: var(--color-ts-class); +} +.tsd-index-panel .tsd-kind-module a { + color: var(--color-ts); +} +.tsd-index-panel .tsd-kind-interface a { + color: var(--color-ts-interface); +} +.tsd-index-panel .tsd-kind-enum a { + color: var(--color-ts-enum); +} +.tsd-index-panel .tsd-kind-class a { + color: var(--color-ts-class); +} +.tsd-index-panel .tsd-is-private a { + color: var(--color-ts-private); +} + +.tsd-flag { + display: inline-block; + padding: 1px 5px; + border-radius: 4px; + color: var(--color-comment-tag-text); + background-color: var(--color-comment-tag); + text-indent: 0; + font-size: 14px; + font-weight: normal; +} + +.tsd-anchor { + position: absolute; + top: -100px; +} + +.tsd-member { + position: relative; +} +.tsd-member .tsd-anchor + h3 { + margin-top: 0; + margin-bottom: 0; + border-bottom: none; +} +.tsd-member [data-tsd-kind] { + color: var(--color-ts); +} +.tsd-member [data-tsd-kind="Interface"] { + color: var(--color-ts-interface); +} +.tsd-member [data-tsd-kind="Enum"] { + color: var(--color-ts-enum); +} +.tsd-member [data-tsd-kind="Class"] { + color: var(--color-ts-class); +} +.tsd-member [data-tsd-kind="Private"] { + color: var(--color-ts-private); +} + +.tsd-navigation { + margin: 0 0 0 40px; +} +.tsd-navigation a { + display: block; + padding-top: 2px; + padding-bottom: 2px; + border-left: 2px solid transparent; + color: var(--color-text); + text-decoration: none; + transition: border-left-color 0.1s; +} +.tsd-navigation a:hover { + text-decoration: underline; +} +.tsd-navigation ul { + margin: 0; + padding: 0; + list-style: none; +} +.tsd-navigation li { + padding: 0; +} + +.tsd-navigation.primary { + padding-bottom: 40px; +} +.tsd-navigation.primary a { + display: block; + padding-top: 6px; + padding-bottom: 6px; +} +.tsd-navigation.primary ul li a { + padding-left: 5px; +} +.tsd-navigation.primary ul li li a { + padding-left: 25px; +} +.tsd-navigation.primary ul li li li a { + padding-left: 45px; +} +.tsd-navigation.primary ul li li li li a { + padding-left: 65px; +} +.tsd-navigation.primary ul li li li li li a { + padding-left: 85px; +} +.tsd-navigation.primary ul li li li li li li a { + padding-left: 105px; +} +.tsd-navigation.primary > ul { + border-bottom: 1px solid var(--color-panel-divider); +} +.tsd-navigation.primary li { + border-top: 1px solid var(--color-panel-divider); +} +.tsd-navigation.primary li.current > a { + font-weight: bold; +} +.tsd-navigation.primary li.label span { + display: block; + padding: 20px 0 6px 5px; + color: var(--color-menu-label); +} +.tsd-navigation.primary li.globals + li > span, +.tsd-navigation.primary li.globals + li > a { + padding-top: 20px; +} + +.tsd-navigation.secondary { + max-height: calc(100vh - 1rem - 40px); + overflow: auto; + position: -webkit-sticky; + position: sticky; + top: calc(0.5rem + 40px); + transition: 0.3s; +} +.tsd-navigation.secondary.tsd-navigation--toolbar-hide { + max-height: calc(100vh - 1rem); + top: 0.5rem; +} +.tsd-navigation.secondary ul { + transition: opacity 0.2s; +} +.tsd-navigation.secondary ul li a { + padding-left: 25px; +} +.tsd-navigation.secondary ul li li a { + padding-left: 45px; +} +.tsd-navigation.secondary ul li li li a { + padding-left: 65px; +} +.tsd-navigation.secondary ul li li li li a { + padding-left: 85px; +} +.tsd-navigation.secondary ul li li li li li a { + padding-left: 105px; +} +.tsd-navigation.secondary ul li li li li li li a { + padding-left: 125px; +} +.tsd-navigation.secondary ul.current a { + border-left-color: var(--color-panel-divider); +} +.tsd-navigation.secondary li.focus > a, +.tsd-navigation.secondary ul.current li.focus > a { + border-left-color: var(--color-menu-divider-focus); +} +.tsd-navigation.secondary li.current { + margin-top: 20px; + margin-bottom: 20px; + border-left-color: var(--color-panel-divider); +} +.tsd-navigation.secondary li.current > a { + font-weight: bold; +} + +@media (min-width: 901px) { + .menu-sticky-wrap { + position: static; + } +} + +.tsd-panel { + margin: 20px 0; + padding: 20px; + background-color: var(--color-panel); + box-shadow: 0 0 4px rgba(0, 0, 0, 0.25); +} +.tsd-panel:empty { + display: none; +} +.tsd-panel > h1, +.tsd-panel > h2, +.tsd-panel > h3 { + margin: 1.5em -20px 10px -20px; + padding: 0 20px 10px 20px; + border-bottom: 1px solid var(--color-panel-divider); +} +.tsd-panel > h1.tsd-before-signature, +.tsd-panel > h2.tsd-before-signature, +.tsd-panel > h3.tsd-before-signature { + margin-bottom: 0; + border-bottom: 0; +} +.tsd-panel table { + display: block; + width: 100%; + overflow: auto; + margin-top: 10px; + word-break: normal; + word-break: keep-all; + border-collapse: collapse; +} +.tsd-panel table th { + font-weight: bold; +} +.tsd-panel table th, +.tsd-panel table td { + padding: 6px 13px; + border: 1px solid var(--color-panel-divider); +} +.tsd-panel table tr { + background: var(--color-background); +} +.tsd-panel table tr:nth-child(even) { + background: var(--color-secondary-background); +} + +.tsd-panel-group { + margin: 60px 0; +} +.tsd-panel-group > h1, +.tsd-panel-group > h2, +.tsd-panel-group > h3 { + padding-left: 20px; + padding-right: 20px; +} + +#tsd-search { + transition: background-color 0.2s; +} +#tsd-search .title { + position: relative; + z-index: 2; +} +#tsd-search .field { + position: absolute; + left: 0; + top: 0; + right: 40px; + height: 40px; +} +#tsd-search .field input { + box-sizing: border-box; + position: relative; + top: -50px; + z-index: 1; + width: 100%; + padding: 0 10px; + opacity: 0; + outline: 0; + border: 0; + background: transparent; + color: var(--color-text); +} +#tsd-search .field label { + position: absolute; + overflow: hidden; + right: -40px; +} +#tsd-search .field input, +#tsd-search .title { + transition: opacity 0.2s; +} +#tsd-search .results { + position: absolute; + visibility: hidden; + top: 40px; + width: 100%; + margin: 0; + padding: 0; + list-style: none; + box-shadow: 0 0 4px rgba(0, 0, 0, 0.25); +} +#tsd-search .results li { + padding: 0 10px; + background-color: var(--color-background); +} +#tsd-search .results li:nth-child(even) { + background-color: var(--color-panel); +} +#tsd-search .results li.state { + display: none; +} +#tsd-search .results li.current, +#tsd-search .results li:hover { + background-color: var(--color-panel-divider); +} +#tsd-search .results a { + display: block; +} +#tsd-search .results a:before { + top: 10px; +} +#tsd-search .results span.parent { + color: var(--color-text-aside); + font-weight: normal; +} +#tsd-search.has-focus { + background-color: var(--color-panel-divider); +} +#tsd-search.has-focus .field input { + top: 0; + opacity: 1; +} +#tsd-search.has-focus .title { + z-index: 0; + opacity: 0; +} +#tsd-search.has-focus .results { + visibility: visible; +} +#tsd-search.loading .results li.state.loading { + display: block; +} +#tsd-search.failure .results li.state.failure { + display: block; +} + +.tsd-signature { + margin: 0 0 1em 0; + padding: 10px; + border: 1px solid var(--color-panel-divider); + font-family: Menlo, Monaco, Consolas, "Courier New", monospace; + font-size: 14px; + overflow-x: auto; +} +.tsd-signature.tsd-kind-icon { + padding-left: 30px; +} +.tsd-signature.tsd-kind-icon:before { + top: 10px; + left: 10px; +} +.tsd-panel > .tsd-signature { + margin-left: -20px; + margin-right: -20px; + border-width: 1px 0; +} +.tsd-panel > .tsd-signature.tsd-kind-icon { + padding-left: 40px; +} +.tsd-panel > .tsd-signature.tsd-kind-icon:before { + left: 20px; +} + +.tsd-signature-symbol { + color: var(--color-text-aside); + font-weight: normal; +} + +.tsd-signature-type { + font-style: italic; + font-weight: normal; +} + +.tsd-signatures { + padding: 0; + margin: 0 0 1em 0; + border: 1px solid var(--color-panel-divider); +} +.tsd-signatures .tsd-signature { + margin: 0; + border-width: 1px 0 0 0; + transition: background-color 0.1s; +} +.tsd-signatures .tsd-signature:first-child { + border-top-width: 0; +} +.tsd-signatures .tsd-signature.current { + background-color: var(--color-panel-divider); +} +.tsd-signatures.active > .tsd-signature { + cursor: pointer; +} +.tsd-panel > .tsd-signatures { + margin-left: -20px; + margin-right: -20px; + border-width: 1px 0; +} +.tsd-panel > .tsd-signatures .tsd-signature.tsd-kind-icon { + padding-left: 40px; +} +.tsd-panel > .tsd-signatures .tsd-signature.tsd-kind-icon:before { + left: 20px; +} +.tsd-panel > a.anchor + .tsd-signatures { + border-top-width: 0; + margin-top: -20px; +} + +ul.tsd-descriptions { + position: relative; + overflow: hidden; + padding: 0; + list-style: none; +} +ul.tsd-descriptions.active > .tsd-description { + display: none; +} +ul.tsd-descriptions.active > .tsd-description.current { + display: block; +} +ul.tsd-descriptions.active > .tsd-description.fade-in { + animation: fade-in-delayed 0.3s; +} +ul.tsd-descriptions.active > .tsd-description.fade-out { + animation: fade-out-delayed 0.3s; + position: absolute; + display: block; + top: 0; + left: 0; + right: 0; + opacity: 0; + visibility: hidden; +} +ul.tsd-descriptions h4, +ul.tsd-descriptions .tsd-index-panel h3, +.tsd-index-panel ul.tsd-descriptions h3 { + font-size: 16px; + margin: 1em 0 0.5em 0; +} + +ul.tsd-parameters, +ul.tsd-type-parameters { + list-style: square; + margin: 0; + padding-left: 20px; +} +ul.tsd-parameters > li.tsd-parameter-signature, +ul.tsd-type-parameters > li.tsd-parameter-signature { + list-style: none; + margin-left: -20px; +} +ul.tsd-parameters h5, +ul.tsd-type-parameters h5 { + font-size: 16px; + margin: 1em 0 0.5em 0; +} +ul.tsd-parameters .tsd-comment, +ul.tsd-type-parameters .tsd-comment { + margin-top: -0.5em; +} + +.tsd-sources { + font-size: 14px; + color: var(--color-text-aside); + margin: 0 0 1em 0; +} +.tsd-sources a { + color: var(--color-text-aside); + text-decoration: underline; +} +.tsd-sources ul, +.tsd-sources p { + margin: 0 !important; +} +.tsd-sources ul { + list-style: none; + padding: 0; +} + +.tsd-page-toolbar { + position: fixed; + z-index: 1; + top: 0; + left: 0; + width: 100%; + height: 40px; + color: var(--color-toolbar-text); + background: var(--color-toolbar); + border-bottom: 1px solid var(--color-panel-divider); + transition: transform 0.3s linear; +} +.tsd-page-toolbar a { + color: var(--color-toolbar-text); + text-decoration: none; +} +.tsd-page-toolbar a.title { + font-weight: bold; +} +.tsd-page-toolbar a.title:hover { + text-decoration: underline; +} +.tsd-page-toolbar .table-wrap { + display: table; + width: 100%; + height: 40px; +} +.tsd-page-toolbar .table-cell { + display: table-cell; + position: relative; + white-space: nowrap; + line-height: 40px; +} +.tsd-page-toolbar .table-cell:first-child { + width: 100%; +} + +.tsd-page-toolbar--hide { + transform: translateY(-100%); +} + +.tsd-select .tsd-select-list li:before, +.tsd-select .tsd-select-label:before, +.tsd-widget:before { + content: ""; + display: inline-block; + width: 40px; + height: 40px; + margin: 0 -8px 0 0; + background-image: url(./widgets.png); + background-repeat: no-repeat; + text-indent: -1024px; + vertical-align: bottom; + filter: var(--icon-filter); +} +@media (-webkit-min-device-pixel-ratio: 1.5), (min-resolution: 144dpi) { + .tsd-select .tsd-select-list li:before, + .tsd-select .tsd-select-label:before, + .tsd-widget:before { + background-image: url(./widgets@2x.png); + background-size: 320px 40px; + } +} + +.tsd-widget { + display: inline-block; + overflow: hidden; + opacity: 0.8; + height: 40px; + transition: opacity 0.1s, background-color 0.2s; + vertical-align: bottom; + cursor: pointer; +} +.tsd-widget:hover { + opacity: 0.9; +} +.tsd-widget.active { + opacity: 1; + background-color: var(--color-panel-divider); +} +.tsd-widget.no-caption { + width: 40px; +} +.tsd-widget.no-caption:before { + margin: 0; +} +.tsd-widget.search:before { + background-position: 0 0; +} +.tsd-widget.menu:before { + background-position: -40px 0; +} +.tsd-widget.options:before { + background-position: -80px 0; +} +.tsd-widget.options, +.tsd-widget.menu { + display: none; +} +@media (max-width: 900px) { + .tsd-widget.options, + .tsd-widget.menu { + display: inline-block; + } +} +input[type="checkbox"] + .tsd-widget:before { + background-position: -120px 0; +} +input[type="checkbox"]:checked + .tsd-widget:before { + background-position: -160px 0; +} + +.tsd-select { + position: relative; + display: inline-block; + height: 40px; + transition: opacity 0.1s, background-color 0.2s; + vertical-align: bottom; + cursor: pointer; +} +.tsd-select .tsd-select-label { + opacity: 0.6; + transition: opacity 0.2s; +} +.tsd-select .tsd-select-label:before { + background-position: -240px 0; +} +.tsd-select.active .tsd-select-label { + opacity: 0.8; +} +.tsd-select.active .tsd-select-list { + visibility: visible; + opacity: 1; + transition-delay: 0s; +} +.tsd-select .tsd-select-list { + position: absolute; + visibility: hidden; + top: 40px; + left: 0; + margin: 0; + padding: 0; + opacity: 0; + list-style: none; + box-shadow: 0 0 4px rgba(0, 0, 0, 0.25); + transition: visibility 0s 0.2s, opacity 0.2s; +} +.tsd-select .tsd-select-list li { + padding: 0 20px 0 0; + background-color: var(--color-background); +} +.tsd-select .tsd-select-list li:before { + background-position: 40px 0; +} +.tsd-select .tsd-select-list li:nth-child(even) { + background-color: var(--color-panel); +} +.tsd-select .tsd-select-list li:hover { + background-color: var(--color-panel-divider); +} +.tsd-select .tsd-select-list li.selected:before { + background-position: -200px 0; +} +@media (max-width: 900px) { + .tsd-select .tsd-select-list { + top: 0; + left: auto; + right: 100%; + margin-right: -5px; + } + .tsd-select .tsd-select-label:before { + background-position: -280px 0; + } +} + +img { + max-width: 100%; +} diff --git a/docs/assets/images/widgets.png b/docs/assets/widgets.png similarity index 100% rename from docs/assets/images/widgets.png rename to docs/assets/widgets.png diff --git a/docs/assets/images/widgets@2x.png b/docs/assets/widgets@2x.png similarity index 100% rename from docs/assets/images/widgets@2x.png rename to docs/assets/widgets@2x.png diff --git a/docs/classes/HOTP.html b/docs/classes/HOTP.html index 2e52a73e..42e14acb 100644 --- a/docs/classes/HOTP.html +++ b/docs/classes/HOTP.html @@ -1,3450 +1,35 @@ - - - - - - HOTP | otpauth - - - - - -
-
-
-
-
- otpauth -
-
-
- Options -
-
- All -
    -
  • Public
  • -
  • Public/Protected
  • -
  • All
  • -
-
- - - - - - -
-
- Menu -
-
-
-
-
- -
-
-
-
-
-

HOTP: An HMAC-based One-time Password Algorithm. - RFC 4226

-
-
-
-
-

Hierarchy

-
    -
  • - HOTP -
  • -
-
-
-

Index

-
-
-
-

Constructors

- -
-
-

Properties

- -
-
-

Accessors

- -
-
-

Methods

- -
-
-
-
-
-

Constructors

-
- -

constructor

-
    -
  • new HOTP(__namedParameters?: undefined | { algorithm: undefined | string; counter: undefined | number; digits: undefined | number; issuer: undefined | string; label: undefined | string; secret: undefined | string | Secret }): HOTP
  • -
-
    -
  • - -
    -
    -

    Creates an HOTP object.

    -
    -
    -

    Parameters

    -
      -
    • -
      __namedParameters: undefined | { algorithm: undefined | string; counter: undefined | number; digits: undefined | number; issuer: undefined | string; label: undefined | string; secret: undefined | string | Secret } = {}
      -
    • -
    -

    Returns HOTP

    -
  • -
-
-
-
-

Properties

-
- -

algorithm

-
algorithm: string
- -
-
-

HMAC hashing algorithm.

-
-
-
-
- -

counter

-
counter: number
- -
-
-

Initial counter value.

-
-
-
-
- -

digits

-
digits: number
- -
-
-

Token length.

-
-
-
-
- -

issuer

-
issuer: string
- -
-
-

Account provider.

-
-
-
-
- -

label

-
label: string
- -
-
-

Account label.

-
-
-
-
- -

secret

-
secret: Secret
- -
-
-

Secret key.

-
-
-
-
-
-

Accessors

-
- -

Static defaults

-
    -
  • get defaults(): { algorithm: string; counter: number; digits: number; issuer: string; label: string; window: number }
  • -
-
    -
  • - -
    -
    -

    Default configuration.

    -
    -
    -

    Returns { algorithm: string; counter: number; digits: number; issuer: string; label: string; window: number }

    -
      -
    • -
      algorithm: string
      -
    • -
    • -
      counter: number
      -
    • -
    • -
      digits: number
      -
    • -
    • -
      issuer: string
      -
    • -
    • -
      label: string
      -
    • -
    • -
      window: number
      -
    • -
    -
  • -
-
-
-
-

Methods

-
- -

generate

-
    -
  • generate(__namedParameters?: undefined | { counter: undefined | number }): string
  • -
-
    -
  • - -
    -
    -

    Generates an HOTP token.

    -
    -
    -

    Parameters

    -
      -
    • -
      __namedParameters: undefined | { counter: undefined | number } = {}
      -
    • -
    -

    Returns string

    -

    Token.

    -
  • -
-
-
- -

toString

-
    -
  • toString(): string
  • -
-
    -
  • - -
    -
    -

    Returns a Google Authenticator key URI.

    -
    -
    -

    Returns string

    -

    URI.

    -
  • -
-
-
- -

validate

-
    -
  • validate(__namedParameters: { counter: undefined | number; token: string; window: undefined | number }): null | number
  • -
-
    -
  • - -
    -
    -

    Validates an HOTP token.

    -
    -
    -

    Parameters

    -
      -
    • -
      __namedParameters: { counter: undefined | number; token: string; window: undefined | number }
      -
        -
      • -
        counter: undefined | number
        -
      • -
      • -
        token: string
        -
      • -
      • -
        window: undefined | number
        -
      • -
      -
    • -
    -

    Returns null | number

    -

    Token delta, or null if the token is not found.

    -
  • -
-
-
- -

Static generate

-
    -
  • generate(__namedParameters: { algorithm: undefined | string; counter: undefined | number; digits: undefined | number; secret: Secret }): string
  • -
-
    -
  • - -
    -
    -

    Generates an HOTP token.

    -
    -
    -

    Parameters

    -
      -
    • -
      __namedParameters: { algorithm: undefined | string; counter: undefined | number; digits: undefined | number; secret: Secret }
      -
        -
      • -
        algorithm: undefined | string
        -
      • -
      • -
        counter: undefined | number
        -
      • -
      • -
        digits: undefined | number
        -
      • -
      • -
        secret: Secret
        -
      • -
      -
    • -
    -

    Returns string

    -

    Token.

    -
  • -
-
-
- -

Static validate

-
    -
  • validate(__namedParameters: { algorithm: undefined | string; counter: undefined | number; digits: number; secret: Secret; token: string; window: undefined | number }): null | number
  • -
-
    -
  • - -
    -
    -

    Validates an HOTP token.

    -
    -
    -

    Parameters

    -
      -
    • -
      __namedParameters: { algorithm: undefined | string; counter: undefined | number; digits: number; secret: Secret; token: string; window: undefined | number }
      -
        -
      • -
        algorithm: undefined | string
        -
      • -
      • -
        counter: undefined | number
        -
      • -
      • -
        digits: number
        -
      • -
      • -
        secret: Secret
        -
      • -
      • -
        token: string
        -
      • -
      • -
        window: undefined | number
        -
      • -
      -
    • -
    -

    Returns null | number

    -

    Token delta, or null if the token is not found.

    -
  • -
-
-
-
-
-

Legend

-
-
    -
  • Constructor
  • -
  • Property
  • -
  • Method
  • -
-
    -
  • Static method
  • -
-
-
-
-
-

Generated using TypeDoc

-
-
-
- - - \ No newline at end of file +HOTP | otpauth
Options
All
  • Public
  • Public/Protected
  • All
Menu

Class HOTP

+

HOTP: An HMAC-based One-time Password Algorithm. +RFC 4226

+

Hierarchy

  • HOTP

Index

Constructors

constructor

  • new HOTP(__namedParameters?: undefined | { algorithm: undefined | string; counter: undefined | number; digits: undefined | number; issuer: undefined | string; label: undefined | string; secret: undefined | string | Secret }): HOTP
  • +

    Creates an HOTP object.

    +

    Parameters

    • __namedParameters: undefined | { algorithm: undefined | string; counter: undefined | number; digits: undefined | number; issuer: undefined | string; label: undefined | string; secret: undefined | string | Secret } = {}

    Returns HOTP

Properties

algorithm

algorithm: string
+

HMAC hashing algorithm.

+

counter

counter: number
+

Initial counter value.

+

digits

digits: number
+

Token length.

+

issuer

issuer: string
+

Account provider.

+

label

label: string
+

Account label.

+

secret

secret: Secret
+

Secret key.

+

Accessors

Static defaults

  • get defaults(): { algorithm: string; counter: number; digits: number; issuer: string; label: string; window: number }
  • +

    Default configuration.

    +

    Returns { algorithm: string; counter: number; digits: number; issuer: string; label: string; window: number }

    • algorithm: string
    • counter: number
    • digits: number
    • issuer: string
    • label: string
    • window: number

Methods

generate

  • generate(__namedParameters?: undefined | { counter: undefined | number }): string
  • +

    Generates an HOTP token.

    +

    Parameters

    • __namedParameters: undefined | { counter: undefined | number } = {}

    Returns string

    Token.

    +

toString

  • toString(): string
  • +

    Returns a Google Authenticator key URI.

    +

    Returns string

    URI.

    +

validate

  • validate(__namedParameters: { counter: undefined | number; token: string; window: undefined | number }): null | number
  • +

    Validates an HOTP token.

    +

    Parameters

    • __namedParameters: { counter: undefined | number; token: string; window: undefined | number }
      • counter: undefined | number
      • token: string
      • window: undefined | number

    Returns null | number

    Token delta, or null if the token is not found.

    +

Static generate

  • generate(__namedParameters: { algorithm: undefined | string; counter: undefined | number; digits: undefined | number; secret: Secret }): string
  • +

    Generates an HOTP token.

    +

    Parameters

    • __namedParameters: { algorithm: undefined | string; counter: undefined | number; digits: undefined | number; secret: Secret }
      • algorithm: undefined | string
      • counter: undefined | number
      • digits: undefined | number
      • secret: Secret

    Returns string

    Token.

    +

Static validate

  • validate(__namedParameters: { algorithm: undefined | string; counter: undefined | number; digits: number; secret: Secret; token: string; window: undefined | number }): null | number
  • +

    Validates an HOTP token.

    +

    Parameters

    • __namedParameters: { algorithm: undefined | string; counter: undefined | number; digits: number; secret: Secret; token: string; window: undefined | number }
      • algorithm: undefined | string
      • counter: undefined | number
      • digits: number
      • secret: Secret
      • token: string
      • window: undefined | number

    Returns null | number

    Token delta, or null if the token is not found.

    +

Legend

  • Constructor
  • Property
  • Method
  • Static method

Settings

Theme

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/classes/Secret.html b/docs/classes/Secret.html index eb3423c4..52e03eab 100644 --- a/docs/classes/Secret.html +++ b/docs/classes/Secret.html @@ -1,3352 +1,31 @@ - - - - - - Secret | otpauth - - - - - -
-
-
-
-
- otpauth -
-
-
- Options -
-
- All -
    -
  • Public
  • -
  • Public/Protected
  • -
  • All
  • -
-
- - - - - - -
-
- Menu -
-
-
-
-
- -
-
-
-
-
-

OTP secret key.

-
-
-
-
-

Hierarchy

-
    -
  • - Secret -
  • -
-
-
-

Index

-
-
-
-

Constructors

- -
-
-

Properties

- -
-
-

Accessors

- -
-
-

Methods

- -
-
-
-
-
-

Constructors

-
- -

constructor

-
    -
  • new Secret(__namedParameters?: undefined | { buffer: undefined | ArrayBuffer; size: undefined | number }): Secret
  • -
-
    -
  • - -
    -
    -

    Creates a secret key object.

    -
    -
    -

    Parameters

    -
      -
    • -
      __namedParameters: undefined | { buffer: undefined | ArrayBuffer; size: undefined | number } = {}
      -
    • -
    -

    Returns Secret

    -
  • -
-
-
-
-

Properties

-
- -

buffer

-
buffer: ArrayBuffer
- -
-
-

Secret key.

-
-
-
-
-
-

Accessors

-
- -

base32

-
    -
  • get base32(): string
  • -
-
    -
  • - -
    -
    -

    Base32 string representation of secret key.

    -
    -
    -

    Returns string

    -
  • -
-
-
- -

hex

-
    -
  • get hex(): string
  • -
-
    -
  • - -
    -
    -

    Hexadecimal string representation of secret key.

    -
    -
    -

    Returns string

    -
  • -
-
-
- -

latin1

-
    -
  • get latin1(): string
  • -
-
    -
  • - -
    -
    -

    Latin-1 string representation of secret key.

    -
    -
    -

    Returns string

    -
  • -
-
-
- -

utf8

-
    -
  • get utf8(): string
  • -
-
    -
  • - -
    -
    -

    UTF-8 string representation of secret key.

    -
    -
    -

    Returns string

    -
  • -
-
-
-
-

Methods

-
- -

Static fromBase32

-
    -
  • fromBase32(str: string): Secret
  • -
-
    -
  • - -
    -
    -

    Converts a base32 string to a Secret object.

    -
    -
    -

    Parameters

    -
      -
    • -
      str: string
      -
      -

      Base32 string.

      -
      -
    • -
    -

    Returns Secret

    -

    Secret object.

    -
  • -
-
-
- -

Static fromHex

-
    -
  • fromHex(str: string): Secret
  • -
-
    -
  • - -
    -
    -

    Converts a hexadecimal string to a Secret object.

    -
    -
    -

    Parameters

    -
      -
    • -
      str: string
      -
      -

      Hexadecimal string.

      -
      -
    • -
    -

    Returns Secret

    -

    Secret object.

    -
  • -
-
-
- -

Static fromLatin1

-
    -
  • fromLatin1(str: string): Secret
  • -
-
    -
  • - -
    -
    -

    Converts a Latin-1 string to a Secret object.

    -
    -
    -

    Parameters

    -
      -
    • -
      str: string
      -
      -

      Latin-1 string.

      -
      -
    • -
    -

    Returns Secret

    -

    Secret object.

    -
  • -
-
-
- -

Static fromUTF8

-
    -
  • fromUTF8(str: string): Secret
  • -
-
    -
  • - -
    -
    -

    Converts an UTF-8 string to a Secret object.

    -
    -
    -

    Parameters

    -
      -
    • -
      str: string
      -
      -

      UTF-8 string.

      -
      -
    • -
    -

    Returns Secret

    -

    Secret object.

    -
  • -
-
-
-
-
-

Legend

-
-
    -
  • Constructor
  • -
  • Property
  • -
  • Method
  • -
-
    -
  • Static method
  • -
-
-
-
-
-

Generated using TypeDoc

-
-
-
- - - \ No newline at end of file +Secret | otpauth
Options
All
  • Public
  • Public/Protected
  • All
Menu

Class Secret

+

OTP secret key.

+

Hierarchy

  • Secret

Index

Constructors

constructor

  • new Secret(__namedParameters?: undefined | { buffer: undefined | ArrayBuffer; size: undefined | number }): Secret
  • +

    Creates a secret key object.

    +

    Parameters

    • __namedParameters: undefined | { buffer: undefined | ArrayBuffer; size: undefined | number } = {}

    Returns Secret

Properties

buffer

buffer: ArrayBuffer
+

Secret key.

+

Accessors

base32

  • get base32(): string
  • +

    Base32 string representation of secret key.

    +

    Returns string

hex

  • get hex(): string
  • +

    Hexadecimal string representation of secret key.

    +

    Returns string

latin1

  • get latin1(): string
  • +

    Latin-1 string representation of secret key.

    +

    Returns string

utf8

  • get utf8(): string
  • +

    UTF-8 string representation of secret key.

    +

    Returns string

Methods

Static fromBase32

  • fromBase32(str: string): Secret
  • +

    Converts a base32 string to a Secret object.

    +

    Parameters

    • str: string

      Base32 string.

      +

    Returns Secret

    Secret object.

    +

Static fromHex

  • +

    Converts a hexadecimal string to a Secret object.

    +

    Parameters

    • str: string

      Hexadecimal string.

      +

    Returns Secret

    Secret object.

    +

Static fromLatin1

  • fromLatin1(str: string): Secret
  • +

    Converts a Latin-1 string to a Secret object.

    +

    Parameters

    • str: string

      Latin-1 string.

      +

    Returns Secret

    Secret object.

    +

Static fromUTF8

  • +

    Converts an UTF-8 string to a Secret object.

    +

    Parameters

    • str: string

      UTF-8 string.

      +

    Returns Secret

    Secret object.

    +

Legend

  • Constructor
  • Property
  • Method
  • Static method

Settings

Theme

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/classes/TOTP.html b/docs/classes/TOTP.html index 79e37e14..304cfec8 100644 --- a/docs/classes/TOTP.html +++ b/docs/classes/TOTP.html @@ -1,3456 +1,35 @@ - - - - - - TOTP | otpauth - - - - - -
-
-
-
-
- otpauth -
-
-
- Options -
-
- All -
    -
  • Public
  • -
  • Public/Protected
  • -
  • All
  • -
-
- - - - - - -
-
- Menu -
-
-
-
-
- -
-
-
-
-
-

TOTP: Time-Based One-Time Password Algorithm. - RFC 6238

-
-
-
-
-

Hierarchy

-
    -
  • - TOTP -
  • -
-
-
-

Index

-
-
-
-

Constructors

- -
-
-

Properties

- -
-
-

Accessors

- -
-
-

Methods

- -
-
-
-
-
-

Constructors

-
- -

constructor

-
    -
  • new TOTP(__namedParameters?: undefined | { algorithm: undefined | string; digits: undefined | number; issuer: undefined | string; label: undefined | string; period: undefined | number; secret: undefined | string | Secret }): TOTP
  • -
-
    -
  • - -
    -
    -

    Creates a TOTP object.

    -
    -
    -

    Parameters

    -
      -
    • -
      __namedParameters: undefined | { algorithm: undefined | string; digits: undefined | number; issuer: undefined | string; label: undefined | string; period: undefined | number; secret: undefined | string | Secret } = {}
      -
    • -
    -

    Returns TOTP

    -
  • -
-
-
-
-

Properties

-
- -

algorithm

-
algorithm: string
- -
-
-

HMAC hashing algorithm.

-
-
-
-
- -

digits

-
digits: number
- -
-
-

Token length.

-
-
-
-
- -

issuer

-
issuer: string
- -
-
-

Account provider.

-
-
-
-
- -

label

-
label: string
- -
-
-

Account label.

-
-
-
-
- -

period

-
period: number
- -
-
-

Token time-step duration.

-
-
-
-
- -

secret

-
secret: Secret
- -
-
-

Secret key.

-
-
-
-
-
-

Accessors

-
- -

Static defaults

-
    -
  • get defaults(): { algorithm: string; digits: number; issuer: string; label: string; period: number; window: number }
  • -
-
    -
  • - -
    -
    -

    Default configuration.

    -
    -
    -

    Returns { algorithm: string; digits: number; issuer: string; label: string; period: number; window: number }

    -
      -
    • -
      algorithm: string
      -
    • -
    • -
      digits: number
      -
    • -
    • -
      issuer: string
      -
    • -
    • -
      label: string
      -
    • -
    • -
      period: number
      -
    • -
    • -
      window: number
      -
    • -
    -
  • -
-
-
-
-

Methods

-
- -

generate

-
    -
  • generate(__namedParameters?: undefined | { timestamp: undefined | number }): string
  • -
-
    -
  • - -
    -
    -

    Generates a TOTP token.

    -
    -
    -

    Parameters

    -
      -
    • -
      __namedParameters: undefined | { timestamp: undefined | number } = {}
      -
    • -
    -

    Returns string

    -

    Token.

    -
  • -
-
-
- -

toString

-
    -
  • toString(): string
  • -
-
    -
  • - -
    -
    -

    Returns a Google Authenticator key URI.

    -
    -
    -

    Returns string

    -

    URI.

    -
  • -
-
-
- -

validate

-
    -
  • validate(__namedParameters: { timestamp: undefined | number; token: string; window: undefined | number }): null | number
  • -
-
    -
  • - -
    -
    -

    Validates a TOTP token.

    -
    -
    -

    Parameters

    -
      -
    • -
      __namedParameters: { timestamp: undefined | number; token: string; window: undefined | number }
      -
        -
      • -
        timestamp: undefined | number
        -
      • -
      • -
        token: string
        -
      • -
      • -
        window: undefined | number
        -
      • -
      -
    • -
    -

    Returns null | number

    -

    Token delta, or null if the token is not found.

    -
  • -
-
-
- -

Static generate

-
    -
  • generate(__namedParameters: { algorithm: undefined | string; digits: undefined | number; period: undefined | number; secret: Secret; timestamp: undefined | number }): string
  • -
-
    -
  • - -
    -
    -

    Generates a TOTP token.

    -
    -
    -

    Parameters

    -
      -
    • -
      __namedParameters: { algorithm: undefined | string; digits: undefined | number; period: undefined | number; secret: Secret; timestamp: undefined | number }
      -
        -
      • -
        algorithm: undefined | string
        -
      • -
      • -
        digits: undefined | number
        -
      • -
      • -
        period: undefined | number
        -
      • -
      • -
        secret: Secret
        -
      • -
      • -
        timestamp: undefined | number
        -
      • -
      -
    • -
    -

    Returns string

    -

    Token.

    -
  • -
-
-
- -

Static validate

-
    -
  • validate(__namedParameters: { algorithm: undefined | string; digits: number; period: undefined | number; secret: Secret; timestamp: undefined | number; token: string; window: undefined | number }): null | number
  • -
-
    -
  • - -
    -
    -

    Validates a TOTP token.

    -
    -
    -

    Parameters

    -
      -
    • -
      __namedParameters: { algorithm: undefined | string; digits: number; period: undefined | number; secret: Secret; timestamp: undefined | number; token: string; window: undefined | number }
      -
        -
      • -
        algorithm: undefined | string
        -
      • -
      • -
        digits: number
        -
      • -
      • -
        period: undefined | number
        -
      • -
      • -
        secret: Secret
        -
      • -
      • -
        timestamp: undefined | number
        -
      • -
      • -
        token: string
        -
      • -
      • -
        window: undefined | number
        -
      • -
      -
    • -
    -

    Returns null | number

    -

    Token delta, or null if the token is not found.

    -
  • -
-
-
-
-
-

Legend

-
-
    -
  • Constructor
  • -
  • Property
  • -
  • Method
  • -
-
    -
  • Static method
  • -
-
-
-
-
-

Generated using TypeDoc

-
-
-
- - - \ No newline at end of file +TOTP | otpauth
Options
All
  • Public
  • Public/Protected
  • All
Menu

Class TOTP

+

TOTP: Time-Based One-Time Password Algorithm. +RFC 6238

+

Hierarchy

  • TOTP

Index

Constructors

constructor

  • new TOTP(__namedParameters?: undefined | { algorithm: undefined | string; digits: undefined | number; issuer: undefined | string; label: undefined | string; period: undefined | number; secret: undefined | string | Secret }): TOTP
  • +

    Creates a TOTP object.

    +

    Parameters

    • __namedParameters: undefined | { algorithm: undefined | string; digits: undefined | number; issuer: undefined | string; label: undefined | string; period: undefined | number; secret: undefined | string | Secret } = {}

    Returns TOTP

Properties

algorithm

algorithm: string
+

HMAC hashing algorithm.

+

digits

digits: number
+

Token length.

+

issuer

issuer: string
+

Account provider.

+

label

label: string
+

Account label.

+

period

period: number
+

Token time-step duration.

+

secret

secret: Secret
+

Secret key.

+

Accessors

Static defaults

  • get defaults(): { algorithm: string; digits: number; issuer: string; label: string; period: number; window: number }
  • +

    Default configuration.

    +

    Returns { algorithm: string; digits: number; issuer: string; label: string; period: number; window: number }

    • algorithm: string
    • digits: number
    • issuer: string
    • label: string
    • period: number
    • window: number

Methods

generate

  • generate(__namedParameters?: undefined | { timestamp: undefined | number }): string
  • +

    Generates a TOTP token.

    +

    Parameters

    • __namedParameters: undefined | { timestamp: undefined | number } = {}

    Returns string

    Token.

    +

toString

  • toString(): string
  • +

    Returns a Google Authenticator key URI.

    +

    Returns string

    URI.

    +

validate

  • validate(__namedParameters: { timestamp: undefined | number; token: string; window: undefined | number }): null | number
  • +

    Validates a TOTP token.

    +

    Parameters

    • __namedParameters: { timestamp: undefined | number; token: string; window: undefined | number }
      • timestamp: undefined | number
      • token: string
      • window: undefined | number

    Returns null | number

    Token delta, or null if the token is not found.

    +

Static generate

  • generate(__namedParameters: { algorithm: undefined | string; digits: undefined | number; period: undefined | number; secret: Secret; timestamp: undefined | number }): string
  • +

    Generates a TOTP token.

    +

    Parameters

    • __namedParameters: { algorithm: undefined | string; digits: undefined | number; period: undefined | number; secret: Secret; timestamp: undefined | number }
      • algorithm: undefined | string
      • digits: undefined | number
      • period: undefined | number
      • secret: Secret
      • timestamp: undefined | number

    Returns string

    Token.

    +

Static validate

  • validate(__namedParameters: { algorithm: undefined | string; digits: number; period: undefined | number; secret: Secret; timestamp: undefined | number; token: string; window: undefined | number }): null | number
  • +

    Validates a TOTP token.

    +

    Parameters

    • __namedParameters: { algorithm: undefined | string; digits: number; period: undefined | number; secret: Secret; timestamp: undefined | number; token: string; window: undefined | number }
      • algorithm: undefined | string
      • digits: number
      • period: undefined | number
      • secret: Secret
      • timestamp: undefined | number
      • token: string
      • window: undefined | number

    Returns null | number

    Token delta, or null if the token is not found.

    +

Legend

  • Constructor
  • Property
  • Method
  • Static method

Settings

Theme

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/classes/URI.html b/docs/classes/URI.html index a6afa2e2..4d58bf12 100644 --- a/docs/classes/URI.html +++ b/docs/classes/URI.html @@ -1,3128 +1,12 @@ - - - - - - URI | otpauth - - - - - -
-
-
-
-
- otpauth -
-
-
- Options -
-
- All -
    -
  • Public
  • -
  • Public/Protected
  • -
  • All
  • -
-
- - - - - - -
-
- Menu -
-
-
-
-
- -
-
-
-
-
-

HOTP/TOTP object/string conversion. - Key URI Format

-
-
-
-
-

Hierarchy

-
    -
  • - URI -
  • -
-
-
-

Index

-
-
-
-

Constructors

- -
-
-

Methods

- -
-
-
-
-
-

Constructors

-
- -

constructor

-
    -
  • new URI(): URI
  • -
-
    -
  • - -

    Returns URI

    -
  • -
-
-
-
-

Methods

-
- -

Static parse

- -
    -
  • - -
    -
    -

    Parses a Google Authenticator key URI and returns an HOTP/TOTP object.

    -
    -
    -

    Parameters

    -
      -
    • -
      uri: string
      -
      -

      Google Authenticator Key URI.

      -
      -
    • -
    -

    Returns HOTP | TOTP

    -

    HOTP/TOTP object.

    -
  • -
-
-
- -

Static stringify

-
    -
  • stringify(otp: HOTP | TOTP): string
  • -
-
    -
  • - -
    -
    -

    Converts an HOTP/TOTP object to a Google Authenticator key URI.

    -
    -
    -

    Parameters

    -
      -
    • -
      otp: HOTP | TOTP
      -
      -

      HOTP/TOTP object.

      -
      -
    • -
    -

    Returns string

    -

    Google Authenticator Key URI.

    -
  • -
-
-
-
-
-

Legend

-
-
    -
  • Constructor
  • -
  • Property
  • -
  • Method
  • -
-
    -
  • Static method
  • -
-
-
-
-
-

Generated using TypeDoc

-
-
-
- - - \ No newline at end of file +URI | otpauth
Options
All
  • Public
  • Public/Protected
  • All
Menu

Class URI

+

HOTP/TOTP object/string conversion. +Key URI Format

+

Hierarchy

  • URI

Index

Constructors

Methods

Constructors

constructor

Methods

Static parse

  • +

    Parses a Google Authenticator key URI and returns an HOTP/TOTP object.

    +

    Parameters

    • uri: string

      Google Authenticator Key URI.

      +

    Returns HOTP | TOTP

    HOTP/TOTP object.

    +

Static stringify

  • +

    Converts an HOTP/TOTP object to a Google Authenticator key URI.

    +

    Parameters

    Returns string

    Google Authenticator Key URI.

    +

Legend

  • Constructor
  • Property
  • Method
  • Static method

Settings

Theme

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/index.html b/docs/index.html index 6e51e1ec..0f67dd9f 100644 --- a/docs/index.html +++ b/docs/index.html @@ -1,3120 +1,57 @@ - - - - - - otpauth | otpauth - - - - - -
-
-
-
-
- otpauth -
-
-
- Options -
-
- All -
    -
  • Public
  • -
  • Public/Protected
  • -
  • All
  • -
-
- - - - - - -
-
- Menu -
-
-
-
-
- -
-
-
-

Last version - Build Status - Dependencies status - Dev dependencies status - NPM downloads

-
- -

OTPAuth

-
-

One Time Password (HOTP/TOTP) library for Node.js, Deno and browsers.

- -

Usage

-
- -

Node.js

-
-
import * as OTPAuth from 'otpauth';
-
-// Create a new TOTP object.
-let totp = new OTPAuth.TOTP({
-    issuer: 'ACME',
-    label: 'AzureDiamond',
-    algorithm: 'SHA1',
-    digits: 6,
-    period: 30,
-    secret: 'NB2W45DFOIZA' // or "OTPAuth.Secret.fromBase32('NB2W45DFOIZA')"
-});
-
-// Generate a token.
-let token = totp.generate();
-
-// Validate a token.
-let delta = totp.validate({
-    token: token,
-    window: 1
-});
-
-// Convert to Google Authenticator key URI.
-// otpauth://totp/ACME:AzureDiamond?issuer=ACME&secret=NB2W45DFOIZA&algorithm=SHA1&digits=6&period=30
-let uri = totp.toString(); // or "OTPAuth.URI.stringify(totp)"
-
-// Convert from Google Authenticator key URI.
-let parsedTotp = OTPAuth.URI.parse(uri);
+otpauth
Options
All
  • Public
  • Public/Protected
  • All
Menu

otpauth

Last version +Build Status +Dependencies status +Dev dependencies status +NPM downloads

+
+ + +

OTPAuth

+
+

One Time Password (HOTP/TOTP) library for Node.js, Deno and browsers.

+ + +

Usage

+
+ + +

Node.js

+
+
import * as OTPAuth from 'otpauth';

// Create a new TOTP object.
let totp = new OTPAuth.TOTP({
issuer: 'ACME',
label: 'AzureDiamond',
algorithm: 'SHA1',
digits: 6,
period: 30,
secret: 'NB2W45DFOIZA' // or "OTPAuth.Secret.fromBase32('NB2W45DFOIZA')"
});

// Generate a token.
let token = totp.generate();

// Validate a token.
let delta = totp.validate({
token: token,
window: 1
});

// Convert to Google Authenticator key URI.
// otpauth://totp/ACME:AzureDiamond?issuer=ACME&secret=NB2W45DFOIZA&algorithm=SHA1&digits=6&period=30
let uri = totp.toString(); // or "OTPAuth.URI.stringify(totp)"

// Convert from Google Authenticator key URI.
let parsedTotp = OTPAuth.URI.parse(uri);
- -

Deno

-
-
// @deno-types="https://deno.land/x/otpauth/dist/otpauth.d.ts"
-import * as OTPAuth from 'https://deno.land/x/otpauth/dist/otpauth.esm.js'
 
-// Same as above...
+
+  

Deno

+
+
// @deno-types="https://deno.land/x/otpauth/dist/otpauth.d.ts"
import * as OTPAuth from 'https://deno.land/x/otpauth/dist/otpauth.esm.js'

// Same as above...
- -

Browsers

-
-
<script src="https://cdn.jsdelivr.net/npm/otpauth/dist/otpauth.umd.min.js"></script>
-<script>
-    // Same as above...
-</script>
-
- -

Documentation

-
-

See the documentation page.

-
-

https://hectorm.github.io/otpauth/

-
- -

Supported hashing algorithms

-
-

In Node.js, the same algorithms as - Crypto.createHmac - function are supported, since it is used internally. In Deno and browsers, the SHA1, SHA224, SHA256, SHA384, - SHA512, SHA3-224, SHA3-256, SHA3-384 and SHA3-512 algorithms are supported by using the - jsSHA library.

- -

License

-
-

MIT License - © Héctor Molinero Fernández.

-
-
-
-

Index

-
-
-
-

Classes

- -
-
-

Variables

- -
-
-
-
-
-

Variables

-
- -

Const version

-
version: string = '__OTPAUTH_VERSION__'
- -
-
-

Library version.

-
-
-
-
-
-
-

Legend

-
-
    -
  • Constructor
  • -
  • Property
  • -
  • Method
  • -
-
    -
  • Static method
  • -
-
-
-
-
-

Generated using TypeDoc

-
-
-
- - - \ No newline at end of file + +

Documentation

+
+

See the documentation page.

+
+

https://hectorm.github.io/otpauth/

+
+ + +

Supported hashing algorithms

+
+

In Node.js, the same algorithms as +Crypto.createHmac +function are supported, since it is used internally. In Deno and browsers, the SHA1, SHA224, SHA256, SHA384, +SHA512, SHA3-224, SHA3-256, SHA3-384 and SHA3-512 algorithms are supported by using the +jsSHA library.

+ + +

License

+
+

MIT LicenseHéctor Molinero Fernández.

+

Legend

  • Constructor
  • Property
  • Method
  • Static method

Settings

Theme

Generated using TypeDoc

\ No newline at end of file diff --git a/docs/modules.html b/docs/modules.html index b3fa9a42..6f1c132e 100644 --- a/docs/modules.html +++ b/docs/modules.html @@ -1,3119 +1,3 @@ - - - - - - otpauth | otpauth - - - - - -
-
-
-
-
- otpauth -
-
-
- Options -
-
- All -
    -
  • Public
  • -
  • Public/Protected
  • -
  • All
  • -
-
- - - - - - -
-
- Menu -
-
-
-
-
- -
-
-
-

Last version - Build Status - Dependencies status - Dev dependencies status - NPM downloads

-
- -

OTPAuth

-
-

One Time Password (HOTP/TOTP) library for Node.js, Deno and browsers.

- -

Usage

-
- -

Node.js

-
-
import * as OTPAuth from 'otpauth';
-
-// Create a new TOTP object.
-let totp = new OTPAuth.TOTP({
-    issuer: 'ACME',
-    label: 'AzureDiamond',
-    algorithm: 'SHA1',
-    digits: 6,
-    period: 30,
-    secret: 'NB2W45DFOIZA' // or "OTPAuth.Secret.fromBase32('NB2W45DFOIZA')"
-});
-
-// Generate a token.
-let token = totp.generate();
-
-// Validate a token.
-let delta = totp.validate({
-    token: token,
-    window: 1
-});
-
-// Convert to Google Authenticator key URI.
-// otpauth://totp/ACME:AzureDiamond?issuer=ACME&secret=NB2W45DFOIZA&algorithm=SHA1&digits=6&period=30
-let uri = totp.toString(); // or "OTPAuth.URI.stringify(totp)"
-
-// Convert from Google Authenticator key URI.
-let parsedTotp = OTPAuth.URI.parse(uri);
-
- -

Deno

-
-
// @deno-types="https://deno.land/x/otpauth/dist/otpauth.d.ts"
-import * as OTPAuth from 'https://deno.land/x/otpauth/dist/otpauth.esm.js'
-
-// Same as above...
-
- -

Browsers

-
-
<script src="https://cdn.jsdelivr.net/npm/otpauth/dist/otpauth.umd.min.js"></script>
-<script>
-    // Same as above...
-</script>
-
- -

Documentation

-
-

See the documentation page.

-
-

https://hectorm.github.io/otpauth/

-
- -

Supported hashing algorithms

-
-

In Node.js, the same algorithms as - Crypto.createHmac - function are supported, since it is used internally. In Deno and browsers, the SHA1, SHA224, SHA256, SHA384, - SHA512, SHA3-224, SHA3-256, SHA3-384 and SHA3-512 algorithms are supported by using the - jsSHA library.

- -

License

-
-

MIT License - © Héctor Molinero Fernández.

-
-
-

Index

-
-
-
-

Classes

- -
-
-

Variables

- -
-
-
-
-
-

Variables

-
- -

Const version

-
version: string = '__OTPAUTH_VERSION__'
- -
-
-

Library version.

-
-
-
-
-
-
-

Legend

-
-
    -
  • Constructor
  • -
  • Property
  • -
  • Method
  • -
-
    -
  • Static method
  • -
-
-
-
-
-

Generated using TypeDoc

-
-
-
- - - \ No newline at end of file +otpauth
Options
All
  • Public
  • Public/Protected
  • All
Menu

otpauth

Index

Classes

Variables

Variables

version

version: string = '__OTPAUTH_VERSION__'
+

Library version.

+

Legend

  • Constructor
  • Property
  • Method
  • Static method

Settings

Theme

Generated using TypeDoc

\ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 362a2c4c..c089aa6b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "otpauth", - "version": "7.0.5", + "version": "7.0.6", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "otpauth", - "version": "7.0.5", + "version": "7.0.6", "license": "MIT", "dependencies": { "jssha": "~3.2.0" diff --git a/package.json b/package.json index 025c4925..25e170ab 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "otpauth", - "version": "7.0.5", + "version": "7.0.6", "description": "One Time Password (HOTP/TOTP) library for Node.js, Deno and browsers", "keywords": [ "otp",