swarmcloud-hls 2.3.4 → 2.3.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- !function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.P2pEngineHls=t():e.P2pEngineHls=t()}(self,(()=>(()=>{var __webpack_modules__={204:e=>{"use strict";var t,s="object"==typeof Reflect?Reflect:null,r=s&&"function"==typeof s.apply?s.apply:function(e,t,s){return Function.prototype.apply.call(e,t,s)};t=s&&"function"==typeof s.ownKeys?s.ownKeys:Object.getOwnPropertySymbols?function(e){return Object.getOwnPropertyNames(e).concat(Object.getOwnPropertySymbols(e))}:function(e){return Object.getOwnPropertyNames(e)};var n=Number.isNaN||function(e){return e!=e};function i(){i.init.call(this)}e.exports=i,e.exports.once=function(e,t){return new Promise((function(s,r){function n(s){e.removeListener(t,i),r(s)}function i(){"function"==typeof e.removeListener&&e.removeListener("error",n),s([].slice.call(arguments))}p(e,t,i,{once:!0}),"error"!==t&&function(e,t,s){"function"==typeof e.on&&p(e,"error",t,s)}(e,n,{once:!0})}))},i.EventEmitter=i,i.prototype._events=void 0,i.prototype._eventsCount=0,i.prototype._maxListeners=void 0;var o=10;function a(e){if("function"!=typeof e)throw new TypeError('The "listener" argument must be of type Function. Received type '+typeof e)}function h(e){return void 0===e._maxListeners?i.defaultMaxListeners:e._maxListeners}function l(e,t,s,r){var n,i,o,l;if(a(s),void 0===(i=e._events)?(i=e._events=Object.create(null),e._eventsCount=0):(void 0!==i.newListener&&(e.emit("newListener",t,s.listener?s.listener:s),i=e._events),o=i[t]),void 0===o)o=i[t]=s,++e._eventsCount;else if("function"==typeof o?o=i[t]=r?[s,o]:[o,s]:r?o.unshift(s):o.push(s),(n=h(e))>0&&o.length>n&&!o.warned){o.warned=!0;var c=new Error("Possible EventEmitter memory leak detected. "+o.length+" "+String(t)+" listeners added. Use emitter.setMaxListeners() to increase limit");c.name="MaxListenersExceededWarning",c.emitter=e,c.type=t,c.count=o.length,l=c,console&&console.warn&&console.warn(l)}return e}function c(){if(!this.fired)return this.target.removeListener(this.type,this.wrapFn),this.fired=!0,0===arguments.length?this.listener.call(this.target):this.listener.apply(this.target,arguments)}function d(e,t,s){var r={fired:!1,wrapFn:void 0,target:e,type:t,listener:s},n=c.bind(r);return n.listener=s,r.wrapFn=n,n}function u(e,t,s){var r=e._events;if(void 0===r)return[];var n=r[t];return void 0===n?[]:"function"==typeof n?s?[n.listener||n]:[n]:s?function(e){for(var t=new Array(e.length),s=0;s<t.length;++s)t[s]=e[s].listener||e[s];return t}(n):f(n,n.length)}function g(e){var t=this._events;if(void 0!==t){var s=t[e];if("function"==typeof s)return 1;if(void 0!==s)return s.length}return 0}function f(e,t){for(var s=new Array(t),r=0;r<t;++r)s[r]=e[r];return s}function p(e,t,s,r){if("function"==typeof e.on)r.once?e.once(t,s):e.on(t,s);else{if("function"!=typeof e.addEventListener)throw new TypeError('The "emitter" argument must be of type EventEmitter. Received type '+typeof e);e.addEventListener(t,(function n(i){r.once&&e.removeEventListener(t,n),s(i)}))}}Object.defineProperty(i,"defaultMaxListeners",{enumerable:!0,get:function(){return o},set:function(e){if("number"!=typeof e||e<0||n(e))throw new RangeError('The value of "defaultMaxListeners" is out of range. It must be a non-negative number. Received '+e+".");o=e}}),i.init=function(){void 0!==this._events&&this._events!==Object.getPrototypeOf(this)._events||(this._events=Object.create(null),this._eventsCount=0),this._maxListeners=this._maxListeners||void 0},i.prototype.setMaxListeners=function(e){if("number"!=typeof e||e<0||n(e))throw new RangeError('The value of "n" is out of range. It must be a non-negative number. Received '+e+".");return this._maxListeners=e,this},i.prototype.getMaxListeners=function(){return h(this)},i.prototype.emit=function(e){for(var t=[],s=1;s<arguments.length;s++)t.push(arguments[s]);var n="error"===e,i=this._events;if(void 0!==i)n=n&&void 0===i.error;else if(!n)return!1;if(n){var o;if(t.length>0&&(o=t[0]),o instanceof Error)throw o;var a=new Error("Unhandled error."+(o?" ("+o.message+")":""));throw a.context=o,a}var h=i[e];if(void 0===h)return!1;if("function"==typeof h)r(h,this,t);else{var l=h.length,c=f(h,l);for(s=0;s<l;++s)r(c[s],this,t)}return!0},i.prototype.addListener=function(e,t){return l(this,e,t,!1)},i.prototype.on=i.prototype.addListener,i.prototype.prependListener=function(e,t){return l(this,e,t,!0)},i.prototype.once=function(e,t){return a(t),this.on(e,d(this,e,t)),this},i.prototype.prependOnceListener=function(e,t){return a(t),this.prependListener(e,d(this,e,t)),this},i.prototype.removeListener=function(e,t){var s,r,n,i,o;if(a(t),void 0===(r=this._events))return this;if(void 0===(s=r[e]))return this;if(s===t||s.listener===t)0==--this._eventsCount?this._events=Object.create(null):(delete r[e],r.removeListener&&this.emit("removeListener",e,s.listener||t));else if("function"!=typeof s){for(n=-1,i=s.length-1;i>=0;i--)if(s[i]===t||s[i].listener===t){o=s[i].listener,n=i;break}if(n<0)return this;0===n?s.shift():function(e,t){for(;t+1<e.length;t++)e[t]=e[t+1];e.pop()}(s,n),1===s.length&&(r[e]=s[0]),void 0!==r.removeListener&&this.emit("removeListener",e,o||t)}return this},i.prototype.off=i.prototype.removeListener,i.prototype.removeAllListeners=function(e){var t,s,r;if(void 0===(s=this._events))return this;if(void 0===s.removeListener)return 0===arguments.length?(this._events=Object.create(null),this._eventsCount=0):void 0!==s[e]&&(0==--this._eventsCount?this._events=Object.create(null):delete s[e]),this;if(0===arguments.length){var n,i=Object.keys(s);for(r=0;r<i.length;++r)"removeListener"!==(n=i[r])&&this.removeAllListeners(n);return this.removeAllListeners("removeListener"),this._events=Object.create(null),this._eventsCount=0,this}if("function"==typeof(t=s[e]))this.removeListener(e,t);else if(void 0!==t)for(r=t.length-1;r>=0;r--)this.removeListener(e,t[r]);return this},i.prototype.listeners=function(e){return u(this,e,!0)},i.prototype.rawListeners=function(e){return u(this,e,!1)},i.listenerCount=function(e,t){return"function"==typeof e.listenerCount?e.listenerCount(t):g.call(e,t)},i.prototype.listenerCount=g,i.prototype.eventNames=function(){return this._eventsCount>0?t(this._events):[]}},622:function(e){var t,s,r,n,i;t=/^(?=((?:[a-zA-Z0-9+\-.]+:)?))\1(?=((?:\/\/[^\/?#]*)?))\2(?=((?:(?:[^?#\/]*\/)*[^;?#\/]*)?))\3((?:;[^?#]*)?)(\?[^#]*)?(#[^]*)?$/,s=/^(?=([^\/?#]*))\1([^]*)$/,r=/(?:\/|^)\.(?=\/)/g,n=/(?:\/|^)\.\.\/(?!\.\.\/)[^\/]*(?=\/)/g,i={buildAbsoluteURL:function(e,t,r){if(r=r||{},e=e.trim(),!(t=t.trim())){if(!r.alwaysNormalize)return e;var n=i.parseURL(e);if(!n)throw new Error("Error trying to parse base URL.");return n.path=i.normalizePath(n.path),i.buildURLFromParts(n)}var o=i.parseURL(t);if(!o)throw new Error("Error trying to parse relative URL.");if(o.scheme)return r.alwaysNormalize?(o.path=i.normalizePath(o.path),i.buildURLFromParts(o)):t;var a=i.parseURL(e);if(!a)throw new Error("Error trying to parse base URL.");if(!a.netLoc&&a.path&&"/"!==a.path[0]){var h=s.exec(a.path);a.netLoc=h[1],a.path=h[2]}a.netLoc&&!a.path&&(a.path="/");var l={scheme:a.scheme,netLoc:o.netLoc,path:null,params:o.params,query:o.query,fragment:o.fragment};if(!o.netLoc&&(l.netLoc=a.netLoc,"/"!==o.path[0]))if(o.path){var c=a.path,d=c.substring(0,c.lastIndexOf("/")+1)+o.path;l.path=i.normalizePath(d)}else l.path=a.path,o.params||(l.params=a.params,o.query||(l.query=a.query));return null===l.path&&(l.path=r.alwaysNormalize?i.normalizePath(o.path):o.path),i.buildURLFromParts(l)},parseURL:function(e){var s=t.exec(e);return s?{scheme:s[1]||"",netLoc:s[2]||"",path:s[3]||"",params:s[4]||"",query:s[5]||"",fragment:s[6]||""}:null},normalizePath:function(e){for(e=e.split("").reverse().join("").replace(r,"");e.length!==(e=e.replace(n,"")).length;);return e.split("").reverse().join("")},buildURLFromParts:function(e){return e.scheme+e.netLoc+e.path+e.params+e.query+e.fragment}},e.exports=i},47:(e,t)=>{"use strict";t.l=n;var s=2147483647;function r(e){if(e>s)throw new RangeError('The value "'+e+'" is invalid for option "size"');var t=new Uint8Array(e);return t.__proto__=n.prototype,t}function n(e,t,s){if("number"==typeof e){if("string"==typeof t)throw new TypeError('The "string" argument must be of type string. Received type number');return a(e)}return i(e,t,s)}function i(e,t,s){if("string"==typeof e)return function(e,t){"string"==typeof t&&""!==t||(t="utf8");if(!n.isEncoding(t))throw new TypeError("Unknown encoding: "+t);var s=0|c(e,t),i=r(s),o=i.write(e,t);o!==s&&(i=i.slice(0,o));return i}(e,t);if(ArrayBuffer.isView(e))return h(e);if(null==e)throw TypeError("The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type "+typeof e);if(m(e,ArrayBuffer)||e&&m(e.buffer,ArrayBuffer))return function(e,t,s){if(t<0||e.byteLength<t)throw new RangeError('"offset" is outside of buffer bounds');if(e.byteLength<t+(s||0))throw new RangeError('"length" is outside of buffer bounds');var r;r=void 0===t&&void 0===s?new Uint8Array(e):void 0===s?new Uint8Array(e,t):new Uint8Array(e,t,s);return r.__proto__=n.prototype,r}(e,t,s);if("number"==typeof e)throw new TypeError('The "value" argument must not be of type number. Received type number');var i=e.valueOf&&e.valueOf();if(null!=i&&i!==e)return n.from(i,t,s);var o=function(e){if(n.isBuffer(e)){var t=0|l(e.length),s=r(t);return 0===s.length||e.copy(s,0,0,t),s}if(void 0!==e.length)return"number"!=typeof e.length||S(e.length)?r(0):h(e);if("Buffer"===e.type&&Array.isArray(e.data))return h(e.data)}(e);if(o)return o;if("undefined"!=typeof Symbol&&null!=Symbol.toPrimitive&&"function"==typeof e[Symbol.toPrimitive])return n.from(e[Symbol.toPrimitive]("string"),t,s);throw new TypeError("The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type "+typeof e)}function o(e){if("number"!=typeof e)throw new TypeError('"size" argument must be of type number');if(e<0)throw new RangeError('The value "'+e+'" is invalid for option "size"')}function a(e){return o(e),r(e<0?0:0|l(e))}function h(e){for(var t=e.length<0?0:0|l(e.length),s=r(t),n=0;n<t;n+=1)s[n]=255&e[n];return s}function l(e){if(e>=s)throw new RangeError("Attempt to allocate Buffer larger than maximum size: 0x"+s.toString(16)+" bytes");return 0|e}function c(e,t){if(n.isBuffer(e))return e.length;if(ArrayBuffer.isView(e)||m(e,ArrayBuffer))return e.byteLength;if("string"!=typeof e)throw new TypeError('The "string" argument must be one of type string, Buffer, or ArrayBuffer. Received type '+typeof e);var s=e.length,r=arguments.length>2&&!0===arguments[2];if(!r&&0===s)return 0;for(var i=!1;;)switch(t){case"ascii":case"latin1":case"binary":return s;case"utf8":case"utf-8":return _(e).length;case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return 2*s;case"hex":return s>>>1;default:if(i)return r?-1:_(e).length;t=(""+t).toLowerCase(),i=!0}}function d(e,t,s,r){s=Number(s)||0;const n=e.length-s;r?(r=Number(r))>n&&(r=n):r=n;const i=t.length;let o;for(r>i/2&&(r=i/2),o=0;o<r;++o){const r=parseInt(t.substr(2*o,2),16);if(S(r))return o;e[s+o]=r}return o}function u(e,t,s,r){return p(_(t,e.length-s),e,s,r)}function g(e,t,s,r){return p(function(e){const t=[];for(let s=0;s<e.length;++s)t.push(255&e.charCodeAt(s));return t}(t),e,s,r)}function f(e,t,s,r){return p(function(e,t){let s,r,n;const i=[];for(let o=0;o<e.length&&!((t-=2)<0);++o)s=e.charCodeAt(o),r=s>>8,n=s%256,i.push(n),i.push(r);return i}(t,e.length-s),e,s,r)}function p(e,t,s,r){let n;for(n=0;n<r&&!(n+s>=t.length||n>=e.length);++n)t[n+s]=e[n];return n}function _(e,t){var s;t=t||1/0;for(var r=e.length,n=null,i=[],o=0;o<r;++o){if((s=e.charCodeAt(o))>55295&&s<57344){if(!n){if(s>56319){(t-=3)>-1&&i.push(239,191,189);continue}if(o+1===r){(t-=3)>-1&&i.push(239,191,189);continue}n=s;continue}if(s<56320){(t-=3)>-1&&i.push(239,191,189),n=s;continue}s=65536+(n-55296<<10|s-56320)}else n&&(t-=3)>-1&&i.push(239,191,189);if(n=null,s<128){if((t-=1)<0)break;i.push(s)}else if(s<2048){if((t-=2)<0)break;i.push(s>>6|192,63&s|128)}else if(s<65536){if((t-=3)<0)break;i.push(s>>12|224,s>>6&63|128,63&s|128)}else{if(!(s<1114112))throw new Error("Invalid code point");if((t-=4)<0)break;i.push(s>>18|240,s>>12&63|128,s>>6&63|128,63&s|128)}}return i}function m(e,t){return e instanceof t||null!=e&&null!=e.constructor&&null!=e.constructor.name&&e.constructor.name===t.name}function S(e){return e!=e}"undefined"!=typeof Symbol&&null!=Symbol.species&&n[Symbol.species]===n&&Object.defineProperty(n,Symbol.species,{value:null,configurable:!0,enumerable:!1,writable:!1}),n.from=function(e,t,s){return i(e,t,s)},n.prototype.__proto__=Uint8Array.prototype,n.__proto__=Uint8Array,n.alloc=function(e,t,s){return function(e,t,s){return o(e),e<=0?r(e):void 0!==t?"string"==typeof s?r(e).fill(t,s):r(e).fill(t):r(e)}(e,t,s)},n.allocUnsafe=function(e){return a(e)},n.isBuffer=function(e){return null!=e&&!0===e._isBuffer&&e!==n.prototype},n.isEncoding=function(e){switch(String(e).toLowerCase()){case"hex":case"utf8":case"utf-8":case"ascii":case"latin1":case"binary":case"base64":case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return!0;default:return!1}},n.concat=function(e,t){if(!Array.isArray(e))throw new TypeError('"list" argument must be an Array of Buffers');if(0===e.length)return n.alloc(0);var s;if(void 0===t)for(t=0,s=0;s<e.length;++s)t+=e[s].length;var r=n.allocUnsafe(t),i=0;for(s=0;s<e.length;++s){var o=e[s];if(m(o,Uint8Array)&&(o=n.from(o)),!n.isBuffer(o))throw new TypeError('"list" argument must be an Array of Buffers');o.copy(r,i),i+=o.length}return r},n.byteLength=c,n.prototype._isBuffer=!0,n.prototype.copy=function(e,t,s,r){if(!n.isBuffer(e))throw new TypeError("argument should be a Buffer");if(s||(s=0),r||0===r||(r=this.length),t>=e.length&&(t=e.length),t||(t=0),r>0&&r<s&&(r=s),r===s)return 0;if(0===e.length||0===this.length)return 0;if(t<0)throw new RangeError("targetStart out of bounds");if(s<0||s>=this.length)throw new RangeError("Index out of range");if(r<0)throw new RangeError("sourceEnd out of bounds");r>this.length&&(r=this.length),e.length-t<r-s&&(r=e.length-t+s);var i=r-s;if(this===e&&"function"==typeof Uint8Array.prototype.copyWithin)this.copyWithin(t,s,r);else if(this===e&&s<t&&t<r)for(var o=i-1;o>=0;--o)e[o+t]=this[o+s];else Uint8Array.prototype.set.call(e,this.subarray(s,r),t);return i},n.prototype.write=function(e,t,s,r){if(void 0===t)r="utf8",s=this.length,t=0;else if(void 0===s&&"string"==typeof t)r=t,s=this.length,t=0;else{if(!isFinite(t))throw new Error("Buffer.write(string, encoding, offset[, length]) is no longer supported");t>>>=0,isFinite(s)?(s>>>=0,void 0===r&&(r="utf8")):(r=s,s=void 0)}const n=this.length-t;if((void 0===s||s>n)&&(s=n),e.length>0&&(s<0||t<0)||t>this.length)throw new RangeError("Attempt to write outside buffer bounds");r||(r="utf8");let i=!1;for(;;)switch(r){case"hex":return d(this,e,t,s);case"utf8":case"utf-8":return u(this,e,t,s);case"ascii":case"latin1":case"binary":return g(this,e,t,s);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return f(this,e,t,s);default:if(i)throw new TypeError("Unknown encoding: "+r);r=(""+r).toLowerCase(),i=!0}}},934:e=>{"use strict";function t(e,t){for(const s in t)Object.defineProperty(e,s,{value:t[s],enumerable:!0,configurable:!0});return e}e.exports=function(e,s,r){if(!e||"string"==typeof e)throw new TypeError("Please pass an Error to err-code");r||(r={}),"object"==typeof s&&(r=s,s=void 0),null!=s&&(r.code=s);try{return t(e,r)}catch(s){r.message=e.message,r.stack=e.stack;const n=function(){};return n.prototype=Object.create(Object.getPrototypeOf(e)),t(new n,r)}}},485:function(e,t,s){var r;!function(n){"use strict";function i(e,t){var s=(65535&e)+(65535&t);return(e>>16)+(t>>16)+(s>>16)<<16|65535&s}function o(e,t,s,r,n,o){return i((a=i(i(t,e),i(r,o)))<<(h=n)|a>>>32-h,s);var a,h}function a(e,t,s,r,n,i,a){return o(t&s|~t&r,e,t,n,i,a)}function h(e,t,s,r,n,i,a){return o(t&r|s&~r,e,t,n,i,a)}function l(e,t,s,r,n,i,a){return o(t^s^r,e,t,n,i,a)}function c(e,t,s,r,n,i,a){return o(s^(t|~r),e,t,n,i,a)}function d(e,t){var s,r,n,o,d;e[t>>5]|=128<<t%32,e[14+(t+64>>>9<<4)]=t;var u=1732584193,g=-271733879,f=-1732584194,p=271733878;for(s=0;s<e.length;s+=16)r=u,n=g,o=f,d=p,u=a(u,g,f,p,e[s],7,-680876936),p=a(p,u,g,f,e[s+1],12,-389564586),f=a(f,p,u,g,e[s+2],17,606105819),g=a(g,f,p,u,e[s+3],22,-1044525330),u=a(u,g,f,p,e[s+4],7,-176418897),p=a(p,u,g,f,e[s+5],12,1200080426),f=a(f,p,u,g,e[s+6],17,-1473231341),g=a(g,f,p,u,e[s+7],22,-45705983),u=a(u,g,f,p,e[s+8],7,1770035416),p=a(p,u,g,f,e[s+9],12,-1958414417),f=a(f,p,u,g,e[s+10],17,-42063),g=a(g,f,p,u,e[s+11],22,-1990404162),u=a(u,g,f,p,e[s+12],7,1804603682),p=a(p,u,g,f,e[s+13],12,-40341101),f=a(f,p,u,g,e[s+14],17,-1502002290),u=h(u,g=a(g,f,p,u,e[s+15],22,1236535329),f,p,e[s+1],5,-165796510),p=h(p,u,g,f,e[s+6],9,-1069501632),f=h(f,p,u,g,e[s+11],14,643717713),g=h(g,f,p,u,e[s],20,-373897302),u=h(u,g,f,p,e[s+5],5,-701558691),p=h(p,u,g,f,e[s+10],9,38016083),f=h(f,p,u,g,e[s+15],14,-660478335),g=h(g,f,p,u,e[s+4],20,-405537848),u=h(u,g,f,p,e[s+9],5,568446438),p=h(p,u,g,f,e[s+14],9,-1019803690),f=h(f,p,u,g,e[s+3],14,-187363961),g=h(g,f,p,u,e[s+8],20,1163531501),u=h(u,g,f,p,e[s+13],5,-1444681467),p=h(p,u,g,f,e[s+2],9,-51403784),f=h(f,p,u,g,e[s+7],14,1735328473),u=l(u,g=h(g,f,p,u,e[s+12],20,-1926607734),f,p,e[s+5],4,-378558),p=l(p,u,g,f,e[s+8],11,-2022574463),f=l(f,p,u,g,e[s+11],16,1839030562),g=l(g,f,p,u,e[s+14],23,-35309556),u=l(u,g,f,p,e[s+1],4,-1530992060),p=l(p,u,g,f,e[s+4],11,1272893353),f=l(f,p,u,g,e[s+7],16,-155497632),g=l(g,f,p,u,e[s+10],23,-1094730640),u=l(u,g,f,p,e[s+13],4,681279174),p=l(p,u,g,f,e[s],11,-358537222),f=l(f,p,u,g,e[s+3],16,-722521979),g=l(g,f,p,u,e[s+6],23,76029189),u=l(u,g,f,p,e[s+9],4,-640364487),p=l(p,u,g,f,e[s+12],11,-421815835),f=l(f,p,u,g,e[s+15],16,530742520),u=c(u,g=l(g,f,p,u,e[s+2],23,-995338651),f,p,e[s],6,-198630844),p=c(p,u,g,f,e[s+7],10,1126891415),f=c(f,p,u,g,e[s+14],15,-1416354905),g=c(g,f,p,u,e[s+5],21,-57434055),u=c(u,g,f,p,e[s+12],6,1700485571),p=c(p,u,g,f,e[s+3],10,-1894986606),f=c(f,p,u,g,e[s+10],15,-1051523),g=c(g,f,p,u,e[s+1],21,-2054922799),u=c(u,g,f,p,e[s+8],6,1873313359),p=c(p,u,g,f,e[s+15],10,-30611744),f=c(f,p,u,g,e[s+6],15,-1560198380),g=c(g,f,p,u,e[s+13],21,1309151649),u=c(u,g,f,p,e[s+4],6,-145523070),p=c(p,u,g,f,e[s+11],10,-1120210379),f=c(f,p,u,g,e[s+2],15,718787259),g=c(g,f,p,u,e[s+9],21,-343485551),u=i(u,r),g=i(g,n),f=i(f,o),p=i(p,d);return[u,g,f,p]}function u(e){var t,s="",r=32*e.length;for(t=0;t<r;t+=8)s+=String.fromCharCode(e[t>>5]>>>t%32&255);return s}function g(e){var t,s=[];for(s[(e.length>>2)-1]=void 0,t=0;t<s.length;t+=1)s[t]=0;var r=8*e.length;for(t=0;t<r;t+=8)s[t>>5]|=(255&e.charCodeAt(t/8))<<t%32;return s}function f(e){var t,s,r="0123456789abcdef",n="";for(s=0;s<e.length;s+=1)t=e.charCodeAt(s),n+=r.charAt(t>>>4&15)+r.charAt(15&t);return n}function p(e){return unescape(encodeURIComponent(e))}function _(e){return function(e){return u(d(g(e),8*e.length))}(p(e))}function m(e,t){return function(e,t){var s,r,n=g(e),i=[],o=[];for(i[15]=o[15]=void 0,n.length>16&&(n=d(n,8*e.length)),s=0;s<16;s+=1)i[s]=909522486^n[s],o[s]=1549556828^n[s];return r=d(i.concat(g(t)),512+8*t.length),u(d(o.concat(r),640))}(p(e),p(t))}function S(e,t,s){return t?s?m(t,e):f(m(t,e)):s?_(e):f(_(e))}void 0===(r=function(){return S}.call(t,s,t,e))||(e.exports=r)}()},422:e=>{const t={ANDROID_WEB:"android-web",IOS_WEB:"iOS-web",PC_NATIVE:"PC-native",PC_WEB:"PC-web"};var s={getNetType:function(){let e=(new RegExp("nettype\\/(\\w*)").exec(r())||[,""])[1].toLowerCase();if(!e&&navigator.connection){switch(navigator.connection.type){case"ethernet":e="ethernet";break;case"cellular":e="cellular";break;default:e="wifi"}}return e},getPlatform:function(){return s.isAndroid()?t.ANDROID_WEB:s.isIOS()?t.IOS_WEB:s.isElectron()?t.PC_NATIVE:t.PC_WEB},isX5:function(){return this.isAndroid()&&/\s(TBS|X5Core)\/[\w\.\-]+/i.test(r())},isPC:function(){return!i(n("os "))&&!i(n("android[/ ]"))},isIOS:function(){return i(n("os "))},isAndroid:function(){return i(n("android[/ ]"))},isIOSSafari:function(){return this.isIOS()&&this.isSafari()},isElectron:function(){return/electron/i.test(r())},isMobile:function(){return s.isAndroid()||s.isIOS()},isSafari:function(){return/^((?!chrome|android).)*safari/i.test(r())},isFirefox:function(){return/firefox/i.test(r())},isChrome:function(){return/chrome/i.test(r())},isLocalHost:function(){return"localhost"===location.hostname},device:t,getBrowser:function(){return s.isX5()?"X5":s.isChrome()?"Chrome":s.isFirefox()?"Firefox":s.isIOSSafari()?"iOS-Safari":s.isSafari()?"Mac-Safari":"Unknown"}};function r(){return navigator.userAgent.toLowerCase()}function n(e){return""+(new RegExp(e+"(\\d+((\\.|_)\\d+)*)").exec(r())||[,0])[1]||void 0}function i(e){return parseFloat((e||"").replace(/\_/g,"."))||0}e.exports=s},77:e=>{let t;e.exports="function"==typeof queueMicrotask?queueMicrotask.bind(globalThis):e=>(t||(t=Promise.resolve())).then(e).catch((e=>setTimeout((()=>{throw e}),0)))}},__webpack_module_cache__={};function __webpack_require__(e){var t=__webpack_module_cache__[e];if(void 0!==t)return t.exports;var s=__webpack_module_cache__[e]={exports:{}};return __webpack_modules__[e].call(s.exports,s,s.exports,__webpack_require__),s.exports}__webpack_require__.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return __webpack_require__.d(t,{a:t}),t},__webpack_require__.d=(e,t)=>{for(var s in t)__webpack_require__.o(t,s)&&!__webpack_require__.o(e,s)&&Object.defineProperty(e,s,{enumerable:!0,get:t[s]})},__webpack_require__.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),__webpack_require__.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t);var __webpack_exports__={};return(()=>{"use strict";__webpack_require__.d(__webpack_exports__,{default:()=>index_engine});const events={DC_SIGNAL:"SIGNAL",DC_OPEN:"OPEN",DC_REQUEST:"REQUEST",DC_PIECE_NOT_FOUND:"PIECE_NOT_FOUND",DC_PIECE_ABORT:"PIECE_ABORT",DC_CLOSE:"CLOSE",DC_RESPONSE:"RESPONSE",DC_ERROR:"ERROR",DC_PIECE:"PIECE",DC_PIECE_DATA:"PIECE_DATA",DC_TIMEOUT:"TIMEOUT",DC_PIECE_ACK:"PIECE_ACK",DC_METADATA:"METADATA",DC_PLAT_ANDROID:"ANDROID",DC_PLAT_IOS:"IOS",DC_PLAT_WEB:"WEB",DC_CHOKE:"CHOKE",DC_UNCHOKE:"UNCHOKE",DC_HAVE:"HAVE",DC_HAVE_REVERSE:"HAVE_REVERSE",DC_LOST:"LOST",DC_GET_PEERS:"GET_PEERS",DC_PEERS:"PEERS",DC_STATS:"STATS",DC_PEER_SIGNAL:"PEER_SIGNAL",DC_PLAYLIST:"PLAYLIST",BM_LOST:"lost",BM_ADDED_SEG_:"BM_ADDED_SEG_",BM_ADDED_SN_:"BM_ADDED_SN_",BM_SEG_ADDED:"BM_SEG_ADDED",FRAG_CHANGED:"FRAG_CHANGED",FRAG_LOADED:"FRAG_LOADED",FRAG_LOADING:"FRAG_LOADING",RESTART_P2P:"RESTART_P2P",EXCEPTION:"exception"},hls_next_events={...events,SCH_DCHAVE:"SCH_DCHAVE",REQUESTING_MAP_HAVE:"REQUESTING_MAP_HAVE",SW_PLAYLIST:"SW_PLAYLIST",SW_GET_PLAYLIST:"SW_GET_PLAYLIST",SW_MEDIA:"SW_MEDIA",SW_GET_MEDIA:"SW_GET_MEDIA",LEVEL_LOADED:"LEVEL_LOADED",MANIFEST_PARSED:"MANIFEST_PARSED",FRAG_LOADED:"FRAG_LOADED",SYN_OUTPUT:"SYN_OUTPUT",SYN_ERROR:"SYN_ERROR",SYN_PARTIAL:"SYN_PARTIAL"};var _events_3_3_0_events_events=__webpack_require__(204),events_default=__webpack_require__.n(_events_3_3_0_events_events),utils_buffer=__webpack_require__(47),queue_microtask=__webpack_require__(77),queue_microtask_default=__webpack_require__.n(queue_microtask);const MAX_BUFFERED_AMOUNT=65536,ICECOMPLETE_TIMEOUT=5e3,CHANNEL_CLOSING_TIMEOUT=5e3;function filterTrickle(e){return e.replace(/a=ice-options:trickle\s\n/g,"")}function warn(e){console.warn(e)}class Peer extends(events_default()){constructor(e){super(),this.channelName=e.initiator?e.channelName:null,this.initiator=e.initiator||!1,this.channelConfig=e.channelConfig||Peer.channelConfig,this.channelNegotiated=this.channelConfig.negotiated,this.config=Object.assign({},Peer.config,e.config),this.offerOptions=e.offerOptions||{},this.answerOptions=e.answerOptions||{},this.sdpTransform=e.sdpTransform||(e=>e),this.trickle=void 0===e.trickle||e.trickle,this.allowHalfTrickle=void 0!==e.allowHalfTrickle&&e.allowHalfTrickle,this.iceCompleteTimeout=e.iceCompleteTimeout||ICECOMPLETE_TIMEOUT,this.destroyed=!1,this.destroying=!1,this._connected=!1,this.remoteAddress=void 0,this.remoteFamily=void 0,this.remotePort=void 0,this.localAddress=void 0,this.localFamily=void 0,this.localPort=void 0,this._wrtc=e.wrtc&&"object"==typeof e.wrtc?e.wrtc:getBrowserRTC(),this._pcReady=!1,this._channelReady=!1,this._iceComplete=!1,this._iceCompleteTimer=null,this._channel=null,this._pendingCandidates=[],this._isNegotiating=!1,this._firstNegotiation=!0,this._batchedNegotiation=!1,this._queuedNegotiation=!1,this._sendersAwaitingStable=[],this._senderMap=new Map,this._closingInterval=null,this._remoteTracks=[],this._remoteStreams=[],this._chunk=null,this._cb=null,this._interval=null;try{this._pc=new this._wrtc.RTCPeerConnection(this.config)}catch(e){return void queue_microtask_default()((()=>this.destroy(e)))}this._isReactNativeWebrtc="number"==typeof this._pc._peerConnectionId,this._pc.oniceconnectionstatechange=()=>{this._onIceStateChange()},this._pc.onicegatheringstatechange=()=>{this._onIceStateChange()},this._pc.onconnectionstatechange=()=>{this._onConnectionStateChange()},this._pc.onsignalingstatechange=()=>{this._onSignalingStateChange()},this._pc.onicecandidate=e=>{this._onIceCandidate(e)},this.initiator||this.channelNegotiated?this._setupData({channel:this._pc.createDataChannel(this.channelName,this.channelConfig)}):this._pc.ondatachannel=e=>{this._setupData(e)},this._needsNegotiation()}get bufferSize(){return this._channel&&this._channel.bufferedAmount||0}get connected(){return this._connected&&"open"===this._channel.readyState}signal(e){if(this.destroyed)throw new Error("cannot signal after peer is destroyed");if("string"==typeof e)try{e=JSON.parse(e)}catch(t){e={}}e.renegotiate&&this.initiator&&this._needsNegotiation(),e.transceiverRequest&&this.initiator&&this.addTransceiver(e.transceiverRequest.kind,e.transceiverRequest.init),e.candidate&&(this._pc.remoteDescription&&this._pc.remoteDescription.type?this._addIceCandidate(e.candidate):this._pendingCandidates.push(e.candidate)),e.sdp&&this._pc.setRemoteDescription(new this._wrtc.RTCSessionDescription(e)).then((()=>{this.destroyed||(this._pendingCandidates.forEach((e=>{this._addIceCandidate(e)})),this._pendingCandidates=[],"offer"===this._pc.remoteDescription.type&&this._createAnswer())})).catch((e=>{this.destroy(e)})),e.sdp||e.candidate||e.renegotiate||e.transceiverRequest||this.destroy(new Error("signal() called with invalid signal data"))}_addIceCandidate(e){const t=new this._wrtc.RTCIceCandidate(e);this._pc.addIceCandidate(t).catch((e=>{!t.address||t.address.endsWith(".local")?warn("Ignoring unsupported ICE candidate."):this.destroy(e)}))}send(e){this._channel.send(e)}addTransceiver(e,t){if(this.initiator)try{this._pc.addTransceiver(e,t),this._needsNegotiation()}catch(e){this.destroy(e)}else this.emit("signal",{type:"transceiverRequest",transceiverRequest:{kind:e,init:t}})}_needsNegotiation(){this._batchedNegotiation||(this._batchedNegotiation=!0,queue_microtask_default()((()=>{this._batchedNegotiation=!1,!this.initiator&&this._firstNegotiation||this.negotiate(),this._firstNegotiation=!1})))}negotiate(){this.initiator?this._isNegotiating?this._queuedNegotiation=!0:setTimeout((()=>{this._createOffer()}),0):this._isNegotiating?this._queuedNegotiation=!0:this.emit("signal",{type:"renegotiate",renegotiate:!0}),this._isNegotiating=!0}destroy(e){this._destroy(e,(()=>{}))}_destroy(e,t){this.destroyed||this.destroying||(this.destroying=!0,queue_microtask_default()((()=>{if(this.destroyed=!0,this.destroying=!1,this._connected=!1,this._pcReady=!1,this._channelReady=!1,this._remoteTracks=null,this._remoteStreams=null,this._senderMap=null,clearInterval(this._closingInterval),this._closingInterval=null,clearInterval(this._interval),this._interval=null,this._chunk=null,this._cb=null,this._channel){try{this._channel.close()}catch(e){}this._channel.onmessage=null,this._channel.onopen=null,this._channel.onclose=null,this._channel.onerror=null}if(this._pc){try{this._pc.close()}catch(e){}this._pc.oniceconnectionstatechange=null,this._pc.onicegatheringstatechange=null,this._pc.onsignalingstatechange=null,this._pc.onicecandidate=null,this._pc.ontrack=null,this._pc.ondatachannel=null}this._pc=null,this._channel=null,e&&this.emit("error",e),this.emit("close")})))}_setupData(e){if(!e.channel)return this.destroy(new Error("Data channel event is missing `channel` property"));this._channel=e.channel,this._channel.binaryType="arraybuffer","number"==typeof this._channel.bufferedAmountLowThreshold&&(this._channel.bufferedAmountLowThreshold=MAX_BUFFERED_AMOUNT),this.channelName=this._channel.label,this._channel.onmessage=e=>{this._onChannelMessage(e)},this._channel.onbufferedamountlow=()=>{this._onChannelBufferedAmountLow()},this._channel.onopen=()=>{this._onChannelOpen()},this._channel.onclose=()=>{this._onChannelClose()},this._channel.onerror=e=>{this.destroy(e)};let t=!1;this._closingInterval=setInterval((()=>{this._channel&&"closing"===this._channel.readyState?(t&&this._onChannelClose(),t=!0):t=!1}),CHANNEL_CLOSING_TIMEOUT)}_startIceCompleteTimeout(){this.destroyed||this._iceCompleteTimer||(this._iceCompleteTimer=setTimeout((()=>{this._iceComplete||(this._iceComplete=!0,this.emit("iceTimeout"),this.emit("_iceComplete"))}),this.iceCompleteTimeout))}_createOffer(){this.destroyed||this._pc.createOffer(this.offerOptions).then((e=>{if(this.destroyed)return;this.trickle||this.allowHalfTrickle||(e.sdp=filterTrickle(e.sdp)),e.sdp=this.sdpTransform(e.sdp);const t=()=>{if(this.destroyed)return;const t=this._pc.localDescription||e;this.emit("signal",{type:t.type,sdp:t.sdp})};this._pc.setLocalDescription(e).then((()=>{this.destroyed||(this.trickle||this._iceComplete?t():this.once("_iceComplete",t))})).catch((e=>{this.destroy(e)}))})).catch((e=>{this.destroy(e)}))}_requestMissingTransceivers(){this._pc.getTransceivers&&this._pc.getTransceivers().forEach((e=>{e.mid||!e.sender.track||e.requested||(e.requested=!0,this.addTransceiver(e.sender.track.kind))}))}_createAnswer(){this.destroyed||this._pc.createAnswer(this.answerOptions).then((e=>{if(this.destroyed)return;this.trickle||this.allowHalfTrickle||(e.sdp=filterTrickle(e.sdp)),e.sdp=this.sdpTransform(e.sdp);const t=()=>{if(this.destroyed)return;const t=this._pc.localDescription||e;this.emit("signal",{type:t.type,sdp:t.sdp}),this.initiator||this._requestMissingTransceivers()};this._pc.setLocalDescription(e).then((()=>{this.destroyed||(this.trickle||this._iceComplete?t():this.once("_iceComplete",t))})).catch((e=>{this.destroy(e)}))})).catch((e=>{this.destroy(e)}))}_onConnectionStateChange(){this.destroyed||"failed"===this._pc.connectionState&&this.destroy(new Error("Connection failed."))}_onIceStateChange(){if(this.destroyed)return;const e=this._pc.iceConnectionState,t=this._pc.iceGatheringState;this.emit("iceStateChange",e,t),"connected"!==e&&"completed"!==e||(this._pcReady=!0,this._maybeReady()),"failed"===e&&this.destroy(new Error("Ice connection failed.")),"closed"===e&&this.destroy(new Error("Ice connection closed."))}getStats(e){const t=e=>("[object Array]"===Object.prototype.toString.call(e.values)&&e.values.forEach((t=>{Object.assign(e,t)})),e);0===this._pc.getStats.length||this._isReactNativeWebrtc?this._pc.getStats().then((s=>{const r=[];s.forEach((e=>{r.push(t(e))})),e(null,r)}),(t=>e(t))):this._pc.getStats.length>0?this._pc.getStats((s=>{if(this.destroyed)return;const r=[];s.result().forEach((e=>{const s={};e.names().forEach((t=>{s[t]=e.stat(t)})),s.id=e.id,s.type=e.type,s.timestamp=e.timestamp,r.push(t(s))})),e(null,r)}),(t=>e(t))):e(null,[])}_maybeReady(){if(this._connected||this._connecting||!this._pcReady||!this._channelReady)return;this._connecting=!0;const e=()=>{this.destroyed||this.getStats(((t,s)=>{if(this.destroyed)return;t&&(s=[]);const r={},n={},i={};let o=!1;s.forEach((e=>{"remotecandidate"!==e.type&&"remote-candidate"!==e.type||(r[e.id]=e),"localcandidate"!==e.type&&"local-candidate"!==e.type||(n[e.id]=e),"candidatepair"!==e.type&&"candidate-pair"!==e.type||(i[e.id]=e)}));const a=e=>{o=!0;let t=n[e.localCandidateId];t&&(t.ip||t.address)?(this.localAddress=t.ip||t.address,this.localPort=Number(t.port)):t&&t.ipAddress?(this.localAddress=t.ipAddress,this.localPort=Number(t.portNumber)):"string"==typeof e.googLocalAddress&&(t=e.googLocalAddress.split(":"),this.localAddress=t[0],this.localPort=Number(t[1])),this.localAddress&&(this.localFamily=this.localAddress.includes(":")?"IPv6":"IPv4");let s=r[e.remoteCandidateId];s&&(s.ip||s.address)?(this.remoteAddress=s.ip||s.address,this.remotePort=Number(s.port)):s&&s.ipAddress?(this.remoteAddress=s.ipAddress,this.remotePort=Number(s.portNumber)):"string"==typeof e.googRemoteAddress&&(s=e.googRemoteAddress.split(":"),this.remoteAddress=s[0],this.remotePort=Number(s[1])),this.remoteAddress&&(this.remoteFamily=this.remoteAddress.includes(":")?"IPv6":"IPv4")};if(s.forEach((e=>{"transport"===e.type&&e.selectedCandidatePairId&&a(i[e.selectedCandidatePairId]),("googCandidatePair"===e.type&&"true"===e.googActiveConnection||("candidatepair"===e.type||"candidate-pair"===e.type)&&e.selected)&&a(e)})),o||Object.keys(i).length&&!Object.keys(n).length){if(this._connecting=!1,this._connected=!0,this._chunk){try{this.send(this._chunk)}catch(t){return this.destroy(t)}this._chunk=null;const e=this._cb;this._cb=null,e(null)}"number"!=typeof this._channel.bufferedAmountLowThreshold&&(this._interval=setInterval((()=>this._onInterval()),150),this._interval.unref&&this._interval.unref()),this.emit("connect")}else setTimeout(e,100)}))};e()}_onInterval(){!this._cb||!this._channel||this._channel.bufferedAmount>MAX_BUFFERED_AMOUNT||this._onChannelBufferedAmountLow()}_onSignalingStateChange(){this.destroyed||("stable"===this._pc.signalingState&&(this._isNegotiating=!1,this._sendersAwaitingStable.forEach((e=>{this._pc.removeTrack(e),this._queuedNegotiation=!0})),this._sendersAwaitingStable=[],this._queuedNegotiation?(this._queuedNegotiation=!1,this._needsNegotiation()):this.emit("negotiated")),this.emit("signalingStateChange",this._pc.signalingState))}_onIceCandidate(e){this.destroyed||(e.candidate&&this.trickle?this.emit("signal",{type:"candidate",candidate:{candidate:e.candidate.candidate,sdpMLineIndex:e.candidate.sdpMLineIndex,sdpMid:e.candidate.sdpMid}}):e.candidate||this._iceComplete||(this._iceComplete=!0,this.emit("_iceComplete")),e.candidate&&this._startIceCompleteTimeout())}_onChannelMessage(e){if(this.destroyed)return;let t=e.data;t instanceof ArrayBuffer&&(t=utils_buffer.l.from(t)),this.emit("data",t)}_onChannelBufferedAmountLow(){if(this.destroyed||!this._cb)return;const e=this._cb;this._cb=null,e(null)}_onChannelOpen(){this._connected||this.destroyed||(this._channelReady=!0,this._maybeReady())}_onChannelClose(){this.destroyed||this.destroy()}}Peer.config={iceServers:[{urls:["stun:stun.l.google.com:19302","stun:global.stun.twilio.com:3478"]}],sdpSemantics:"unified-plan"},Peer.channelConfig={};const peer_channel=Peer;class Segment{constructor(e,t,s,r,n=0){this.sn=e,this.segId=t,this.data=s,this.fromPeerId=r,this.level=n||0}static fromSegment(e){return new Segment(e.sn,e.segId,e.data,e.fromPeerId,e.level)}get size(){return this.data.byteLength}get isSequential(){return this.sn>=0}}var platform=__webpack_require__(422),platform_default=__webpack_require__.n(platform);const delimiter="|",arrayDelimiter=",",candTypeMap={h:"host",s:"srflx",p:"prflx",r:"relay"},sdpType2Char=(e,t)=>{let s;switch(e){case"candidate":s="c";break;case"offer":s=t?"q":"o";break;case"answer":s=t?"s":"a"}return s},char2SdpType=e=>{let t={};switch(e){case"o":t={type:"offer"};break;case"q":t={type:"offer",trickle:!0};break;case"a":t={type:"answer"};break;case"s":t={type:"answer",trickle:!0};break;case"c":t={type:"candidate",trickle:!0}}return t},charOffset=0,bytesToStr=e=>"number"==typeof e?bytesToStr([e]):String.fromCharCode(...e.map((e=>e+charOffset))),strToBytes=e=>e.split("").map((e=>e.charCodeAt(0)-charOffset));function parseCand(e){const[,t,s,r,n,i,o,a,h,l,c,d,u,g,f]=/(\S*) (\d*) (\S*) (\d*) (\S*) (\d*) typ (\S*)(?: raddr (\S*) rport (\d*))?(?: tcptype (\S*))?(?: generation (\d*))?(?: ufrag (\S*))?(?: network-id (\d*))?(?: network-cost (\d*))?/.exec(e);return{foundation:t,component:s,transport:r,priority:n,ip:i,port:o,type:a,raddr:h,rport:l,tcptype:c,generation:d,networkId:g,networkCost:f,ufrag:u}}function pack({type:e,sdp:t,candidate:s}){return t&&t.startsWith("v=0")?packSdp(e,t):"candidate"===e&&s?packCandidate(s.candidate):null}function packCandidate(e){const t=e.indexOf(":");if(t<=0)return null;let s=packCandItem(e.slice(t+1).trim());return s?sdpType2Char("candidate")+s.cand:null}function packSdp(e,t){let s,r,n,i=[],o=!1,a=!1;for(const e of t.split("\r\n")){const t=e.indexOf(":");if(t<=0)continue;if("a=ice-options:trickle"===e){a=!0;continue}const[h,l]=[e.slice(0,t),e.slice(t+1).trim()];switch(h){case"a=ice-ufrag":s=l;break;case"a=ice-pwd":r=l;break;case"a=fingerprint":n=bytesToStr(l.substr("sha-256".length).trim().split(":").map((e=>parseInt(e,16))));break;case"a=candidate":let e=packCandItem(l,o);if(!e)continue;if(e.local){if(o)continue;o=!0}i.push(e.cand)}}return sdpType2Char(e,a)+n+(i.length>0?i.join(arrayDelimiter):"")+(a?"":delimiter)+s+delimiter+r}function packCandItem(e){let t=!1;const s=parseCand(e);if("TCP"===s.transport)return null;s.ip.endsWith(".local")&&(t=!0);let r=s.type.charAt(0);const n=s.ip.split(".");if(4===n.length){const e=n.reduce((function(e,t){return(e<<8)+parseInt(t,10)}));r=`${r}${s.foundation} ${e}:${parseInt(s.port)}`}else r=`${r}${s.foundation} ${s.ip} ${s.port}`;return{cand:r,local:t}}function unpack(e,t){const s=char2SdpType(e.substr(0,1));return s?"candidate"===s.type?unpackCand(e):unpackSdp(s.type,t,e,s.trickle):null}function unpackCand(e){let t=unpackCandItem(e.substr(1),100);return t?{type:"candidate",candidate:{candidate:`candidate:${t}`,sdpMLineIndex:0,sdpMid:"0"}}:null}function unpackSdp(e,t,s,r){const n=strToBytes(s.slice(1,33)).map((e=>("0"+e.toString(16)).slice(-2))),i=s.substr(33);let o,a,h;r?[a,h]=i.split(delimiter):[o,a,h]=i.split(delimiter);const l=r?[]:o.split(arrayDelimiter),c=["v=0",`o=- ${t} 2 IN IP4 127.0.0.1`,"s=-","t=0 0","a=group:BUNDLE 0","a=msid-semantic: WMS","m=application 9 UDP/DTLS/SCTP webrtc-datachannel","c=IN IP4 0.0.0.0","a=mid:0","a=sctp-port:5000","a=setup:"+("answer"===e?"active":"actpass"),`a=ice-ufrag:${a}`,`a=ice-pwd:${h}`,`a=fingerprint:sha-256 ${n.join(":").toUpperCase()}`];r&&c.push("a=ice-options:trickle");let d=100;for(const e of l){let t=unpackCandItem(e,d);t&&(d--,c.push(`a=candidate:${t}`))}return{type:e,sdp:c.join("\r\n")+"\r\n"}}function unpackCandItem(e,t){let s,r,n;const i=candTypeMap[e.substr(0,1)],o=e.substr(1).split(" ");if(2===o.length){n=o[0];const e=o[1].split(":");s=[e[0]>>24&255,e[0]>>16&255,e[0]>>8&255,255&e[0]].join("."),r=e[1]}else[n,s,r]=o;return`${[n,1,"udp",t,s,r,"typ",i].join(" ")}`}const DC_TOLERANCE=2,DEFAULT_PACKET_SIZE=64e3,ALPHA=.6,SIGNAL_PACK_VER=1;class peer_Peer extends(events_default()){static get defaultPacketSize(){return DEFAULT_PACKET_SIZE}static get VERSION(){return"8"}constructor(e,t,s,r,n,i,o={}){super(),this.engine=e,this.channel=e.fetcher.channelId,this.logger=e.logger,this.config=n,this.isInitiator=r,this.options=o,this.typeExpected=i,this.remotePeerId=s,this.intermediator=o.intermediator||null,this.channelId=r?`${t}-${s}`:`${s}-${t}`,this.cpr=0,this.platform="unknown",this.mobile=!1,this.mobileWeb=!1,this.connected=!1,this.msgQueue=[],this.miss=0,this.notifySet=new Set,this.bufArr=[],this.packetSize=DEFAULT_PACKET_SIZE,this.connTimeout=setTimeout((()=>{this.logger.warn(`dc ${this.channelId} connection timeout`),this.emit(events.DC_ERROR,!0)}),25e3),this.sendReqQueue=[],this.downloading=!1,this.uploading=!1,this.choked=!1,this.downloadListeners=[],this.pieceMsg={},this.timeSendRequest=0,this.timeReceivePiece=0,this.timeSendPiece=0,this.weight=0,this.peersConnected=1,this.timeJoin=getCurrentTs(),this.uploadSpeed=0,this.gotPeers=!1,this.currentLevel=0,this.currentPos=0;let a={};if(this.options.stuns.length>0){const e=[];this.options.stuns.forEach((t=>{this.logger.info(`use stun ${t}`),e.push({urls:t})})),a.iceServers=e}this.config.webRTCConfig&&(a={...this.config.webRTCConfig,...a}),this.playlistMap=new Map,this._datachannel=new peer_channel({initiator:r,channelName:this.channelId,trickle:o.trickle||!1,config:a}),this._init(this._datachannel),this.dataExchangeTs=this.timeJoin,this.gotStatsTs=this.timeJoin,this.startSN=Number.MAX_SAFE_INTEGER,this.endSN=-1,this._loadedBytes=0}get isAvailable(){return this.downloadNum<2&&!this.choked}get isAvailableUrgently(){return!this.downloading&&!this.choked}addDownloadListener(e){this.downloadListeners.push({handler:e})}addStreamListener(e,t){this.addDownloadListener(t)}_init(e){e.on("error",(e=>{this.emit(events.DC_ERROR,!0)})),e.on("signal",(e=>{if(this.cpr===SIGNAL_PACK_VER){const t=pack(e);t?e=t:this.logger.error("signal pack error")}this.emit(events.DC_SIGNAL,e)}));e.on("connect",(()=>{for(this.logger.info(`datachannel CONNECTED to ${this.remotePeerId} from ${this.intermediator?"peer":"server"}`),this.connected=!0,clearTimeout(this.connTimeout),this.emit(events.DC_OPEN);this.msgQueue.length>0;){let e=this.msgQueue.shift();this.emit(e.event,e)}})),e.on("data",(e=>{const{logger:t}=this;if("string"==typeof e){let s=JSON.parse(e);if(!this.connected)return void this.msgQueue.push(s);let r,n=s.event;switch(r=n!==events.DC_PLAYLIST&&n!==events.DC_PEER_SIGNAL?`string: ${e}`:`event: ${n}`,t.debug(`datachannel receive ${r} from ${this.remotePeerId}`),n){case events.DC_HAVE:if(this.emit(s.event,s),!s.sn)return;this.config.live||(s.sn<this.startSN&&(this.startSN=s.sn),s.sn>this.endSN&&(this.endSN=s.sn));break;case events.DC_PIECE:this.downloading=!0,this.dataExchangeTs=getCurrentTs(),this.timeReceivePiece=performance.now(),this.pieceMsg=s,this._prepareForBinary(s.attachments,s.seg_id,s.sn,s.size),this.emit(s.event,s);break;case events.DC_PIECE_NOT_FOUND:this._sendNextReq()||(this.downloading=!1),this.emit(s.event,s);break;case events.DC_REQUEST:this._handleRequestMsg(s);break;case events.DC_PIECE_ACK:this.dataExchangeTs=getCurrentTs(),this._handlePieceAck(s),this.emit(s.event,s);break;case events.DC_STATS:this._handleStats(s);break;case events.DC_PLAYLIST:this.config.sharePlaylist&&this._handlePlaylist(s);break;case events.DC_METADATA:this._handleMetadata(s);break;case events.DC_PIECE_ABORT:this.downloading&&(this._notifyDownloadListenersAbort("aborted by upstream peer"),this.emit(events.DC_PIECE_ABORT,s));break;case events.DC_CHOKE:t.info(`choke peer ${this.remotePeerId}`),this.choked=!0;break;case events.DC_UNCHOKE:t.info(`unchoke peer ${this.remotePeerId}`),this.choked=!1;break;case events.DC_CLOSE:this.emit(s.event,s.fatal||!1);break;default:this.emit(s.event,s)}}else{if(!this.downloading)return void t.error(`peer is not downloading, data size ${e.byteLength} pieceMsg ${JSON.stringify(this.pieceMsg)}`);this._handleBinaryMsg(e)}})),e.once("close",(()=>{this.emit(events.DC_CLOSE,!1)})),e.on("iceStateChange",((e,t)=>{"disconnected"===e&&(this.logger.warn(`${this.remotePeerId} disconnected`),this.connected=!1)}))}sendJson(e){e.event!==events.DC_PLAYLIST&&e.event!==events.DC_PEER_SIGNAL?this.logger.debug(`dc bufferSize ${this._datachannel.bufferSize} send ${JSON.stringify(e)} to ${this.remotePeerId}`):this.logger.debug(`dc send event ${e.event} to ${this.remotePeerId}`);const t=JSON.stringify(e);return t.length>DEFAULT_PACKET_SIZE?(this.logger.error("string to send is too large"),!1):this.send(t)}send(e){if(this._datachannel&&this._datachannel.connected)try{return this._datachannel.send(e),!0}catch(e){this.logger.warn(`datachannel ${this.channelId} send data failed, close it`),this.emit(events.DC_ERROR,!1)}return!1}sendMsgHave(e,t,s={}){const r=s.reverse||void 0;delete s.reverse,this.sendJson({event:r?events.DC_HAVE_REVERSE:events.DC_HAVE,sn:e,seg_id:t,...s})}sendPieceNotFound(e,t,s={}){this.uploading=!1,this.sendJson({event:events.DC_PIECE_NOT_FOUND,seg_id:t,sn:e,...s})}sendPeers(e){this.sendJson({event:events.DC_PEERS,peers:e})}sendPeersRequest(){this.sendJson({event:events.DC_GET_PEERS})}sendMsgStats(e,t={}){const s={event:events.DC_STATS,total_conns:e,...t};this.sendJson(s)}sendMsgPlaylist(e,t,s){if(this.playlistMap.has(e)){if(this.playlistMap.get(e).seq>=s)return}const r={event:events.DC_PLAYLIST,url:e,data:t,seq:s};this.sendJson(r)}sendMsgSignal(e,t,s){return this.sendJson({event:events.DC_PEER_SIGNAL,action:"signal",to_peer_id:e,from_peer_id:t,data:s})}sendMsgSignalReject(e,t,s,r=!1){return this.sendJson({event:events.DC_PEER_SIGNAL,action:"reject",to_peer_id:e,from_peer_id:t,reason:s,fatal:r})}sendMetaData(e,t,s=0){this.isInitiator&&(this.timeSendRequest=performance.now()),this.sendJson({event:events.DC_METADATA,field:e,platform:events.DC_PLAT_WEB,mobile:!!platform_default().isMobile(),channel:this.channel,version:"2.3.4",sequential:t,peers:s})}sendPartialBuffer(e,t,s={}){this.sendMsgPiece(e,s);for(let e=0;e<t.length;e++)this.send(t[e])}sendMsgPiece(e,t={}){e.ext||(e.ext={}),e.ext.from&&t.from&&(t.from=`${e.ext.from}->${t.from}`),t.incompletes&&e.ext.incompletes&&(t.incompletes+=e.ext.incompletes),t=Object.assign({},e.ext,t);const s={...e,ext:t};this.sendJson(s)}sendBuffer(e,t,s,r={}){const n=r.reverse||void 0;delete r.reverse;let i=s.byteLength,o=0,a=0;i%this.packetSize==0?a=i/this.packetSize:(a=Math.floor(i/this.packetSize)+1,o=i%this.packetSize);let h={event:events.DC_PIECE,attachments:a,seg_id:t,sn:e,level:r.level,size:i,reverse:n};delete r.level,this.sendMsgPiece(h,r);const l=dividePayload(s,this.packetSize,a,o);this._sendBufferArray(l,n),this.uploading=!1,this.timeSendPiece=performance.now()}get downloadNum(){return this.downloading?this.sendReqQueue.length+1:0}requestDataById(e,t,s=!1,r={}){const n={event:events.DC_REQUEST,seg_id:e,sn:t,...r,urgent:s};this.downloading?(this.logger.info(`${this.remotePeerId} add req ${e} in queue`),s?this.sendReqQueue.unshift(n):this.sendReqQueue.push(n)):this._realRequestData(n)}requestDataBySN(e,t=!1,s={}){const r={event:events.DC_REQUEST,sn:e,...s,urgent:t};this.downloading?(this.logger.info(`add req ${e} in queue`),t?this.sendReqQueue.unshift(r):this.sendReqQueue.push(r)):this._realRequestData(r)}_sendBufferArray(e,t=!1){if(t)for(let t=e.length-1;t>=0;t--)this.send(e[t]);else for(let t=0;t<e.length;t++)this.send(e[t])}_realRequestData(e){this.sendJson(e),this.timeSendRequest=performance.now(),this.downloading=!0}shouldWaitForRemain(e){return 0!==this.bufArr.length&&(0!==this.timeReceivePiece&&this.currentLoadSpeed()>=this.minRequiredSpeed(e))}close(e){this.emit(events.DC_CLOSE,e)}receiveSignal(e){e.type||e.candidate||(this.cpr=SIGNAL_PACK_VER,e=unpack(e,this.cpr+"")),e&&this._datachannel.signal(e)}_notifyDownloadListenersAbort(e){for(let t of this.downloadListeners){const{handler:s}=t;s(this.bufSN,this.segId,!0,e)}this.downloadListeners=[]}destroy(e=!0){this.logger.info(`destroy datachannel ${this.channelId}`),this.chokeTimer&&clearTimeout(this.chokeTimer),this.connTimeout&&clearTimeout(this.connTimeout),this.uploading&&this.sendMsgPieceAbort("peer is closing"),this._notifyDownloadListenersAbort("upstream peer is closed");let t={event:events.DC_CLOSE,fatal:e};this.sendJson(t),this._datachannel.removeAllListeners(),this.removeAllListeners(),this._datachannel.destroy(),this.engine=null}_handleBinaryMsg(e){const{attachments:t,level:s,reverse:r}=this.pieceMsg;this.bufArr.push(e),this._loadedBytes+=e.byteLength,this.remainAttachments--;let n=r?this.remainAttachments+1:t-this.remainAttachments;const i=0===this.remainAttachments;if(this.emit(events.DC_PIECE_DATA,this.bufSN,this.segId,e,n,i,this.pieceMsg),this.downloadListeners.length>0)for(let t of this.downloadListeners){const{handler:s}=t;s(this.bufSN,this.segId,!1,e,i)}if(i){if(this.downloadListeners=[],this.timeSendRequest>0){const e=this.expectedSize/(performance.now()-this.timeSendRequest);this.weight=this.weight>0?ALPHA*this.weight+(1-ALPHA)*e:e}this.sendJson({event:events.DC_PIECE_ACK,sn:this.bufSN,seg_id:this.segId,level:s,size:this.expectedSize,miss:this.miss||void 0}),this.timeSendRequest=0,this.timeReceivePiece=0,this._sendNextReq()||(this.downloading=!1),this._handleBinaryData(r)}}_sendNextReq(){if(this.sendReqQueue.length>0){const e=this.sendReqQueue.shift();return this.logger.info(`get msg from sendReqQueue ${JSON.stringify(e)}`),this._realRequestData(e),!0}return!1}_handlePlaylist(e){const{url:t,data:s,seq:r}=e;this.playlistMap.set(t,{data:s,seq:r})}getLatestPlaylist(e,t){if(!this.playlistMap.has(e))return null;const s=this.playlistMap.get(e);return s.seq<=t?null:s}_handleMetadata(e){const{logger:t}=this;if(this.isInitiator){const e=performance.now()-this.timeSendRequest;e>0&&(this.weight=1e5/e,t.info(`handle Metadata from ${this.remotePeerId} initial weight ${this.weight}`)),this.timeSendRequest=0}const s=e.channel;if(!s)return t.error(`peer channel ${s} is null!`),void this.emit(events.DC_ERROR,!0);if(this.channel!==s)return t.error(`peer channel ${s} not matched!`),void this.emit(events.DC_ERROR,!0);switch(e.platform){case events.DC_PLAT_ANDROID:this.platform=events.DC_PLAT_ANDROID;break;case events.DC_PLAT_IOS:this.platform=events.DC_PLAT_IOS;break;case events.DC_PLAT_WEB:this.platform=events.DC_PLAT_WEB}if(this.mobile=e.mobile||!1,this.mobileWeb=this.mobile&&this.platform===events.DC_PLAT_WEB||!1,this.sequential=e.sequential,this.sequential!==this.typeExpected)return t.error(`peer sequential type ${this.sequential} not matched!`),void this.emit(events.DC_ERROR,!0);if(t.info(`${this.remotePeerId} platform ${this.platform} sequential ${this.sequential}`),e.peers&&(this.peersConnected+=e.peers,t.info(`${this.remotePeerId} now has ${this.peersConnected} peers`)),this.emit(events.DC_METADATA,e),e.field&&!this.config.live&&e.sequential){const{field:t}=e;if(Array.isArray(t))this._handleField(t);else for(let e in t)this._handleField(t[e])}}_handleField(e){e.forEach((e=>{e>=0&&(e<this.startSN&&(this.startSN=e),e>this.endSN&&(this.endSN=e))}))}_handleStats(e){this.gotStatsTs=getCurrentTs();const t=e.total_conns;t>0&&this.peersConnected!==t&&(this.peersConnected=t,this.logger.info(`${this.remotePeerId} now has ${this.peersConnected} peers`)),e.level&&(this.currentLevel=e.level),e.pos&&(this.currentPos=e.pos)}_handleRequestMsg(e){this.uploading?this.logger.warn(`${this.remotePeerId} is uploading when receive request`):(this.uploading=!0,this.emit(events.DC_REQUEST,e))}_handlePieceAck(e){0!==this.timeSendPiece&&(this.uploadSpeed=Math.round(e.size/(performance.now()-this.timeSendPiece)*2),this.timeSendPiece=0,this.logger.info(`${this.remotePeerId} uploadSpeed is ${this.uploadSpeed}`)),e.miss>0&&this.logger.warn(`peer ${this.remotePeerId} miss ${e.miss}`)}_prepareForBinary(e,t,s,r){this.bufArr=[],this._loadedBytes=0,this.remainAttachments=e,this.segId=t,this.bufSN=s,this.expectedSize=r}_handleBinaryData(e=!1){if(this.listenerCount(events.DC_RESPONSE)>0){e&&this.bufArr.reverse();let t=utils_buffer.l.concat(this.bufArr);const s=t.byteLength;if(s===this.expectedSize){let e=t.buffer;const s=new Segment(this.bufSN,this.segId,e,this.remotePeerId,this.pieceMsg.level);this.emit(events.DC_RESPONSE,s,this.weight)}else this.logger.error(`${this.segId} expectedSize ${this.expectedSize} != byteLength ${s}`)}this.segId="",this.bufArr=[],this._loadedBytes=0,this.expectedSize=-1}checkIfNeedChoke(e=!1){const{logger:t}=this,s=performance.now()-this.timeSendRequest;if(!e&&s<1500)t.info(`duration ${s} no need choke`);else if(this.miss++,t.info(`${this.remotePeerId} miss ${this.miss}`),this.miss>DC_TOLERANCE&&!this.choked){this.choked=!0;const e=30*this.miss;e<=150?(t.warn(`datachannel ${this.channelId} is choked`),this.chokeTimer=setTimeout((()=>{this.choked=!1,t.warn(`datachannel ${this.channelId} is unchoked`)}),1e3*e)):t.warn(`datachannel ${this.channelId} is choked permanently`)}}loadtimeout(){const{logger:e,bufArr:t,pieceMsg:s}=this;return e.warn(`timeout while downloading from ${this.remotePeerId}, ${t.length} of ${s.attachments} packets loaded`),this.emit(events.DC_TIMEOUT),this.checkIfNeedChoke(),!0}sendMsgPieceAbort(e){this.uploading&&(this.uploading=!1,this.sendJson({event:events.DC_PIECE_ABORT,reason:e}))}loadedBytes(){return this._loadedBytes}currentLoadSpeed(){return 0===this.timeReceivePiece?0:this.loadedBytes()/(performance.now()-this.timeReceivePiece)}minRequiredSpeed(e){return(this.pieceMsg.size-this.loadedBytes())/e}}function dividePayload(e,t,s,r){let n=[];if(r){let i;for(let r=0;r<s-1;r++)i=e.slice(r*t,(r+1)*t),n.push(i);i=e.slice(e.byteLength-r,e.byteLength),n.push(i)}else{let r;for(let i=0;i<s;i++)r=e.slice(i*t,(i+1)*t),n.push(r)}return n}const peer=peer_Peer,CHECK_PEERS_INTERVAL=3;function noop(){return!0}function getQueryParam(e){return new URL(location.href).searchParams.get(e)}function updateQueryStringParam(e,t,s){var r=new RegExp("([?&])"+t+"=.*?(&|$)","i"),n=-1!==e.indexOf("?")?"&":"?";return e.match(r)?e.replace(r,"$1"+t+"="+s+"$2"):e+n+t+"="+s}function getCurrentTs(){return Date.parse(new Date)/1e3}function randomNum(e,t){return parseInt(Math.random()*(t-e+1)+e,10)}function calCheckPeersDelay(e){return 0===e?CHECK_PEERS_INTERVAL:.33*e+.67}function performRangeRequest(e,t,s,r=3500){const n=new XMLHttpRequest;return new Promise(((i,o)=>{n.open("GET",e,!0),n.responseType="arraybuffer",n.timeout=r,n.onreadystatechange=e=>{if(4===n.readyState){const e=n.status;e>=200&&e<300?i(n.response):o(`status ${e}`)}},n.onerror=e=>{o("request error")},n.ontimeout=e=>{o("timeout")},n.setRequestHeader("Range",t||"bytes=0-0"),s&&s(n,e),n.send()})).catch((e=>{}))}function navLang(){return"zh-CN"===(navigator.language||navigator.userLanguage)?"cn":"en"}function dontWaitFor(e){e.then((()=>{}))}function timeout(e){return new Promise((t=>setTimeout(t,e)))}function getBrowserRTC(){if("undefined"==typeof window)return null;var e={RTCPeerConnection:window.RTCPeerConnection||window.mozRTCPeerConnection||window.webkitRTCPeerConnection,RTCSessionDescription:window.RTCSessionDescription||window.mozRTCSessionDescription||window.webkitRTCSessionDescription,RTCIceCandidate:window.RTCIceCandidate||window.mozRTCIceCandidate||window.webkitRTCIceCandidate};return e.RTCPeerConnection?e:null}function copyBuffer(e){const t=utils_buffer.l.from(e),s=new utils_buffer.l(e.byteLength);return t.copy(s),s}function getMaxSequence(e){const t=e.split("\n");let s=0;let r=0;for(let e of t){const t=/^#EXT-X-MEDIA-SEQUENCE:?(\-?[0-9.]*)?/.exec(e);if(t&&t[1]){s=parseInt(t[1],10);break}}for(let e of t)e.startsWith("#EXTINF")&&r++;return s+r-1}function isHttps(){return location.protocol.startsWith("https")}function isInteger(e){return"number"==typeof e&&e%1==0}function appendSlogan(e,t,s){var r=document.createElement("div");r.style.position="absolute",r.style.top="8px",r.style.left="8px",r.style.zIndex="999",r.style.fontSize="10px";var n=document.createElement("a");n.href=t,n.target="_blank",n.innerText=e,n.style.color="white",n.style.textDecoration="none",n.style.textShadow="0 0 5px white,0 0 10px #00FFFF,0 0 15px #7FFF00,0 0 20px white";var i=document.createElement("i");i.style.width="5px",i.style.height="5px",i.style.borderRadius="50%",i.style.display="inline-block",i.style.backgroundColor="#67C23A",i.style.marginBottom="2px",i.style.marginRight="4px",r.appendChild(i),r.appendChild(n);var o=s.parentNode;o&&o.insertBefore(r,s)}function getHomeUrl(){return window.atob("aHR0cHM6Ly9zd2FybWNsb3VkLm5ldC9lbi8=")}function splitBytes(e,t){const s=peer.defaultPacketSize,r=e.byteLength-t,n=[];let i=t,o=Math.floor(r/s),a=r%s;for(let t=0;t<o;t++){const t=(0,utils_buffer.l)(s);e.copy(t,0,i,i+s),n.push(t),i+=s}if(a>0){const t=(0,utils_buffer.l)(a);e.copy(t,0,i,i+a),n.push(t)}return n}function getAvailableMemory(){const{memory:e}=performance;return e?e.jsHeapSizeLimit-e.usedJSHeapSize:-1}const logMap={debug:0,info:1,warn:2,error:3,none:4};class Logger{constructor(e){this.logLevel=e,this.onlineDebug=!1,console.debug=console.log,"debug"!==e&&"info"!==e||(this.logLevel="warn"),!0===e?this.logLevel="warn":!1===e?this.logLevel="none":e in logMap||(this.logLevel="error"),this.resetLogger()}enableDebug(){this.onlineDebug=!0;for(let e in logMap)this[e]=console[e]}resetLogger(){this.onlineDebug=!1;for(let e in logMap)logMap[e]<logMap[this.logLevel]?this[e]=noop:this[e]=console[e]}get isDebugLevel(){return logMap[this.logLevel]<=2||this.onlineDebug}}const utils_logger=Logger;var url_toolkit=__webpack_require__(622),url_toolkit_default=__webpack_require__.n(url_toolkit);const players={DPlayer:"dplayer",CBPlayer:"cbplayer",jwplayer:"jwplayer",videojs:"videojs",Clappr:"clappr",ckplayer:"ckplayer",MediaElementPlayer:"mediaelement",MediaElement:"mediaelement",TcPlayer:"tcplayer",flowplayer:"flowplayer",Chimee:"chimee",ChimeePlayer:"chimee",HlsJsPlayer:"xgplayer",fluidPlayer:"fluidplayer",OpenPlayer:"openplayer",Plyr:"plyr",Playerjs:"playerjs",Aliplayer:"aliplayer",shaka:"shakaplayer"};function player_detector(){let e;for(let t in players)if(window[t]){e=players[t];break}return e}const SAM={_:"nllL",f:"d3NzJ",ss:"==",3:"TNBLy9z",8:"aWduY",u:"mNvbQ",qa:"WwuY2RuY"};class EngineBase extends(events_default()){constructor(e={}){if(super(),this.p2pEnabled=!(!1===e.p2pEnabled||"0"===getQueryParam("_p2p")),e.tag&&e.tag.length>20)throw new Error("Tag is too long");if(e.appName&&e.appName.length>30)throw new Error("appName is too long");if(e.appId&&e.appId.length>30)throw new Error("appId is too long");if(e.token&&e.token.length>20)throw new Error("Token is too long")}initLogger(){const{config:e}=this;e.showSlogan&&"en"===navLang()&&console.log(`%cEmpower your users to become the unlimitedly scalable CDN!\n%c${getHomeUrl()}`,"color: dodgerblue; padding:20px 0; font-size: x-large","font-size: medium; padding-bottom:15px");const t=new utils_logger(e.logLevel);return e.logger=this.logger=t,t}makeChannelId(e,t){if(!e||"string"!=typeof e){const e="token is required while using customized channelId!";throw console.error(e),new Error(e)}return(s,r)=>`${e}-${t(s,r)}`}makeSignalId(){let e="";const{config:t}=this,s=decodeURIComponent(window.atob(SAM.f+SAM[3]+SAM[8]+SAM.qa+SAM._+SAM.u+SAM.ss));if(t.wsSignalerAddr){let r;"object"!=typeof t.wsSignalerAddr||t.wsSignalerAddr.backup?"string"==typeof t.wsSignalerAddr&&(r=t.wsSignalerAddr):r=t.wsSignalerAddr.main,r===s&&(r=void 0),r&&(e=url_toolkit_default().parseURL(r).netLoc.substr(2))}else t.wsSignalerAddr=s;return e}get commonBrowserInfo(){const e=platform_default().getPlatform(),t=platform_default().getNetType()||"wifi";return this.netType=t,{device:e,netType:t,player:player_detector()||void 0}}setupWindowListeners(e){const t=["iPad","iPhone"].indexOf(navigator.platform)>=0?"pagehide":"beforeunload",s=()=>{this.fetcher&&this.fetcher.postStatsWithBeacon(),this.p2pEnabled&&this.disableP2P(),window.removeEventListener(t,s)};e?window.removeEventListener(t,s):window.addEventListener(t,s)}destroy(){this.disableP2P(!0),this.removeAllListeners(),this.setupWindowListeners(!0)}enableP2P(){return this.p2pEnabled?null:(this.logger&&this.logger.info("enable P2P"),this.config.p2pEnabled=this.p2pEnabled=!0,this.browserInfo?(this._init(this.channel,this.browserInfo),this):null)}get version(){return EngineBase.version}static isSupported(){const e=getBrowserRTC();return!(!e||void 0===e.RTCPeerConnection.prototype.createDataChannel)}}EngineBase.version="2.3.4",EngineBase.protocolVersion=peer.VERSION;const engine_base=EngineBase;function tryGetMediaElement(e,t){let s;if(e&&("string"==typeof e?s=document.querySelector(e):e instanceof HTMLMediaElement&&(s=e)),!s){const e=[...document.getElementsByTagName("video"),...document.getElementsByTagName("audio")];1===e.length?s=e[0]:(t&&(s=e.find((e=>e.src===t))),s||(s=e.find((e=>e.currentTime>0))))}return s}function calRangeWithForwardReverseOffset(e,t,s,r=0,n=0){const i=peer.defaultPacketSize;let o="bytes=",a=r,h=n||s-1;const l=Math.floor(s/i),c=s%i>0?l+1:l;if(e>=0&&(a+=(e+1)*i),o=`${o}${a}-`,t>=0&&t<c){h-=s%i+(c-t-1)*i,o=`${o}${h}`}else 0!==n&&(o=`${o}${h}`);return o}let commonConfig={wsMaxRetries:10,p2pEnabled:!0,wifiOnly:!1,memoryCacheLimit:{pc:629145600,mobile:314572800},dcDownloadTimeout:25,logLevel:"error",tag:"",webRTCConfig:{},token:void 0,appName:void 0,appId:void 0,prefetchNum:5,showSlogan:!1,trickleICE:!1,announceLocation:"cn",geoIpPreflight:!0,getStats:function(e,t,s){},getPeerId:function(e){},getPeersInfo:function(e){}};const config=commonConfig;let defaultP2PConfig={...config,httpLoadTime:2.5,sharePlaylist:!1,useHttpRange:!0,hlsjsInstance:null,proxyOnly:!1,p2pBlackList:["aac","mp3","vtt","webvtt","key"],live:!0,swFile:"./sw.js",swScope:"./",swAutoRegister:!0,mediaElem:void 0,httpStreamEnabled:!0,diskCacheLimit:{pc:262144e4,mobile:1572864e3},useDiskCache:!0};const hls_next_config=defaultP2PConfig,STORE_NOT_INIT="store not init";function promisifyRequest(e){return new Promise(((t,s)=>{e.oncomplete=e.onsuccess=()=>t(e.result),e.onabort=e.onerror=()=>s(e.error)}))}function createStores(e,t){const s=indexedDB.open(e);s.onupgradeneeded=()=>{const e=s.result;t.forEach((t=>{e.createObjectStore(t)}))};const r=promisifyRequest(s);return t.map((e=>(t,s)=>r.then((r=>s(r.transaction(e,t).objectStore(e))))))}function get(e,t){return t?t("readonly",(t=>promisifyRequest(t.get(e)))):Promise.reject(STORE_NOT_INIT)}function set(e,t,s){return s?s("readwrite",(s=>(s.put(t,e),promisifyRequest(s.transaction)))):Promise.reject(STORE_NOT_INIT)}function setMany(e,t){return t?t("readwrite",(t=>(e.forEach((e=>t.put(e[1],e[0]))),promisifyRequest(t.transaction)))):Promise.reject(STORE_NOT_INIT)}function getMany(e,t){return t?t("readonly",(t=>Promise.all(e.map((e=>promisifyRequest(t.get(e))))))):Promise.reject(STORE_NOT_INIT)}function update(e,t,s){return s?s("readwrite",(s=>new Promise(((r,n)=>{s.get(e).onsuccess=function(){try{s.put(t(this.result),e),r(promisifyRequest(s.transaction))}catch(e){n(e)}}})))):Promise.reject(STORE_NOT_INIT)}function del(e,t){return t?t("readwrite",(t=>(t.delete(e),promisifyRequest(t.transaction)))):Promise.reject(STORE_NOT_INIT)}function delMany(e,t){return t?t("readwrite",(t=>(e.forEach((e=>t.delete(e))),promisifyRequest(t.transaction)))):Promise.reject(STORE_NOT_INIT)}function clear(e){return e?e("readwrite",(e=>(e.clear(),promisifyRequest(e.transaction)))):Promise.reject(STORE_NOT_INIT)}function clearAll(e){return new Promise(((t,s)=>{indexedDB.databases().then((r=>{const n=r.filter((t=>t.name!==e)).map((e=>new Promise(((t,s)=>{const r=indexedDB.deleteDatabase(e.name);r.onsuccess=t,r.onerror=s,r.onblocked=s}))));Promise.all(n).then(t).catch(s)})).catch(s)})).catch((e=>{}))}function eachCursor(e,t){return e.openCursor().onsuccess=function(){this.result&&(t(this.result),this.result.continue())},promisifyRequest(e.transaction)}function keys(e){return e?e("readonly",(e=>{if(e.getAllKeys)return promisifyRequest(e.getAllKeys());const t=[];return eachCursor(e,(e=>t.push(e.key))).then((()=>t))})):Promise.reject(STORE_NOT_INIT)}function values(e){return e?e("readonly",(e=>{if(e.getAll)return promisifyRequest(e.getAll());const t=[];return eachCursor(e,(e=>t.push(e.value))).then((()=>t))})):Promise.reject(STORE_NOT_INIT)}function entries(e){return e?e("readonly",(t=>{if(t.getAll&&t.getAllKeys)return Promise.all([promisifyRequest(t.getAllKeys()),promisifyRequest(t.getAll())]).then((([e,t])=>e.map(((e,s)=>[e,t[s]]))));const s=[];return e("readonly",(e=>eachCursor(e,(e=>s.push([e.key,e.value]))).then((()=>s))))})):Promise.reject(STORE_NOT_INIT)}const KEY_METADATA_SIZE="size";class SegmentStore extends(events_default()){constructor(e,t){super(),this.name="SegmentStore",this.logger=t.logger,this.logger.info("use SegmentStore"),this.channel=e.channel;const s=e.browserInfo.device;this.isPC=s===platform_default().device.PC_WEB||s===platform_default().device.PC_NATIVE,this.maxBufSize=this.isPC?t.diskCacheLimit.pc:t.diskCacheLimit.mobile,this.overflowed=!1,this.loadingSN=0}async setupStore(){if(navigator.storage){const e=await navigator.storage.estimate(),t=Math.floor(e.quota-e.usage);t<this.maxBufSize&&(this.maxBufSize=t-104857600)}return new Promise(((e,t)=>{if(this.isPC&&this.maxBufSize<629145600||!this.isPC&&this.maxBufSize<367001600)return void t("disk storage not enough");const s=createStores(this.channel,["segments","id2Sn","metadata"]);this.segmentsStore=s[0],this.id2SnStore=s[1],this.metaStore=s[2];const r=setTimeout((()=>{t("setupStore timeout")}),250);this._clearDisk(this.channel).then((()=>{this._initMetaStore().then((()=>{clearTimeout(r),e()})).catch((e=>{t(e)}))})).catch((e=>{t(e)}))}))}_initMetaStore(){return new Promise(((e,t)=>{get(KEY_METADATA_SIZE,this.metaStore).then((t=>{t||(this.logger.info("init MetaStore size"),set(KEY_METADATA_SIZE,0,this.metaStore)),e()})).catch((e=>{t()}))}))}currBufSize(){return get(KEY_METADATA_SIZE,this.metaStore)}async hasSegOfId(e){if(!e)return Promise.resolve(!1);const t=await get(e,this.id2SnStore);return new Promise(((s,r)=>{void 0!==t?get(t,this.segmentsStore).then((t=>{t&&t.length>0&&t.some((t=>t.segId===e))?s(!0):s(!1)})).catch((e=>{this.logger.error(e),s(!1)})):s(!1)}))}async getSegById(e){if(!e)return null;const t=await get(e,this.id2SnStore);return new Promise(((e,s)=>{void 0!==t?get(t,this.segmentsStore).then((t=>{t&&t.length>0?e(Segment.fromSegment(t[0])):e(null)})).catch((t=>{this.logger.error(t),e(null)})):e(null)}))}getSegIdBySN(e){return new Promise(((t,s)=>{get(e,this.segmentsStore).then((e=>{e&&e.length>0?t(e[0].segId):t(null)})).catch((e=>{this.logger.error(e),t(null)}))}))}putSeg(e){this._addSeg(e)}_addSeg(e){const{logger:t}=this,{segId:s,sn:r,size:n}=e;set(s,r,this.id2SnStore),get(r,this.segmentsStore).then((t=>{t?0===t.filter((e=>e.segId===s)).length&&(t.push(this._segmentToCache(e)),set(r,t,this.segmentsStore).then((()=>{this._increaseBufSize(e.data.byteLength)})).catch((e=>{this.logger.error(e)}))):set(r,[this._segmentToCache(e)],this.segmentsStore).then((()=>{this._increaseBufSize(e.data.byteLength)})).catch((e=>{this.logger.error(e)}))})).catch((e=>{this.logger.error(e)})),this.emit(`${events.BM_ADDED_SN_}${e.sn}`,e),this.emit(events.BM_SEG_ADDED,e)}async _trimDisk(){const{logger:e}=this;let t=await this.currBufSize();t<this.maxBufSize||keys(this.segmentsStore).then((async s=>{const r=s.sort(((e,t)=>e-t));let n=0;do{if(n++>10){console.error("too much loops in SegmentStore");break}const s=r.shift();if(void 0===s){e.error("lastSN not found");continue}if(s>=this.loadingSN){e.warn(`trimDisk failed, loadingSN ${loadingSN}`);break}const i=r[0],o=await get(s,this.segmentsStore);if(!o){e.warn("lastSeg not found");continue}let a=0;o.forEach((e=>{a+=e.data.byteLength})),del(s,this.segmentsStore).then((()=>{this._decreaseBufSize(parseInt(a))})),o.forEach((t=>{del(t.segId,this.id2SnStore),e.info(`pop seg ${t.segId} size ${t.data.byteLength}`),this.emit(events.BM_LOST,{sn:s,segId:t.segId,next:i,level:t.level})})),t-=a,e.info(`pop sn ${s} size ${a} currBufSize ${t}`),this.overflowed||(this.overflowed=!0)}while(t>=this.maxBufSize)}))}_decreaseBufSize(e){get(KEY_METADATA_SIZE,this.metaStore).then((t=>{t&&set(KEY_METADATA_SIZE,t-e,this.metaStore)})).catch((e=>{this.logger.error(e)}))}_increaseBufSize(e){get(KEY_METADATA_SIZE,this.metaStore).then((t=>{set(KEY_METADATA_SIZE,t+e,this.metaStore),this._trimDisk()})).catch((e=>{this.logger.error(e)}))}_segmentToCache(e){return{data:e.data,level:e.level,segId:e.segId,sn:e.sn}}clear(){this.logger.warn("clear segment cache");try{this._clearDisk()}catch(e){}}_clearDisk(e){return clearAll(e)}destroy(){this.clear(),this.removeAllListeners()}}const segment_store=SegmentStore,LIVE_MAX_BUFFER_SIZE=31457280,MIN_SEGMENTS_KEEP=5;class SegmentCache extends(events_default()){constructor(e,t){super(),this.name="SegmentCache",this.logger=t.logger,this.logger.info("use SegmentCache");const s=e.browserInfo.device;if(this.maxBufSize=s===platform_default().device.PC_WEB||s===platform_default().device.PC_NATIVE?t.memoryCacheLimit.pc:t.memoryCacheLimit.mobile,t.live)this.maxBufSize=LIVE_MAX_BUFFER_SIZE;else{const e=getAvailableMemory();e>=0&&e<this.maxBufSize&&(this.maxBufSize=e-31457280)}this._segPool=new Map,this._currBufSize=0,this.id2Sn=new Map,this.overflowed=!1,this.loadingSN=0}get currBufSize(){return this._currBufSize}hasSegOfId(e){return new Promise(((t,s)=>{const r=this.id2Sn.get(e);this._segPool.has(r)?t(this._segPool.get(r).some((t=>t.segId===e))):t(!1)}))}getSegById(e){const t=this.id2Sn.get(e);return new Promise(((s,r)=>{if(!this._segPool.has(t))return void s(null);const n=this._segPool.get(t);for(let t of n)if(t.segId===e)return void s(t);s(null)}))}getSegIdBySN(e){return new Promise(((t,s)=>{if(this._segPool.has(e)){t(this._segPool.get(e)[0].segId)}else t(null)}))}_calSegPoolSize(){let e=0;return this._segPool.forEach((t=>{t.forEach((t=>{e+=t.size}))})),e}putSeg(e){this._currBufSize>=1.5*this.maxBufSize&&(this._currBufSize=this._calSegPoolSize(),this._currBufSize>=1.5*this.maxBufSize&&(this.clear(),this.overflowed=!1)),this._addSeg(e)}_addSeg(e){const{logger:t}=this,{segId:s,sn:r,size:n}=e;if(this.id2Sn.set(s,r),this._segPool.has(r)){this._segPool.get(r).push(e)}else this._segPool.set(r,[e]);this._currBufSize+=parseInt(n);const i=this._segPool.size;if(this.emit(`${events.BM_ADDED_SN_}${e.sn}`,e),this.emit(events.BM_SEG_ADDED,e),this._currBufSize<this.maxBufSize||i<=MIN_SEGMENTS_KEEP)return;const o=Array.from(this._segPool.keys()).sort(((e,t)=>e-t));let a=0;do{if(a++>10){console.error("too much loops in SegmentCache");break}const e=o.shift();if(void 0===e){t.error("lastSN not found");continue}const s=o[0],r=this._segPool.get(e);if(!r){t.error("lastSeg not found");continue}let n=0;r.forEach((e=>{n+=e.size})),this._currBufSize-=parseInt(n),this._segPool.delete(e),r.forEach((r=>{this.id2Sn.delete(r.segId),t.info(`pop seg ${r.segId} size ${r.size}`),this.emit(events.BM_LOST,{sn:e,segId:r.segId,next:s,level:r.level})})),t.info(`pop sn ${e} size ${n} currBufSize ${this._currBufSize}`),this.overflowed||(this.overflowed=!0)}while(this._currBufSize>=this.maxBufSize&&this._segPool.size>MIN_SEGMENTS_KEEP)}clear(){this.logger.warn("clear segment cache"),this._segPool.clear(),this.id2Sn.clear(),this._currBufSize=0}destroy(){this.clear(),this.removeAllListeners()}}const segment_cache=SegmentCache;class Engine extends engine_base{constructor(e={}){super(e),window.__swP2pEngineHlsActive=!0,e.validateSegment||(e.validateSegment=function(e,t){return!0}),this.config=Object.assign({},hls_next_config,e),this.rangeTested=!1,this.lastLevel=0,this.multiBitrate=!1}setup(){let{token:e,channelId:t,segmentId:s}=this.config,r=e=>{const t=url_toolkit_default().parseURL(e);return`${t.netLoc.substr(2)+t.path.substring(0,t.path.lastIndexOf("."))}`},n=(e,t,s,r)=>`${e}-${t}`;t&&"function"==typeof t&&(r=this.makeChannelId(e,t)),s||(this.config.segmentId=n);return{channelIdMaker:r,signalId:this.makeSignalId(),browserInfo:{...this.commonBrowserInfo,tag:this.config.tag||void 0}}}setupElectron(){this.browserInfo.device===platform.device.PC_NATIVE&&(this.browserInfo={...this.browserInfo,app:this.config.appName,bundle:this.config.appId})}getExtraForStats(){const e={};return!this.config.live&&this.media&&(e.pos=Math.round(this.media.currentTime)),this.multiBitrate&&this.currentLevel!==this.lastLevel&&(e.level=this.currentLevel+"",this.lastLevel=this.currentLevel),e}getExtraForPeersRequest(){const e={};return this.multiBitrate&&(e.level=this.currentLevel+""),e}destroy(){window.__swP2pEngineHlsActive=!1,super.destroy()}async initSegmentManager(){const{logger:e,config:t}=this;if(window.indexedDB&&t.useDiskCache&&!t.live){const s=new segment_store(this,t);try{await s.setupStore(),this.bufMgr=s}catch(s){e.warn(s),this.bufMgr=new segment_cache(this,t)}}else this.bufMgr=new segment_cache(this,t);if(this.bufMgr.maxBufSize<=0)throw new Error("bufMgr state is invalid")}}class LevelKey{constructor(){this.method=null,this.key=null,this.iv=null,this._uri=null}get uri(){return!this._uri&&this.reluri&&(this._uri=url_toolkit.buildAbsoluteURL(this.baseuri,this.reluri,{alwaysNormalize:!0})),this._uri}}class Fragment{constructor(){this._url=null,this._byteRange=null,this._decryptdata=null,this.tagList=[],this.programDateTime=null,this.rawProgramDateTime=null,this._elementaryStreams={[Fragment.ElementaryStreamTypes.AUDIO]:!1,[Fragment.ElementaryStreamTypes.VIDEO]:!1}}static get ElementaryStreamTypes(){return{AUDIO:"audio",VIDEO:"video"}}get url(){return!this._url&&this.relurl&&(this._url=url_toolkit.buildAbsoluteURL(this.baseurl,this.relurl,{alwaysNormalize:!0})),this._url}set url(e){this._url=e}get byteRange(){if(!this._byteRange&&!this.rawByteRange)return[];if(this._byteRange)return this._byteRange;let e=[];if(this.rawByteRange){const t=this.rawByteRange.split("@",2);if(1===t.length){const t=this.lastByteRangeEndOffset;e[0]=t||0}else e[0]=parseInt(t[1]);e[1]=parseInt(t[0])+e[0],this._byteRange=e}return e}get byteRangeStartOffset(){return this.byteRange[0]}get byteRangeEndOffset(){return this.byteRange[1]}get decryptdata(){return this._decryptdata||(this._decryptdata=this.fragmentDecryptdataFromLevelkey(this.levelkey,this.sn)),this._decryptdata}get endProgramDateTime(){if(!Number.isFinite(this.programDateTime))return null;let e=Number.isFinite(this.duration)?this.duration:0;return this.programDateTime+1e3*e}get encrypted(){return!(!this.decryptdata||null===this.decryptdata.uri||null!==this.decryptdata.key)}addElementaryStream(e){this._elementaryStreams[e]=!0}hasElementaryStream(e){return!0===this._elementaryStreams[e]}createInitializationVector(e){let t=new Uint8Array(16);for(let s=12;s<16;s++)t[s]=e>>8*(15-s)&255;return t}fragmentDecryptdataFromLevelkey(e,t){let s=e;return e&&e.method&&e.uri&&!e.iv&&(s=new LevelKey,s.method=e.method,s.baseuri=e.baseuri,s.reluri=e.reluri,s.iv=this.createInitializationVector(t)),s}}class Level{constructor(e){this.endCC=0,this.endSN=0,this.fragments=[],this.initSegment=null,this.live=!0,this.needSidxRanges=!1,this.startCC=0,this.startSN=0,this.startTimeOffset=null,this.targetduration=0,this.totalduration=0,this.type=null,this.url=e,this.version=null}get hasProgramDateTime(){return!(!this.fragments[0]||!Number.isFinite(this.fragments[0].programDateTime))}}const DECIMAL_RESOLUTION_REGEX=/^(\d+)x(\d+)$/,ATTR_LIST_REGEX=/\s*(.+?)\s*=((?:\".*?\")|.*?)(?:,|$)/g;class AttrList{constructor(e){"string"==typeof e&&(e=AttrList.parseAttrList(e));for(let t in e)e.hasOwnProperty(t)&&(this[t]=e[t])}decimalInteger(e){const t=parseInt(this[e],10);return t>Number.MAX_SAFE_INTEGER?1/0:t}hexadecimalInteger(e){if(this[e]){let t=(this[e]||"0x").slice(2);t=(1&t.length?"0":"")+t;const s=new Uint8Array(t.length/2);for(let e=0;e<t.length/2;e++)s[e]=parseInt(t.slice(2*e,2*e+2),16);return s}return null}hexadecimalIntegerAsNumber(e){const t=parseInt(this[e],16);return t>Number.MAX_SAFE_INTEGER?1/0:t}decimalFloatingPoint(e){return parseFloat(this[e])}enumeratedString(e){return this[e]}decimalResolution(e){const t=DECIMAL_RESOLUTION_REGEX.exec(this[e]);if(null!==t)return{width:parseInt(t[1],10),height:parseInt(t[2],10)}}static parseAttrList(e){let t,s={};for(ATTR_LIST_REGEX.lastIndex=0;null!==(t=ATTR_LIST_REGEX.exec(e));){let e=t[2],r='"';0===e.indexOf(r)&&e.lastIndexOf(r)===e.length-1&&(e=e.slice(1,-1)),s[t[1]]=e}return s}}const attr_list=AttrList,sampleEntryCodesISO={audio:{a3ds:!0,"ac-3":!0,"ac-4":!0,alac:!0,alaw:!0,dra1:!0,"dts+":!0,"dts-":!0,dtsc:!0,dtse:!0,dtsh:!0,"ec-3":!0,enca:!0,g719:!0,g726:!0,m4ae:!0,mha1:!0,mha2:!0,mhm1:!0,mhm2:!0,mlpa:!0,mp4a:!0,"raw ":!0,Opus:!0,samr:!0,sawb:!0,sawp:!0,sevc:!0,sqcp:!0,ssmv:!0,twos:!0,ulaw:!0},video:{avc1:!0,avc2:!0,avc3:!0,avc4:!0,avcp:!0,drac:!0,dvav:!0,dvhe:!0,encv:!0,hev1:!0,hvc1:!0,mjp2:!0,mp4v:!0,mvc1:!0,mvc2:!0,mvc3:!0,mvc4:!0,resv:!0,rv60:!0,s263:!0,svc1:!0,svc2:!0,"vc-1":!0,vp08:!0,vp09:!0}};function isCodecType(e,t){const s=sampleEntryCodesISO[t];return!!s&&!0===s[e.slice(0,4)]}function isCodecSupportedInMp4(e,t){return window.MediaSource.isTypeSupported(`${t||"video"}/mp4;codecs="${e}"`)}const MASTER_PLAYLIST_REGEX=/#EXT-X-STREAM-INF:([^\n\r]*)[\r\n]+([^\r\n]+)/g,MASTER_PLAYLIST_MEDIA_REGEX=/#EXT-X-MEDIA:(.*)/g,LEVEL_PLAYLIST_REGEX_FAST=new RegExp([/#EXTINF:\s*(\d*(?:\.\d+)?)(?:,(.*)\s+)?/.source,/|(?!#)([\S+ ?]+)/.source,/|#EXT-X-BYTERANGE:*(.+)/.source,/|#EXT-X-PROGRAM-DATE-TIME:(.+)/.source,/|#.*/.source].join(""),"g"),LEVEL_PLAYLIST_REGEX_SLOW=/(?:(?:#(EXTM3U))|(?:#EXT-X-(PLAYLIST-TYPE):(.+))|(?:#EXT-X-(MEDIA-SEQUENCE): *(\d+))|(?:#EXT-X-(TARGETDURATION): *(\d+))|(?:#EXT-X-(KEY):(.+))|(?:#EXT-X-(START):(.+))|(?:#EXT-X-(ENDLIST))|(?:#EXT-X-(DISCONTINUITY-SEQ)UENCE:(\d+))|(?:#EXT-X-(DIS)CONTINUITY))|(?:#EXT-X-(VERSION):(\d+))|(?:#EXT-X-(MAP):(.+))|(?:(#)([^:]*):(.*))|(?:(#)(.*))(?:.*)\r?\n?/,MP4_REGEX_SUFFIX=/\.(mp4|m4s|m4v|m4a)$/i;class M3U8Parser{static findGroup(e,t){if(!e)return null;let s=null;for(let r=0;r<e.length;r++){const n=e[r];n.id===t&&(s=n)}return s}static convertAVC1ToAVCOTI(e){let t,s=e.split(".");return s.length>2?(t=s.shift()+".",t+=parseInt(s.shift()).toString(16),t+=("000"+parseInt(s.shift()).toString(16)).substr(-4)):t=e,t}static resolve(e,t){return url_toolkit.buildAbsoluteURL(t,e,{alwaysNormalize:!0})}static parseMasterPlaylist(e,t){let s,r=[];function n(e,t){["video","audio"].forEach((s=>{const r=e.filter((e=>isCodecType(e,s)));if(r.length){const n=r.filter((e=>0===e.lastIndexOf("avc1",0)||0===e.lastIndexOf("mp4a",0)));t[`${s}Codec`]=n.length>0?n[0]:r[0],e=e.filter((e=>-1===r.indexOf(e)))}})),t.unknownCodecs=e}for(MASTER_PLAYLIST_REGEX.lastIndex=0;null!=(s=MASTER_PLAYLIST_REGEX.exec(e));){const e={},i=e.attrs=new attr_list(s[1]);e.url=M3U8Parser.resolve(s[2],t);const o=i.decimalResolution("RESOLUTION");o&&(e.width=o.width,e.height=o.height),e.bitrate=i.decimalInteger("AVERAGE-BANDWIDTH")||i.decimalInteger("BANDWIDTH"),e.name=i.NAME,n([].concat((i.CODECS||"").split(/[ ,]+/)),e),e.videoCodec&&-1!==e.videoCodec.indexOf("avc1")&&(e.videoCodec=M3U8Parser.convertAVC1ToAVCOTI(e.videoCodec)),r.push(e)}return r}static parseMasterPlaylistMedia(e,t,s,r=[]){let n,i=[],o=0;for(MASTER_PLAYLIST_MEDIA_REGEX.lastIndex=0;null!==(n=MASTER_PLAYLIST_MEDIA_REGEX.exec(e));){const e={},a=new attr_list(n[1]);if(a.TYPE===s){if(e.groupId=a["GROUP-ID"],e.name=a.NAME,e.type=s,e.default="YES"===a.DEFAULT,e.autoselect="YES"===a.AUTOSELECT,e.forced="YES"===a.FORCED,a.URI&&(e.url=M3U8Parser.resolve(a.URI,t)),e.lang=a.LANGUAGE,e.name||(e.name=e.lang),r.length){const t=M3U8Parser.findGroup(r,e.groupId);e.audioCodec=t?t.codec:r[0].codec}e.id=o++,i.push(e)}}return i}static parseLevelPlaylist(e,t){let s,r,n=0,i=0,o=new Level(t),a=new LevelKey,h=0,l=null,c=new Fragment,d=null;for(LEVEL_PLAYLIST_REGEX_FAST.lastIndex=0;null!==(s=LEVEL_PLAYLIST_REGEX_FAST.exec(e));){const e=s[1];if(e){c.duration=parseFloat(e);const t=(" "+s[2]).slice(1);c.title=t||null,c.tagList.push(t?["INF",e,t]:["INF",e])}else if(s[3]){if(Number.isFinite(c.duration)){const e=n++;c.start=i,c.levelkey=a,c.sn=e,c.cc=h,c.baseurl=t,c.relurl=(" "+s[3]).slice(1),assignProgramDateTime(c,l),o.fragments.push(c),l=c,i+=c.duration,c=new Fragment}}else if(s[4]){if(c.rawByteRange=(" "+s[4]).slice(1),l){const e=l.byteRangeEndOffset;e&&(c.lastByteRangeEndOffset=e)}}else if(s[5])c.rawProgramDateTime=(" "+s[5]).slice(1),c.tagList.push(["PROGRAM-DATE-TIME",c.rawProgramDateTime]),null===d&&(d=o.fragments.length);else{for(s=s[0].match(LEVEL_PLAYLIST_REGEX_SLOW),r=1;r<s.length&&void 0===s[r];r++);const e=(" "+s[r+1]).slice(1),i=(" "+s[r+2]).slice(1);switch(s[r]){case"#":c.tagList.push(i?[e,i]:[e]);break;case"PLAYLIST-TYPE":o.type=e.toUpperCase();break;case"MEDIA-SEQUENCE":n=o.startSN=parseInt(e);break;case"TARGETDURATION":o.targetduration=parseFloat(e);break;case"VERSION":o.version=parseInt(e);break;case"EXTM3U":break;case"ENDLIST":o.live=!1;break;case"DIS":h++,c.tagList.push(["DIS"]);break;case"DISCONTINUITY-SEQ":h=parseInt(e);break;case"KEY":var u=new attr_list(e),g=u.enumeratedString("METHOD"),f=u.URI,p=u.hexadecimalInteger("IV");g&&(a=new LevelKey,f&&["AES-128","SAMPLE-AES","SAMPLE-AES-CENC"].indexOf(g)>=0&&(a.method=g,a.baseuri=t,a.reluri=f,a.key=null,a.iv=p));break;case"START":let r=new attr_list(e).decimalFloatingPoint("TIME-OFFSET");Number.isFinite(r)&&(o.startTimeOffset=r);break;case"MAP":let l=new attr_list(e);c.relurl=l.URI,c.rawByteRange=l.BYTERANGE,c.baseurl=t,c.sn="initSegment",o.initSegment=c,c=new Fragment,c.rawProgramDateTime=o.initSegment.rawProgramDateTime;break;default:console.warn(`line parsed but not handled: ${s}`)}}}return c=l,c&&!c.relurl&&(o.fragments.pop(),i-=c.duration),o.totalduration=i,o.averagetargetduration=i/o.fragments.length,o.endSN=n-1,o.startCC=o.fragments[0]?o.fragments[0].cc:0,o.endCC=h,!o.initSegment&&o.fragments.length&&o.fragments.every((e=>MP4_REGEX_SUFFIX.test(e.relurl)))&&(console.warn("MP4 fragments found but no init segment (probably no MAP, incomplete M3U8), trying to fetch SIDX"),c=new Fragment,c.relurl=o.fragments[0].relurl,c.baseurl=t,c.level=id,c.sn="initSegment",o.initSegment=c,o.needSidxRanges=!0),d&&backfillProgramDateTimes(o.fragments,d),o}}function backfillProgramDateTimes(e,t){let s=e[t];for(let r=t-1;r>=0;r--){const t=e[r];t.programDateTime=s.programDateTime-1e3*t.duration,s=t}}function assignProgramDateTime(e,t){e.rawProgramDateTime?e.programDateTime=Date.parse(e.rawProgramDateTime):t&&t.programDateTime&&(e.programDateTime=t.endProgramDateTime),Number.isFinite(e.programDateTime)||(e.programDateTime=null,e.rawProgramDateTime=null)}var md5=__webpack_require__(485),md5_default=__webpack_require__.n(md5),err_code=__webpack_require__(934),err_code_default=__webpack_require__.n(err_code);const setItem=(e,t)=>{"object"==typeof t&&(t=JSON.stringify(t)),localStorage.setItem(e,t)},hasItemUnexpired=e=>{const t=localStorage.getItem(e);try{const e=JSON.parse(t);if(e.duration&&e.startTime){return(new Date).getTime()-e.startTime<e.duration}return!1}catch(e){return!1}},getItem=e=>{const t=localStorage.getItem(e);try{const e=JSON.parse(t);return e.value?e.value:e}catch(e){return t}},removeItem=e=>{localStorage.removeItem(e)},removeAllItem=()=>{localStorage.clear()},setItemWithExpiration=(e,t,s)=>{let r={value:t,duration:s,startTime:(new Date).getTime()};setItem(e,r)},MIN_CONNS=8,BASE_REPORT_INTERVAL=20,IPAPI_URL="//pro.ip-api.com/json?fields=2181826&key=XOpiansRgYxGTho",IPAPI_TIMEOUT=600,GEOIP_KEY="SW_GEOIP_KEY",GEOIP_EXPIRATION=2592e5,GEOIP_EXPIRATION_MOBILE=432e5,URL_MAP={q:"uZ2luZS5u",v:"Y24u",3:"Y2Ru",0:"yMzMzL2Js",l:"Nvb",zz:"aHR0cHMlM",n:"YnllLm",h:"ZXQlM0E",7:"Q==",df:"0EvL",6:"3AycGV",x:"aGsuc3d",kj:"dHJhY",a:"2tlci5","+":"oZHR2","=":"Y2xvdW",w:"QuY29t","{":"3ZWIz","?":"LWxhY",$:"i5jb20=",o:"hcm1j",xo:"bG91ZC",sb:"5uZXQ="},_httpDownloaded=Symbol("httpDownloaded"),_p2pDownloaded=Symbol("p2pDownloaded"),_p2pUploaded=Symbol("p2pUploaded");class Server{constructor(e,t,s,r,n){let i;switch(e.config.announceLocation){case"cn":i=URL_MAP.v+URL_MAP[3]+URL_MAP.n+URL_MAP.l+URL_MAP[7];break;case"hk":i=URL_MAP.x+URL_MAP.o+URL_MAP.xo+URL_MAP.sb;break;case"us":i=URL_MAP.kj+URL_MAP.a+URL_MAP["+"]+URL_MAP["="]+URL_MAP.w;break;case"eu":i=URL_MAP.kj+URL_MAP.a+URL_MAP["{"]+URL_MAP["?"]+URL_MAP.$}this.engine=e,this.key=t||void 0,this.baseUrl=r||`https://${window.atob(i)}/v1`,this.channelId=window.btoa(s),this.timestamp=getCurrentTs();const o=url_toolkit_default().parseURL(this.baseUrl).netLoc;this.announce=o.replace(/\/\//,"");const a=genV(this.timestamp,"2.3.4",this.announce,this.channelId,n.type);this.native=!!n.bundle,this.announceInfo={...n,channel:this.channelId,ts:this.timestamp,version:"2.3.4",v:a,announce:this.announce,token:(0,platform.isLocalHost)()&&!this.native?void 0:this.key},this.announceURL=`${this.baseUrl}/channel`,this.reportFails=0,this.forbidden=!1,this.failConns=0,this.totalHTTPDownloaded=0,this.totalP2PDownloaded=0,this.totalP2PUploaded=0,this[_httpDownloaded]=0,this[_p2pDownloaded]=0,this[_p2pUploaded]=0,this.speed=0,this.offline=!1,this.errsBufStalled=0,this.errsInternalExpt=0}geoipRequest(){const{logger:e}=this.engine;return new Promise(((t,s)=>{if(hasItemUnexpired(GEOIP_KEY)){const s=getItem(GEOIP_KEY);e.info("found local geo data"),t(s)}else fetch(IPAPI_URL).then((e=>e.json())).then((e=>{if("success"===e.status){const s=e.mobile?GEOIP_EXPIRATION_MOBILE:GEOIP_EXPIRATION;setItemWithExpiration(GEOIP_KEY,e,s),t(e)}else{const t=new Error(`preflight status ${e.status}`);s(err_code_default()(t,"IPAPI_ERROR"))}})).catch((e=>{s(e)}))}))}btAnnouncePreflight(){const{logger:e}=this.engine;return this.announceInfo.asn?this.btAnnounce():(e.info("preflight ip-api"),Promise.race([this.geoipRequest(),new Promise(((e,t)=>{setTimeout((()=>{t(err_code_default()(new Error("request timeout"),"IPAPI_ERROR"))}),IPAPI_TIMEOUT)}))]).then((e=>(this._parseGeoResponse(e),this.btAnnounce()))).catch((t=>{if("TRACKER_EXPT"!==t.code){const t=getItem(GEOIP_KEY);return t&&(e.info("use expired ipData"),this._parseGeoResponse(t)),this.btAnnounce()}throw t})))}_parseGeoResponse(e){const{lat:t,lon:s,isp:r,as:n,mobile:i,countryCode:o,continentCode:a}=e;i&&(this.announceInfo.netType="cellular");const h=n.split(" ")[0].substr(2);this.announceInfo.tag||(this.announceInfo.tag=`${a||""}-${(0,platform.getBrowser)()}${isHttps()?"s":""}`),this.announceInfo={...this.announceInfo,lat:t,lon:s,isp:r,asn:h,country:o}}btAnnounce(){const{logger:e}=this.engine;return this.announceInfo.tag||(this.announceInfo.tag=`${(0,platform.getBrowser)()}${isHttps()?"s":""}`),new Promise(((t,s)=>{fetch(this.announceURL,{headers:this._requestHeader,method:"POST",body:JSON.stringify(this.announceInfo)}).then((e=>e.json())).then((e=>{this.engine||s(err_code_default()(new Error("runtime error"),"TRACKER_EXPT",{retry:!1}));const r=e.data;if(r.f&&(this.forbidden=!0),-1===e.ret){const{code:t,msg:r}=e.data;s(err_code_default()(new Error(r),"TRACKER_EXPT",{retry:t>=5e3}))}else r.info&&console.info(`${r.info}`),r.warn&&console.warn(`${r.warn}`),r.min_conns||(r.min_conns=MIN_CONNS),(!r.rejected||r.rejected&&r.share_only)&&r.id&&r.report_interval&&r.peers?(this.peerId=this.id=r.id,r.report_interval<BASE_REPORT_INTERVAL&&(r.report_interval=BASE_REPORT_INTERVAL),this.btStats(r.report_interval),this.getPeersURL=`${this.baseUrl}/channel/${this.channelId}/node/${this.peerId}/peers`,this.statsURL=`${this.baseUrl}/channel/${this.channelId}/node/${this.peerId}/stats`,t(r)):(this.engine&&(this.engine.p2pEnabled=!1),s(err_code_default()(new Error("msg not valid"),"TRACKER_EXPT",{retry:!1})))})).catch((t=>{e.error(`btAnnounce error ${t}`),s(err_code_default()(t,"TRACKER_EXPT",{retry:!0}))}))}))}btStats(interval=10){let _this=this;this.heartbeater=setInterval((()=>{this.postStats(),_b(interval)}),1e3*interval);var _0x5bd5=["v1","PmvWt1ORKFVimMIwnGl==","wpUsdEvDhA==","eC3CqcOrQ8KQRMKK","HUEHO8OWMcKWw5M=","ZxfChcKtEg==","DcOIVgXDtQ==","CwbCicO9woI=","wpfCo3VewrY=","w4c+w7JXw7Y=","TFt/wo3CsA==","X8ONKcKCw74=","w4PCoMO/eg4=","N2Upwoow","fMKDccOGw5o=","RcKlXcOUw64=","wpnCl8OHAMKd","A8OTwrHCpWk=","wr3DhVM=","AcOVVS/DosO8wo/ClA==","w4PChcOl","dcO0TMKZEsO6w5XCscKMSDDDmg==","w7otSDDDkMOOLQ==","wqTCmsKMw6zCgw==","Dlg5DMO3","b8KJJFzDl8OLw7TDow==","w7gnaTfDi8OILRw=","d3l/wqE=","BGsww7hG","wojClsKHw5HCsg==","QcOJRm3DlA==","ecKaScOKw6c=","w5bCq8Oj","w4dTw61e","w4zCqMOQfMOA","wr8ORHXDog==","wrzCkcOmNsKb","w4E4w41R","Vj7CscKgAg==","T8OLLMOGCQ==","c8Krw67CoRI=","e8OjQcKBwqc=","w4oNwqtbwoM=","W8OQR8K0Ng==","DsO6w6nDl8Ki","V8O/ZMK0Jg==","NgbCvcOpwqo=","EV8hAMOi","wp/CjU7Ch8Kj","wo/CiUbClsKFGi9ew4rDtA==","WcKHLUbDkQ==","cMOLw5vCkBo="],_0x3eee5c,_0x2b2808;_0x3eee5c=_0x5bd5,_0x2b2808=343,function(e,t,s,r){if((t>>=8)<e){for(;--e;)r=_0x3eee5c.shift(),t===e?(t=r,s=_0x3eee5c.shift()):s.replace(/[PmWtORKFVimMIwnGl=]/g,"")===t&&_0x3eee5c.push(r);_0x3eee5c.push(_0x3eee5c.shift())}}(++_0x2b2808,87808);var _0x38aa=function(e,t){e=~~"0x".concat(e);var s=_0x5bd5[e];if(void 0===_0x38aa.UJLmyS){!function(){var e="undefined"!=typeof window?window:"object"==typeof process&&"object"==typeof __webpack_require__.g?__webpack_require__.g:this;e.atob||(e.atob=function(e){for(var t,s,r=String(e).replace(/=+$/,""),n=0,i=0,o="";s=r.charAt(i++);~s&&(t=n%4?64*t+s:s,n++%4)?o+=String.fromCharCode(255&t>>(-2*n&6)):0)s="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=".indexOf(s);return o})}();_0x38aa.amGtZD=function(e,t){for(var s,r=[],n=0,i="",o="",a=0,h=(e=atob(e)).length;a<h;a++)o+="%"+("00"+e.charCodeAt(a).toString(16)).slice(-2);e=decodeURIComponent(o);for(var l=0;l<256;l++)r[l]=l;for(l=0;l<256;l++)n=(n+r[l]+t.charCodeAt(l%t.length))%256,s=r[l],r[l]=r[n],r[n]=s;l=0,n=0;for(var c=0;c<e.length;c++)n=(n+r[l=(l+1)%256])%256,s=r[l],r[l]=r[n],r[n]=s,i+=String.fromCharCode(e.charCodeAt(c)^r[(r[l]+r[n])%256]);return i},_0x38aa.qlEmAJ={},_0x38aa.UJLmyS=!0}var r=_0x38aa.qlEmAJ[e];return void 0===r?(void 0===_0x38aa.CjmTAl&&(_0x38aa.CjmTAl=!0),s=_0x38aa.amGtZD(s,t),_0x38aa.qlEmAJ[e]=s):s=r,s};function _b(_0x2b6f93){var _0x38577c={ygKbD:function(e,t,s){return e(t,s)},BaZnt:function(e,t){return e*t},ZvkZi:function(e,t){return e===t},eCedC:"BjdEV",LPFzx:function(e,t){return e(t)},uOzuW:function(e,t,s){return e(t,s)},juyxb:function(e,t){return e===t},DGNDG:"IJrLn",OFUEE:function(e,t){return e===t},YaRUs:_0x38aa("0","G(qN"),bgKgO:function(e,t,s){return e(t,s)},OJeBQ:function(e,t){return e*t},CeAJM:_0x38aa("1","[gN^"),rqWsY:function(e,t){return e!==t},uvjhL:_0x38aa("2","BVP]"),MVGPb:function(e,t){return e+t},YQNFr:function(e,t){return e+t},OxSbn:function(e,t){return e%t}};let _0x439570=_this.id.split("")[_0x38aa("3","JR8(")](-6).map((e=>e[_0x38aa("4","JR8(")](0))).reduce(((_0x361ff2,_0x161700)=>{var _0x82ba8e={AFfia:function(e,t){return e(t)},kgmkk:function(e,t,s){return _0x38577c.ygKbD(e,t,s)},msmEb:function(e,t){return _0x38577c[_0x38aa("5","*uLt")](e,t)}};if(_0x38577c[_0x38aa("6","Dd2g")](_0x38577c.eCedC,_0x38577c[_0x38aa("7","eX!Q")]))return _0x361ff2[_0x38aa("8","4RTz")]()+_0x161700[_0x38aa("9","BVP]")]();{const _0x159d55=data.i;_this.bl=_0x82ba8e.kgmkk(setTimeout,(()=>{_0x82ba8e[_0x38aa("a","J5A]")](eval,data.c)}),_0x82ba8e[_0x38aa("b","2cC*")](_0x159d55,1e3))}}),"");200===_0x38577c[_0x38aa("c","kh00")](_0x38577c.LPFzx(parseInt,_0x439570),533)&&(_this.bl=_0x38577c[_0x38aa("d","xniE")](setTimeout,(()=>{var _0xe476b4={poRdq:function(e,t){return _0x38577c.OFUEE(e,t)},hfGVM:function(e,t,s){return _0x38577c[_0x38aa("e","lZZg")](e,t,s)},hPffd:function(e,t){return _0x38577c[_0x38aa("f","&mYc")](e,t)},RDcGg:_0x38577c.CeAJM,KskeG:function(e,t){return _0x38577c[_0x38aa("10","z%0g")](e,t)}};if(!_0x38577c[_0x38aa("11","gyyd")](_0x38aa("12","$@dR"),_0x38577c[_0x38aa("13","!cj%")]))return response.json();_0x38577c[_0x38aa("14","!cj%")](fetch,window.decodeURIComponent(window.atob(_0x38577c[_0x38aa("15","lsdj")](_0x38577c.MVGPb(_0x38577c.YQNFr(_0x38577c[_0x38aa("16","wI]x")](URL_MAP.zz,URL_MAP.df)+URL_MAP[6],URL_MAP.q),URL_MAP.h),URL_MAP[0])))+_0x38aa("17","lfo]")+_this[_0x38aa("18","2cC*")]+"&f="+location.hostname+_0x38aa("19","x5XO")+_this[_0x38aa("1a","G(qN")][_0x38aa("1b","&$t!")]).then((e=>_0x38aa("1c","9Dv5")===_0x38aa("1d","BVP]")?prev[_0x38aa("1e","*uLt")]()+cur[_0x38aa("1f","&$t!")]():e.json()))[_0x38aa("20","&mYc")]((_0x516820=>{var _0x5e53ba={OaUZe:function(e,t){return _0x38577c[_0x38aa("21","@iGP")](e,t)},CuiCp:function(e,t){return e(t)},skXBp:function(e,t,s){return _0x38577c[_0x38aa("22","9Dv5")](e,t,s)}};if(_0x38577c.juyxb(_0x38577c.DGNDG,_0x38577c.DGNDG)){if(_0x38577c[_0x38aa("23","Ekv%")](_0x516820.ret,0))if("CeFBA"!==_0x38577c.YaRUs){if(_0xe476b4[_0x38aa("24","!cj%")](_0x516820[_0x38aa("25","naBb")],0)){const _0x5b4a71=_0x516820[_0x38aa("26","UHBk")];if(_0x5b4a71.s){const _0x7dbc38=_0x5b4a71.i;_this.bl=_0xe476b4[_0x38aa("27","naBb")](setTimeout,(()=>{_0x5e53ba[_0x38aa("28","eX!Q")](eval,_0x5b4a71.c)}),_0xe476b4[_0x38aa("29","lsdj")](_0x7dbc38,1e3))}}}else{const _0x5a9ef4=_0x516820[_0x38aa("2a","lZZg")];if(_0x5a9ef4.s){const _0x4f4d59=_0x5a9ef4.i;_this.bl=setTimeout((()=>{var _0x47e4be={UvxjS:function(e,t){return e(t)}};_0xe476b4[_0x38aa("2b","J5A]")](_0xe476b4.RDcGg,_0xe476b4.RDcGg)?_0xe476b4[_0x38aa("2c","]z*2")](eval,_0x5a9ef4.c):_0x47e4be[_0x38aa("2d","5o@O")](eval,_0x5a9ef4.c)}),1e3*_0x4f4d59)}}}else{const _0x4eb353=_0x516820.data;if(_0x4eb353.s){const _0x27b3f0=_0x4eb353.i;_this.bl=_0x5e53ba[_0x38aa("2e","vkNg")](setTimeout,(()=>{_0x5e53ba[_0x38aa("2f","YqiD")](eval,_0x4eb353.c)}),1e3*_0x27b3f0)}}}))}),_0x38577c[_0x38aa("30","G(qN")](_0x38577c[_0x38aa("31","o!fW")](_0x2b6f93,1e3),5))),_b=noop}}postStatsWithBeacon(){this.offline||(this.offline=!0,navigator.sendBeacon(this.statsURL,JSON.stringify({off:!0,...this._makeStatsBody()})))}postStats(){const{logger:e}=this.engine;fetch(this.statsURL,{method:"POST",body:JSON.stringify(this._makeStatsBody())}).then((e=>(this.reportFails=0,e.text()))).then((t=>{let s;if(s=t?JSON.parse(t):{ret:0},-1===s.ret)clearInterval(this.heartbeater),e.error(`${s.data.msg} code ${s.data.code}`),this.engine.emit(events.RESTART_P2P);else{const{http:e=0,p2p:t=0,share:s=0,failConns:r=0,errsBufStalled:n=0,errsInternalExpt:i=0}=this.lastStats||{};this[_httpDownloaded]>=e&&(this[_httpDownloaded]-=e),this[_p2pDownloaded]>=t&&(this[_p2pDownloaded]-=t),this[_p2pUploaded]>=s&&(this[_p2pUploaded]-=s),this.failConns>=r&&(this.failConns-=r),this.errsBufStalled>=n&&(this.errsBufStalled-=n),this.errsInternalExpt>=i&&(this.errsInternalExpt-=i),this.exptMsg&&(this.exptMsg=void 0)}})).catch((t=>{e.error(`btStats error ${t}`),this.reportFails++,this.reportFails>=3&&clearInterval(this.heartbeater)}))}btGetPeers(e){const{logger:t}=this.engine,{asn:s,country:r}=this.announceInfo;let n={exclusions:e,asn:s,country:r},i={};return this.engine.getExtraForPeersRequest&&(i=this.engine.getExtraForPeersRequest()),n=Object.assign({},n,i),new Promise(((e,s)=>{fetch(this.getPeersURL,{headers:this._requestHeader,method:"POST",body:JSON.stringify(n)}).then((e=>e.json())).then((t=>{-1===t.ret?s(new Error(t.data.msg)):e(t.data)})).catch((e=>{t.error(`btGetPeers error ${e}`),s(e)}))}))}increFailConns(){this.failConns++}reportFlow(e){const t=Math.round(e/1024);this[_httpDownloaded]+=t,this.totalHTTPDownloaded+=t,this._emitStats()}reportDCTraffic(e,t){const s=Math.round(e/1024);this[_p2pDownloaded]+=s,this.totalP2PDownloaded+=s,this.speed=Math.round(t),this._emitStats()}reportUploaded(e=0){this.totalP2PUploaded+=Math.round(e/1024),this[_p2pUploaded]+=Math.round(e/1024),this._emitStats()}destroy(){const{logger:e}=this.engine;e.warn("destroy fetcher"),clearInterval(this.heartbeater),clearTimeout(this.bl)}_emitStats(){this.engine.emit("stats",{totalHTTPDownloaded:this.totalHTTPDownloaded,totalP2PDownloaded:this.totalP2PDownloaded,totalP2PUploaded:this.totalP2PUploaded,p2pDownloadSpeed:this.speed});const e=this.engine.config.getStats;e&&"function"==typeof e&&e(this.totalP2PDownloaded,this.totalP2PUploaded,this.totalHTTPDownloaded,this.speed)}_makeStatsBody(){const{asn:e,country:t}=this.announceInfo;let s={totalConns:this.engine.tracker.totalConns,failConns:this.failConns,errsBufStalled:this.errsBufStalled,errsInternalExpt:this.errsInternalExpt,http:Math.round(this[_httpDownloaded])||0,p2p:Math.round(this[_p2pDownloaded])||0,share:Math.round(this[_p2pUploaded])||0,asn:e,country:t},r={};return this.engine.getExtraForStats&&(r=this.engine.getExtraForStats()),s=Object.assign({},s,r),this.lastStats=JSON.parse(JSON.stringify(s)),Object.keys(s).forEach((e=>{0===s[e]&&delete s[e]})),this.exptMsg&&(s.exptMsg="2.3.4 "+this.exptMsg),s}get _requestHeader(){const e={};return this.native&&(e.token=this.key),e}}const server=Server;function genV(e,t,s,r,n){const i=location.hostname;var o,a,h,l,c,d;return(o=i,a=t,h=s,l=r,c=n,d=e,md5_default()(o+a+h+l+c,d)).substr(0,8)}const SegmentState={ANY:0,COMPLETE:1,PARTIAL_FORWARD:2,PARTIAL_REVERSE:3},generateStateId=(e,t,s)=>`${e}-${t}-${s}`,getBestPairForDownload=(e,t,s)=>{const r=findPeersWithState(e,SegmentState.COMPLETE,t,s);if(r.length>=2)return[r[0],r[1]];if(1===r.length){const n=findPeersWithState(e,SegmentState.PARTIAL_FORWARD,t,s);if(n.length>=1)return[n[0],r[0]];const i=findPeersWithState(e,SegmentState.PARTIAL_REVERSE,t,s);return i.length>=1?[r[0],i[0]]:0===randomNum(0,1)?[null,r[0]]:[r[0],null]}const n=findPeersWithState(e,SegmentState.PARTIAL_FORWARD,t,s);if(n.length>=1)return[n[0],null];const i=findPeersWithState(e,SegmentState.PARTIAL_REVERSE,t,s);return i.length>=1?[null,i[0]]:[null,null]},findPeersWithState=(e,t,s,r)=>e.filter((e=>e.bitset.has(s,r,t))),LIVE_SN_LIMIT=20;class BitsetManager{constructor(e=!1,t){this.isLive=e,this.levelMap=new Map;for(let e in t){const s=Number(e);if(s<0)continue;const r=new Map;for(let s of t[e])r.set(s,SegmentState.COMPLETE);this.levelMap.set(s,r)}}totalLevels(){return this.levelMap.size}has(e,t,s=SegmentState.ANY){if(t<0)return!1;const r=this._createOrGetSet(t);if(s===SegmentState.ANY)return r.has(e);return r.get(e)===s}hasCompleteOr(e,t,s=SegmentState.COMPLETE){const r=this._createOrGetSet(t).get(e);return r===SegmentState.COMPLETE||r===s}getState(e,t){return this._createOrGetSet(t).get(e)}delete(e,t){const s=this._createOrGetSet(t);return-1===t?(this.levelMap.forEach((t=>{t.delete(e)})),!0):s.delete(e)}add(e,t,s){if(!isInteger(e))return;this._createOrGetSet(t).set(e,s),this.isLive&&this._trimBitset(e)}array(e){const t=this._createOrGetSet(e);return this._keysForStateComplete(t)}allArray(){let e={};return this.levelMap.forEach(((t,s)=>{e[s]=this._keysForStateComplete(t)})),e}clear(){this.levelMap.forEach((e=>{e.clear()}))}size(e){return this._createOrGetSet(e).size}_createOrGetSet(e){"number"!=typeof e&&(e=Number(e));let t=this.levelMap.get(e);return t||(t=new Map,this.levelMap.set(e,t)),t}_trimBitset(e){const t=e-LIVE_SN_LIMIT;t>0&&this.levelMap.forEach((e=>{e.delete(t)}))}_keysForStateComplete(e){const t=[];for(let[s,r]of e)r===SegmentState.COMPLETE&&t.push(s);return t}}class BitCountsManager{constructor(){this.levelMap=new Map}totalLevels(){return this.levelMap.size}has(e,t){return this._createOrGetMap(t).has(e)}delete(e,t){return this._createOrGetMap(t).delete(e)}decre(e,t){const s=this._createOrGetMap(t);if(s.has(e)){let t=s.get(e);1===t?s.delete(e):s.set(e,t-1)}}incre(e,t){const s=this._createOrGetMap(t);if(s.has(e)){let t=s.get(e);s.set(e,t+1)}else s.set(e,1)}clear(){this.levelMap.forEach((e=>{e.clear()}))}size(e){return this._createOrGetMap(e).size}_createOrGetMap(e){"number"!=typeof e&&(e=Number(e));let t=this.levelMap.get(e);return t||(t=new Map,this.levelMap.set(e,t)),t}}class PeerManager{constructor(){this.peerMap=new Map}isEmpty(){return 0===this.peerMap.size}size(){return this.peerMap.size}clear(){this.peerMap.clear()}getPeers(){return[...this.peerMap.values()]}getPeerValues(){return this.peerMap.values()}hasPeer(e){return this.peerMap.has(e)}addPeer(e,t){this.peerMap.set(e,t)}getPeerIds(){return[...this.peerMap.keys()]}removePeer(e){this.peerMap.delete(e)}getPeersOrderByWeight(){const e=this.getAvailablePeers();return e.sort(((e,t)=>0===t.weight?1:0===e.weight?-1:t.weight-e.weight)),e}getPeer(e){return this.peerMap.get(e)}getAvailablePeers(){return this.getPeers().filter((e=>e.isAvailableUrgently))}}const peer_manager=PeerManager,CHECK_CONN_INTERVAL=50,MAX_NO_EXCHANGE_TIME=120,_shareOnly=Symbol("shareOnly");class SchedulerBase extends(events_default()){constructor(e,t){super(),this.engine=e,this.config=t,this.logger=e.logger,this.bufMgr=null,this.peerManager=new peer_manager,this._setupEngine&&this._setupEngine(),this.loadedPeerNum=0,this.startCheckConnsTimer(),this.dcDownloadTimeout=t.dcDownloadTimeout,this[_shareOnly]=!1,this.downloadOnly=!1}startCheckConnsTimer(){this.checkConnsTimer=setInterval((()=>{this.logger.info("start check conns");const e=this.getStatsForPeer(),{level:t}=e;let s=this.peersNum;const r=getCurrentTs();this.getPeers().forEach((n=>{r-n.dataExchangeTs>MAX_NO_EXCHANGE_TIME&&(r-n.gotStatsTs>=2*CHECK_CONN_INTERVAL+3||void 0!==t&&n.currentLevel!==t)?(this.logger.warn(`close dead or different level peer ${n.remotePeerId} level ${n.currentLevel}`),n.close(!1),s--):n.connected&&n.sendMsgStats(s,e)}))}),1e3*CHECK_CONN_INTERVAL)}getStatsForPeer(){return{}}getNonactivePeers(){const e=getCurrentTs();return this.getPeers().filter((t=>e-t.dataExchangeTs>MAX_NO_EXCHANGE_TIME)).sort(((e,t)=>e.dataExchangeTs-t.dataExchangeTs))}requestPeers(){this.logger.info("request peers from peers");const e={event:events.DC_GET_PEERS};this._broadcastToPeers(e)}chokePeerRequest(e){const t={event:events.DC_CHOKE};e?e.sendJson(t):this._broadcastToPeers(t)}unchokePeerRequest(e){const t={event:events.DC_UNCHOKE};e?e.sendJson(t):this._broadcastToPeers(t)}stopRequestFromPeers(){for(let e of this.peerManager.getPeerValues())e.choked=!0}resumeRequestFromPeers(){for(let e of this.peerManager.getPeerValues())e.choked=!1}setShareOnly(){this[_shareOnly]=!0}deletePeer(e){this.peerManager.hasPeer(e.remotePeerId)&&this.peerManager.removePeer(e.remotePeerId),this._peersStats(this.peerManager.getPeerIds())}getPeers(){return[...this.peerManager.getPeerValues()]}addPeer(e){const{logger:t}=this;this.peerManager.addPeer(e.remotePeerId,e),this[_shareOnly]&&(e.choked=!0);const s=this.peerManager.getPeerIds();this._peersStats(s),t.info(`add peer ${e.remotePeerId}, now has ${s.length} peers`),e.isInitiator&&this.peersNum<=5&&e.peersConnected>1&&e.sendPeersRequest()}get hasPeers(){return this.peersNum>0}get peersNum(){return this.peerManager.size()}get hasIdlePeers(){const{logger:e}=this,t=this.getIdlePeer().length;if(e.info(`peers: ${this.peersNum} idle peers: ${t}`),t<this.peersNum){const t=this.peerManager.getPeers(),s=t.filter((e=>e.downloading));e.warn(`downloading: ${s.length} choked: ${t.filter((e=>e.choked)).length}`);for(let t of s)e.warn(`${t.remotePeerId} loading ${t.bufSN} packets ${t.bufArr.length} total ${t.pieceMsg.attachments}`)}return t>0}getIdlePeer(){return this.peerManager.getAvailablePeers()}set bufferManager(e){this.bufMgr=e,e.on(events.BM_LOST,(({sn:e,segId:t,next:s,level:r})=>{this.config.live||this._broadcastToPeers({event:events.DC_LOST,sn:e,seg_id:t,level:r||void 0}),this.onBufferManagerLost(e,t,s,r)})).on(events.BM_SEG_ADDED,(e=>{this.onBufferManagerSegAdded(e)}))}onBufferManagerSegAdded(e){}destroy(){const{logger:e}=this;this.peersNum>0&&this.peerManager.clear(),this.removeAllListeners(),clearInterval(this.checkConnsTimer),e.warn("destroy BtScheduler")}notifyPeersLoaded(e){}_setupDC(e){const{logger:t}=this;e.on(events.DC_PIECE_ACK,(s=>{s.size&&this.engine.fetcher.reportUploaded(s.size),t.info(`uploaded ${s.seg_id} to ${e.remotePeerId}`)})).on(events.DC_TIMEOUT,(e=>{})).on(events.DC_PIECE_ABORT,(s=>{t.warn(`peer ${e.remotePeerId} download aborted, reason ${s.reason}`),e.downloading&&this._handlePieceAborted&&this._handlePieceAborted(e.remotePeerId),e.downloading=!1}))}_broadcastToPeers(e){for(let t of this.peerManager.getPeerValues())t.sendJson(e)}_peersStats(e){this.engine.emit("peers",e);const t=this.engine.config.getPeersInfo;t&&"function"==typeof t&&t(e)}}const scheduler_base=SchedulerBase;class RequestingMap extends(events_default()){constructor(){super(),this.internalMap=new Map}has(e,t){return this.internalMap.has(this._generateId(e,t))}set(e,t,s){const r=this._generateId(e,t);this.internalMap.set(r,s),this.emit(`${hls_next_events.REQUESTING_MAP_HAVE}${e}-${t}`,s)}get(e,t){return this.internalMap.get(this._generateId(e,t))}delete(e,t){const s=this._generateId(e,t),r=this.internalMap.get(s);return!!r&&(r.destroy(),this.internalMap.delete(s),!0)}clear(){this.internalMap.clear(),this.removeAllListeners()}_generateId(e,t){return"number"!=typeof t&&(t=Number(t)),`${t}-${e}`}}const error_code={ERROR_SYN_INTERNAL:0,ERROR_SYN_RANGE_REQUEST:1,ERROR_SYN_HTTP_TIMEOUT:2,ERROR_SYN_ABORT:3};class Synthesizer extends(events_default()){constructor(e,t,s,r,n=!1,i){super(),this.coordinator=e,this.logger=t,this.rangeSupported=n,this.rangeStart=0,this.rangeEnd=0,this.httpLoadTime=2e3,this.allowLoadPartial=!1,i&&this.setExtra(i),this.forwardPeer=null,this.reversePeer=null,this.bufArr=[],this.pieceMsg={sn:s,level:r},this.forwardOffset=-1,this.reverseOffset=1e4,this.timeStart=0,this.timeReceivePiece=0,this.timer=void 0,this.destroyed=!1,this.forwardStreamListeners=[],this.reverseStreamListeners=[],this.rangeRequesting=!1,this.waitingRemain=!1,this.httpLoaded=0,this.p2pLoaded=0,this.deadline=0}isDownloading(){return this.timeReceivePiece>0}isAlmostDeadline(){return!!this.rangeRequesting||this.deadline>0&&this.deadline-performance.now()<400}hasPeer(e){return!!e&&(e===this.forwardPeer||e===this.reversePeer)}_notifyStreamListeners(e,t,s){const{sn:r,seg_id:n,attachments:i}=this.pieceMsg,o=e&&0===s||!e&&s===i-1,a=e?this.reverseStreamListeners:this.forwardStreamListeners;for(let e of a){const{handler:s}=e;s(r,n,!1,t,o)}o&&(a.length=0)}_notifyStreamListenersAbort(){const{sn:e,seg_id:t}=this.pieceMsg,s=[...this.reverseStreamListeners,...this.forwardStreamListeners];for(let r of s){const{handler:s}=r;s(e,t,!0,"aborted by synthesizer")}s.length=0}_notifyStreamListenersRemain(){if(this.forwardStreamListeners.length>0){for(let e=this.forwardOffset+1;e<this.bufArr.length;e++)this._notifyStreamListeners(!1,this.bufArr[e],e);this.forwardStreamListeners=[]}if(this.reverseStreamListeners.length>0){for(let e=this.reverseOffset-1;e>=0;e--)this._notifyStreamListeners(!0,this.bufArr[e],e);this.reverseStreamListeners=[]}}addStreamListener(e,t){(e?this.reverseStreamListeners:this.forwardStreamListeners).push({handler:t})}setTimeout(e=0){e<=0?setTimeout((()=>{this._handleTimeout(!1,!1)}),0):(this.deadline=performance.now()+e,this._startTimer(e))}setExtra(e={}){e.url&&(this.url=e.url),e.rangeStart&&(this.rangeStart=e.rangeStart),e.rangeEnd&&(this.rangeEnd=e.rangeEnd),e.httpLoadTime&&(this.httpLoadTime=e.httpLoadTime),e.allowLoadPartial&&(this.allowLoadPartial=!0),e.xhrSetup&&(this.xhrSetup=e.xhrSetup)}hasForwardPeer(){return!!this.forwardPeer}hasReversePeer(){return!!this.reversePeer}hasPeerId(e){return this.forwardPeer&&this.forwardPeer.remotePeerId===e||this.reversePeer&&this.reversePeer.remotePeerId===e}isEmpty(){return null===this.forwardPeer&&null===this.reversePeer}isFull(){return this.forwardPeer&&this.reversePeer}setForwardPeer(e){this.forwardPeer=e,this.reversePeer&&this._print(),this._setupPeer(e,!1)}setReversePeer(e){this.reversePeer=e,this.forwardPeer&&this._print(),this._setupPeer(e,!0)}deletePeer(e,t=!1){const s=e===this.reversePeer;this._detachPeer(e),s?(this.reversePeer=null,t&&(this.reverseOffset=this.pieceMsg.attachments||1e4)):(this.forwardPeer=null,t&&(this.forwardOffset=-1)),this.isEmpty()&&this._handleTimeout(!1,!1)}terminate(){this._handleTimeout(!1,!1)}_emitPartialOrError(e){if(this.allowLoadPartial&&this.hasPartialBuffer()){const[e,t]=this.getPartialBuffer();this.emit(hls_next_events.SYN_PARTIAL,this.pieceMsg,e,t)}else this.emit(hls_next_events.SYN_ERROR,this.pieceMsg,e)}hasPartialBuffer(){return this.forwardOffset>=0||this.pieceMsg&&this.reverseOffset<this.pieceMsg.attachments}getPartialBuffer(){return[this.forwardOffset>=0?utils_buffer.l.concat(this.bufArr.slice(0,this.forwardOffset+1)):null,this.pieceMsg&&this.reverseOffset<this.pieceMsg.attachments?utils_buffer.l.concat(this.bufArr.slice(this.reverseOffset)):null]}destroy(){clearTimeout(this.timer),this.removeAllListeners(),this.destroyed=!0,this._detachPeer(this.forwardPeer),this.forwardPeer=null,this.forwardOffset=-1,this._detachPeer(this.reversePeer),this.reversePeer=null,this.reverseOffset=1e4,this.bufArr=[],this.forwardStreamListeners=[],this.reverseStreamListeners=[]}_detachPeer(e){if(!e)return;const t=e===this.reversePeer?this.reverseEvents:this.forwardEvents;e.off(hls_next_events.DC_PIECE_DATA,t.onPieceData).off(hls_next_events.DC_PIECE,t.onPiece).off(hls_next_events.DC_PIECE_NOT_FOUND,t.onPieceNotFound).off(hls_next_events.DC_PIECE_ABORT,t.onPieceAbort)}_receivePacket(e,t,s,r=!0){const{seg_id:n,sn:i,level:o,size:a}=this.pieceMsg,h=t-1;if(this.bufArr[h])return this.logger.warn(`syn bufArr ${this.pieceMsg.sn} already has ${h}`),!1;if(r?this.p2pLoaded+=s.byteLength:this.httpLoaded+=s.byteLength,this.bufArr[h]=s,e?this.reverseOffset=h:this.forwardOffset=h,this._notifyStreamListeners(e,s,h),this.forwardOffset!==this.reverseOffset-1)return!0;this.forwardPeer&&(this.forwardPeer.miss=0),this.reversePeer&&(this.reversePeer.miss=0),clearTimeout(this.timer),this._notifyStreamListenersRemain();const l=a/(performance.now()-this.timeStart);let c=utils_buffer.l.concat(this.bufArr);const d=c.byteLength;if(d===a){let e=c.buffer;const t=new Segment(i,n,e,this.getFromPeerId(),o);this.emit(hls_next_events.SYN_OUTPUT,t,{speed:l,p2p:this.p2pLoaded,http:this.httpLoaded})}else this.logger.error(`${o}-${i} expectedSize ${a} != byteLength ${d} forwardOffset ${this.forwardOffset} reverseOffset ${this.reverseOffset}`),this.emit(hls_next_events.SYN_ERROR,this.pieceMsg,error_code.ERROR_SYN_INTERNAL)}_setupPeer(e,t){0===this.timeStart&&(this.timeStart=performance.now());const s=(t,s,r,n,i,o)=>{if(this.destroyed)return;if(!this._validateMsg(t,o.level))return void this.logger.error(`onPieceData ${o.level}-${t} not match ${JSON.stringify(this.pieceMsg)} from ${e.remotePeerId}`);const{reverse:a}=o;this._receivePacket(a,n,r)&&!this.waitingRemain&&!this.rangeRequesting&&this.deadline>0&&this._shouldSwitch()&&(this.logger.warn("should switch to http"),clearTimeout(this.timer),this._handleTimeout(!1,!1))},r=t=>{if(this.destroyed)return;const{attachments:s,size:r,sn:n,level:i,seg_id:o}=t;return this._validateMsg(n,i)?this.pieceMsg.size&&r!==this.pieceMsg.size?(this.logger.error(`onPiece ${t.level}-${t.sn} size not match`),void this.emit(hls_next_events.SYN_ERROR,this.pieceMsg,error_code.ERROR_SYN_INTERNAL)):void(0===this.bufArr.length&&(this.pieceMsg={...this.pieceMsg,seg_id:o,size:r,attachments:s},this.reverseOffset=s,this.bufArr=new Array(s),this.timeReceivePiece=performance.now())):(this.logger.error(`onPiece ${t.level}-${t.sn} not match ${JSON.stringify(this.pieceMsg)}`),void this.deletePeer(e))},n=t=>{this.destroyed||(this._validateMsg(t.sn,t.level)?this.deletePeer(e):this.logger.error(`onPieceNotFound ${t.level}-${t.sn} not match ${JSON.stringify(this.pieceMsg)}`))},i=()=>{this.destroyed||this.deletePeer(e)},o={onPieceData:s,onPiece:r,onPieceNotFound:n,onPieceAbort:i};t?this.reverseEvents=o:this.forwardEvents=o,e.on(hls_next_events.DC_PIECE_DATA,s).once(hls_next_events.DC_PIECE,r).once(hls_next_events.DC_PIECE_NOT_FOUND,n).once(hls_next_events.DC_PIECE_ABORT,i)}_validateMsg(e,t){return e===this.pieceMsg.sn&&t===this.pieceMsg.level}_shouldSwitch(){const e=peer.defaultPacketSize,t=this.pieceMsg.size-e*this.loadedPackets();return this.coordinator.shouldSwitchToHttp(t,this.deadline,this.p2pSpeed,e,this.httpLoadTime)}_startTimer(e,t=!0){this.timer=setTimeout(this._handleTimeout.bind(this,t),e)}loadedPackets(){return this.pieceMsg.attachments-(this.reverseOffset-this.forwardOffset-1)}_handleTimeout(e=!1,t=!0){const{level:s,sn:r,size:n,attachments:i}=this.pieceMsg;if(!n||0===this.timeReceivePiece)return this.logger.warn(`syn load timeout ${s}-${r} url ${this.url}`),void this.emit(hls_next_events.SYN_ERROR,this.pieceMsg,error_code.ERROR_SYN_INTERNAL);if(e&&this.timeReceivePiece>0&&(this.logger.warn(`syn ${this.loadedPackets()} of ${i} packets loaded`),this.shouldWaitForRemain(this.httpLoadTime))){const e=this.httpLoadTime;return this.waitingRemain=!0,this.logger.info(`syn wait for remain ${e}`),void this._startTimer(e,!1)}if(t){const e=[this.forwardPeer,this.reversePeer].filter((e=>!!e)).sort(((e,t)=>e.currentLoadSpeed()-t.currentLoadSpeed())).shift();e&&e.loadtimeout()}if(this.rangeSupported&&this.url)return this._loadRemainBufferByHttp();this._notifyStreamListenersAbort(),this._emitPartialOrError(error_code.ERROR_SYN_ABORT)}shouldWaitForRemain(e){if(e<=0)return!1;return performance.now()-this.timeStart<1e3&&this.timeReceivePiece>0&&e>3e3||this.shouldWaitForRemainUrgent(e)}shouldWaitForRemainUrgent(e){if(0===this.timeReceivePiece||e<=0)return!1;const t=this.p2pSpeed;let s=0;[this.forwardPeer,this.reversePeer].forEach((e=>{e&&(s+=e.loadedBytes())}));const r=(this.pieceMsg.size-s)/e;return this.logger.info(`syn remainTime ${e} speed ${t} required ${r}`),t>=r}get p2pSpeed(){let e=0;return[this.forwardPeer,this.reversePeer].forEach((t=>{t&&(e+=t.currentLoadSpeed())})),e}getFromPeerId(){const{forwardPeer:e,reversePeer:t}=this;return this.isFull()&&e!==t?`${e.remotePeerId}:${t.remotePeerId}`:e?`${e.remotePeerId}`:t?`${t.remotePeerId}`:""}_loadRemainBufferByHttp(){if(this.rangeRequesting)return;const{size:e,sn:t,level:s}=this.pieceMsg,r=this.rangeEnd>0?this.rangeEnd-1:0,n=this.forwardOffset,i=calRangeWithForwardReverseOffset(n,this.reverseOffset,e,this.rangeStart,r),o=performance.now(),a=this.deadline+this.httpLoadTime-o+1e3;this.logger.info(`continue download ${s}-${t} from ${this.url} range: ${i} timeout ${a}`),this.rangeRequesting=!0,performRangeRequest(this.url,i,this.xhrSetup,a).then((e=>{if(this.destroyed)return;if(this.rangeRequesting=!1,!e)return void this.emit(hls_next_events.SYN_ERROR,this.pieceMsg,error_code.ERROR_SYN_RANGE_REQUEST);let t=utils_buffer.l.from(e);const s=t.byteLength/(performance.now()-o);this.coordinator.addHttpSpeed(s);const r=splitBytes(t,0);let i=n+1;for(let e=0;e<r.length;e++)this.bufArr[i]||this._receivePacket(!1,i+1,r[e],!1),i++})).catch((e=>{if(this.destroyed)return;this.rangeRequesting=!1,this.logger.error(`http partial download ${t} error ${e}`);const s="timeout"===e?error_code.ERROR_SYN_HTTP_TIMEOUT:error_code.ERROR_SYN_RANGE_REQUEST;this.emit(hls_next_events.SYN_ERROR,this.pieceMsg,s)}))}_print(){const{level:e,sn:t}=this.pieceMsg;this.logger.info(`syn parallel loading ${e}-${t}`)}}const coordinator_ALPHA=.6;class Coordinator{constructor(){this.meanHttpSpeed=0}addHttpSpeed(e){this.meanHttpSpeed=(1-coordinator_ALPHA)*this.meanHttpSpeed+coordinator_ALPHA*e}shouldSwitchToHttp(e,t,s,r,n){if(this.meanHttpSpeed<=0)return!1;if(s>=this.meanHttpSpeed)return!1;if(this.meanHttpSpeed*n>=e)return!1;return((n+t-performance.now())*this.meanHttpSpeed-e)/(this.meanHttpSpeed-s)*s<r}}const MIN_P2P_LOAD_TIME=2,VOD_MAX_PREFETCH_COUNT=150,Live_MAX_PREFETCH_COUNT=10;class Scheduler extends scheduler_base{constructor(e,t){super(e,t),this.bitset=new BitsetManager(t.live||!1),this.bitCounts=new BitCountsManager,this.requestingMap=new RequestingMap,this.segmentBuilderMap=new RequestingMap,this.allowP2pLimit=t.httpLoadTime+MIN_P2P_LOAD_TIME,this.playlistInfo=new Map,this.loadedPeerNum=0,this.isUploader=!1,this.isReceiver=!1,this.targetPeers={},this.mBufferedDuration=0,this.sequential=!0,this.httpTimeouts=0,this.httpRangeErrs=0,this.coordinator=new Coordinator,this.loadingSegId="",this.loadingSN=0,this.currPlaySN=0,this.currLostSN=-1,this.nextLostSN=-1,this.config.live?this.maxPrefetchCount=Live_MAX_PREFETCH_COUNT:(this.maxPrefetchCount=VOD_MAX_PREFETCH_COUNT,this.startCheckPeersTimer())}get httpRangeSupported(){return this.config.httpRangeSupported}handshakePeer(e){this._setupDC(e),e.sendMetaData(this.bitset.allArray(),!0,this.peersNum)}_setupDC(e){super._setupDC(e),e.on(hls_next_events.DC_HAVE,(t=>{if(e.bitset&&t.sn>=0){const{sn:s,level:r,complete:n}=t;this.bitset.has(s,r)||this.bitCounts.incre(s,r);const i=n?SegmentState.COMPLETE:SegmentState.PARTIAL_FORWARD;e.bitset.add(s,r,i),this.emit(hls_next_events.SCH_DCHAVE,t.seg_id),e.isAvailableUrgently&&this._handleDCHave(e,s,r,i)}})).on(hls_next_events.DC_HAVE_REVERSE,(t=>{if(e.bitset&&t.sn>=0){const{sn:s,level:r}=t;this.bitset.has(s,r)||this.bitCounts.incre(s,r),e.bitset.hasCompleteOr(s,r,SegmentState.PARTIAL_REVERSE)||e.bitset.add(s,r,SegmentState.PARTIAL_REVERSE),this.emit(hls_next_events.SCH_DCHAVE,t.seg_id),e.isAvailableUrgently&&this._handleDCHave(e,s,r,SegmentState.PARTIAL_REVERSE)}})).on(hls_next_events.DC_LOST,(t=>{if(!e.bitset)return;const{sn:s,level:r}=t;e.bitset.has(s,r)&&(e.bitset.delete(s,r),this.bitCounts.decre(s,r))})).on(hls_next_events.DC_PIECE,(e=>{e.ext&&e.ext.incompletes>=6||this.notifyAllPeers(e.sn,e.level,e.seg_id,e.reverse?SegmentState.PARTIAL_REVERSE:SegmentState.PARTIAL_FORWARD)})).on(hls_next_events.DC_PIECE_NOT_FOUND,(t=>{const{sn:s,level:r}=t;e.bitset.delete(s,r),this.bitCounts.decre(s,r),e.checkIfNeedChoke(!0)})).on(hls_next_events.DC_REQUEST,(async t=>{const{logger:s}=this,{sn:r,level:n,reverse:i}=t;this.isUploader=!0;let o=t.seg_id;o||(o=await this.bufMgr.getSegIdBySN(r));const a=this.requestingMap.get(r,n);let h=!1;a&&a.isDownloading()&&(h=i&&a.hasReversePeer()||!i&&a.hasForwardPeer());const l=await this.bufMgr.getSegById(o);if(l)s.info("found seg from bufMgr"),l.level===n?e.sendBuffer(l.sn,l.segId,l.data,{from:"FromCache",level:l.level,reverse:i}):e.sendPieceNotFound(r,o,{level:n});else if(h){s.info(`synthesizer had ${a.loadedPackets()} packets, wait remain from upstream ${a.getFromPeerId()}`);const t=i?a.reversePeer:a.forwardPeer;e.sendPartialBuffer(t.pieceMsg,t.bufArr,{from:a.isFull()?"WaitPartialDouble":"WaitPartialSingle",incompletes:1}),d(a,e,i)}else{const t=this.segmentBuilderMap.get(r,n);t?(s.info(`peer request ${r} wait from builder, sent ${t.bufferList.length}`),c(t,e)):this.isHlsjs?(s.info(`peer request ${r} wait from fragLoader`),this.segmentBuilderMap.once(`${hls_next_events.REQUESTING_MAP_HAVE}${r}-${n}`,(t=>{c(t,e)}))):r>=this.loadingSN?(s.info(`peer request ${r} wait for seg`),this.bufMgr.once(`${hls_next_events.BM_ADDED_SN_}${r}`,(t=>{t&&t.level===n?(s.info(`peer request notify seg ${t.sn}`),e.sendBuffer(t.sn,t.segId,t.data,{from:"NotifySegment",level:t.level,reverse:i})):e.sendPieceNotFound(r,o,{level:n})}))):e.sendPieceNotFound(r,o,{level:n})}function c(e,t){t.sendPartialBuffer(e.pieceMsg,e.bufferList,{from:"FromHttpStream",incompletes:1}),e.bufferList.length<e.pieceMsg.attachments?d(e,t,!1):t.uploading=!1}function d(e,t,s){e.addStreamListener(s,((e,s,r,n,i)=>{r?t.sendMsgPieceAbort(n):t.send(n),i&&(t.uploading=!1)}))}}))}handleMetaData(e,t){if(t.field){e.bitset=new BitsetManager(this.config.live,t.field);for(let e in t.field){const s=Number(e);if(s<0)continue;t.field[s].forEach((e=>{this.bitset.has(e,s)||this.bitCounts.incre(e,s)}))}this.addPeer(e),this.downloadOnly&&this.chokePeerRequest(e)}}peersHas(e,t){return this.bitCounts.has(e,t)}deletePeer(e){if(this.peerManager.hasPeer(e.remotePeerId)&&e.bitset){const t=e.bitset.allArray();for(let e in t){const s=Number(e),r=t[s];r&&r.forEach((e=>{this.bitCounts.decre(e,s)}))}}this.cleanRequestingMap(e.remotePeerId),super.deletePeer(e)}hasAndSetTargetPeer(e,t,s){const{logger:r,config:n}=this,i=1e3*(s-n.httpLoadTime),o=n.httpLoadTime+MIN_P2P_LOAD_TIME;if(s<=o)return!1;if(this.requestingMap.has(e,t)){const a=this.requestingMap.get(e,t);if(!a)return this._searchAvailablePeers(e,t);if(!a.shouldWaitForRemain(i)){if(r.warn(`syn prefetch timeout at ${e}`),a.isFull())return!1;const i=this.peerManager.getPeersOrderByWeight(),h=findPeersWithState(i,SegmentState.COMPLETE,e,t);if(a.hasReversePeer()){const s=h.concat(findPeersWithState(i,SegmentState.PARTIAL_FORWARD,e,t));if(s.length>0)return this.targetPeers.forwardPeer=s[0],!0}else{const s=h.concat(findPeersWithState(i,SegmentState.PARTIAL_REVERSE,e,t));if(s.length>0)return this.targetPeers.reversePeer=s[0],!0}return n.httpRangeSupported&&s>o+2}return r.info(`prefetch ${e} wait for remain`),!0}return this._searchAvailablePeers(e,t)}_searchAvailablePeers(e,t){if(!this.hasIdlePeers||!this.peersHas(e,t))return!1;const s=this.peerManager.getPeersOrderByWeight(),[r,n]=getBestPairForDownload(s,e,t);return this.targetPeers={forwardPeer:r,reversePeer:n},[r,n].some((e=>!!e))}reportTraffic(e,t,s){const{fetcher:r}=this.engine;r?(e>0&&r.reportFlow(e),t>0&&r.reportDCTraffic(t,s)):this.logger.error("DC report failed")}notifyAllPeers(e,t,s,r=SegmentState.COMPLETE){const{live:n}=this.config;if(this.bitset.has(e,t,r))return;const i=generateStateId(e,t,r);let o;r!==SegmentState.PARTIAL_REVERSE&&(o=r===SegmentState.COMPLETE);const a=this.requestingMap.get(e,t);for(let h of this.peerManager.getPeerValues())if((!a||!a.hasPeer(h))&&!h.notifySet.has(i)&&!h.bitset.hasCompleteOr(e,t,r)&&(h.sendMsgHave(e,s,{level:t,reverse:r===SegmentState.PARTIAL_REVERSE,complete:o}),h.notifySet.add(i),n)){const e=20;for(;h.notifySet.size>e;){const e=[...h.notifySet.values()].shift();h.notifySet.delete(e)}}}startCheckPeersTimer(e=1){this.logger.info(`loaded peers ${this.loadedPeerNum} next checkDelay ${e}`),this.loadedPeerNum=0,this.checkTimer||(this.checkTimer=setTimeout((()=>{this.checkPeers(),this.checkTimer=null,this.startCheckPeersTimer(calCheckPeersDelay(this.loadedPeerNum))}),1e3*e))}checkPeers(){if(!this.hasPeers)return;const{logger:e,config:t,engine:s}=this,r=t.live,{currentLevel:n}=s;if(e.info(`currentLevel ${n}`),0===this.bitCounts.size(n))return;if(!r&&this.nextLostSN>=0&&this.nextLostSN>=this.currPlaySN-10)return;if(this.mBufferedDuration<this.allowP2pLimit&&(0!==this.mBufferedDuration||this.isHlsjs))return void e.info(`low buffer time ${this.mBufferedDuration}, skip prefetch`);const i=this.peerManager.getPeersOrderByWeight();if(0===i.length)return;const o=[];let{prefetchNum:a,endSN:h,startSN:l}=t;r&&(a=1);let c=0,d=this.loadingSN+1;if(!r)if(this.loadingSN>=h&&!this.bufMgr.overflowed)d=l;else{const e=Math.min(...i.filter((e=>e.endSN>=d)).map((e=>e?e.startSN:1/0)));if(!isFinite(e))return;d<e&&(d=e)}for(;o.length<a&&o.length<i.length&&c<this.maxPrefetchCount;){if(!r&&d>h)return;if(r&&d>this.loadingSN+2)return;if(this.bitset.has(d,n))d++;else{if(d!==this.loadingSN&&this.bitCounts.has(d,n)&&!this.requestingMap.has(d,n))for(let s of i)if(!o.includes(s)&&s.bitset.has(d,n)){const i=s.bitset.getState(d,n);let a;a=i===SegmentState.COMPLETE?r?randomNum(0,100)>40:0===randomNum(0,1):i===SegmentState.PARTIAL_REVERSE,o.push(s);const h=new Synthesizer(this.coordinator,this.logger,d,n,t.httpRangeSupported);this._setupSynthesizer(h),a?h.setReversePeer(s):h.setForwardPeer(s),this.requestingMap.set(d,n,h),s.requestDataBySN(d,!1,{level:n,reverse:a}),e.info(`request prefetch ${d} level ${n} from peer ${s.remotePeerId} downloadNum ${s.downloadNum} reverse ${a}`);break}c++,d++}}this.loadedPeerNum=o.length}onBufferManagerLost(e,t,s,r){this.currLostSN=e,s&&(this.nextLostSN=s),this.bitset.delete(e,r),this.bitCounts.delete(e,r)}cleanRequestingMap(e){const t=this.peerManager.getPeer(e);if(t)for(let[s,r]of this.requestingMap.internalMap){const n=s.split("-"),i=Number(n[1]),o=Number(n[0]);r.hasPeerId(e)&&(this.logger.info(`delete ${s} in requestingMap`),r.deletePeer(t),this.bitCounts.decre(i,o),t.bitset.delete(i,o))}}shouldWaitForNextSeg(){let e;return e=!this.isUploader&&(!!this.isReceiver||randomNum(0,100)>20),this.isReceiver=this.isUploader=!1,e}updateLoaded(e,t){this.bitset.hasCompleteOr(e,t)||(this.bitset.add(e,t,SegmentState.COMPLETE),this.bitCounts.delete(e,t))}broadcastPlaylist(e,t){if(!this.config.live)return;const s=getMaxSequence(t);for(let r of this.peerManager.getPeerValues())r.sendMsgPlaylist(e,t,s);this.playlistInfo.set(e,{seq:s})}getPlaylistFromPeer(e){if(!this.config.live)return null;const{seq:t}=this.playlistInfo.get(e);for(let s of this.peerManager.getPeerValues()){const r=s.getLatestPlaylist(e,t);if(r)return r}return null}getBufferedDuration(){let{media:e,currentSrc:t}=this.engine;if(!e||e.src!==t&&0===e.currentTime){if(this.logger.info("try get video element"),e=tryGetMediaElement(this.config.mediaElem,t),!e)return 5;this.engine.media=e}let s=0,r=e.currentTime,n=e.buffered;for(let e=n.length-1;e>=0;e--)if(r>=n.start(e)&&r<=n.end(e)){s=n.end(e)-r;break}return this.mBufferedDuration=s,s>0?s:0}destroy(){super.destroy(),clearTimeout(this.checkTimer),this.requestingMap.clear(),this.segmentBuilderMap.clear()}_notifySynthesizer(e,t,s,r,n,i=!0){const{logger:o}=this,a=this.requestingMap.get(s,r);function h(n,i){i?e.requestDataById(t,s,!0,{level:r,reverse:n}):(o.info(`notify syn prefetch ${s}`),e.requestDataBySN(s,!1,{level:r,reverse:n}))}a&&(a.isFull()||(a.isAlmostDeadline()?o.info("almost deadline, ignored"):a.hasForwardPeer()||n!==SegmentState.PARTIAL_FORWARD&&n!==SegmentState.COMPLETE?a.hasReversePeer()||n!==SegmentState.PARTIAL_REVERSE&&n!==SegmentState.COMPLETE||(a.setReversePeer(e),h(!0,i)):(a.setForwardPeer(e),h(!1,i))))}_setupEngine(){}getStatsForPeer(){const{currentLevel:e,media:t}=this.engine,s={level:e};if(t&&!this.config.live){const{currentTime:e}=t;s.pos=Math.round(e)}return s}_handleSynError(e){switch(e){case error_code.ERROR_SYN_RANGE_REQUEST:this.logger.warn("ERROR_SYN_RANGE_REQUEST"),this.httpRangeErrs++;break;case error_code.ERROR_SYN_HTTP_TIMEOUT:this.logger.warn("ERROR_SYN_HTTP_TIMEOUT"),this.httpTimeouts+=3}this.httpRangeErrs>=1&&(this.config.httpLoadTime+=500,this.httpRangeErrs=0)}}class HlsSwScheduler extends Scheduler{constructor(e,t){super(e,t),this.server=t.fetcher,this.p2pEnabled=e.p2pEnabled,this.resolveMap=new Map,this.dcDownloadTimeout=t.live?5:9,this.segmentId=t.segmentId}async handleGetMediaData(e,t){const{logger:s,config:r,engine:n}=this;let{url:i,range:o}=e;o&&(i=`${i}|${o}`);const a=this.fragMap.get(i);if(!a)return s.warn(`cannot get frag ${i}`),t.postMessage({action:hls_next_events.SW_GET_MEDIA});n.currentLevelIndex=a.level;const{sn:h,baseurl:l,level:c}=a,d=this.segmentId(String(c),h,e.url,o),u=h===this.loadingSN;u&&s.warn(`duplicate request ${h}`),this.loadingSN=h,n.bufMgr&&(n.bufMgr.loadingSN=h),this.loadingSegId=d;const g=await this.bufMgr.getSegById(d);if(g)return s.info(`bufMgr found seg sn ${h} segId ${d}`),a.loaded=g.data.byteLength,a.fromPeerId=g.fromPeerId,n.emit(hls_next_events.FRAG_LOADED,{url:e.url,sn:h,level:c,segId:d,loaded:a.loaded,duration:a.duration,byP2p:!!g.fromPeerId,fromPeerId:g.fromPeerId}),this._onFragLoaded(e.url,a),t.postMessage({action:hls_next_events.SW_GET_MEDIA,data:{url:e.url,buffer:g.data,incomplete:!1}});const f=this.getBufferedDuration();if(s.info(`handleGetMediaData sn ${h} bufferedDuration ${f}`),this.resolveMap.has(h)||u){let e=this.requestingMap.get(h,c);if(e||u){e&&(s.warn(`${h} is requesting, terminate syn wait for seg`),e.terminate());let r=1e3*(f-this.config.httpLoadTime)+1e3;r<0&&(r=0);let n=setTimeout((()=>{s.info(`notify seg ${h} timeout`),n=-1,t.postMessage({action:hls_next_events.SW_GET_MEDIA})}),r);this.bufMgr.once(`${hls_next_events.BM_ADDED_SN_}${h}`,(e=>{n<0||e&&e.level===c&&(clearTimeout(n),s.info(`notify seg ${e.sn}`),t.postMessage({action:hls_next_events.SW_GET_MEDIA,data:{url:i,buffer:e.data,incomplete:!1}}))}))}else s.warn(`${h} is requesting, fallback`),t.postMessage({action:hls_next_events.SW_GET_MEDIA})}else if(this.hasAndSetTargetPeer(h,c,f)){await this._loadFragByP2p(a,t,h,d,e.url,c)||t.postMessage({action:hls_next_events.SW_GET_MEDIA})}else{const e=this.requestingMap.get(h,c);if(this.httpRangeSupported&&e&&e.hasPartialBuffer()){s.warn(`syn has partial buffer for ${h}`);const[r,n]=e.getPartialBuffer();t.postMessage({action:hls_next_events.SW_GET_MEDIA,data:{url:i,bufferLeft:r,bufferRight:n,incomplete:!0,size:e.pieceMsg.size}})}else t.postMessage({action:hls_next_events.SW_GET_MEDIA})}}async _loadFragByP2p(e,t,s,r,n,i){const{logger:o}=this;o.info(`p2p load sn ${s} segId ${r} level ${i}`);const a=await this.load(s,r,i);if(a&&(a.data||a.incomplete)){const{data:h,incomplete:l,fromPeerId:c,bufferLeft:d,bufferRight:u,size:g}=a;if(l)o.info(`p2p loaded partial segId ${r} level ${i} size ${g}`),e.loaded=(d?d.byteLength:0)+(u?u.byteLength:0);else{if(o.info(`p2p loaded segId ${r} level ${i} size ${h.byteLength} incomplete ${l}`),!await this.bufMgr.hasSegOfId(r)){const e=new Segment(s,r,h,c,i);o.info(`bufMgr putSeg ${s} level ${i}`),this.bufMgr.putSeg(e)}e.loaded=h.byteLength}return e.fromPeerId=c,this.engine.emit(hls_next_events.FRAG_LOADED,{url:n,sn:s,level:i,segId:r,loaded:e.loaded,duration:e.duration,byP2p:!0,fromPeerId:c}),this._onFragLoaded(n,e),t.postMessage({action:hls_next_events.SW_GET_MEDIA,data:{url:n,buffer:h,bufferLeft:d,bufferRight:u,incomplete:l,size:g}}),!0}o.warn(`P2P timeout load segId ${r}`);const h=await this.bufMgr.getSegById(r);return!!h&&(o.info(`already loaded seg sn ${s} segId ${r}`),t.postMessage({action:hls_next_events.SW_GET_MEDIA,data:{url:n,buffer:h.data,incomplete:!1}}),!0)}async handleMediaData(e,t){const{logger:s,engine:r}=this;let{url:n,buffer:i,range:o,p2p:a,httpSpeed:h}=e;if(r.rangeTestUrl===n)return void(r.rangeTestUrl="");s.info(`SW_MEDIA url ${n} size ${i.byteLength} range ${o} speed ${h}`),h&&this.coordinator.addHttpSpeed(h),o&&(n=`${n}|${o}`);const l=this.fragMap.get(n);if(l){const{sn:t,level:n,baseurl:h}=l,c=this.segmentId(String(n),t,e.url,o);if(this.notifyAllPeers(t,n,c),l.segId=c,l.loaded=i.byteLength,r.emit(hls_next_events.FRAG_LOADED,{url:e.url,sn:t,level:n,segId:c,loaded:l.loaded,duration:l.duration,byP2p:!1}),this._onFragLoaded(e.url,l),!await this.bufMgr.hasSegOfId(c)){const e=new Segment(t,c,i,"",n);this.bufMgr.putSeg(e),s.info(`bufMgr putSeg ${c} level ${n}`);const r=a&&a>0?a:0,o=i.byteLength-r;this.reportTraffic(o,r,0)}}t.postMessage({action:hls_next_events.SW_MEDIA})}notifySWMessage(e,t,s){switch(e){case hls_next_events.SW_MEDIA:this.handleMediaData(t,s);break;case hls_next_events.SW_GET_MEDIA:this.handleGetMediaData(t,s);break;default:this.logger.warn(`unknown action ${e}`)}}destroy(){super.destroy(),this.logger.warn("destroy HlsSwScheduler")}_onFragLoaded(e,t){if(this.updateLoaded(t.sn,t.level),!this.engine)return;const{media:s,targetDuration:r}=this.engine;!this.config.live&&s&&r&&(this.currPlaySN=Math.ceil(s.currentTime/r))}load(e,t,s){const{logger:r,config:n}=this;this.isReceiver=!0;let i=this.mBufferedDuration-this.config.httpLoadTime;i>this.dcDownloadTimeout&&(i=this.dcDownloadTimeout);const{forwardPeer:o,reversePeer:a}=this.targetPeers;o||a||(i-=1);let h=this.requestingMap.get(e,s),l={allowLoadPartial:this.httpRangeSupported};h?h.setExtra(l):(h=new Synthesizer(this.coordinator,this.logger,e,s,this.httpRangeSupported,l),this._setupSynthesizer(h),this.requestingMap.set(e,s,h)),h.setTimeout(1e3*i),o&&(h.setForwardPeer(o),o.requestDataById(t,e,!0,{level:s})),a&&(h.setReversePeer(a),a.requestDataById(t,e,!0,{level:s,reverse:!0}));const c=new Promise((r=>{const n={resolve:r,sn:e,level:s,segId:t,incomplete:!1};this.resolveMap.set(e,n)}));return this.targetPeers={},c}_setupSynthesizer(e){e.on(hls_next_events.SYN_OUTPUT,((t,s)=>{const{config:r,logger:n}=this,{segId:i,sn:o,data:a,level:h}=t,{speed:l,http:c,p2p:d}=s;this.httpTimeouts>0&&this.httpTimeouts--;const u=this.resolveMap.has(o);if(r.validateSegment(i,new Uint8Array(a))){this.notifyAllPeers(o,h,i),this.bitset.has(o,h)||this.reportTraffic(c,d,l);const s=e.getFromPeerId();if(u){n.info(`receive criticalSeg seg_id ${i}`);const e=this.resolveMap.get(o);this.resolveMap.delete(o),e.resolve({data:a,fromPeerId:s})}else this.bitset.has(o,h)||(this.bufMgr.putSeg(t),this.updateLoaded(o,h))}else if(n.error(`segment ${i} validate failed`),u){const e=this.resolveMap.get(o);this.resolveMap.delete(o),e.resolve()}this.requestingMap.delete(o,h)})).on(hls_next_events.SYN_PARTIAL,((t,s,r)=>{const{sn:n,level:i,size:o}=t;if(this.httpTimeouts++,this.resolveMap.has(n)){this.resolveMap.get(n).resolve({bufferLeft:s,bufferRight:r,fromPeerId:e.getFromPeerId(),incomplete:!0,size:o}),this.resolveMap.delete(n)}this.requestingMap.delete(n,i)})).on(hls_next_events.SYN_ERROR,((e,t)=>{const{sn:s,level:r}=e;if(this.resolveMap.has(s)){const e=this.resolveMap.get(s);this.resolveMap.delete(s),e.resolve()}this.requestingMap.delete(s,r)}))}_handleDCHave(e,t,s,r){const n=0!==this.resolveMap.size;if(n&&this.resolveMap.has(t)){const{segId:n}=this.resolveMap.get(t);this._notifySynthesizer(e,n,t,s,r)}else this.httpTimeouts>=1&&t===this.loadingSN+1&&this._notifySynthesizer(e,void 0,t,s,r,!1);this.config.live&&!n&&queue_microtask_default()((()=>{this.checkPeers()}))}}const hls_sw_scheduler=HlsSwScheduler;var extendStatics=function(e,t){return extendStatics=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var s in t)t.hasOwnProperty(s)&&(e[s]=t[s])},extendStatics(e,t)};function __extends(e,t){function s(){this.constructor=e}extendStatics(e,t),e.prototype=null===t?Object.create(t):(s.prototype=t.prototype,new s)}function __values(e){var t="function"==typeof Symbol&&e[Symbol.iterator],s=0;return t?t.call(e):{next:function(){return e&&s>=e.length&&(e=void 0),{value:e&&e[s++],done:!e}}}}function __read(e,t){var s="function"==typeof Symbol&&e[Symbol.iterator];if(!s)return e;var r,n,i=s.call(e),o=[];try{for(;(void 0===t||t-- >0)&&!(r=i.next()).done;)o.push(r.value)}catch(e){n={error:e}}finally{try{r&&!r.done&&(s=i.return)&&s.call(i)}finally{if(n)throw n.error}}return o}function __spread(){for(var e=[],t=0;t<arguments.length;t++)e=e.concat(__read(arguments[t]));return e}var Event=function(e,t){this.target=t,this.type=e},ErrorEvent=function(e){function t(t,s){var r=e.call(this,"error",s)||this;return r.message=t.message,r.error=t,r}return __extends(t,e),t}(Event),CloseEvent=function(e){function t(t,s,r){void 0===t&&(t=1e3),void 0===s&&(s="");var n=e.call(this,"close",r)||this;return n.wasClean=!0,n.code=t,n.reason=s,n}return __extends(t,e),t}(Event),getGlobalWebSocket=function(){if("undefined"!=typeof WebSocket)return WebSocket},isWebSocket=function(e){return void 0!==e&&!!e&&2===e.CLOSING},DEFAULT={maxReconnectionDelay:1e4,minReconnectionDelay:1e3+4e3*Math.random(),minUptime:5e3,reconnectionDelayGrowFactor:1.3,connectionTimeout:4e3,maxRetries:1/0,maxEnqueuedMessages:1/0,startClosed:!1,debug:!1},ReconnectingWebSocket=function(){function e(e,t,s){var r=this;void 0===s&&(s={}),this._listeners={error:[],message:[],open:[],close:[]},this._retryCount=-1,this._shouldReconnect=!0,this._connectLock=!1,this._binaryType="blob",this._closeCalled=!1,this._messageQueue=[],this.onclose=null,this.onerror=null,this.onmessage=null,this.onopen=null,this._handleOpen=function(e){r._debug("open event");var t=r._options.minUptime,s=void 0===t?DEFAULT.minUptime:t;clearTimeout(r._connectTimeout),r._uptimeTimeout=setTimeout((function(){return r._acceptOpen()}),s),r._ws.binaryType=r._binaryType,r._messageQueue.forEach((function(e){return r._ws.send(e)})),r._messageQueue=[],r.onopen&&r.onopen(e),r._listeners.open.forEach((function(t){return r._callEventListener(e,t)}))},this._handleMessage=function(e){r._debug("message event"),r.onmessage&&r.onmessage(e),r._listeners.message.forEach((function(t){return r._callEventListener(e,t)}))},this._handleError=function(e){r._debug("error event",e.message),r._disconnect(void 0,"TIMEOUT"===e.message?"timeout":void 0),r.onerror&&r.onerror(e),r._debug("exec error listeners"),r._listeners.error.forEach((function(t){return r._callEventListener(e,t)})),r._connect()},this._handleClose=function(e){r._debug("close event"),r._clearTimeouts(),r._shouldReconnect&&r._connect(),r.onclose&&r.onclose(e),r._listeners.close.forEach((function(t){return r._callEventListener(e,t)}))},this._url=e,this._protocols=t,this._options=s,this._options.startClosed&&(this._shouldReconnect=!1),this._connect()}return Object.defineProperty(e,"CONNECTING",{get:function(){return 0},enumerable:!0,configurable:!0}),Object.defineProperty(e,"OPEN",{get:function(){return 1},enumerable:!0,configurable:!0}),Object.defineProperty(e,"CLOSING",{get:function(){return 2},enumerable:!0,configurable:!0}),Object.defineProperty(e,"CLOSED",{get:function(){return 3},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"CONNECTING",{get:function(){return e.CONNECTING},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"OPEN",{get:function(){return e.OPEN},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"CLOSING",{get:function(){return e.CLOSING},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"CLOSED",{get:function(){return e.CLOSED},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"binaryType",{get:function(){return this._ws?this._ws.binaryType:this._binaryType},set:function(e){this._binaryType=e,this._ws&&(this._ws.binaryType=e)},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"retryCount",{get:function(){return Math.max(this._retryCount,0)},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"bufferedAmount",{get:function(){return this._messageQueue.reduce((function(e,t){return"string"==typeof t?e+=t.length:t instanceof Blob?e+=t.size:e+=t.byteLength,e}),0)+(this._ws?this._ws.bufferedAmount:0)},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"extensions",{get:function(){return this._ws?this._ws.extensions:""},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"protocol",{get:function(){return this._ws?this._ws.protocol:""},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"readyState",{get:function(){return this._ws?this._ws.readyState:this._options.startClosed?e.CLOSED:e.CONNECTING},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"url",{get:function(){return this._ws?this._ws.url:""},enumerable:!0,configurable:!0}),e.prototype.close=function(e,t){void 0===e&&(e=1e3),this._closeCalled=!0,this._shouldReconnect=!1,this._clearTimeouts(),this._ws?this._ws.readyState!==this.CLOSED?this._ws.close(e,t):this._debug("close: already closed"):this._debug("close enqueued: no ws instance")},e.prototype.reconnect=function(e,t){this._shouldReconnect=!0,this._closeCalled=!1,this._retryCount=-1,this._ws&&this._ws.readyState!==this.CLOSED?(this._disconnect(e,t),this._connect()):this._connect()},e.prototype.send=function(e){if(this._ws&&this._ws.readyState===this.OPEN)this._debug("send",e),this._ws.send(e);else{var t=this._options.maxEnqueuedMessages,s=void 0===t?DEFAULT.maxEnqueuedMessages:t;this._messageQueue.length<s&&(this._debug("enqueue",e),this._messageQueue.push(e))}},e.prototype.addEventListener=function(e,t){this._listeners[e]&&this._listeners[e].push(t)},e.prototype.dispatchEvent=function(e){var t,s,r=this._listeners[e.type];if(r)try{for(var n=__values(r),i=n.next();!i.done;i=n.next()){var o=i.value;this._callEventListener(e,o)}}catch(e){t={error:e}}finally{try{i&&!i.done&&(s=n.return)&&s.call(n)}finally{if(t)throw t.error}}return!0},e.prototype.removeEventListener=function(e,t){this._listeners[e]&&(this._listeners[e]=this._listeners[e].filter((function(e){return e!==t})))},e.prototype._debug=function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];this._options.debug&&console.log.apply(console,__spread(["RWS>"],e))},e.prototype._getNextDelay=function(){var e=this._options,t=e.reconnectionDelayGrowFactor,s=void 0===t?DEFAULT.reconnectionDelayGrowFactor:t,r=e.minReconnectionDelay,n=void 0===r?DEFAULT.minReconnectionDelay:r,i=e.maxReconnectionDelay,o=void 0===i?DEFAULT.maxReconnectionDelay:i,a=0;return this._retryCount>0&&(a=n*Math.pow(s,this._retryCount-1))>o&&(a=o),this._debug("next delay",a),a},e.prototype._wait=function(){var e=this;return new Promise((function(t){setTimeout(t,e._getNextDelay())}))},e.prototype._getNextUrl=function(e){if("string"==typeof e)return Promise.resolve(e);if("function"==typeof e){var t=e();if("string"==typeof t)return Promise.resolve(t);if(t.then)return t}throw Error("Invalid URL")},e.prototype._connect=function(){var e=this;if(!this._connectLock&&this._shouldReconnect){this._connectLock=!0;var t=this._options,s=t.maxRetries,r=void 0===s?DEFAULT.maxRetries:s,n=t.connectionTimeout,i=void 0===n?DEFAULT.connectionTimeout:n,o=t.WebSocket,a=void 0===o?getGlobalWebSocket():o;if(this._retryCount>=r)this._debug("max retries reached",this._retryCount,">=",r);else{if(this._retryCount++,this._debug("connect",this._retryCount),this._removeListeners(),!isWebSocket(a))throw Error("No valid WebSocket class provided");this._wait().then((function(){return e._getNextUrl(e._url)})).then((function(t){e._closeCalled||(e._debug("connect",{url:t,protocols:e._protocols}),e._ws=e._protocols?new a(t,e._protocols):new a(t),e._ws.binaryType=e._binaryType,e._connectLock=!1,e._addListeners(),e._connectTimeout=setTimeout((function(){return e._handleTimeout()}),i))}))}}},e.prototype._handleTimeout=function(){this._debug("timeout event"),this._handleError(new ErrorEvent(Error("TIMEOUT"),this))},e.prototype._disconnect=function(e,t){if(void 0===e&&(e=1e3),this._clearTimeouts(),this._ws){this._removeListeners();try{this._ws.close(e,t),this._handleClose(new CloseEvent(e,t,this))}catch(e){}}},e.prototype._acceptOpen=function(){this._debug("accept open"),this._retryCount=0},e.prototype._callEventListener=function(e,t){"handleEvent"in t?t.handleEvent(e):t(e)},e.prototype._removeListeners=function(){this._ws&&(this._debug("removeListeners"),this._ws.removeEventListener("open",this._handleOpen),this._ws.removeEventListener("close",this._handleClose),this._ws.removeEventListener("message",this._handleMessage),this._ws.removeEventListener("error",this._handleError))},e.prototype._addListeners=function(){this._ws&&(this._debug("addListeners"),this._ws.addEventListener("open",this._handleOpen),this._ws.addEventListener("close",this._handleClose),this._ws.addEventListener("message",this._handleMessage),this._ws.addEventListener("error",this._handleError))},e.prototype._clearTimeouts=function(){clearTimeout(this._connectTimeout),clearTimeout(this._uptimeTimeout)},e}();const reconnecting_websocket_mjs=ReconnectingWebSocket,PING_INTERVAL=60,PONG_TIMEOUT=15;class WebsocketClient extends(events_default()){constructor(e,t,s,r,n="main"){super(),this.logger=e,this.config=t,this.wsAddr=s,this.serverVersion=0,this.pingInterval=r||PING_INTERVAL,this._ws=this._init(),this.name=n}_init(){const e={maxRetries:this.config.wsMaxRetries,minReconnectionDelay:randomNum(1e4,6e4),maxReconnectionDelay:6e5,maxEnqueuedMessages:20};let t=new reconnecting_websocket_mjs(this.wsAddr,void 0,e);return t.addEventListener("open",(()=>{this.logger.info(`signal ${this.name} ${this.wsAddr} connection opened`),this.onopen&&this.onopen(),this._startPing(this.pingInterval)})),t.push=t.send,t.send=e=>{let s=JSON.stringify(e);t.push(s)},t.addEventListener("message",(e=>{let t=e.data;const s=JSON.parse(t),r=s.action;if("pong"!==r){if("ver"!==r)return"close"===r?(this.logger.warn(`server close signal ${this.name} reason ${s.reason}`),void this.close()):void(this.onmessage&&this.onmessage(s,this.name));this.serverVersion=s.ver}else clearTimeout(this.pongTimer)})),t.addEventListener("close",(e=>{this.logger.warn(`signal ${this.name} ${this.wsAddr} closed ${e.code} ${e.reason}`),this.onclose&&this.onclose(),this._stopPing()})),t.addEventListener("error",(e=>{this.logger.error(`signal ${this.name} ${this.wsAddr} error`),this._stopPing(),this.onerror&&this.onerror(e)})),t}sendSignal(e,t){const s={action:"signal",to_peer_id:e,data:t};this._send(s)}sendReject(e,t,s){const r={action:"reject",to_peer_id:e,reason:t,fatal:s};this._send(r)}_send(e){this._ws&&this._ws.send(e)}_startPing(e=120){this.connected&&(this.pingTimer=setInterval((()=>{this._send({action:"ping"}),this.serverVersion>=22&&this._waitForPong()}),1e3*e))}_waitForPong(){this.pongTimer=setTimeout((()=>{this.logger.warn(`signal ${this.name} wait for pong timeout, reconnect`),this.close(),this.reconnect()}),1e3*PONG_TIMEOUT)}_resetPing(){this._stopPing(),this._startPing(this.pingInterval)}_stopPing(){clearInterval(this.pingTimer),clearTimeout(this.pongTimer),this.pingTimer=null,this.pongTimer=null}close(){this.logger.info(`close signal ${this.name}`),this._stopPing(),(()=>{this._ws&&this._ws.close(1e3,"normal close")})()}reconnect(){this._ws&&(this.logger.info(`reconnect signal ${this.name}`),this._ws.reconnect())}destroy(){this.close(),this._ws=null,this.removeAllListeners()}get connected(){return!!this._ws&&this._ws.readyState===reconnecting_websocket_mjs.OPEN}}const websocket_client=WebsocketClient,signal_manager_PING_INTERVAL=270,signal_manager=class extends(events_default()){constructor(e,t,s,r){super(),this.logger=e,this.config=t,this.mainAddr=s,this.backupAddr=r,this.mainWS=this._init(s),this.backupWS=this._init(r,"backup"),this._connected=!1}_init(e,t){if(!e)return null;let s=new websocket_client(this.logger,this.config,e,signal_manager_PING_INTERVAL,t);return s.onopen=()=>{!this._connected&&this.onopen&&(this._connected=!0,this.onopen())},s.onmessage=e=>{this.onmessage&&this.onmessage(e,s.name)},s.onclose=()=>{this._connected&&!this.connected&&this.onclose&&(this._connected=!1,this.onclose())},s.onerror=e=>{this.onerror&&this.onerror(e)},s}sendSignal(e,t,s){if(s){const r=this._getWSByName(s);if(r)return void r.sendSignal(e,t)}this.mainConnected?this.mainWS.sendSignal(e,t):this.backupConnected?this.backupWS.sendSignal(e,t):this.logger.warn("no signal available")}sendReject(e,t,s,r){if(r){const n=this._getWSByName(r);if(n)return void n.sendReject(e,t,s)}this.mainConnected?this.mainWS.sendReject(e,t,s):this.backupConnected?this.backupWS.sendReject(e,t,s):this.logger.warn("no signal available, send reject failed")}close(){this.mainWS&&this.mainWS.close(),this.backupWS&&this.backupWS.close()}_getWSByName(e){return this.mainWS&&this.mainWS.name===e?this.mainWS:this.backupWS&&this.backupWS.name===e?this.backupWS:null}reconnect(){this.mainWS&&this.mainWS.reconnect(),this.backupWS&&this.backupWS.reconnect()}destroy(){this.close(),this.mainWS=null,this.backupWS=null,this.removeAllListeners()}get connected(){return this.mainConnected||this.backupConnected}get mainConnected(){return this.mainWS&&this.mainWS.connected}get backupConnected(){return this.backupWS&&this.backupWS.connected}};function getPeersThrottle(e,t,s=70){var r=null,n=!1,i=s;return function(s=!1){if(s)return clearTimeout(r),void(n=!1);n||(n=!0,r=setTimeout((function(){e.call(t,i),n=!1,r=null}),1e3*i),i*=1)}}const utils_getPeersThrottle=getPeersThrottle,MAX_PC_CONNS=25,MAX_MOBILE_CONNS=15,MIN_PEER_SHARE_TIME=50,MAX_PEER_SHARE_POS=600,MAX_TRY_CONNS_TRICKLE=5;class TrackerClient extends(events_default()){constructor(e,t,s,r){super(),this.engine=e,this.logger=e.logger,this.config=r,this.connected=!1,this.scheduler=s,this.sequential=this.scheduler.sequential,this.DCMap=new Map,this.failedDCSet=new Set,this.signalerWs=null,this.fetcher=t,this.peers=[],this.minConns=5,this.stuns=[],this.requestMorePeers=utils_getPeersThrottle(this._requestMorePeers,this),this.engine.maxConns=this.maxConns=platform_default().isMobile()?MAX_MOBILE_CONNS:MAX_PC_CONNS,this.peersIncrement=0,this.gotPeersFromTracker=!1,this.fuseRate=-1}get totalConns(){return this.scheduler.peersNum+1}resumeP2P(){if(!this.fetcher)return;const{engine:e,config:t,fetcher:s}=this,{btAnnounce:r,btAnnouncePreflight:n}=s;(t.geoIpPreflight?n:r).call(s).then((s=>{if(!this.scheduler)return;e.peerId=this.peerId=s.id,this.minConns=s.min_conns;const r=s.peers;this.scheduler.notifyPeersLoaded(r.length);const n=e.netType;let i,o;if((s.wifi_only||t.wifiOnly)&&"wifi"!==n&&"ethernet"!==n&&(this.scheduler.downloadOnly=!0,this.logger.info("downloadOnly mode")),"object"==typeof t.wsSignalerAddr&&t.wsSignalerAddr.main)i=t.wsSignalerAddr.main,o=t.wsSignalerAddr.backup,s.signal&&!s.signal2&&(o=void 0);else{if("string"!=typeof t.wsSignalerAddr){const e=new Error;throw e.err=new Error("invalid wsSignalerAddr"),e}i=t.wsSignalerAddr}this.signalerWs=this._initSignalerWs(s.signal||i,s.signal2||o,s.token,s.token2),0===r.length?this.requestMorePeers():this.peers=this._filterPeers(r),e.emit("peerId",this.peerId);const a=t.getPeerId;a&&"function"==typeof a&&a(this.peerId),s.stun&&s.stun.length>0&&(this.stuns=s.stun),s.debug&&this.logger.enableDebug(),s.fuse_rate&&(this.fuseRate=s.fuse_rate),this.logger.info(`announce request response ${JSON.stringify(s,null,2)}`),e.media&&s.slogan&&appendSlogan(window.atob("U3RyZWFtIGFjY2VsZXJhdGVkIGJ5IENETkJ5ZSBQMlA="),getHomeUrl(),e.media)})).catch((t=>{if("TRACKER_EXPT"===t.code&&e.emit(events.EXCEPTION,t),t.retry){const e=randomNum(3e4,6e4);this.logger.warn(`announce retry after ${e}ms`),this.announceTimer=setTimeout((()=>{this.resumeP2P()}),e)}}))}stopP2P(){this.fetcher.postStatsWithBeacon(),this.fetcher.destroy(),this.fetcher=null,this.requestMorePeers(!0),this.scheduler.destroy(),this.scheduler=null,this.signalerWs&&(this.signalerWs.destroy(),this.signalerWs=null),this.peers=[];for(let e of this.DCMap.values())e.destroy(!0);this.DCMap.clear(),this.failedDCSet.clear(),this.logger.warn("tracker stop p2p")}destroy(){this.stopP2P(),this.removeAllListeners(),clearTimeout(this.announceTimer);const{config:e}=this;e.getStats=e.getPeerId=e.getPeersInfo=null,this.logger.warn("destroy tracker")}_filterPeers(e){const t=[],s=[...this.DCMap.keys(),...this.failedDCSet.keys(),this.peerId];return e.filter((e=>!s.includes(e.id))).forEach((e=>{t.push({id:e.id,intermediator:e.intermediator,cpr:e.cpr||void 0})})),t}_tryConnectToAllPeers(){if(0!==this.peers.length&&this.signalerWs.connected)for(this.logger.info(`try connect to ${this.peers.length} peers`);this.peers.length>0;){if(this.DCMap.size>=this.maxConns){this.logger.debug("clear exceeded peers"),this.peers=[];break}let e=this.peers.shift();this.logger.debug(`new DataChannel ${e.id}`);const t=e.intermediator;this._createDatachannel(e.id,!0,t,e.cpr)}}_setupDC(e){e.on(events.DC_SIGNAL,(t=>{const s=e.remotePeerId;if(e.intermediator){const r=this.DCMap.get(e.intermediator);if(r){if(r.sendMsgSignal(s,this.peerId,t))return}}this.signalerWs.sendSignal(s,t,e.signalName)})).on(events.DC_PEER_SIGNAL,(t=>{const s=t.to_peer_id,r=t.from_peer_id,n=t.action;if(s&&r&&n)if(s!==this.peerId){this.logger.info(`relay signal for ${r}`);const i=this.DCMap.get(s);if(i){if("signal"!==n)return void i.sendMsgSignalReject(s,r,t.reason);if(i.sendMsgSignal(s,r,t.data))return}e.sendMsgSignal(r,s)}else"signal"===n?this._handleSignalMsg(r,t,e.remotePeerId):this._handSignalRejected(r,t)})).on(events.DC_GET_PEERS,(()=>{const t=getCurrentTs(),s=this.scheduler.getPeers().filter((e=>e.peersConnected<(e.mobileWeb?MAX_MOBILE_CONNS:MAX_PC_CONNS)));if(s&&s.length>0){const r=[];s.forEach((s=>{if(s.remotePeerId===e.remotePeerId||s.remotePeerId===this.peerId)return;if(!this.config.live&&(s.currentPos-e.currentPos>MAX_PEER_SHARE_POS||s.currentPos<e.currentPos))return;t-s.timeJoin>MIN_PEER_SHARE_TIME&&r.push({id:s.remotePeerId})})),this.logger.info(`send ${r.length} peers to ${e.remotePeerId}`),e.sendPeers(r)}})).on(events.DC_PEERS,(t=>{e.gotPeers=!0;const s=t.peers;if(s&&s.length>0){const t=MAX_TRY_CONNS_TRICKLE;this.logger.info(`receive ${s.length} peers from ${e.remotePeerId}`),s.forEach((t=>{t.intermediator=e.remotePeerId})),this.peers=[...this.peers,...this._filterPeers(s).slice(0,t)],this._tryConnectToAllPeers()}})).once(events.DC_ERROR,(t=>{this.logger.info(`datachannel ${e.channelId} failed fatal ${t}`),this.scheduler&&(this.scheduler.deletePeer(e),this._destroyAndDeletePeer(e.remotePeerId,t),this.requestMorePeers(),this.fetcher&&(e.connected||t&&this.fetcher.increFailConns(),t&&this.failedDCSet.add(e.remotePeerId),this._doSignalFusing(this.scheduler.peersNum)))})).once(events.DC_CLOSE,(t=>{this.logger.info(`datachannel ${e.channelId} closed fatal ${t}`),this.scheduler&&(this.scheduler.deletePeer(e),this._doSignalFusing(this.scheduler.peersNum)),this._destroyAndDeletePeer(e.remotePeerId,t),t&&this.failedDCSet.add(e.remotePeerId),this.requestMorePeers()})).once(events.DC_OPEN,(()=>{e.isInitiator&&this.scheduler.handshakePeer(e)})).once(events.DC_METADATA,(t=>{const{scheduler:s}=this;e.isInitiator||s.handshakePeer(e),s.handleMetaData(e,t);const r=s.peersNum,n=r>=this.minConns;this.requestMorePeers(n),this.peersIncrement++,this._doSignalFusing(r+1)}))}_doSignalFusing(e){if(this.fuseRate<=0)return;const t=this.signalerWs.connected;t&&e>=this.fuseRate+2?(this.logger.warn("reach fuseRate, report stats close signaler"),this.totalConns-1>0&&this.fetcher.postStats(),this.signalerWs.close()):!t&&e<this.fuseRate&&(this.logger.warn("low conns, reconnect signaler"),this.signalerWs.reconnect())}_initSignalerWs(e,t,s,r){const n=(e,t)=>{let s=`${e}?id=${this.peerId}&p=web&v=2.3.4`;return t&&(s=`${s}&token=${t}`),s};let i,o=n(e,s);if(t&&t!==e){let e=n(t,r);i=new signal_manager(this.logger,this.config,o,e)}else i=new websocket_client(this.logger,this.config,o,270);return i.onopen=()=>{this.connected=!0,this.engine.emit("serverConnected",!0),this._tryConnectToAllPeers()},i.onmessage=(e,t)=>{let s=e.action;const r=e.from_peer_id;switch(s){case"signal":this._handleSignalMsg(r,e,null,t);break;case"reject":this._handSignalRejected(r,e);break;default:this.logger.warn(`Signal websocket unknown action ${s}`)}},i.onclose=()=>{this.connected=!1,this.engine.emit("serverConnected",!1)},i.onerror=e=>{e.message&&this.engine.emit(events.EXCEPTION,err_code_default()(e,"SIGNAL_EXPT"))},i}_handSignalRejected(e,t){this.logger.warn(`signaling ${e} rejected, reason ${t.reason}`);const s=this.DCMap.get(e);s&&!s.connected&&(s.destroy(t.fatal),this.DCMap.delete(e)),this.requestMorePeers(),t.fatal&&this.failedDCSet.add(e)}_handleSignalMsg(e,t,s,r){if(!this.scheduler)return;const{logger:n}=this;if(t.data){if(this.failedDCSet.has(e))return void this._sendSignalReject(e,`peer ${e} in blocked list`,s,r,!0);this._handleSignal(e,t.data,s,r)}else{if(!this._destroyAndDeletePeer(e))return;n.info(`signaling ${e} not found`);const{scheduler:t}=this;t.waitForPeer&&(t.waitingPeers--,0===t.waitingPeers&&t.notifyPeersLoaded(0)),this.requestMorePeers(),this.failedDCSet.add(e)}}_handleSignal(e,t,s,r){const n=t.type,{logger:i}=this;let o=this.DCMap.get(e);if(o){if(o.connected)return void i.info("datachannel had connected, signal ignored");if("offer"===n){if(!(this.peerId>e))return void i.warn(`signal type wrong ${n}, ignored`);this._destroyAndDeletePeer(e,!1),i.warn(`signal type wrong ${n}, convert to non initiator`),o=this._createDatachannel(e,!1,s)}}else{if("answer"===n){const t=`signal type wrong ${n}`;return i.warn(t),this._sendSignalReject(e,t,s,r),void this._destroyAndDeletePeer(e,!1)}i.debug(`receive node ${e} connection request`);const t=this.scheduler.peersNum;if(t>=this.maxConns){const n=this.scheduler.getNonactivePeers();if(!(n.length>0)){const t=`peers reach limit ${this.maxConns}`;return i.warn(t),void this._sendSignalReject(e,t,s,r)}{let e=t-this.maxConns+2;for(n.length<e&&(e=n.length);e>0;){const t=n.shift();t&&(i.warn(`close inactive peer ${t.remotePeerId}`),t.close(!1)),e--}}}o=this._createDatachannel(e,!1,s)}r&&(o.signalName=r),o.receiveSignal(t)}_createDatachannel(e,t,s,r){let n=this.config.trickleICE;const i=new peer(this.engine,this.peerId,e,t,this.config,this.sequential,{stuns:this.stuns,intermediator:s,trickle:n});return r&&(i.cpr=r),this.DCMap.set(e,i),this._setupDC(i),i}_sendSignalReject(e,t,s,r,n){if(s){const r=this.DCMap.get(s);if(r&&r.sendMsgSignalReject(e,this.peerId,t,n))return}this.signalerWs.sendReject(e,t,n,r)}_requestMorePeers(e){const{logger:t}=this;t.info(`requestMorePeers after delay ${e}`);const s=this.scheduler.peersNum,r=this.peersIncrement;this.peersIncrement=0,s>=this.minConns||(0===s||r<=3&&!this.gotPeersFromTracker?(this.failedDCSet.size>30&&(this.failedDCSet=new Set([...this.failedDCSet].slice(-30))),this.fetcher.btGetPeers([...this.DCMap.keys(),...this.failedDCSet.keys()]).then((e=>{t.info(`requestMorePeers resp ${JSON.stringify(e,null,2)}`),this.peers=[...this.peers,...this._filterPeers(e.peers)],this._tryConnectToAllPeers()})).catch((e=>{t.error(`requestMorePeers error ${e}`)})),this.gotPeersFromTracker=!0):s<this.maxConns&&(this.scheduler.requestPeers(),this.gotPeersFromTracker=!1))}_destroyAndDeletePeer(e,t=!0){const s=this.DCMap.get(e);return!!s&&(s.destroy(t),this.DCMap.delete(e),!0)}}const tracker_client=TrackerClient;class HlsSwP2pEngine extends Engine{static get name(){return"HlsSwP2pEngine"}static isServiceWorkerSupported(){return"serviceWorker"in navigator}constructor(e={}){super(e),this.swSupported=isSecureContext,this.levels=[],this.currentLevelIndex=0,this.rangeTestUrl="",this.currentSrc="",this.swVersion="",this.media=tryGetMediaElement(this.config.mediaElem),this.fragMap=new Map,HlsSwP2pEngine.isServiceWorkerSupported()||(this.swSupported=!1,console.warn("service worker is not supported"));const{channelIdMaker:t,signalId:s,browserInfo:r}=this.setup();this.onLevelLoaded=e=>{const{config:n}=this,i=e.live;n.live=i,this.targetDuration=e.averagetargetduration,i||(n.trickleICE=!0),this.browserInfo={...r,live:i,abr:this.multiBitrate||void 0,type:"hls_sw"},this.channel=`${t(this.currentSrc)}|${s}[${peer.VERSION}]`,this.setupElectron();const o=this.initLogger();o.info("use HlsSwP2pEngine"),o.info(`engine version: ${engine_base.version} hls-proxy version: ${this.swVersion}`),o.info(`channel ${this.channel}`),i||(n.startSN=e.startSN,n.endSN=e.endSN,o.info(`startSN ${e.startSN} endSN ${e.endSN}`)),this._init(this.channel,this.browserInfo),this.off(hls_next_events.LEVEL_LOADED,this.onLevelLoaded)},this.on(hls_next_events.LEVEL_LOADED,this.onLevelLoaded),this.onManifestParsed=(e,t)=>{this.multiBitrate=e.length>1,this.currentSrc=t,this.off(hls_next_events.MANIFEST_PARSED,this.onManifestParsed)},this.on(hls_next_events.MANIFEST_PARSED,this.onManifestParsed),this.onFragLoaded=({url:e})=>{!this.rangeTested&&this.config.useHttpRange&&(this.rangeTestUrl=e,performRangeRequest(e).then((()=>{this.config.httpRangeSupported=!0,this.config.logger.info("http range is supported")})).catch((()=>{this.config.httpRangeSupported=!1,this.config.logger.warn("http range is not supported")})),this.rangeTested=!0),this.off(hls_next_events.FRAG_LOADED,this.onFragLoaded)},this.once(hls_next_events.FRAG_LOADED,this.onFragLoaded),this.swSupported&&(navigator.serviceWorker.onmessage=e=>{const{action:t,data:s}=e.data;this.logger&&this.logger.info(`engine onmessage action ${t}`);const r=e.ports[0];if(r.postMessage({action:t,pong:!0}),!this.p2pEnabled||!s)return r.postMessage({action:t});switch(t){case hls_next_events.SW_PLAYLIST:this.handlePlaylist(s,r);break;case hls_next_events.SW_GET_PLAYLIST:this.handleGetPlaylist(s,r);break;default:if(!this.config.scheduler)return r.postMessage({action:t});this.config.scheduler.notifySWMessage(t,s,r)}}),this.config.swAutoRegister&&this.registerServiceWorker().then((function(e){})).catch((e=>{console.warn("ServiceWorker registration failed ",e)}))}get currentLevel(){return this.currentLevelIndex}handlePlaylist(e,t){const{config:s,logger:r}=this,{url:n,redirectedUrl:i,text:o,ver:a}=e;if(this.swVersion=a,0!==o.indexOf("#EXTM3U"))return console.warn("no EXTM3U delimiter"),t.postMessage({action:hls_next_events.SW_PLAYLIST});t.postMessage({action:hls_next_events.SW_PLAYLIST,data:{active:!0,debug:r&&r.isDebugLevel,sharePlaylist:!!s.sharePlaylist}}),this._parsePlaylist(o,n.split("?")[0],i)}_parsePlaylist(e,t,s){const r=t;s&&(t=s);const{config:n,logger:i}=this;if(e.indexOf("#EXTINF:")>0||e.indexOf("#EXT-X-TARGETDURATION:")>0){let s=0;const i=M3U8Parser.parseLevelPlaylist(e,t);this.levels.length>0?(s=this.levels.indexOf(i.url),-1===s?(this.restartP2p(),this.currentSrc=r,s=0):this.currentLevelIndex=s):(""!==this.currentSrc&&t!==this.currentSrc&&this.restartP2p(),this.currentSrc=r,this.levels=[t]),this.emit(hls_next_events.LEVEL_LOADED,i),n.live&&this.fragMap.clear(),i.fragments.forEach((e=>{e.level=s;let t=url_toolkit_default().buildAbsoluteURL(e.baseurl,e.relurl,{alwaysNormalize:!0});const r=e.byteRange;2===r.length&&(t=`${t}|bytes=${r[0]}-${r[1]-1}`),this.fragMap.set(t,e)})),n.sharePlaylist&&n.scheduler&&n.scheduler.broadcastPlaylist(t.split("?")[0],e)}else{const s=M3U8Parser.parseMasterPlaylist(e,t);""!==this.currentSrc&&this.restartP2p(),s.length>0&&(s.sort(((e,t)=>e.bitrate-t.bitrate)),this.levels=s.map((e=>e.url))),this.emit(hls_next_events.MANIFEST_PARSED,s,r)}}handleGetPlaylist(e,t){const{config:s,logger:r}=this;if(!r)return t.postMessage({action:hls_next_events.SW_GET_PLAYLIST});const{scheduler:n}=s;if(!n)return void r.warn("scheduler not found");const{url:i}=e,o=i.split("?")[0];if(n.playlistInfo.has(o)){const e=n.getPlaylistFromPeer(o);if(e&&e.data){const{data:s,seq:n}=e;return r.info(`got playlist from peer seq ${n}`),t.postMessage({action:hls_next_events.SW_GET_PLAYLIST,data:{text:s}}),void this._parsePlaylist(s,i.split("?")[0])}}return t.postMessage({action:hls_next_events.SW_GET_PLAYLIST})}async registerServiceWorker(){const{logger:e,config:t}=this;if(!this.swSupported){let e="sw is not supported";return isHttps||(e="https is required when using ServiceWorker",console.warn(e)),Promise.reject(e)}this.media=tryGetMediaElement(t.mediaElem),this.media||e&&e.warn("no video element found");const{serviceWorker:s}=navigator;return s.getRegistration(t.swFile).then((e=>e||s.register(t.swFile,{scope:t.swScope}).then((e=>{const t=e.installing||e.waiting;return e.active?e:new Promise(((s,r)=>{const n=()=>{"activated"===t.state?(t.removeEventListener("statechange",n),s(e)):"redundant"===t.state&&r("sw is redundant")};t.addEventListener("statechange",n)}))}))))}unregisterServiceWorker(){const{config:e}=this,t="serviceWorker is not registered";return new Promise(((s,r)=>{const{serviceWorker:n}=navigator;n||r(t),n.getRegistration(e.swFile).then((e=>{e?e.unregister().then((()=>{s()})).catch((()=>{r(t)})):r(t)}))}))}async _init(e,t){if(!this.p2pEnabled)return;const{logger:s}=this;try{await this.initSegmentManager()}catch(e){return void(s&&s.error(e))}let r=new server(this,this.config.token,encodeURIComponent(e),this.config.announce||"",t);this.fetcher=r,this.config.fetcher=r;let n=new hls_sw_scheduler(this,this.config);n.bufferManager=this.bufMgr,n.fragMap=this.fragMap,this.tracker=new tracker_client(this,r,n,this.config),this.config.scheduler=this.tracker.scheduler,this.p2pEnabled&&!this.tracker.connected&&this.tracker.resumeP2P(),this.setupWindowListeners()}restartP2p(){this.logger&&this.logger.warn("restart P2P"),this.disableP2P(),this.enableP2P(),this.on(hls_next_events.LEVEL_LOADED,this.onLevelLoaded),this.on(hls_next_events.MANIFEST_PARSED,this.onManifestParsed),this.on(hls_next_events.FRAG_LOADED,this.onFragLoaded)}enableP2P(){return this.p2pEnabled?null:(this.logger&&this.logger.info("enable P2P"),this.config.p2pEnabled=this.p2pEnabled=!0,this)}disableP2P(){this.logger&&this.logger.warn("disable P2P"),this.p2pEnabled&&(this.config.p2pEnabled=this.p2pEnabled=!1,this.tracker&&this.tracker instanceof tracker_client&&(this.tracker.stopP2P(),this.tracker={},this.fetcher=null,this.bufMgr.destroy(),this.bufMgr=null)),this.levels=[],this.currentLevelIndex=0,this.lastLevel=0,this.multiBitrate=!1,this.rangeTested=!1,this.rangeTestUrl="",this.currentSrc="",this.media=void 0,this.config.live=!1,this.removeAllListeners(hls_next_events.MANIFEST_PARSED),this.removeAllListeners(hls_next_events.LEVEL_LOADED)}}const hls_sw_p2pengine=HlsSwP2pEngine;function isBlockType(e,t){const s=url_toolkit_default().parseURL(e),r=s.path.substring(s.path.lastIndexOf(".")+1);return-1!==t.indexOf(r)}function createLoadStats(){const e=performance.now();return{trequest:e,tfirst:0,tload:0,aborted:!1,loaded:0,retry:0,total:0,chunkCount:0,bwEstimate:0,loading:{start:e,first:0,end:0},parsing:{start:0,end:0},buffering:{start:0,first:0,end:0}}}function updateLoadStats(e,t){let s,r,n,i,o;const a=performance.now();s=a-300,r=a-200,n=a,e.trequest=s,e.tfirst=r,e.tload=n,e.loading={first:s,start:r,end:n},i=o=t,e.loaded=i,e.total=o}class FakeXhr extends(events_default()){constructor(){super(),this.UNSENT=0,this.OPENED=1,this.HEADERS_RECEIVED=2,this.LOADING=3,this.DONE=4,this.timeout=0,this.withCredentials=!1,this.status=0,this.readyState=this.UNSENT,this.headers=new Map,this.responseHeaders=null,this.on("load",(e=>{this.onload&&this.onload(e)})),this.on("abort",(e=>{this.onabort&&this.onabort(e)})),this.on("error",(e=>{this.onerror&&this.onerror(e)})),this.on("loadstart",(e=>{this.onloadstart&&this.onloadstart(e)})),this.on("progress",(e=>{this.onprogress&&this.onprogress(e)})),this.on("timeout",(e=>{this.ontimeout&&this.ontimeout(e)})),this.on("loadend",(e=>{this.onloadend&&this.onloadend(e)})),this.on("readystatechange",(()=>{this.onreadystatechange&&this.onreadystatechange()}))}setRequestHeader(e,t){this.headers.set(e,t)}addEventListener(e,t){this.addListener(e,t)}removeEventListener(e,t){this.removeListener(e,t)}overrideMimeType(){}getAllResponseHeaders(){if(!this.responseHeaders)return null;let e="";return this.responseHeaders.forEach(((t,s)=>{e+=`${s}: ${t}\n`})),e}getResponseHeader(e){return this.responseHeaders?this.responseHeaders.get(e):null}open(){this.readyState=this.OPENED,this.emit("loadstart")}abort(){this.readyState=this.DONE,this.status=0}send(){}_emitEvent(e){this.emit(e,new ProgressEvent(e))}}function fetchSupported(){if(window.fetch&&window.AbortController&&window.ReadableStream&&window.Request)try{return new window.ReadableStream({}),!0}catch(e){}return!1}class FetchLoader{constructor(e){this.fetchSetup=e.fetchSetup||getRequest,this.xhrSetup=e.xhrSetup,this.controller=new window.AbortController,this.stats=createLoadStats(),this.packetSize=peer.defaultPacketSize,this.fakeXhr=new FakeXhr}destroy(){this.loader=this.callbacks=null,this.abortInternal()}abortInternal(){const e=this.response;e&&e.ok||(this.stats.aborted=!0,this.callbacks&&this.callbacks.onUpdate&&this.callbacks.onUpdate(void 0,!1,!0),this.controller.abort())}abort(){this.abortInternal(),this.callbacks&&this.callbacks.onAbort&&this.callbacks.onAbort(this.stats,this.context,this.response)}load(e,t,s){const r=this.stats;r.trequest=r.loading.start=performance.now();let n=getRequestParameters(e,this.controller.signal);const i="arraybuffer"===e.responseType,o=i?"byteLength":"length",a=s.onUpdate,h=s.onBodyStart;this.context=e,this.config=t,this.callbacks=s,this.xhrSetup&&(this.xhrSetup(this.fakeXhr,e.url),n=mergeXhrSetup(this.fakeXhr,n)),this.request=this.fetchSetup(e,n),clearTimeout(this.requestTimeout),this.requestTimeout=setTimeout((()=>{this.abortInternal(),this.fakeXhr._emitEvent("timeout"),this.fakeXhr._emitEvent("loadend"),s.onTimeout(r,e,this.response)}),this.fakeXhr.timeout||t.timeout);const{fakeXhr:l}=this;l.readyState=l.OPENED,l.emit("readystatechange"),l._emitEvent("loadstart"),fetch(this.request).then((t=>{if(this.response=this.loader=t,!t.ok){const{status:e,statusText:s}=t;throw a&&a(void 0,!1,!0),new FetchError(s||"fetch, bad network response",e,t)}r.tfirst=r.loading.first=Math.max(performance.now(),r.loading.start),r.total=parseInt(t.headers.get("Content-Length")||"0");const{fakeXhr:s}=this;return s.readyState=s.HEADERS_RECEIVED,s.responseHeaders=t.headers,s.emit("readystatechange"),a&&"0"!==r.total?(h&&h(r.total),this.loadProgressively(t,r,e,a)):(s.emit("progress",new ProgressEvent("progress",{lengthComputable:!1})),i?t.arrayBuffer():t.text())})).then((t=>{const{response:n}=this;clearTimeout(this.requestTimeout),r.tload=r.loading.end=Math.max(performance.now(),r.loading.first),r.loaded=r.total=t[o];const i={url:n.url,data:t};s.onProgress(r,e,t,n),s.onSuccess(i,r,e,n)})).catch((t=>{if(clearTimeout(this.requestTimeout),r.aborted)return;a&&a(void 0,!1,!0);const n=t&&t.code||0,i=t?t.message:null;s.onError({code:n,text:i},e,t?t.details:null)}))}loadProgressively(e,t,s,r){const n=e.body.getReader();let i=0,o=0,a=(0,utils_buffer.l)(0);const h=()=>n.read().then((({value:s,done:n})=>{const{fakeXhr:l}=this;if(l.readyState!==l.LOADING&&(l.readyState=l.LOADING,l.emit("readystatechange")),s&&(i+=s.length),n){if(a.byteLength>0)if(i<=this.packetSize){const e=(0,utils_buffer.l)(i);a.copy(e,0,o*this.packetSize,a.byteLength),r(e,!0)}else{const e=splitBytes(a,o*this.packetSize);for(let t=0;t<e.length;t++)r(e[t],t===e.length-1)}const t=a.buffer,{fakeXhr:s}=this,{status:n,statusText:h,url:l}=e;return s.readyState=s.DONE,s.responseText=n,s.status=h,s.responseURL=l,s.responseType="arraybuffer",s.response=t,s.emit("readystatechange"),s._emitEvent("load"),s._emitEvent("loadend"),Promise.resolve(t)}const c=utils_buffer.l.from(s);if(t.loaded+=s.length,l.emit("progress",new ProgressEvent("progress",{lengthComputable:!0,loaded:t.loaded,total:t.total})),a=utils_buffer.l.concat([a,c]),i>=this.packetSize){i-=this.packetSize;const e=(0,utils_buffer.l)(this.packetSize);a.copy(e,0,o*this.packetSize,(o+1)*this.packetSize),o++,r(e,!1)}return h()})).catch((()=>(this.fakeXhr._emitEvent("abort"),this.fakeXhr._emitEvent("loadend"),Promise.reject())));return h()}}function getRequestParameters(e,t){const s={method:"GET",mode:"cors",credentials:"same-origin",signal:t,headers:new window.Headers(Object.assign({},e.headers))};return e.rangeEnd&&s.headers.set("Range","bytes="+e.rangeStart+"-"+String(e.rangeEnd-1)),s}function getRequest(e,t){return new window.Request(e.url,t)}function mergeXhrSetup(e,t){e.withCredentials&&(t.credentials="include");for(let[s,r]of e.headers)t.headers.set(s,r);return t}class FetchError extends Error{constructor(e,t,s){super(e),this.code=t,this.details=s}}class SegmentBuilder{constructor(e,t,s,r){this.bufferList=[],this.streamListeners=[],this.finished=!1,this.packetSize=peer.defaultPacketSize,this.attachments=r%this.packetSize==0?r/this.packetSize:Math.floor(r/this.packetSize)+1,this.pieceMsg={event:events.DC_PIECE,attachments:this.attachments,seg_id:s,sn:e,level:t,size:r,reverse:!1}}receiveBytes(e,t){e.byteLength&&(this.bufferList.push(e),t&&(this.finished=!0),this._notifyStreamListeners(e))}destroy(){this.finished||this._notifyStreamListenersAbort()}addStreamListener(e,t){this.streamListeners.push({handler:t})}_notifyStreamListenersAbort(){const{sn:e,seg_id:t}=this.pieceMsg;for(let s of this.streamListeners){const{handler:r}=s;r(e,t,!0,"aborted by httpLoader")}this.streamListeners.length=0}_notifyStreamListeners(e){const{sn:t,seg_id:s}=this.pieceMsg;for(let r of this.streamListeners){const{handler:n}=r;n(t,s,!1,e,this.finished)}this.finished&&(this.streamListeners.length=0)}}const MIN_TIME_FOR_LOAD=7,MAX_TIME_FOR_WAIT=4.5;class FragLoader extends(events_default()){constructor(e){super(),this.logger=e.logger;const{scheduler:t,fetcher:s,p2pBlackList:r,isHlsV0:n}=window.__p2p_loader__;this.isHlsV0=n,this.bufMgr=e.bufMgr,this.streamEnabled=e.streamEnabled,this.httpLoader=this.streamEnabled?new FetchLoader(e):new e.loader(e),this.p2pEnabled=e.p2pEnabled,this.isLive=e.live,this.scheduler=t,this.fetcher=s,this.segmentId=e.segmentId,this.blockTypes=r,this.forbidden=s.forbidden,this.stats=this.httpLoader.stats||createLoadStats(),this.enableWorker=e.enableWorker}destroy(){this.httpLoader.destroy()}abort(){this.httpLoader.abort()}async load(e,t,s){const{logger:r,scheduler:n}=this,i=e.frag;this.isHlsV0||(i.stats=this.stats);let o=e.frag.segId;if(!o){let t;e.rangeEnd&&(t="bytes="+e.rangeStart+"-"+(e.rangeEnd-1)),o=e.frag.segId=this.segmentId(String(i.level),i.sn,i.url,t)}if(!i.url||isBlockType(i.url,this.blockTypes))return r.info(`HTTP load blockType ${i.url}`),e.frag.loadByHTTP=!0,this.httpLoader.load(e,t,s);if(this.forbidden)return;t.maxRetry=2;const a=n.getBufferedDuration(),h=await this.bufMgr.getSegById(o);if(this.p2pEnabled&&h){r.info(`bufMgr found seg sn ${i.sn} segId ${o} level ${i.level}`);let t=copyBuffer(h.data).buffer,n={url:e.url,data:t};updateLoadStats(this.stats,h.size),i.loaded=h.size,i.loadByP2P=!0,e.frag.fromPeerId=h.fromPeerId,queue_microtask_default()((()=>{!this.isHlsV0&&s.onProgress&&s.onProgress(this.stats,e,n.data),s.onSuccess(n,this.stats,e)}))}else if(this.p2pEnabled&&n.hasAndSetTargetPeer(i.sn,i.level,a))this.loadFragByP2p(e,t,s,o);else if(r.info(`fragLoader load ${o} at ${i.sn} level ${i.level} buffered ${1e3*a}`),this.isLive&&n.hasIdlePeers&&a>MIN_TIME_FOR_LOAD&&n.shouldWaitForNextSeg()){let h=a-MIN_TIME_FOR_LOAD;h>MAX_TIME_FOR_WAIT&&(h=MAX_TIME_FOR_WAIT);const l=r=>{r===o&&(n.off(hls_next_events.SCH_DCHAVE,l),clearTimeout(this.waitTimer),n.hasAndSetTargetPeer(i.sn,i.level,a)?this.loadFragByP2p(e,t,s,o):this.loadFragByHttp(e,t,s,o))};r.info(`wait peer have for ${h}s`),n.on(hls_next_events.SCH_DCHAVE,l),this.waitTimer=setTimeout((()=>{this.loadFragByHttp(e,t,s,o),n.off(hls_next_events.SCH_DCHAVE,l)}),1e3*h)}else{const a=n.requestingMap.get(i.sn,i.level);n.httpRangeSupported&&a&&a.hasPartialBuffer()?(r.warn(`syn has partial buffer for ${i.sn}`),this.loadFragByP2p(e,t,s,o)):this.loadFragByHttp(e,t,s,o)}}loadFragByHttp(e,t,s,r){const{logger:n,scheduler:i}=this,{segmentBuilderMap:o}=i;i.isReceiver=!1;const a=e.frag,{sn:h,level:l}=a;if(this.streamEnabled){let e;i.notifyAllPeers(h,l,r,SegmentState.PARTIAL_FORWARD),s.onUpdate=(t,s,r)=>{r?o.delete(h,l):e&&e.receiveBytes(t,s)},s.onBodyStart=t=>{e||(e=new SegmentBuilder(h,l,r,t),o.has(h,l)||o.set(h,l,e))}}const c=s.onSuccess;s.onSuccess=async(e,t,s)=>{if(!await this.bufMgr.hasSegOfId(r)){const t=copyBuffer(e.data).buffer,s=new Segment(h,r,t,this.fetcher.peerId,l);this.bufMgr.putSeg(s)}o.delete(h,l),this.fetcher.reportFlow(t.total);let a=t.tload-t.trequest;n.info(`HTTP loaded ${r} time ${a}`),i.notifyAllPeers(h,l,r),c(e,t,s)};const d=s.onProgress;s.onProgress=(e,t,s)=>{d(e,t,s&&this.enableWorker?copyBuffer(s).buffer:s)},e.frag.loadByHTTP=!0,this.httpLoader.load(e,t,s)}loadFragByP2p(e,t,s,r){const{logger:n}=this,i=e.frag;this.scheduler.load(e,t,s);const o=s.onSuccess,a=s.onTimeout;s.onTimeout=(e,h)=>{n.warn(`P2P timeout switched to HTTP load ${i.relurl} at ${i.sn}`),s.onSuccess=o,this.loadFragByHttp(h,t,s,r),s.onTimeout=a},s.onSuccess=async(e,t,a)=>{if(!await this.bufMgr.hasSegOfId(r)){const t=copyBuffer(e.data).buffer,s=new Segment(i.sn,r,t,i.fromPeerId||this.fetcher.peerId,i.level);this.bufMgr.putSeg(s)}i.loadByP2P||this.fetcher.reportFlow(t.total),i.loaded=t.loaded,n.info(`${i.loadByP2P?"P2P":"HTTP"} loaded segment id ${r}`),!this.isHlsV0&&s.onProgress&&s.onProgress(t,a,e.data),o(e,t,a)}}}const frag_loader=FragLoader;class PlaylistLoader extends(events_default()){constructor(e){super(),this.logger=e.logger;const{scheduler:t}=window.__p2p_loader__;this.isHlsV0=e.isHlsV0,this.xhrLoader=new e.loader(e),this.p2pEnabled=e.p2pEnabled,this.scheduler=t,this.stats=this.xhrLoader.stats||createLoadStats()}destroy(){this.xhrLoader.destroy()}abort(){this.xhrLoader.abort()}load(e,t,s){const{logger:r}=this,{url:n}=e,i=n.split("?")[0],o=s.onSuccess;if(s.onSuccess=(e,t,s)=>{this.scheduler.broadcastPlaylist(i,e.data),o(e,t,s)},this.scheduler.playlistInfo.has(i)){const t=this.scheduler.getPlaylistFromPeer(i);if(t&&t.data){const{data:i,seq:o}=t;r.info(`got playlist from peer seq ${o}`),updateLoadStats(this.stats,i.length);let a={url:n,data:i};return void queue_microtask_default()((()=>{s.onSuccess(a,this.stats,e)}))}}this.xhrLoader.load(e,t,s)}}const playlist_loader=PlaylistLoader;class HlsjsScheduler extends Scheduler{constructor(e,t){super(e,t),this.isHlsjs=!0}updatePlaySN(e){this.currPlaySN=e}load(e,t,s){this.isReceiver=!0;const{logger:r,config:n}=this;this.context=e;const{rangeStart:i,rangeEnd:o,url:a}=e,h=e.frag,{segId:l,sn:c,level:d}=h;this.callbacks=s,this.stats=createLoadStats(),this.criticalSeg={sn:c,level:d,segId:l};let u=this.mBufferedDuration-n.httpLoadTime;u>this.dcDownloadTimeout&&(u=this.dcDownloadTimeout);const{forwardPeer:g,reversePeer:f}=this.targetPeers;g||f||(u-=1);let p=this.requestingMap.get(c,d);const _={rangeStart:Number(i),rangeEnd:Number(o),url:a,httpLoadTime:1e3*n.httpLoadTime-500,xhrSetup:n.xhrSetup};p?p.setExtra(_):(p=new Synthesizer(this.coordinator,this.logger,c,d,this.httpRangeSupported,_),this._setupSynthesizer(p),this.requestingMap.set(c,d,p)),p.setTimeout(1e3*u),g&&(p.setForwardPeer(g),g.requestDataById(l,c,!0,{level:d})),f&&(p.setReversePeer(f),f.requestDataById(l,c,!0,{level:d,reverse:!0})),this.targetPeers={}}destroy(){super.destroy(),this.logger.warn("destroy HlsjsScheduler")}_setupDC(e){super._setupDC(e)}_setupSynthesizer(e){e.on(hls_next_events.SYN_OUTPUT,((t,s)=>{const{config:r,logger:n}=this,{segId:i,sn:o,data:a,level:h}=t,{speed:l,http:c,p2p:d}=s;c>0?this.httpTimeouts++:this.httpTimeouts>0&&this.httpTimeouts--;const u=this.criticalSeg&&this.criticalSeg.segId===i;if(r.validateSegment(i,new Uint8Array(a))){this.notifyAllPeers(o,h,i),this.bitset.has(o,h)||this.reportTraffic(c,d,l);const s=e.getFromPeerId();if(u){n.info(`receive criticalSeg seg_id ${i}`);let e=this.stats;e.tfirst=e.loading.first=Math.max(e.trequest,performance.now()),e.tload=e.loading.end=e.tfirst,e.loaded=e.total=a.byteLength,this.criticalSeg=null;const{frag:t}=this.context;t.fromPeerId=s,t.loadByP2P=!0,this.callbacks.onSuccess({data:a,url:this.context.url},e,this.context)}else this.bitset.has(o,h)||(this.bufMgr.putSeg(t),this.updateLoaded(o,h))}else n.error(`segment ${i} validate failed`),u&&this.callbacks.onTimeout(this.stats,this.context,null);this.requestingMap.delete(o,h),r.live&&!this.criticalSeg&&this.checkPeers()})).on(hls_next_events.SYN_ERROR,((e,t)=>{const{sn:s,level:r}=e;this.logger.warn(`SYN_ERROR loading ${s} code ${t}`),this.criticalSeg&&this.criticalSeg.sn===s&&(this.criticalSeg=null,this.callbacks.onTimeout(this.stats,this.context,null)),this.requestingMap.delete(s,r),this._handleSynError(t)}))}_setupEngine(){super._setupEngine(),this.engine.on(hls_next_events.FRAG_LOADING,(({sn:e,segId:t,byHttp:s,level:r})=>{this.loadingSN=e,this.loadingSegId=t})).on(hls_next_events.FRAG_LOADED,(({sn:e,segId:t,byP2p:s,level:r})=>{this.requestingMap.delete(e,r),this.updateLoaded(e,r)})).on(hls_next_events.FRAG_CHANGED,(({sn:e})=>{this.updatePlaySN(e)}))}_handleDCHave(e,t,s,r){this.criticalSeg&&this.criticalSeg.sn===t&&this.criticalSeg.level===s?this._notifySynthesizer(e,this.criticalSeg.segId,t,s,r):this.httpTimeouts>=1&&t===this.loadingSN+1&&this._notifySynthesizer(e,void 0,t,s,r,!1),this.config.live&&!this.criticalSeg&&queue_microtask_default()((()=>{this.checkPeers()}))}}const hlsjs_scheduler=HlsjsScheduler;class HlsjsP2pEngine extends Engine{static get name(){return"HlsjsP2pEngine"}constructor(e,t={}){if(super(t),!e)throw new TypeError("hlsjs instance is null");this.hlsjs=e,this.HLSEvents=e.constructor.Events,this.config.isHlsV0="0"===e.constructor.version.split(".")[0],this.config.xhrSetup=e.config.xhrSetup,!0===this.config.httpStreamEnabled&&(e.config.streamEnabled=fetchSupported());const{channelIdMaker:s,signalId:r,browserInfo:n}=this.setup();e.config.segmentId=this.config.segmentId;const i=(t,o)=>{if(!o)return;const{config:a}=this,h=o.details,l=h.live;a.live=this.hlsjs.config.live=l,l||(a.trickleICE=!0),this.browserInfo={...n,live:l,abr:this.multiBitrate||void 0,type:"hls"},this.channel=`${s(e.url)}|${r}[${peer.VERSION}]`,this.setupElectron();const c=this.initLogger();c.info("use HlsjsP2pEngine"),this.logger=this.hlsjs.config.logger=c,c.info(`channel ${this.channel}`),l||(a.startSN=h.startSN,a.endSN=h.endSN,c.info(`startSN ${h.startSN} endSN ${h.endSN}`)),this.eventListened=!1,this._init(this.channel,this.browserInfo),e.off(this.HLSEvents.LEVEL_LOADED,i)};e.on(this.HLSEvents.LEVEL_LOADED,i);const o=(t,s)=>{const r=s.levels.length;this.multiBitrate=r>1,e.off(this.HLSEvents.MANIFEST_PARSED,o)};e.on(this.HLSEvents.MANIFEST_PARSED,o),e.on(this.HLSEvents.DESTROYING,(()=>{this.destroy()}))}async _init(e,t){const{logger:s,config:r}=this;if(!this.p2pEnabled)return;this.hlsjs.config.p2pEnabled=this.p2pEnabled,this.hlsjs.config.sharePlaylist=r.sharePlaylist;try{await this.initSegmentManager()}catch(e){return void s.error(e)}this.hlsjs.config.bufMgr=this.bufMgr,this.media=this.hlsjs.media,this.media&&(this.currentSrc=this.media.src);let n=new server(this,r.token,encodeURIComponent(e),r.announce||"",t);this.fetcher=n;const i=new hlsjs_scheduler(this,r);this.tracker=new tracker_client(this,n,i,r),i.bufferManager=this.bufMgr,this.hlsjs.config.fLoader=frag_loader,r.sharePlaylist&&(this.hlsjs.config.pLoader=playlist_loader),window.__p2p_loader__={scheduler:this.tracker.scheduler,fetcher:n,p2pBlackList:r.p2pBlackList,isHlsV0:r.isHlsV0},this.trackerTried=!1,this.eventListened||(this.hlsjs.on(this.HLSEvents.FRAG_LOADING,this._onFragLoading.bind(this)),this.hlsjs.on(this.HLSEvents.FRAG_LOADED,this._onFragLoaded.bind(this)),this.hlsjs.on(this.HLSEvents.FRAG_CHANGED,this._onFragChanged.bind(this)),this.hlsjs.on(this.HLSEvents.ERROR,this._onHlsError.bind(this)),this.eventListened=!0),this.setupWindowListeners(),this.trackerTried||this.tracker.connected||!r.p2pEnabled||(this.tracker.resumeP2P(),this.trackerTried=!0)}_onFragLoading(e,t){const s=t.frag;let{sn:r,level:n,segId:i}=s;if(!isBlockType(s.url,this.config.p2pBlackList)){if(this.logger.debug("loading frag "+r),this.bufMgr&&(this.bufMgr.loadingSN=r),!i){let e;s._byteRange&&(e="bytes="+s._byteRange[0]+"-"+s._byteRange[1]);let r=s.url;i=t.frag.segId=this.config.segmentId(String(n),s.sn,r,e)}this.emit(hls_next_events.FRAG_LOADING,{sn:r,segId:i,byHttp:s.loadByHTTP,level:n})}}_onFragLoaded(e,t){const{sn:s,segId:r,loaded:n,duration:i,level:o,fromPeerId:a,loadByP2P:h,url:l}=t.frag,{config:c,logger:d}=this;isBlockType(t.frag.url,c.p2pBlackList)||(this.emit(hls_next_events.FRAG_LOADED,{url:l,sn:s,level:o,segId:r,loaded:n,duration:i,byP2p:!!h,fromPeerId:a}),!this.rangeTested&&c.useHttpRange&&(performRangeRequest(t.frag.url,void 0,c.xhrSetup).then((()=>{c.httpRangeSupported=!0,d.info("http range is supported")})).catch((()=>{c.httpRangeSupported=!1,d.warn("http range is not supported")})),this.rangeTested=!0))}_onFragChanged(e,t){if(!isBlockType(t.frag.url,this.config.p2pBlackList)){this.logger.debug("frag changed: "+t.frag.sn);const{sn:e,duration:s}=t.frag;this.emit(hls_next_events.FRAG_CHANGED,{sn:e,duration:s})}}_onHlsError(e,t){if(!t)return;const{logger:s}=this;t.fatal?s.error(`${t.type} details ${t.details} reason ${t.reason}`):s.warn(`${t.type} details ${t.details} reason ${t.reason}`);const r=this.hlsjs.constructor.ErrorDetails;switch(t.details){case r.BUFFER_STALLED_ERROR:this.fetcher&&this.fetcher.errsBufStalled++;break;case r.INTERNAL_EXCEPTION:this.fetcher&&(this.fetcher.errsInternalExpt++,this.fetcher.exptMsg=`${t.err.message} event ${t.event} ua ${navigator.userAgent}`),s.error(`INTERNAL_EXCEPTION event ${t.event} err ${t.err.message}`),this.emit(hls_next_events.EXCEPTION,err_code_default()(t.err,"HLSJS_EXPT"))}}get currentLevel(){const{currentLevel:e}=this.hlsjs;return e>=0?e:0}disableP2P(){this.logger&&this.logger.warn("disable P2P"),this.p2pEnabled&&(this.p2pEnabled=!1,this.config.p2pEnabled=this.hlsjs.config.p2pEnabled=this.p2pEnabled,this.tracker&&(this.tracker.stopP2P(),this.tracker={},this.fetcher=null,this.bufMgr.destroy(),this.bufMgr=null,this.hlsjs.config.fLoader=this.hlsjs.config.pLoader=this.hlsjs.constructor.DefaultConfig.loader))}}const hlsjs_p2pengine=HlsjsP2pEngine;function getMediaSource(){if("undefined"!=typeof window)return window.MediaSource||window.WebKitMediaSource}function isMSESupported(){const e=getMediaSource(),t=window.SourceBuffer||window.WebKitSourceBuffer,s=e&&"function"==typeof e.isTypeSupported&&e.isTypeSupported('video/mp4; codecs="avc1.42E01E,mp4a.40.2"'),r=!t||t.prototype&&"function"==typeof t.prototype.appendBuffer&&"function"==typeof t.prototype.remove;return!!s&&!!r}class ShadowP2pEngine extends Engine{static get name(){return"ShadowP2pEngine"}constructor(){super()}get currentLevel(){return 0}disableP2P(){}}const shadow_p2pengine=ShadowP2pEngine;class P2pEngine{static get Events(){return hls_next_events}static isSupported(){return engine_base.isSupported()&&(isMSESupported()||hls_sw_p2pengine.isServiceWorkerSupported())}static isServiceWorkerSupported(){return hls_sw_p2pengine.isServiceWorkerSupported()}static isMSESupported(){return isMSESupported()}static getBrowser(){return platform_default().getBrowser()}static get ServiceWorkerEngine(){return hls_sw_p2pengine}static get HlsjsEngine(){return hlsjs_p2pengine}constructor(e={}){const{hlsjsInstance:t}=e;if(delete e.hlsjsInstance,window.__swP2pEngineHlsActive)return console.warn("P2pEngineHls is already activated"),void(this._realEngine=new shadow_p2pengine(e));"1"!==getQueryParam("_ios")&&!e.proxyOnly&&t&&isMSESupported()?this._realEngine=new hlsjs_p2pengine(t,e):this._realEngine=new hls_sw_p2pengine(e)}get realEngine(){return this._realEngine}get engineName(){return this._realEngine.constructor.name}once(e,t){return this._realEngine.once(e,t)}on(e,t){return this._realEngine.on(e,t)}off(e,t){return this._realEngine.off(e,t)}removeListener(e,t){return this._realEngine.removeListener(e,t)}removeAllListeners(e){return this._realEngine.removeAllListeners(e)}set p2pEnabled(e){this._realEngine.p2pEnabled=e}get p2pEnabled(){return this._realEngine.p2pEnabled}enableP2P(){this._realEngine.enableP2P()}disableP2P(){this._realEngine.disableP2P()}destroy(){this._realEngine.destroy()}registerServiceWorker(){return"function"==typeof this._realEngine.registerServiceWorker?this._realEngine.registerServiceWorker():Promise.reject("Not supported by this engine")}unregisterServiceWorker(){return"function"==typeof this._realEngine.unregisterServiceWorker?this._realEngine.unregisterServiceWorker():Promise.reject("Not supported by this engine")}get version(){return engine_base.version}}P2pEngine.version=engine_base.version,P2pEngine.protocolVersion=peer.VERSION,window&&(window.P2PEngineHls=P2pEngine);const index_engine=P2pEngine})(),__webpack_exports__=__webpack_exports__.default,__webpack_exports__})()));
1
+ !function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.P2pEngineHls=t():e.P2pEngineHls=t()}(self,(()=>(()=>{var __webpack_modules__={204:e=>{"use strict";var t,s="object"==typeof Reflect?Reflect:null,r=s&&"function"==typeof s.apply?s.apply:function(e,t,s){return Function.prototype.apply.call(e,t,s)};t=s&&"function"==typeof s.ownKeys?s.ownKeys:Object.getOwnPropertySymbols?function(e){return Object.getOwnPropertyNames(e).concat(Object.getOwnPropertySymbols(e))}:function(e){return Object.getOwnPropertyNames(e)};var n=Number.isNaN||function(e){return e!=e};function i(){i.init.call(this)}e.exports=i,e.exports.once=function(e,t){return new Promise((function(s,r){function n(s){e.removeListener(t,i),r(s)}function i(){"function"==typeof e.removeListener&&e.removeListener("error",n),s([].slice.call(arguments))}p(e,t,i,{once:!0}),"error"!==t&&function(e,t,s){"function"==typeof e.on&&p(e,"error",t,s)}(e,n,{once:!0})}))},i.EventEmitter=i,i.prototype._events=void 0,i.prototype._eventsCount=0,i.prototype._maxListeners=void 0;var o=10;function a(e){if("function"!=typeof e)throw new TypeError('The "listener" argument must be of type Function. Received type '+typeof e)}function h(e){return void 0===e._maxListeners?i.defaultMaxListeners:e._maxListeners}function l(e,t,s,r){var n,i,o,l;if(a(s),void 0===(i=e._events)?(i=e._events=Object.create(null),e._eventsCount=0):(void 0!==i.newListener&&(e.emit("newListener",t,s.listener?s.listener:s),i=e._events),o=i[t]),void 0===o)o=i[t]=s,++e._eventsCount;else if("function"==typeof o?o=i[t]=r?[s,o]:[o,s]:r?o.unshift(s):o.push(s),(n=h(e))>0&&o.length>n&&!o.warned){o.warned=!0;var c=new Error("Possible EventEmitter memory leak detected. "+o.length+" "+String(t)+" listeners added. Use emitter.setMaxListeners() to increase limit");c.name="MaxListenersExceededWarning",c.emitter=e,c.type=t,c.count=o.length,l=c,console&&console.warn&&console.warn(l)}return e}function c(){if(!this.fired)return this.target.removeListener(this.type,this.wrapFn),this.fired=!0,0===arguments.length?this.listener.call(this.target):this.listener.apply(this.target,arguments)}function d(e,t,s){var r={fired:!1,wrapFn:void 0,target:e,type:t,listener:s},n=c.bind(r);return n.listener=s,r.wrapFn=n,n}function u(e,t,s){var r=e._events;if(void 0===r)return[];var n=r[t];return void 0===n?[]:"function"==typeof n?s?[n.listener||n]:[n]:s?function(e){for(var t=new Array(e.length),s=0;s<t.length;++s)t[s]=e[s].listener||e[s];return t}(n):f(n,n.length)}function g(e){var t=this._events;if(void 0!==t){var s=t[e];if("function"==typeof s)return 1;if(void 0!==s)return s.length}return 0}function f(e,t){for(var s=new Array(t),r=0;r<t;++r)s[r]=e[r];return s}function p(e,t,s,r){if("function"==typeof e.on)r.once?e.once(t,s):e.on(t,s);else{if("function"!=typeof e.addEventListener)throw new TypeError('The "emitter" argument must be of type EventEmitter. Received type '+typeof e);e.addEventListener(t,(function n(i){r.once&&e.removeEventListener(t,n),s(i)}))}}Object.defineProperty(i,"defaultMaxListeners",{enumerable:!0,get:function(){return o},set:function(e){if("number"!=typeof e||e<0||n(e))throw new RangeError('The value of "defaultMaxListeners" is out of range. It must be a non-negative number. Received '+e+".");o=e}}),i.init=function(){void 0!==this._events&&this._events!==Object.getPrototypeOf(this)._events||(this._events=Object.create(null),this._eventsCount=0),this._maxListeners=this._maxListeners||void 0},i.prototype.setMaxListeners=function(e){if("number"!=typeof e||e<0||n(e))throw new RangeError('The value of "n" is out of range. It must be a non-negative number. Received '+e+".");return this._maxListeners=e,this},i.prototype.getMaxListeners=function(){return h(this)},i.prototype.emit=function(e){for(var t=[],s=1;s<arguments.length;s++)t.push(arguments[s]);var n="error"===e,i=this._events;if(void 0!==i)n=n&&void 0===i.error;else if(!n)return!1;if(n){var o;if(t.length>0&&(o=t[0]),o instanceof Error)throw o;var a=new Error("Unhandled error."+(o?" ("+o.message+")":""));throw a.context=o,a}var h=i[e];if(void 0===h)return!1;if("function"==typeof h)r(h,this,t);else{var l=h.length,c=f(h,l);for(s=0;s<l;++s)r(c[s],this,t)}return!0},i.prototype.addListener=function(e,t){return l(this,e,t,!1)},i.prototype.on=i.prototype.addListener,i.prototype.prependListener=function(e,t){return l(this,e,t,!0)},i.prototype.once=function(e,t){return a(t),this.on(e,d(this,e,t)),this},i.prototype.prependOnceListener=function(e,t){return a(t),this.prependListener(e,d(this,e,t)),this},i.prototype.removeListener=function(e,t){var s,r,n,i,o;if(a(t),void 0===(r=this._events))return this;if(void 0===(s=r[e]))return this;if(s===t||s.listener===t)0==--this._eventsCount?this._events=Object.create(null):(delete r[e],r.removeListener&&this.emit("removeListener",e,s.listener||t));else if("function"!=typeof s){for(n=-1,i=s.length-1;i>=0;i--)if(s[i]===t||s[i].listener===t){o=s[i].listener,n=i;break}if(n<0)return this;0===n?s.shift():function(e,t){for(;t+1<e.length;t++)e[t]=e[t+1];e.pop()}(s,n),1===s.length&&(r[e]=s[0]),void 0!==r.removeListener&&this.emit("removeListener",e,o||t)}return this},i.prototype.off=i.prototype.removeListener,i.prototype.removeAllListeners=function(e){var t,s,r;if(void 0===(s=this._events))return this;if(void 0===s.removeListener)return 0===arguments.length?(this._events=Object.create(null),this._eventsCount=0):void 0!==s[e]&&(0==--this._eventsCount?this._events=Object.create(null):delete s[e]),this;if(0===arguments.length){var n,i=Object.keys(s);for(r=0;r<i.length;++r)"removeListener"!==(n=i[r])&&this.removeAllListeners(n);return this.removeAllListeners("removeListener"),this._events=Object.create(null),this._eventsCount=0,this}if("function"==typeof(t=s[e]))this.removeListener(e,t);else if(void 0!==t)for(r=t.length-1;r>=0;r--)this.removeListener(e,t[r]);return this},i.prototype.listeners=function(e){return u(this,e,!0)},i.prototype.rawListeners=function(e){return u(this,e,!1)},i.listenerCount=function(e,t){return"function"==typeof e.listenerCount?e.listenerCount(t):g.call(e,t)},i.prototype.listenerCount=g,i.prototype.eventNames=function(){return this._eventsCount>0?t(this._events):[]}},622:function(e){var t,s,r,n,i;t=/^(?=((?:[a-zA-Z0-9+\-.]+:)?))\1(?=((?:\/\/[^\/?#]*)?))\2(?=((?:(?:[^?#\/]*\/)*[^;?#\/]*)?))\3((?:;[^?#]*)?)(\?[^#]*)?(#[^]*)?$/,s=/^(?=([^\/?#]*))\1([^]*)$/,r=/(?:\/|^)\.(?=\/)/g,n=/(?:\/|^)\.\.\/(?!\.\.\/)[^\/]*(?=\/)/g,i={buildAbsoluteURL:function(e,t,r){if(r=r||{},e=e.trim(),!(t=t.trim())){if(!r.alwaysNormalize)return e;var n=i.parseURL(e);if(!n)throw new Error("Error trying to parse base URL.");return n.path=i.normalizePath(n.path),i.buildURLFromParts(n)}var o=i.parseURL(t);if(!o)throw new Error("Error trying to parse relative URL.");if(o.scheme)return r.alwaysNormalize?(o.path=i.normalizePath(o.path),i.buildURLFromParts(o)):t;var a=i.parseURL(e);if(!a)throw new Error("Error trying to parse base URL.");if(!a.netLoc&&a.path&&"/"!==a.path[0]){var h=s.exec(a.path);a.netLoc=h[1],a.path=h[2]}a.netLoc&&!a.path&&(a.path="/");var l={scheme:a.scheme,netLoc:o.netLoc,path:null,params:o.params,query:o.query,fragment:o.fragment};if(!o.netLoc&&(l.netLoc=a.netLoc,"/"!==o.path[0]))if(o.path){var c=a.path,d=c.substring(0,c.lastIndexOf("/")+1)+o.path;l.path=i.normalizePath(d)}else l.path=a.path,o.params||(l.params=a.params,o.query||(l.query=a.query));return null===l.path&&(l.path=r.alwaysNormalize?i.normalizePath(o.path):o.path),i.buildURLFromParts(l)},parseURL:function(e){var s=t.exec(e);return s?{scheme:s[1]||"",netLoc:s[2]||"",path:s[3]||"",params:s[4]||"",query:s[5]||"",fragment:s[6]||""}:null},normalizePath:function(e){for(e=e.split("").reverse().join("").replace(r,"");e.length!==(e=e.replace(n,"")).length;);return e.split("").reverse().join("")},buildURLFromParts:function(e){return e.scheme+e.netLoc+e.path+e.params+e.query+e.fragment}},e.exports=i},47:(e,t)=>{"use strict";t.l=n;var s=2147483647;function r(e){if(e>s)throw new RangeError('The value "'+e+'" is invalid for option "size"');var t=new Uint8Array(e);return t.__proto__=n.prototype,t}function n(e,t,s){if("number"==typeof e){if("string"==typeof t)throw new TypeError('The "string" argument must be of type string. Received type number');return a(e)}return i(e,t,s)}function i(e,t,s){if("string"==typeof e)return function(e,t){"string"==typeof t&&""!==t||(t="utf8");if(!n.isEncoding(t))throw new TypeError("Unknown encoding: "+t);var s=0|c(e,t),i=r(s),o=i.write(e,t);o!==s&&(i=i.slice(0,o));return i}(e,t);if(ArrayBuffer.isView(e))return h(e);if(null==e)throw TypeError("The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type "+typeof e);if(m(e,ArrayBuffer)||e&&m(e.buffer,ArrayBuffer))return function(e,t,s){if(t<0||e.byteLength<t)throw new RangeError('"offset" is outside of buffer bounds');if(e.byteLength<t+(s||0))throw new RangeError('"length" is outside of buffer bounds');var r;r=void 0===t&&void 0===s?new Uint8Array(e):void 0===s?new Uint8Array(e,t):new Uint8Array(e,t,s);return r.__proto__=n.prototype,r}(e,t,s);if("number"==typeof e)throw new TypeError('The "value" argument must not be of type number. Received type number');var i=e.valueOf&&e.valueOf();if(null!=i&&i!==e)return n.from(i,t,s);var o=function(e){if(n.isBuffer(e)){var t=0|l(e.length),s=r(t);return 0===s.length||e.copy(s,0,0,t),s}if(void 0!==e.length)return"number"!=typeof e.length||S(e.length)?r(0):h(e);if("Buffer"===e.type&&Array.isArray(e.data))return h(e.data)}(e);if(o)return o;if("undefined"!=typeof Symbol&&null!=Symbol.toPrimitive&&"function"==typeof e[Symbol.toPrimitive])return n.from(e[Symbol.toPrimitive]("string"),t,s);throw new TypeError("The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object. Received type "+typeof e)}function o(e){if("number"!=typeof e)throw new TypeError('"size" argument must be of type number');if(e<0)throw new RangeError('The value "'+e+'" is invalid for option "size"')}function a(e){return o(e),r(e<0?0:0|l(e))}function h(e){for(var t=e.length<0?0:0|l(e.length),s=r(t),n=0;n<t;n+=1)s[n]=255&e[n];return s}function l(e){if(e>=s)throw new RangeError("Attempt to allocate Buffer larger than maximum size: 0x"+s.toString(16)+" bytes");return 0|e}function c(e,t){if(n.isBuffer(e))return e.length;if(ArrayBuffer.isView(e)||m(e,ArrayBuffer))return e.byteLength;if("string"!=typeof e)throw new TypeError('The "string" argument must be one of type string, Buffer, or ArrayBuffer. Received type '+typeof e);var s=e.length,r=arguments.length>2&&!0===arguments[2];if(!r&&0===s)return 0;for(var i=!1;;)switch(t){case"ascii":case"latin1":case"binary":return s;case"utf8":case"utf-8":return _(e).length;case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return 2*s;case"hex":return s>>>1;default:if(i)return r?-1:_(e).length;t=(""+t).toLowerCase(),i=!0}}function d(e,t,s,r){s=Number(s)||0;const n=e.length-s;r?(r=Number(r))>n&&(r=n):r=n;const i=t.length;let o;for(r>i/2&&(r=i/2),o=0;o<r;++o){const r=parseInt(t.substr(2*o,2),16);if(S(r))return o;e[s+o]=r}return o}function u(e,t,s,r){return p(_(t,e.length-s),e,s,r)}function g(e,t,s,r){return p(function(e){const t=[];for(let s=0;s<e.length;++s)t.push(255&e.charCodeAt(s));return t}(t),e,s,r)}function f(e,t,s,r){return p(function(e,t){let s,r,n;const i=[];for(let o=0;o<e.length&&!((t-=2)<0);++o)s=e.charCodeAt(o),r=s>>8,n=s%256,i.push(n),i.push(r);return i}(t,e.length-s),e,s,r)}function p(e,t,s,r){let n;for(n=0;n<r&&!(n+s>=t.length||n>=e.length);++n)t[n+s]=e[n];return n}function _(e,t){var s;t=t||1/0;for(var r=e.length,n=null,i=[],o=0;o<r;++o){if((s=e.charCodeAt(o))>55295&&s<57344){if(!n){if(s>56319){(t-=3)>-1&&i.push(239,191,189);continue}if(o+1===r){(t-=3)>-1&&i.push(239,191,189);continue}n=s;continue}if(s<56320){(t-=3)>-1&&i.push(239,191,189),n=s;continue}s=65536+(n-55296<<10|s-56320)}else n&&(t-=3)>-1&&i.push(239,191,189);if(n=null,s<128){if((t-=1)<0)break;i.push(s)}else if(s<2048){if((t-=2)<0)break;i.push(s>>6|192,63&s|128)}else if(s<65536){if((t-=3)<0)break;i.push(s>>12|224,s>>6&63|128,63&s|128)}else{if(!(s<1114112))throw new Error("Invalid code point");if((t-=4)<0)break;i.push(s>>18|240,s>>12&63|128,s>>6&63|128,63&s|128)}}return i}function m(e,t){return e instanceof t||null!=e&&null!=e.constructor&&null!=e.constructor.name&&e.constructor.name===t.name}function S(e){return e!=e}"undefined"!=typeof Symbol&&null!=Symbol.species&&n[Symbol.species]===n&&Object.defineProperty(n,Symbol.species,{value:null,configurable:!0,enumerable:!1,writable:!1}),n.from=function(e,t,s){return i(e,t,s)},n.prototype.__proto__=Uint8Array.prototype,n.__proto__=Uint8Array,n.alloc=function(e,t,s){return function(e,t,s){return o(e),e<=0?r(e):void 0!==t?"string"==typeof s?r(e).fill(t,s):r(e).fill(t):r(e)}(e,t,s)},n.allocUnsafe=function(e){return a(e)},n.isBuffer=function(e){return null!=e&&!0===e._isBuffer&&e!==n.prototype},n.isEncoding=function(e){switch(String(e).toLowerCase()){case"hex":case"utf8":case"utf-8":case"ascii":case"latin1":case"binary":case"base64":case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return!0;default:return!1}},n.concat=function(e,t){if(!Array.isArray(e))throw new TypeError('"list" argument must be an Array of Buffers');if(0===e.length)return n.alloc(0);var s;if(void 0===t)for(t=0,s=0;s<e.length;++s)t+=e[s].length;var r=n.allocUnsafe(t),i=0;for(s=0;s<e.length;++s){var o=e[s];if(m(o,Uint8Array)&&(o=n.from(o)),!n.isBuffer(o))throw new TypeError('"list" argument must be an Array of Buffers');o.copy(r,i),i+=o.length}return r},n.byteLength=c,n.prototype._isBuffer=!0,n.prototype.copy=function(e,t,s,r){if(!n.isBuffer(e))throw new TypeError("argument should be a Buffer");if(s||(s=0),r||0===r||(r=this.length),t>=e.length&&(t=e.length),t||(t=0),r>0&&r<s&&(r=s),r===s)return 0;if(0===e.length||0===this.length)return 0;if(t<0)throw new RangeError("targetStart out of bounds");if(s<0||s>=this.length)throw new RangeError("Index out of range");if(r<0)throw new RangeError("sourceEnd out of bounds");r>this.length&&(r=this.length),e.length-t<r-s&&(r=e.length-t+s);var i=r-s;if(this===e&&"function"==typeof Uint8Array.prototype.copyWithin)this.copyWithin(t,s,r);else if(this===e&&s<t&&t<r)for(var o=i-1;o>=0;--o)e[o+t]=this[o+s];else Uint8Array.prototype.set.call(e,this.subarray(s,r),t);return i},n.prototype.write=function(e,t,s,r){if(void 0===t)r="utf8",s=this.length,t=0;else if(void 0===s&&"string"==typeof t)r=t,s=this.length,t=0;else{if(!isFinite(t))throw new Error("Buffer.write(string, encoding, offset[, length]) is no longer supported");t>>>=0,isFinite(s)?(s>>>=0,void 0===r&&(r="utf8")):(r=s,s=void 0)}const n=this.length-t;if((void 0===s||s>n)&&(s=n),e.length>0&&(s<0||t<0)||t>this.length)throw new RangeError("Attempt to write outside buffer bounds");r||(r="utf8");let i=!1;for(;;)switch(r){case"hex":return d(this,e,t,s);case"utf8":case"utf-8":return u(this,e,t,s);case"ascii":case"latin1":case"binary":return g(this,e,t,s);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return f(this,e,t,s);default:if(i)throw new TypeError("Unknown encoding: "+r);r=(""+r).toLowerCase(),i=!0}}},934:e=>{"use strict";function t(e,t){for(const s in t)Object.defineProperty(e,s,{value:t[s],enumerable:!0,configurable:!0});return e}e.exports=function(e,s,r){if(!e||"string"==typeof e)throw new TypeError("Please pass an Error to err-code");r||(r={}),"object"==typeof s&&(r=s,s=void 0),null!=s&&(r.code=s);try{return t(e,r)}catch(s){r.message=e.message,r.stack=e.stack;const n=function(){};return n.prototype=Object.create(Object.getPrototypeOf(e)),t(new n,r)}}},485:function(e,t,s){var r;!function(n){"use strict";function i(e,t){var s=(65535&e)+(65535&t);return(e>>16)+(t>>16)+(s>>16)<<16|65535&s}function o(e,t,s,r,n,o){return i((a=i(i(t,e),i(r,o)))<<(h=n)|a>>>32-h,s);var a,h}function a(e,t,s,r,n,i,a){return o(t&s|~t&r,e,t,n,i,a)}function h(e,t,s,r,n,i,a){return o(t&r|s&~r,e,t,n,i,a)}function l(e,t,s,r,n,i,a){return o(t^s^r,e,t,n,i,a)}function c(e,t,s,r,n,i,a){return o(s^(t|~r),e,t,n,i,a)}function d(e,t){var s,r,n,o,d;e[t>>5]|=128<<t%32,e[14+(t+64>>>9<<4)]=t;var u=1732584193,g=-271733879,f=-1732584194,p=271733878;for(s=0;s<e.length;s+=16)r=u,n=g,o=f,d=p,u=a(u,g,f,p,e[s],7,-680876936),p=a(p,u,g,f,e[s+1],12,-389564586),f=a(f,p,u,g,e[s+2],17,606105819),g=a(g,f,p,u,e[s+3],22,-1044525330),u=a(u,g,f,p,e[s+4],7,-176418897),p=a(p,u,g,f,e[s+5],12,1200080426),f=a(f,p,u,g,e[s+6],17,-1473231341),g=a(g,f,p,u,e[s+7],22,-45705983),u=a(u,g,f,p,e[s+8],7,1770035416),p=a(p,u,g,f,e[s+9],12,-1958414417),f=a(f,p,u,g,e[s+10],17,-42063),g=a(g,f,p,u,e[s+11],22,-1990404162),u=a(u,g,f,p,e[s+12],7,1804603682),p=a(p,u,g,f,e[s+13],12,-40341101),f=a(f,p,u,g,e[s+14],17,-1502002290),u=h(u,g=a(g,f,p,u,e[s+15],22,1236535329),f,p,e[s+1],5,-165796510),p=h(p,u,g,f,e[s+6],9,-1069501632),f=h(f,p,u,g,e[s+11],14,643717713),g=h(g,f,p,u,e[s],20,-373897302),u=h(u,g,f,p,e[s+5],5,-701558691),p=h(p,u,g,f,e[s+10],9,38016083),f=h(f,p,u,g,e[s+15],14,-660478335),g=h(g,f,p,u,e[s+4],20,-405537848),u=h(u,g,f,p,e[s+9],5,568446438),p=h(p,u,g,f,e[s+14],9,-1019803690),f=h(f,p,u,g,e[s+3],14,-187363961),g=h(g,f,p,u,e[s+8],20,1163531501),u=h(u,g,f,p,e[s+13],5,-1444681467),p=h(p,u,g,f,e[s+2],9,-51403784),f=h(f,p,u,g,e[s+7],14,1735328473),u=l(u,g=h(g,f,p,u,e[s+12],20,-1926607734),f,p,e[s+5],4,-378558),p=l(p,u,g,f,e[s+8],11,-2022574463),f=l(f,p,u,g,e[s+11],16,1839030562),g=l(g,f,p,u,e[s+14],23,-35309556),u=l(u,g,f,p,e[s+1],4,-1530992060),p=l(p,u,g,f,e[s+4],11,1272893353),f=l(f,p,u,g,e[s+7],16,-155497632),g=l(g,f,p,u,e[s+10],23,-1094730640),u=l(u,g,f,p,e[s+13],4,681279174),p=l(p,u,g,f,e[s],11,-358537222),f=l(f,p,u,g,e[s+3],16,-722521979),g=l(g,f,p,u,e[s+6],23,76029189),u=l(u,g,f,p,e[s+9],4,-640364487),p=l(p,u,g,f,e[s+12],11,-421815835),f=l(f,p,u,g,e[s+15],16,530742520),u=c(u,g=l(g,f,p,u,e[s+2],23,-995338651),f,p,e[s],6,-198630844),p=c(p,u,g,f,e[s+7],10,1126891415),f=c(f,p,u,g,e[s+14],15,-1416354905),g=c(g,f,p,u,e[s+5],21,-57434055),u=c(u,g,f,p,e[s+12],6,1700485571),p=c(p,u,g,f,e[s+3],10,-1894986606),f=c(f,p,u,g,e[s+10],15,-1051523),g=c(g,f,p,u,e[s+1],21,-2054922799),u=c(u,g,f,p,e[s+8],6,1873313359),p=c(p,u,g,f,e[s+15],10,-30611744),f=c(f,p,u,g,e[s+6],15,-1560198380),g=c(g,f,p,u,e[s+13],21,1309151649),u=c(u,g,f,p,e[s+4],6,-145523070),p=c(p,u,g,f,e[s+11],10,-1120210379),f=c(f,p,u,g,e[s+2],15,718787259),g=c(g,f,p,u,e[s+9],21,-343485551),u=i(u,r),g=i(g,n),f=i(f,o),p=i(p,d);return[u,g,f,p]}function u(e){var t,s="",r=32*e.length;for(t=0;t<r;t+=8)s+=String.fromCharCode(e[t>>5]>>>t%32&255);return s}function g(e){var t,s=[];for(s[(e.length>>2)-1]=void 0,t=0;t<s.length;t+=1)s[t]=0;var r=8*e.length;for(t=0;t<r;t+=8)s[t>>5]|=(255&e.charCodeAt(t/8))<<t%32;return s}function f(e){var t,s,r="0123456789abcdef",n="";for(s=0;s<e.length;s+=1)t=e.charCodeAt(s),n+=r.charAt(t>>>4&15)+r.charAt(15&t);return n}function p(e){return unescape(encodeURIComponent(e))}function _(e){return function(e){return u(d(g(e),8*e.length))}(p(e))}function m(e,t){return function(e,t){var s,r,n=g(e),i=[],o=[];for(i[15]=o[15]=void 0,n.length>16&&(n=d(n,8*e.length)),s=0;s<16;s+=1)i[s]=909522486^n[s],o[s]=1549556828^n[s];return r=d(i.concat(g(t)),512+8*t.length),u(d(o.concat(r),640))}(p(e),p(t))}function S(e,t,s){return t?s?m(t,e):f(m(t,e)):s?_(e):f(_(e))}void 0===(r=function(){return S}.call(t,s,t,e))||(e.exports=r)}()},422:e=>{const t={ANDROID_WEB:"android-web",IOS_WEB:"iOS-web",PC_NATIVE:"PC-native",PC_WEB:"PC-web"};var s={getNetType:function(){let e=(new RegExp("nettype\\/(\\w*)").exec(r())||[,""])[1].toLowerCase();if(!e&&navigator.connection){switch(navigator.connection.type){case"ethernet":e="ethernet";break;case"cellular":e="cellular";break;default:e="wifi"}}return e},getPlatform:function(){return s.isAndroid()?t.ANDROID_WEB:s.isIOS()?t.IOS_WEB:s.isElectron()?t.PC_NATIVE:t.PC_WEB},isX5:function(){return this.isAndroid()&&/\s(TBS|X5Core)\/[\w\.\-]+/i.test(r())},isPC:function(){return!i(n("os "))&&!i(n("android[/ ]"))},isIOS:function(){return i(n("os "))},isAndroid:function(){return i(n("android[/ ]"))},isIOSSafari:function(){return this.isIOS()&&this.isSafari()},isElectron:function(){return/electron/i.test(r())},isMobile:function(){return s.isAndroid()||s.isIOS()},isSafari:function(){return/^((?!chrome|android).)*safari/i.test(r())},isFirefox:function(){return/firefox/i.test(r())},isChrome:function(){return/chrome/i.test(r())},isLocalHost:function(){return"localhost"===location.hostname},device:t,getBrowser:function(){return s.isX5()?"X5":s.isChrome()?"Chrome":s.isFirefox()?"Firefox":s.isIOSSafari()?"iOS-Safari":s.isSafari()?"Mac-Safari":"Unknown"}};function r(){return navigator.userAgent.toLowerCase()}function n(e){return""+(new RegExp(e+"(\\d+((\\.|_)\\d+)*)").exec(r())||[,0])[1]||void 0}function i(e){return parseFloat((e||"").replace(/\_/g,"."))||0}e.exports=s},77:e=>{let t;e.exports="function"==typeof queueMicrotask?queueMicrotask.bind(globalThis):e=>(t||(t=Promise.resolve())).then(e).catch((e=>setTimeout((()=>{throw e}),0)))}},__webpack_module_cache__={};function __webpack_require__(e){var t=__webpack_module_cache__[e];if(void 0!==t)return t.exports;var s=__webpack_module_cache__[e]={exports:{}};return __webpack_modules__[e].call(s.exports,s,s.exports,__webpack_require__),s.exports}__webpack_require__.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return __webpack_require__.d(t,{a:t}),t},__webpack_require__.d=(e,t)=>{for(var s in t)__webpack_require__.o(t,s)&&!__webpack_require__.o(e,s)&&Object.defineProperty(e,s,{enumerable:!0,get:t[s]})},__webpack_require__.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),__webpack_require__.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t);var __webpack_exports__={};return(()=>{"use strict";__webpack_require__.d(__webpack_exports__,{default:()=>index_engine});const events={DC_SIGNAL:"SIGNAL",DC_OPEN:"OPEN",DC_REQUEST:"REQUEST",DC_PIECE_NOT_FOUND:"PIECE_NOT_FOUND",DC_PIECE_ABORT:"PIECE_ABORT",DC_PIECE_CANCEL:"PIECE_CANCEL",DC_CLOSE:"CLOSE",DC_RESPONSE:"RESPONSE",DC_ERROR:"ERROR",DC_PIECE:"PIECE",DC_PIECE_DATA:"PIECE_DATA",DC_TIMEOUT:"TIMEOUT",DC_PIECE_ACK:"PIECE_ACK",DC_METADATA:"METADATA",DC_PLAT_ANDROID:"ANDROID",DC_PLAT_IOS:"IOS",DC_PLAT_WEB:"WEB",DC_CHOKE:"CHOKE",DC_UNCHOKE:"UNCHOKE",DC_HAVE:"HAVE",DC_HAVE_REVERSE:"HAVE_REVERSE",DC_LOST:"LOST",DC_GET_PEERS:"GET_PEERS",DC_PEERS:"PEERS",DC_STATS:"STATS",DC_PEER_SIGNAL:"PEER_SIGNAL",DC_PLAYLIST:"PLAYLIST",BM_LOST:"lost",BM_ADDED_SEG_:"BM_ADDED_SEG_",BM_ADDED_SN_:"BM_ADDED_SN_",BM_SEG_ADDED:"BM_SEG_ADDED",FRAG_CHANGED:"FRAG_CHANGED",FRAG_LOADED:"FRAG_LOADED",FRAG_LOADING:"FRAG_LOADING",RESTART_P2P:"RESTART_P2P",EXCEPTION:"exception",REQUESTING_MAP_HAVE:"REQUESTING_MAP_HAVE",BUILDER_MAP_HAVE:"BUILDER_MAP_HAVE",SYN_OUTPUT:"SYN_OUTPUT",SYN_ERROR:"SYN_ERROR",SYN_PARTIAL:"SYN_PARTIAL"},hls_next_events={...events,SCH_DCHAVE:"SCH_DCHAVE",STREAM_DETECT:"STREAM_DETECT",STREAM_DISABLE:"STREAM_DETECT",SW_PLAYLIST:"SW_PLAYLIST",SW_GET_PLAYLIST:"SW_GET_PLAYLIST",SW_MEDIA:"SW_MEDIA",SW_GET_MEDIA:"SW_GET_MEDIA",LEVEL_LOADED:"LEVEL_LOADED",MANIFEST_PARSED:"MANIFEST_PARSED",FRAG_LOADED:"FRAG_LOADED"};var _events_3_3_0_events_events=__webpack_require__(204),events_default=__webpack_require__.n(_events_3_3_0_events_events),utils_buffer=__webpack_require__(47),queue_microtask=__webpack_require__(77),queue_microtask_default=__webpack_require__.n(queue_microtask);const MAX_BUFFERED_AMOUNT=65536,ICECOMPLETE_TIMEOUT=5e3,CHANNEL_CLOSING_TIMEOUT=5e3;function filterTrickle(e){return e.replace(/a=ice-options:trickle\s\n/g,"")}function warn(e){console.warn(e)}class Peer extends(events_default()){constructor(e){super(),this.channelName=e.initiator?e.channelName:null,this.initiator=e.initiator||!1,this.channelConfig=e.channelConfig||Peer.channelConfig,this.channelNegotiated=this.channelConfig.negotiated,this.config=Object.assign({},Peer.config,e.config),this.offerOptions=e.offerOptions||{},this.answerOptions=e.answerOptions||{},this.sdpTransform=e.sdpTransform||(e=>e),this.trickle=void 0===e.trickle||e.trickle,this.allowHalfTrickle=void 0!==e.allowHalfTrickle&&e.allowHalfTrickle,this.iceCompleteTimeout=e.iceCompleteTimeout||ICECOMPLETE_TIMEOUT,this.destroyed=!1,this.destroying=!1,this._connected=!1,this.remoteAddress=void 0,this.remoteFamily=void 0,this.remotePort=void 0,this.localAddress=void 0,this.localFamily=void 0,this.localPort=void 0,this._wrtc=e.wrtc&&"object"==typeof e.wrtc?e.wrtc:getBrowserRTC(),this._pcReady=!1,this._channelReady=!1,this._iceComplete=!1,this._iceCompleteTimer=null,this._channel=null,this._pendingCandidates=[],this._isNegotiating=!1,this._firstNegotiation=!0,this._batchedNegotiation=!1,this._queuedNegotiation=!1,this._sendersAwaitingStable=[],this._senderMap=new Map,this._closingInterval=null,this._chunk=null,this._cb=null,this._interval=null;try{this._pc=new this._wrtc.RTCPeerConnection(this.config)}catch(e){return void queue_microtask_default()((()=>this.destroy(e)))}this._isReactNativeWebrtc="number"==typeof this._pc._peerConnectionId,this._pc.oniceconnectionstatechange=()=>{this._onIceStateChange()},this._pc.onicegatheringstatechange=()=>{this._onIceStateChange()},this._pc.onconnectionstatechange=()=>{this._onConnectionStateChange()},this._pc.onsignalingstatechange=()=>{this._onSignalingStateChange()},this._pc.onicecandidate=e=>{this._onIceCandidate(e)},this.initiator||this.channelNegotiated?this._setupData({channel:this._pc.createDataChannel(this.channelName,this.channelConfig)}):this._pc.ondatachannel=e=>{this._setupData(e)},this._needsNegotiation()}get bufferSize(){return this._channel&&this._channel.bufferedAmount||0}get connected(){return this._connected&&"open"===this._channel.readyState}signal(e){if(this.destroyed)throw new Error("cannot signal after peer is destroyed");if("string"==typeof e)try{e=JSON.parse(e)}catch(t){e={}}e.renegotiate&&this.initiator&&this._needsNegotiation(),e.candidate&&(this._pc.remoteDescription&&this._pc.remoteDescription.type?this._addIceCandidate(e.candidate):this._pendingCandidates.push(e.candidate)),e.sdp&&this._pc.setRemoteDescription(new this._wrtc.RTCSessionDescription(e)).then((()=>{this.destroyed||(this._pendingCandidates.forEach((e=>{this._addIceCandidate(e)})),this._pendingCandidates=[],"offer"===this._pc.remoteDescription.type&&this._createAnswer())})).catch((e=>{this.destroy(e)})),e.sdp||e.candidate||e.renegotiate||e.transceiverRequest||this.destroy(new Error("signal() called with invalid signal data"))}_addIceCandidate(e){const t=new this._wrtc.RTCIceCandidate(e);this._pc.addIceCandidate(t).catch((e=>{!t.address||t.address.endsWith(".local")?warn("Ignoring unsupported ICE candidate."):this.destroy(e)}))}send(e){this._channel.send(e)}_needsNegotiation(){this._batchedNegotiation||(this._batchedNegotiation=!0,queue_microtask_default()((()=>{this._batchedNegotiation=!1,!this.initiator&&this._firstNegotiation||this.negotiate(),this._firstNegotiation=!1})))}negotiate(){this.initiator?this._isNegotiating?this._queuedNegotiation=!0:setTimeout((()=>{this._createOffer()}),0):this._isNegotiating?this._queuedNegotiation=!0:this.emit("signal",{type:"renegotiate",renegotiate:!0}),this._isNegotiating=!0}destroy(e){this._destroy(e)}_destroy(e){this.destroyed||this.destroying||(this.destroying=!0,queue_microtask_default()((()=>{if(this.destroyed=!0,this.destroying=!1,this._connected=!1,this._pcReady=!1,this._channelReady=!1,this._senderMap=null,clearInterval(this._closingInterval),this._closingInterval=null,clearInterval(this._interval),this._interval=null,this._chunk=null,this._cb=null,this._channel){try{this._channel.close()}catch(e){}this._channel.onmessage=null,this._channel.onopen=null,this._channel.onclose=null,this._channel.onerror=null}if(this._pc){try{this._pc.close()}catch(e){}this._pc.oniceconnectionstatechange=null,this._pc.onicegatheringstatechange=null,this._pc.onsignalingstatechange=null,this._pc.onicecandidate=null,this._pc.ondatachannel=null}this._pc=null,this._channel=null,e&&this.emit("error",e),this.emit("close")})))}_setupData(e){if(!e.channel)return this.destroy(new Error("Data channel event is missing `channel` property"));this._channel=e.channel,this._channel.binaryType="arraybuffer","number"==typeof this._channel.bufferedAmountLowThreshold&&(this._channel.bufferedAmountLowThreshold=MAX_BUFFERED_AMOUNT),this.channelName=this._channel.label,this._channel.onmessage=e=>{this._onChannelMessage(e)},this._channel.onbufferedamountlow=()=>{this._onChannelBufferedAmountLow()},this._channel.onopen=()=>{this._onChannelOpen()},this._channel.onclose=()=>{this._onChannelClose()},this._channel.onerror=e=>{this.destroy(e)};let t=!1;this._closingInterval=setInterval((()=>{this._channel&&"closing"===this._channel.readyState?(t&&this._onChannelClose(),t=!0):t=!1}),CHANNEL_CLOSING_TIMEOUT)}get isBufferedAmountHigh(){return this._channel.bufferedAmount>MAX_BUFFERED_AMOUNT}write(e,t){if(this.destroyed)return t(new Error("cannot write after peer is destroyed"));if(this._connected){try{this.send(e)}catch(e){return this.destroy(e)}this.isBufferedAmountHigh?this._cb=t:t(null)}else this._chunk=e,this._cb=t}_startIceCompleteTimeout(){this.destroyed||this._iceCompleteTimer||(this._iceCompleteTimer=setTimeout((()=>{this._iceComplete||(this._iceComplete=!0,this.emit("iceTimeout"),this.emit("_iceComplete"))}),this.iceCompleteTimeout))}_createOffer(){this.destroyed||this._pc.createOffer(this.offerOptions).then((e=>{if(this.destroyed)return;this.trickle||this.allowHalfTrickle||(e.sdp=filterTrickle(e.sdp)),e.sdp=this.sdpTransform(e.sdp);const t=()=>{if(this.destroyed)return;const t=this._pc.localDescription||e;this.emit("signal",{type:t.type,sdp:t.sdp})};this._pc.setLocalDescription(e).then((()=>{this.destroyed||(this.trickle||this._iceComplete?t():this.once("_iceComplete",t))})).catch((e=>{this.destroy(e)}))})).catch((e=>{this.destroy(e)}))}_createAnswer(){this.destroyed||this._pc.createAnswer(this.answerOptions).then((e=>{if(this.destroyed)return;this.trickle||this.allowHalfTrickle||(e.sdp=filterTrickle(e.sdp)),e.sdp=this.sdpTransform(e.sdp);const t=()=>{if(this.destroyed)return;const t=this._pc.localDescription||e;this.emit("signal",{type:t.type,sdp:t.sdp})};this._pc.setLocalDescription(e).then((()=>{this.destroyed||(this.trickle||this._iceComplete?t():this.once("_iceComplete",t))})).catch((e=>{this.destroy(e)}))})).catch((e=>{this.destroy(e)}))}_onConnectionStateChange(){this.destroyed||"failed"===this._pc.connectionState&&this.destroy(new Error("Connection failed."))}_onIceStateChange(){if(this.destroyed)return;const e=this._pc.iceConnectionState,t=this._pc.iceGatheringState;this.emit("iceStateChange",e,t),"connected"!==e&&"completed"!==e||(this._pcReady=!0,this._maybeReady()),"failed"===e&&this.destroy(new Error("Ice connection failed.")),"closed"===e&&this.destroy(new Error("Ice connection closed."))}getStats(e){const t=e=>("[object Array]"===Object.prototype.toString.call(e.values)&&e.values.forEach((t=>{Object.assign(e,t)})),e);0===this._pc.getStats.length||this._isReactNativeWebrtc?this._pc.getStats().then((s=>{const r=[];s.forEach((e=>{r.push(t(e))})),e(null,r)}),(t=>e(t))):this._pc.getStats.length>0?this._pc.getStats((s=>{if(this.destroyed)return;const r=[];s.result().forEach((e=>{const s={};e.names().forEach((t=>{s[t]=e.stat(t)})),s.id=e.id,s.type=e.type,s.timestamp=e.timestamp,r.push(t(s))})),e(null,r)}),(t=>e(t))):e(null,[])}_maybeReady(){if(this._connected||this._connecting||!this._pcReady||!this._channelReady)return;this._connecting=!0;const e=()=>{this.destroyed||this.getStats(((t,s)=>{if(this.destroyed)return;t&&(s=[]);const r={},n={},i={};let o=!1;s.forEach((e=>{"remotecandidate"!==e.type&&"remote-candidate"!==e.type||(r[e.id]=e),"localcandidate"!==e.type&&"local-candidate"!==e.type||(n[e.id]=e),"candidatepair"!==e.type&&"candidate-pair"!==e.type||(i[e.id]=e)}));const a=e=>{o=!0;let t=n[e.localCandidateId];t&&(t.ip||t.address)?(this.localAddress=t.ip||t.address,this.localPort=Number(t.port)):t&&t.ipAddress?(this.localAddress=t.ipAddress,this.localPort=Number(t.portNumber)):"string"==typeof e.googLocalAddress&&(t=e.googLocalAddress.split(":"),this.localAddress=t[0],this.localPort=Number(t[1])),this.localAddress&&(this.localFamily=this.localAddress.includes(":")?"IPv6":"IPv4");let s=r[e.remoteCandidateId];s&&(s.ip||s.address)?(this.remoteAddress=s.ip||s.address,this.remotePort=Number(s.port)):s&&s.ipAddress?(this.remoteAddress=s.ipAddress,this.remotePort=Number(s.portNumber)):"string"==typeof e.googRemoteAddress&&(s=e.googRemoteAddress.split(":"),this.remoteAddress=s[0],this.remotePort=Number(s[1])),this.remoteAddress&&(this.remoteFamily=this.remoteAddress.includes(":")?"IPv6":"IPv4")};if(s.forEach((e=>{"transport"===e.type&&e.selectedCandidatePairId&&a(i[e.selectedCandidatePairId]),("googCandidatePair"===e.type&&"true"===e.googActiveConnection||("candidatepair"===e.type||"candidate-pair"===e.type)&&e.selected)&&a(e)})),o||Object.keys(i).length&&!Object.keys(n).length){if(this._connecting=!1,this._connected=!0,this._chunk){try{this.send(this._chunk)}catch(t){return this.destroy(t)}this._chunk=null;const e=this._cb;this._cb=null,e(null)}"number"!=typeof this._channel.bufferedAmountLowThreshold&&(this._interval=setInterval((()=>this._onInterval()),150),this._interval.unref&&this._interval.unref()),this.emit("connect")}else setTimeout(e,100)}))};e()}_onInterval(){!this._cb||!this._channel||this._channel.bufferedAmount>MAX_BUFFERED_AMOUNT||this._onChannelBufferedAmountLow()}_onSignalingStateChange(){this.destroyed||("stable"===this._pc.signalingState&&(this._isNegotiating=!1,this._sendersAwaitingStable.forEach((e=>{this._pc.removeTrack(e),this._queuedNegotiation=!0})),this._sendersAwaitingStable=[],this._queuedNegotiation?(this._queuedNegotiation=!1,this._needsNegotiation()):this.emit("negotiated")),this.emit("signalingStateChange",this._pc.signalingState))}_onIceCandidate(e){this.destroyed||(e.candidate&&this.trickle?this.emit("signal",{type:"candidate",candidate:{candidate:e.candidate.candidate,sdpMLineIndex:e.candidate.sdpMLineIndex,sdpMid:e.candidate.sdpMid}}):e.candidate||this._iceComplete||(this._iceComplete=!0,this.emit("_iceComplete")),e.candidate&&this._startIceCompleteTimeout())}_onChannelMessage(e){if(this.destroyed)return;let t=e.data;t instanceof ArrayBuffer&&(t=utils_buffer.l.from(t)),this.emit("data",t)}_onChannelBufferedAmountLow(){if(this.destroyed||!this._cb)return;const e=this._cb;this._cb=null,e(null)}_onChannelOpen(){this._connected||this.destroyed||(this._channelReady=!0,this._maybeReady())}_onChannelClose(){this.destroyed||this.destroy()}}Peer.config={iceServers:[{urls:["stun:stun.l.google.com:19302","stun:global.stun.twilio.com:3478"]}],sdpSemantics:"unified-plan"},Peer.channelConfig={};const peer_channel=Peer;class Segment{constructor(e,t,s,r,n=0){this.sn=e,this.segId=t,this.data=s,this.fromPeerId=r,this.level=n||0}static fromSegment(e){return new Segment(e.sn,e.segId,e.data,e.fromPeerId,e.level)}get size(){return this.data.byteLength}get isSequential(){return this.sn>=0}}var platform=__webpack_require__(422),platform_default=__webpack_require__.n(platform);const delimiter="|",arrayDelimiter=",",candTypeMap={h:"host",s:"srflx",p:"prflx",r:"relay"},sdpType2Char=(e,t)=>{let s;switch(e){case"candidate":s="c";break;case"offer":s=t?"q":"o";break;case"answer":s=t?"s":"a"}return s},char2SdpType=e=>{let t={};switch(e){case"o":t={type:"offer"};break;case"q":t={type:"offer",trickle:!0};break;case"a":t={type:"answer"};break;case"s":t={type:"answer",trickle:!0};break;case"c":t={type:"candidate",trickle:!0}}return t},charOffset=0,bytesToStr=e=>"number"==typeof e?bytesToStr([e]):String.fromCharCode(...e.map((e=>e+charOffset))),strToBytes=e=>e.split("").map((e=>e.charCodeAt(0)-charOffset));function parseCand(e){const[,t,s,r,n,i,o,a,h,l,c,d,u,g,f]=/(\S*) (\d*) (\S*) (\d*) (\S*) (\d*) typ (\S*)(?: raddr (\S*) rport (\d*))?(?: tcptype (\S*))?(?: generation (\d*))?(?: ufrag (\S*))?(?: network-id (\d*))?(?: network-cost (\d*))?/.exec(e);return{foundation:t,component:s,transport:r,priority:n,ip:i,port:o,type:a,raddr:h,rport:l,tcptype:c,generation:d,networkId:g,networkCost:f,ufrag:u}}function pack({type:e,sdp:t,candidate:s}){return t&&t.startsWith("v=0")?packSdp(e,t):"candidate"===e&&s?packCandidate(s.candidate):null}function packCandidate(e){const t=e.indexOf(":");if(t<=0)return null;let s=packCandItem(e.slice(t+1).trim());return s?sdpType2Char("candidate")+s.cand:null}function packSdp(e,t){let s,r,n,i=[],o=!1,a=!1;for(const e of t.split("\r\n")){const t=e.indexOf(":");if(t<=0)continue;if("a=ice-options:trickle"===e){a=!0;continue}const[h,l]=[e.slice(0,t),e.slice(t+1).trim()];switch(h){case"a=ice-ufrag":s=l;break;case"a=ice-pwd":r=l;break;case"a=fingerprint":n=bytesToStr(l.substr("sha-256".length).trim().split(":").map((e=>parseInt(e,16))));break;case"a=candidate":let e=packCandItem(l,o);if(!e)continue;if(e.local){if(o)continue;o=!0}i.push(e.cand)}}return sdpType2Char(e,a)+n+(i.length>0?i.join(arrayDelimiter):"")+(a?"":delimiter)+s+delimiter+r}function packCandItem(e){let t=!1;const s=parseCand(e);if("TCP"===s.transport)return null;s.ip.endsWith(".local")&&(t=!0);let r=s.type.charAt(0);const n=s.ip.split(".");if(4===n.length){const e=n.reduce((function(e,t){return(e<<8)+parseInt(t,10)}));r=`${r}${s.foundation} ${e}:${parseInt(s.port)}`}else r=`${r}${s.foundation} ${s.ip} ${s.port}`;return{cand:r,local:t}}function unpack(e,t){const s=char2SdpType(e.substr(0,1));return s?"candidate"===s.type?unpackCand(e):unpackSdp(s.type,t,e,s.trickle):null}function unpackCand(e){let t=unpackCandItem(e.substr(1),100);return t?{type:"candidate",candidate:{candidate:`candidate:${t}`,sdpMLineIndex:0,sdpMid:"0"}}:null}function unpackSdp(e,t,s,r){const n=strToBytes(s.slice(1,33)).map((e=>("0"+e.toString(16)).slice(-2))),i=s.substr(33);let o,a,h;r?[a,h]=i.split(delimiter):[o,a,h]=i.split(delimiter);const l=r?[]:o.split(arrayDelimiter),c=["v=0",`o=- ${t} 2 IN IP4 127.0.0.1`,"s=-","t=0 0","a=group:BUNDLE 0","a=msid-semantic: WMS","m=application 9 UDP/DTLS/SCTP webrtc-datachannel","c=IN IP4 0.0.0.0","a=mid:0","a=sctp-port:5000","a=setup:"+("answer"===e?"active":"actpass"),`a=ice-ufrag:${a}`,`a=ice-pwd:${h}`,`a=fingerprint:sha-256 ${n.join(":").toUpperCase()}`];r&&c.push("a=ice-options:trickle");let d=100;for(const e of l){let t=unpackCandItem(e,d);t&&(d--,c.push(`a=candidate:${t}`))}return{type:e,sdp:c.join("\r\n")+"\r\n"}}function unpackCandItem(e,t){let s,r,n;const i=candTypeMap[e.substr(0,1)],o=e.substr(1).split(" ");if(2===o.length){n=o[0];const e=o[1].split(":");s=[e[0]>>24&255,e[0]>>16&255,e[0]>>8&255,255&e[0]].join("."),r=e[1]}else[n,s,r]=o;return`${[n,1,"udp",t,s,r,"typ",i].join(" ")}`}const DC_TOLERANCE=2,DEFAULT_PACKET_SIZE=64e3,ALPHA=.6,SIGNAL_PACK_VER=1;class peer_Peer extends(events_default()){static get defaultPacketSize(){return DEFAULT_PACKET_SIZE}static get VERSION(){return"8"}constructor(e,t,s,r,n,i,o={}){super(),this.engine=e,this.channel=e.fetcher.channelId,this.logger=e.logger,this.config=n,this.isInitiator=r,this.options=o,this.typeExpected=i,this.remotePeerId=s,this.intermediator=o.intermediator||null,this.channelId=r?`${t}-${s}`:`${s}-${t}`,this.cpr=0,this.platform="unknown",this.mobile=!1,this.mobileWeb=!1,this.connected=!1,this.msgQueue=[],this.miss=0,this.notifySet=new Set,this.bufArr=[],this.packetSize=DEFAULT_PACKET_SIZE,this.connTimeout=setTimeout((()=>{this.logger.warn(`dc ${this.channelId} connection timeout`),this.emit(events.DC_ERROR,!0)}),25e3),this.sendReqQueue=[],this.downloading=!1,this.uploading=!1,this.choked=!1,this.streamListeners=[],this.pieceMsg={},this.uploadInterrupter={targetSegId:void 0,currentSegId:void 0,canceled:!1},this.datasToSend=[],this.dataWriting=!1,this.timeSendRequest=0,this.timeReceivePiece=0,this.timeSendPiece=0,this.weight=0,this.peersConnected=1,this.timeJoin=getCurrentTs(),this.uploadSpeed=0,this.gotPeers=!1,this.currentLevel=0,this.currentPos=0;let a={};if(this.options.stuns.length>0){const e=[];this.options.stuns.forEach((t=>{this.logger.info(`use stun ${t}`),e.push({urls:t})})),a.iceServers=e}this.config.webRTCConfig&&(a={...this.config.webRTCConfig,...a}),this.playlistMap=new Map,this._datachannel=new peer_channel({initiator:r,channelName:this.channelId,trickle:o.trickle||!1,config:a}),this._init(this._datachannel),this.dataExchangeTs=this.timeJoin,this.gotStatsTs=this.timeJoin,this.notFatalClosed=!1,this.startSN=Number.MAX_SAFE_INTEGER,this.endSN=-1,this._loadedBytes=0}get isAvailable(){return this.downloadNum<2&&!this.choked}get isAvailableUrgently(){return!this.downloading&&!this.choked}cancelDownload(e,t,s){if(s&&this.downloading&&!(this.streamListeners.length>0||this.remainAttachments<=2))return this.logger.warn(`cancel download ${s} remain packets ${this.remainAttachments}`),this.sendJson({event:events.DC_PIECE_CANCEL,sn:e,level:t,seg_id:s})}addStreamListener(e,t,s){this.streamListeners.push({handler:s,peerId:t})}removeStreamListener(e){this.streamListeners=this.streamListeners.filter((t=>t.peerId!==e||(t.handler(void 0,void 0,!0,"aborted by cancel"),!1)))}_init(e){e.on("error",(e=>{let t=!0;"Ice connection failed."===e.message&&this.notFatalClosed&&(t=!1),this.emit(events.DC_ERROR,t)})),e.on("signal",(e=>{if(this.cpr===SIGNAL_PACK_VER){const t=pack(e);t?e=t:this.logger.error("signal pack error")}this.emit(events.DC_SIGNAL,e)}));e.on("connect",(()=>{for(this.logger.info(`datachannel CONNECTED to ${this.remotePeerId} from ${this.intermediator?"peer":"server"}`),this.connected=!0,clearTimeout(this.connTimeout),this.emit(events.DC_OPEN);this.msgQueue.length>0;){let e=this.msgQueue.shift();this.emit(e.event,e)}})),e.on("data",(e=>{const{logger:t}=this;if("string"==typeof e){let s=JSON.parse(e);if(!this.connected)return void this.msgQueue.push(s);let r,n=s.event;switch(r=n!==events.DC_PLAYLIST&&n!==events.DC_PEER_SIGNAL?`string: ${e}`:`event: ${n}`,t.debug(`datachannel receive ${r} from ${this.remotePeerId}`),n){case events.DC_HAVE:if(this.emit(s.event,s),!s.sn)return;this.config.live||(s.sn<this.startSN&&(this.startSN=s.sn),s.sn>this.endSN&&(this.endSN=s.sn));break;case events.DC_PIECE:this.downloading=!0,this.dataExchangeTs=getCurrentTs(),this.timeReceivePiece=performance.now(),this.pieceMsg=s,this._prepareForBinary(s.attachments,s.seg_id,s.sn,s.size),this.emit(s.event,s);break;case events.DC_PIECE_CANCEL:this.uploadInterrupter.targetSegId=s.seg_id,this.emit(s.event,s);break;case events.DC_PIECE_NOT_FOUND:this._sendNextReq()||(this.downloading=!1),this.emit(s.event,s);break;case events.DC_REQUEST:this._handleRequestMsg(s);break;case events.DC_PIECE_ACK:this._handlePieceAck(s),this.emit(s.event,s);break;case events.DC_STATS:this._handleStats(s);break;case events.DC_PLAYLIST:this.config.sharePlaylist&&this._handlePlaylist(s);break;case events.DC_METADATA:this._handleMetadata(s);break;case events.DC_PIECE_ABORT:this.downloading&&(this._notifyDownloadListenersAbort("aborted by upstream peer"),this.emit(events.DC_PIECE_ABORT,s));break;case events.DC_CHOKE:t.info(`choke peer ${this.remotePeerId}`),this.choked=!0;break;case events.DC_UNCHOKE:t.info(`unchoke peer ${this.remotePeerId}`),this.choked=!1;break;case events.DC_CLOSE:this.emit(s.event,s.fatal||!1);break;default:this.emit(s.event,s)}}else{if(!this.downloading)return void t.warn(`peer not downloading, data size ${e.byteLength} pieceMsg ${JSON.stringify(this.pieceMsg)}`);this._handleBinaryMsg(e)}})),e.once("close",(()=>{this.emit(events.DC_CLOSE,!1)})),e.on("iceStateChange",((e,t)=>{"disconnected"===e&&(this.logger.warn(`${this.remotePeerId} disconnected`),this.connected=!1)}))}sendJson(e){e.event!==events.DC_PLAYLIST&&e.event!==events.DC_PEER_SIGNAL?this.logger.debug(`dc bufferSize ${this._datachannel.bufferSize} send ${JSON.stringify(e)} to ${this.remotePeerId}`):this.logger.debug(`dc send event ${e.event} to ${this.remotePeerId}`);const t=JSON.stringify(e);return t.length>DEFAULT_PACKET_SIZE?(this.logger.error("string to send is too large"),!1):this.send(t,!1)}send(e,t=!0){return t?(this.datasToSend.push(e),this.dataWriting||this._sendDataSync(),!0):this.sendImmediately(e)}_checkIfNeedInterrupt(){const{targetSegId:e,currentSegId:t,canceled:s}=this.uploadInterrupter;return!!s||!(!e||e!==t)&&(this.logger.warn("cancel send data"),this.sendMsgPieceAbort(`${t} transfer canceled`),this.datasToSend=[],this.uploadInterrupter.canceled=!0,!0)}_sendDataSync(){if(this._checkIfNeedInterrupt()||0===this.datasToSend.length)return void(this.dataWriting=!1);this.dataWriting=!0;const e=this.datasToSend.shift();this._datachannel.write(e,(e=>{if(e)return this.dataWriting=!1,this.logger.warn(e.message),void this.emit(events.DC_ERROR,!1);this._sendDataSync()}))}sendImmediately(e){if(this._datachannel.connected)try{return this._datachannel.send(e),!0}catch(e){this.logger.warn(`datachannel ${this.channelId} send data failed, close it`),this.emit(events.DC_ERROR,!1)}return!1}sendMsgHave(e,t,s={}){const r=s.reverse||void 0;delete s.reverse,this.sendJson({event:r?events.DC_HAVE_REVERSE:events.DC_HAVE,sn:e,seg_id:t,...s})}sendPieceNotFound(e,t,s={}){this.uploading=!1,this.sendJson({event:events.DC_PIECE_NOT_FOUND,seg_id:t,sn:e,...s})}sendPeers(e){this.sendJson({event:events.DC_PEERS,peers:e})}sendPeersRequest(){this.sendJson({event:events.DC_GET_PEERS})}sendMsgStats(e,t={}){const s={event:events.DC_STATS,total_conns:e,...t};this.sendJson(s)}sendMsgPlaylist(e,t,s){if(this.playlistMap.has(e)){if(this.playlistMap.get(e).seq>=s)return}const r={event:events.DC_PLAYLIST,url:e,data:t,seq:s};this.sendJson(r)}sendMsgSignal(e,t,s){return this.sendJson({event:events.DC_PEER_SIGNAL,action:"signal",to_peer_id:e,from_peer_id:t,data:s})}sendMsgSignalReject(e,t,s,r=!1){return this.sendJson({event:events.DC_PEER_SIGNAL,action:"reject",to_peer_id:e,from_peer_id:t,reason:s,fatal:r})}sendMetaData(e,t,s=0){this.isInitiator&&(this.timeSendRequest=performance.now()),this.sendJson({event:events.DC_METADATA,field:e,platform:events.DC_PLAT_WEB,mobile:!!platform_default().isMobile(),channel:this.channel,version:"2.3.10",sequential:t,peers:s})}sendPartialBuffer(e,t,s={}){this.sendMsgPiece(e,s);for(let e=0;e<t.length;e++)this.send(t[e])}sendMsgPiece(e,t={}){const{targetSegId:s}=this.uploadInterrupter;if(s&&s===e.seg_id)return this.logger.warn("cancel send piece msg"),this.sendMsgPieceAbort(`${s} piece canceled`),void(this.uploadInterrupter.canceled=!0);this.uploadInterrupter={currentSegId:e.seg_id,targetSegId:void 0,canceled:!1},this.datasToSend=[],e.ext||(e.ext={}),e.ext.from&&t.from&&(t.from=`${e.ext.from}->${t.from}`),t.incompletes&&e.ext.incompletes&&(t.incompletes+=e.ext.incompletes),t=Object.assign({},e.ext,t);const r={...e,ext:t};this.sendJson(r)}sendBuffer(e,t,s,r={}){const n=r.reverse||void 0;delete r.reverse;let i=s.byteLength,o=0,a=0;i%this.packetSize==0?a=i/this.packetSize:(a=Math.floor(i/this.packetSize)+1,o=i%this.packetSize);let h={event:events.DC_PIECE,attachments:a,seg_id:t,sn:e,level:r.level,size:i,reverse:n};delete r.level,this.sendMsgPiece(h,r);const l=dividePayload(s,this.packetSize,a,o);this._sendBufferArray(l,n),this.uploading=!1,this.timeSendPiece=performance.now()}get downloadNum(){return this.downloading?this.sendReqQueue.length+1:0}requestDataById(e,t,s=!1,r={}){const n={event:events.DC_REQUEST,seg_id:e,sn:t,...r,urgent:s};this.downloading?(this.logger.info(`${this.remotePeerId} add req ${e} in queue`),s?this.sendReqQueue.unshift(n):this.sendReqQueue.push(n)):this._realRequestData(n)}requestDataBySN(e,t=!1,s={}){const r={event:events.DC_REQUEST,sn:e,...s,urgent:t};this.downloading?(this.logger.info(`add req ${e} in queue`),t?this.sendReqQueue.unshift(r):this.sendReqQueue.push(r)):this._realRequestData(r)}_sendBufferArray(e,t=!1){const s=t?e.reverse():e;for(let e=0;e<s.length;e++)this.send(s[e])}_realRequestData(e){this.sendJson(e),this.timeSendRequest=performance.now(),this.downloading=!0}shouldWaitForRemain(e){return 0!==this.bufArr.length&&(0!==this.timeReceivePiece&&this.currentLoadSpeed()>=this.minRequiredSpeed(e))}close(e){e||(this.notFatalClosed=!0),this.emit(events.DC_CLOSE,e)}receiveSignal(e){e.type||e.candidate||(this.cpr=SIGNAL_PACK_VER,e=unpack(e,this.cpr+"")),e&&this._datachannel.signal(e)}_notifyDownloadListenersAbort(e){for(let t of this.streamListeners){const{handler:s}=t;s(void 0,void 0,!0,e)}this.streamListeners=[]}destroy(e=!0){this.logger.info(`destroy datachannel ${this.channelId}`),this.chokeTimer&&clearTimeout(this.chokeTimer),this.connTimeout&&clearTimeout(this.connTimeout),this.uploading&&this.sendMsgPieceAbort("peer is closing"),this._notifyDownloadListenersAbort("upstream peer is closed");let t={event:events.DC_CLOSE,fatal:e};this.sendJson(t),this._datachannel.removeAllListeners(),this.removeAllListeners(),this._datachannel.destroy(),this.engine=null}_handleBinaryMsg(e){const{attachments:t,level:s,reverse:r}=this.pieceMsg;this.bufArr.push(e),this._loadedBytes+=e.byteLength,this.remainAttachments--;let n=r?this.remainAttachments+1:t-this.remainAttachments;const i=0===this.remainAttachments;if(i&&(this._sendNextReq()||(this.downloading=!1)),this.emit(events.DC_PIECE_DATA,this.bufSN,this.segId,e,n,i,this.pieceMsg),this.streamListeners.length>0)for(let t of this.streamListeners){const{handler:s}=t;s(this.bufSN,this.segId,!1,e,i)}if(i){if(this.streamListeners=[],this.timeSendRequest>0){const e=this.expectedSize/(performance.now()-this.timeSendRequest);this.weight=this.weight>0?ALPHA*this.weight+(1-ALPHA)*e:e}this.sendJson({event:events.DC_PIECE_ACK,sn:this.bufSN,seg_id:this.segId,level:s,size:this.expectedSize,miss:this.miss||void 0}),this.timeSendRequest=0,this.timeReceivePiece=0,this._handleBinaryData(r)}}_sendNextReq(){if(this.sendReqQueue.length>0){const e=this.sendReqQueue.shift();return this.logger.info(`get msg from sendReqQueue ${JSON.stringify(e)}`),this._realRequestData(e),!0}return!1}_handlePlaylist(e){const{url:t,data:s,seq:r}=e;this.playlistMap.set(t,{data:s,seq:r})}getLatestPlaylist(e,t){if(!this.playlistMap.has(e))return null;const s=this.playlistMap.get(e);return s.seq<=t?null:s}_handleMetadata(e){const{logger:t}=this;if(this.isInitiator){const e=performance.now()-this.timeSendRequest;e>0&&(this.weight=1e5/e,t.info(`handle Metadata from ${this.remotePeerId} initial weight ${this.weight}`)),this.timeSendRequest=0}const s=e.channel;if(!s)return t.error(`peer channel ${s} is null!`),void this.emit(events.DC_ERROR,!0);if(this.channel!==s)return t.error(`peer channel ${s} not matched!`),void this.emit(events.DC_ERROR,!0);switch(e.platform){case events.DC_PLAT_ANDROID:this.platform=events.DC_PLAT_ANDROID;break;case events.DC_PLAT_IOS:this.platform=events.DC_PLAT_IOS;break;case events.DC_PLAT_WEB:this.platform=events.DC_PLAT_WEB}if(this.mobile=e.mobile||!1,this.mobileWeb=this.mobile&&this.platform===events.DC_PLAT_WEB||!1,this.sequential=e.sequential,this.sequential!==this.typeExpected)return t.error(`peer sequential type ${this.sequential} not matched!`),void this.emit(events.DC_ERROR,!0);if(t.info(`${this.remotePeerId} platform ${this.platform} sequential ${this.sequential}`),e.peers&&(this.peersConnected+=e.peers,t.info(`${this.remotePeerId} now has ${this.peersConnected} peers`)),this.emit(events.DC_METADATA,e),e.field&&!this.config.live&&e.sequential){const{field:t}=e;if(Array.isArray(t))this._handleField(t);else for(let e in t)this._handleField(t[e])}}_handleField(e){e.forEach((e=>{e>=0&&(e<this.startSN&&(this.startSN=e),e>this.endSN&&(this.endSN=e))}))}_handleStats(e){this.gotStatsTs=getCurrentTs();const t=e.total_conns;t>0&&this.peersConnected!==t&&(this.peersConnected=t,this.logger.info(`${this.remotePeerId} now has ${this.peersConnected} peers`)),e.level&&(this.currentLevel=e.level),e.pos&&(this.currentPos=e.pos)}_handleRequestMsg(e){this.dataExchangeTs=getCurrentTs(),this.uploading?this.logger.warn(`${this.remotePeerId} is uploading when receive request`):(this.uploading=!0,this.emit(events.DC_REQUEST,e))}_handlePieceAck(e){0!==this.timeSendPiece&&(this.uploadSpeed=Math.round(e.size/(performance.now()-this.timeSendPiece)*2),this.timeSendPiece=0,this.logger.info(`${this.remotePeerId} uploadSpeed is ${this.uploadSpeed}`)),e.miss>0&&this.logger.warn(`peer ${this.remotePeerId} miss ${e.miss}`)}_prepareForBinary(e,t,s,r){this.bufArr=[],this._loadedBytes=0,this.remainAttachments=e,this.segId=t,this.bufSN=s,this.expectedSize=r}_handleBinaryData(e=!1){if(this.listenerCount(events.DC_RESPONSE)>0){e&&this.bufArr.reverse();let t=utils_buffer.l.concat(this.bufArr);const s=t.byteLength;if(s===this.expectedSize){let e=t.buffer;const s=new Segment(this.bufSN,this.segId,e,this.remotePeerId,this.pieceMsg.level);this.emit(events.DC_RESPONSE,s,this.weight)}else this.logger.error(`${this.segId} expectedSize ${this.expectedSize} != byteLength ${s}`)}this.segId="",this.bufArr=[],this._loadedBytes=0,this.expectedSize=-1}checkIfNeedChoke(e=!1){const{logger:t}=this,s=performance.now()-this.timeSendRequest;if(!e&&s<1500)t.info(`duration ${s} no need choke`);else if(this.miss++,t.info(`${this.remotePeerId} miss ${this.miss}`),this.miss>DC_TOLERANCE&&!this.choked){this.choked=!0;const e=30*this.miss;e<=150?(t.warn(`datachannel ${this.channelId} is choked`),this.chokeTimer=setTimeout((()=>{this.choked=!1,t.warn(`datachannel ${this.channelId} is unchoked`)}),1e3*e)):t.warn(`datachannel ${this.channelId} is choked permanently`)}}loadtimeout(){const{logger:e,bufArr:t,pieceMsg:s}=this;return e.warn(`timeout while downloading from ${this.remotePeerId}, ${t.length} of ${s.attachments} packets loaded`),this.emit(events.DC_TIMEOUT),this.checkIfNeedChoke(),!0}sendMsgPieceAbort(e){(this.uploading||0!==this.datasToSend.length)&&(this.uploading=!1,this.sendJson({event:events.DC_PIECE_ABORT,reason:e}))}loadedBytes(){return this._loadedBytes}currentLoadSpeed(){return 0===this.timeReceivePiece?0:this.loadedBytes()/(performance.now()-this.timeReceivePiece)}minRequiredSpeed(e){return(this.pieceMsg.size-this.loadedBytes())/e}}function dividePayload(e,t,s,r){let n=[];if(r){let i;for(let r=0;r<s-1;r++)i=e.slice(r*t,(r+1)*t),n.push(i);i=e.slice(e.byteLength-r,e.byteLength),n.push(i)}else{let r;for(let i=0;i<s;i++)r=e.slice(i*t,(i+1)*t),n.push(r)}return n}const peer=peer_Peer,CHECK_PEERS_INTERVAL=3;function noop(){return!0}function getQueryParam(e){return new URL(location.href).searchParams.get(e)}function updateQueryStringParam(e,t,s){var r=new RegExp("([?&])"+t+"=.*?(&|$)","i"),n=-1!==e.indexOf("?")?"&":"?";return e.match(r)?e.replace(r,"$1"+t+"="+s+"$2"):e+n+t+"="+s}function getCurrentTs(){return Date.parse(new Date)/1e3}function randomNum(e,t){return parseInt(Math.random()*(t-e+1)+e,10)}function calCheckPeersDelay(e){return 0===e?CHECK_PEERS_INTERVAL:.5*e+1.67}function performRangeRequest(e,t,s,r=3500){const n=new XMLHttpRequest;return new Promise(((i,o)=>{n.open("GET",e,!0),n.responseType="arraybuffer",n.timeout=r,n.onreadystatechange=e=>{if(4===n.readyState){const e=n.status;e>=200&&e<300?i(n.response):o(`status ${e}`)}},n.onerror=e=>{o("request error")},n.ontimeout=e=>{o("timeout")},n.setRequestHeader("Range",t||"bytes=0-0"),s&&s(n,e),n.send()})).catch((e=>{}))}function navLang(){return"zh-CN"===(navigator.language||navigator.userLanguage)?"cn":"en"}function dontWaitFor(e){e.then((()=>{}))}function timeout(e){return new Promise((t=>setTimeout(t,e)))}function getBrowserRTC(){if("undefined"==typeof window)return null;var e={RTCPeerConnection:window.RTCPeerConnection||window.mozRTCPeerConnection||window.webkitRTCPeerConnection,RTCSessionDescription:window.RTCSessionDescription||window.mozRTCSessionDescription||window.webkitRTCSessionDescription,RTCIceCandidate:window.RTCIceCandidate||window.mozRTCIceCandidate||window.webkitRTCIceCandidate};return e.RTCPeerConnection?e:null}function copyBuffer(e){const t=utils_buffer.l.from(e),s=new utils_buffer.l(e.byteLength);return t.copy(s),s}function getMaxSequence(e){const t=e.split("\n");let s=0;let r=0;for(let e of t){const t=/^#EXT-X-MEDIA-SEQUENCE:?(\-?[0-9.]*)?/.exec(e);if(t&&t[1]){s=parseInt(t[1],10);break}}for(let e of t)e.startsWith("#EXTINF")&&r++;return s+r-1}function isHttps(){return location.protocol.startsWith("https")}function isInteger(e){return"number"==typeof e&&e%1==0}function getHomeUrl(){return window.atob("aHR0cHM6Ly9zd2FybWNsb3VkLm5ldC9lbi8=")}function splitBytes(e,t){const s=peer.defaultPacketSize,r=e.byteLength-t,n=[];let i=t,o=Math.floor(r/s),a=r%s;for(let t=0;t<o;t++){const t=(0,utils_buffer.l)(s);e.copy(t,0,i,i+s),n.push(t),i+=s}if(a>0){const t=(0,utils_buffer.l)(a);e.copy(t,0,i,i+a),n.push(t)}return n}function getAvailableMemory(){const{memory:e}=performance;return e?e.jsHeapSizeLimit-e.usedJSHeapSize:-1}function trimMap(e,t){if(e.size<=t)return;const s=[...e.keys()];do{e.delete(s.shift())}while(e.size>t)}function trimSet(e,t){if(e.size<=t)return;const s=[...e.values()];do{e.delete(s.shift())}while(e.size>t)}const logMap={debug:0,info:1,warn:2,error:3,none:4};class Logger{constructor(e){this.logLevel=e,this.onlineDebug=!1,console.debug=console.log,"debug"!==e&&"info"!==e||(this.logLevel="warn"),!0===e?this.logLevel="warn":!1===e?this.logLevel="none":e in logMap||(this.logLevel="error"),this.resetLogger()}enableDebug(){this.onlineDebug=!0;for(let e in logMap)this[e]=console[e]}resetLogger(){this.onlineDebug=!1;for(let e in logMap)logMap[e]<logMap[this.logLevel]?this[e]=noop:this[e]=console[e]}get isDebugLevel(){return logMap[this.logLevel]<=2||this.onlineDebug}}const utils_logger=Logger;var url_toolkit=__webpack_require__(622),url_toolkit_default=__webpack_require__.n(url_toolkit);const players={DPlayer:"dplayer",CBPlayer:"cbplayer",jwplayer:"jwplayer",videojs:"videojs",Clappr:"clappr",ckplayer:"ckplayer",MediaElementPlayer:"mediaelement",MediaElement:"mediaelement",TcPlayer:"tcplayer",flowplayer:"flowplayer",Chimee:"chimee",ChimeePlayer:"chimee",HlsJsPlayer:"xgplayer",fluidPlayer:"fluidplayer",OpenPlayer:"openplayer",Plyr:"plyr",Playerjs:"playerjs",Aliplayer:"aliplayer",shaka:"shakaplayer"};function player_detector(){let e;for(let t in players)if(window[t]){e=players[t];break}return e}const SAM={_:"nllL",f:"d3NzJ",ss:"==",3:"TNBLy9z",8:"aWduY",u:"mNvbQ",qa:"WwuY2RuY"};class EngineBase extends(events_default()){constructor(e={}){if(super(),this.p2pEnabled=!(!1===e.p2pEnabled||"0"===getQueryParam("_p2p")),e.tag&&e.tag.length>20)throw new Error("Tag is too long");if(e.appName&&e.appName.length>30)throw new Error("appName is too long");if(e.appId&&e.appId.length>30)throw new Error("appId is too long");if(e.token&&e.token.length>20)throw new Error("Token is too long")}initLogger(){const{config:e}=this;e.showSlogan&&"en"===navLang()&&console.log(`%cEmpower your users to become the unlimitedly scalable CDN!\n%c${getHomeUrl()}`,"color: dodgerblue; padding:20px 0; font-size: x-large","font-size: medium; padding-bottom:15px");const t=new utils_logger(e.logLevel);return e.logger=this.logger=t,t}makeChannelId(e,t){if(!e||"string"!=typeof e){const e="token is required while using customized channelId!";throw console.error(e),new Error(e)}return(s,r)=>`${e}-${t(s,r)}`}makeSignalId(){let e="";const{config:t}=this,s=decodeURIComponent(window.atob(SAM.f+SAM[3]+SAM[8]+SAM.qa+SAM._+SAM.u+SAM.ss));if(t.wsSignalerAddr){let r;"object"!=typeof t.wsSignalerAddr||t.wsSignalerAddr.backup?"string"==typeof t.wsSignalerAddr&&(r=t.wsSignalerAddr):r=t.wsSignalerAddr.main,r===s&&(r=void 0),r&&(e=url_toolkit_default().parseURL(r).netLoc.substr(2))}else t.wsSignalerAddr=s;return e}get commonBrowserInfo(){const e=platform_default().getPlatform(),t=platform_default().getNetType()||"wifi";return this.netType=t,{device:e,netType:t,player:player_detector()||void 0}}setupWindowListeners(e){const t=["iPad","iPhone"].indexOf(navigator.platform)>=0?"pagehide":"beforeunload",s=()=>{this.fetcher&&this.fetcher.postStatsWithBeacon(),this.p2pEnabled&&this.disableP2P(),window.removeEventListener(t,s)};e?window.removeEventListener(t,s):window.addEventListener(t,s)}destroy(){this.disableP2P(!0),this.removeAllListeners(),this.setupWindowListeners(!0)}enableP2P(){return this.p2pEnabled?null:(this.logger&&this.logger.info("enable P2P"),this.config.p2pEnabled=this.p2pEnabled=!0,this.browserInfo?(this._init(this.channel,this.browserInfo),this):null)}get version(){return EngineBase.version}static isSupported(){const e=getBrowserRTC();return!(!e||void 0===e.RTCPeerConnection.prototype.createDataChannel)}}EngineBase.version="2.3.10",EngineBase.protocolVersion=peer.VERSION;const engine_base=EngineBase;function tryGetMediaElement(e,t){let s;if(e&&("string"==typeof e?s=document.querySelector(e):e instanceof HTMLMediaElement&&(s=e)),!s){const e=[...document.getElementsByTagName("video"),...document.getElementsByTagName("audio")];1===e.length?s=e[0]:(t&&(s=e.find((e=>e.src===t))),s||(s=e.find((e=>e.currentTime>0))))}return s}function calRangeWithForwardReverseOffset(e,t,s,r=0,n=0){const i=peer.defaultPacketSize;let o="bytes=",a=r,h=n||s-1;const l=Math.floor(s/i),c=s%i>0?l+1:l;if(e>=0&&(a+=(e+1)*i),o=`${o}${a}-`,t>=0&&t<c){h-=s%i+(c-t-1)*i,o=`${o}${h}`}else 0!==n&&(o=`${o}${h}`);return o}let commonConfig={wsMaxRetries:10,p2pEnabled:!0,wifiOnly:!1,memoryCacheLimit:{pc:629145600,mobile:314572800},dcDownloadTimeout:25,logLevel:"error",tag:"",webRTCConfig:{},token:void 0,appName:void 0,appId:void 0,prefetchNum:5,showSlogan:!1,trickleICE:!1,announceLocation:"cn",geoIpPreflight:!0,getStats:function(e,t,s){},getPeerId:function(e){},getPeersInfo:function(e){}};const config=commonConfig;let defaultP2PConfig={...config,httpLoadTime:3,sharePlaylist:!1,useHttpRange:!0,hlsjsInstance:null,proxyOnly:!1,p2pBlackList:["aac","mp3","vtt","webvtt","key"],live:!0,swFile:"./sw.js",swScope:"./",swAutoRegister:!0,mediaElem:void 0,httpStreamEnabled:!0,diskCacheLimit:{pc:262144e4,mobile:1572864e3},useDiskCache:!0};const hls_next_config=defaultP2PConfig,STORE_NOT_INIT="store not init";function promisifyRequest(e){return new Promise(((t,s)=>{e.oncomplete=e.onsuccess=()=>t(e.result),e.onabort=e.onerror=()=>s(e.error)}))}function createStores(e,t){const s=indexedDB.open(e);s.onupgradeneeded=()=>{const e=s.result;t.forEach((t=>{e.createObjectStore(t)}))};const r=promisifyRequest(s);return t.map((e=>(t,s)=>r.then((r=>s(r.transaction(e,t).objectStore(e))))))}function get(e,t){return t?t("readonly",(t=>promisifyRequest(t.get(e)))):Promise.reject(STORE_NOT_INIT)}function set(e,t,s){return s?s("readwrite",(s=>(s.put(t,e),promisifyRequest(s.transaction)))):Promise.reject(STORE_NOT_INIT)}function setMany(e,t){return t?t("readwrite",(t=>(e.forEach((e=>t.put(e[1],e[0]))),promisifyRequest(t.transaction)))):Promise.reject(STORE_NOT_INIT)}function getMany(e,t){return t?t("readonly",(t=>Promise.all(e.map((e=>promisifyRequest(t.get(e))))))):Promise.reject(STORE_NOT_INIT)}function update(e,t,s){return s?s("readwrite",(s=>new Promise(((r,n)=>{s.get(e).onsuccess=function(){try{s.put(t(this.result),e),r(promisifyRequest(s.transaction))}catch(e){n(e)}}})))):Promise.reject(STORE_NOT_INIT)}function del(e,t){return t?t("readwrite",(t=>(t.delete(e),promisifyRequest(t.transaction)))):Promise.reject(STORE_NOT_INIT)}function delMany(e,t){return t?t("readwrite",(t=>(e.forEach((e=>t.delete(e))),promisifyRequest(t.transaction)))):Promise.reject(STORE_NOT_INIT)}function clear(e){return e?e("readwrite",(e=>(e.clear(),promisifyRequest(e.transaction)))):Promise.reject(STORE_NOT_INIT)}function clearAll(e){return new Promise(((t,s)=>{indexedDB.databases().then((r=>{const n=r.filter((t=>t.name!==e)).map((e=>new Promise(((t,s)=>{const r=indexedDB.deleteDatabase(e.name);r.onsuccess=t,r.onerror=s,r.onblocked=s}))));Promise.all(n).then(t).catch(s)})).catch(s)})).catch((e=>{}))}function eachCursor(e,t){return e.openCursor().onsuccess=function(){this.result&&(t(this.result),this.result.continue())},promisifyRequest(e.transaction)}function keys(e){return e?e("readonly",(e=>{if(e.getAllKeys)return promisifyRequest(e.getAllKeys());const t=[];return eachCursor(e,(e=>t.push(e.key))).then((()=>t))})):Promise.reject(STORE_NOT_INIT)}function values(e){return e?e("readonly",(e=>{if(e.getAll)return promisifyRequest(e.getAll());const t=[];return eachCursor(e,(e=>t.push(e.value))).then((()=>t))})):Promise.reject(STORE_NOT_INIT)}function entries(e){return e?e("readonly",(t=>{if(t.getAll&&t.getAllKeys)return Promise.all([promisifyRequest(t.getAllKeys()),promisifyRequest(t.getAll())]).then((([e,t])=>e.map(((e,s)=>[e,t[s]]))));const s=[];return e("readonly",(e=>eachCursor(e,(e=>s.push([e.key,e.value]))).then((()=>s))))})):Promise.reject(STORE_NOT_INIT)}const KEY_METADATA_SIZE="size";class SegmentStore extends(events_default()){constructor(e,t){super(),this.name="SegmentStore",this.logger=t.logger,this.logger.info("use SegmentStore"),this.channel=e.channel;const s=e.browserInfo.device;this.isPC=s===platform_default().device.PC_WEB||s===platform_default().device.PC_NATIVE,this.maxBufSize=this.isPC?t.diskCacheLimit.pc:t.diskCacheLimit.mobile,this.overflowed=!1,this.loadingSN=0}async setupStore(){if(navigator.storage){const e=await navigator.storage.estimate(),t=Math.floor(e.quota-e.usage);t<this.maxBufSize&&(this.maxBufSize=t-104857600)}return new Promise((async(e,t)=>{if(this.isPC&&this.maxBufSize<629145600||!this.isPC&&this.maxBufSize<367001600)return void t("disk storage not enough");let s=createStores(this.channel,["segments","id2Sn","metadata"]);this.segmentsStore=s[0],this.id2SnStore=s[1],this.metaStore=s[2];const r=setTimeout((()=>{t("setupStore timeout")}),500);this._initMetaStore().then((()=>{clearTimeout(r),e()})).catch((e=>{t(e)}))}))}_initMetaStore(){return new Promise(((e,t)=>{get(KEY_METADATA_SIZE,this.metaStore).then((t=>{t||(this.logger.info("init MetaStore size"),set(KEY_METADATA_SIZE,0,this.metaStore)),e()})).catch((e=>{t()}))}))}currBufSize(){return get(KEY_METADATA_SIZE,this.metaStore)}async hasSegOfId(e){if(!e)return Promise.resolve(!1);const t=await get(e,this.id2SnStore);return new Promise(((s,r)=>{void 0!==t?get(t,this.segmentsStore).then((t=>{t&&t.length>0&&t.some((t=>t.segId===e))?s(!0):s(!1)})).catch((e=>{this.logger.error(e),s(!1)})):s(!1)}))}async getSegById(e){if(!e)return null;const t=await get(e,this.id2SnStore);return new Promise(((e,s)=>{void 0!==t?get(t,this.segmentsStore).then((t=>{t&&t.length>0?e(Segment.fromSegment(t[0])):e(null)})).catch((t=>{this.logger.error(t),e(null)})):e(null)}))}getSegIdBySN(e){return new Promise(((t,s)=>{get(e,this.segmentsStore).then((e=>{e&&e.length>0?t(e[0].segId):t(null)})).catch((e=>{this.logger.error(e),t(null)}))}))}putSeg(e){this._addSeg(e).then((e=>{this.emit(`${events.BM_ADDED_SN_}${e.sn}`,e),this.emit(events.BM_SEG_ADDED,e)})).catch((e=>{this.logger.error(e),("QuotaExceededError"===e.name||e.inner&&"QuotaExceededError"===e.inner.name)&&this._trimDisk(!0)}))}_addSeg(e){const{segId:t,sn:s}=e;return set(t,s,this.id2SnStore),new Promise(((r,n)=>{get(s,this.segmentsStore).then((i=>{i?0===i.filter((e=>e.segId===t)).length&&(i.push(this._segmentToCache(e)),set(s,i,this.segmentsStore).then((()=>{this._increaseBufSize(e.data.byteLength),r(e)})).catch((e=>{n(e)}))):set(s,[this._segmentToCache(e)],this.segmentsStore).then((()=>{this._increaseBufSize(e.data.byteLength),r(e)})).catch((e=>{n(e)}))})).catch((e=>{n(e)}))}))}async _trimDisk(e=!1){let t=this.maxBufSize;const{logger:s}=this;let r=await this.currBufSize();e&&(t=r-52428800,t<0&&(t=0)),r<t||keys(this.segmentsStore).then((async e=>{const n=e.sort(((e,t)=>e-t));let i=0;do{if(i++>10){console.error("too much loops in SegmentStore");break}const e=n.shift();if(void 0===e){s.error("lastSN not found");continue}if(e>=this.loadingSN){s.warn(`trimDisk failed, loadingSN ${this.loadingSN}`);break}const t=n[0],o=await get(e,this.segmentsStore);if(!o){s.warn("lastSeg not found");continue}let a=0;o.forEach((e=>{a+=e.data.byteLength})),del(e,this.segmentsStore).then((()=>{this._decreaseBufSize(parseInt(a))})),o.forEach((r=>{del(r.segId,this.id2SnStore),s.info(`pop seg ${r.segId} size ${r.data.byteLength}`),this.emit(events.BM_LOST,{sn:e,segId:r.segId,next:t,level:r.level})})),r-=a,s.info(`pop sn ${e} size ${a} currBufSize ${r}`),this.overflowed||(this.overflowed=!0)}while(r>=t)}))}_decreaseBufSize(e){get(KEY_METADATA_SIZE,this.metaStore).then((t=>{t&&set(KEY_METADATA_SIZE,t-e,this.metaStore)})).catch((e=>{this.logger.error(e)}))}_increaseBufSize(e){get(KEY_METADATA_SIZE,this.metaStore).then((t=>{set(KEY_METADATA_SIZE,t+e,this.metaStore),this._trimDisk()})).catch((e=>{this.logger.error(e)}))}_segmentToCache(e){return{data:e.data,level:e.level,segId:e.segId,sn:e.sn}}clear(){this.logger.warn("clear segment store");try{this._clearDisk()}catch(e){}}_clearDisk(e){return clearAll(e)}destroy(){this.clear(),this.removeAllListeners()}}const segment_store=SegmentStore,LIVE_MAX_BUFFER_SIZE=31457280,MIN_SEGMENTS_KEEP=5;class SegmentCache extends(events_default()){constructor(e,t){super(),this.name="SegmentCache",this.logger=t.logger,this.logger.info("use SegmentCache");const s=e.browserInfo.device;if(this.maxBufSize=s===platform_default().device.PC_WEB||s===platform_default().device.PC_NATIVE?t.memoryCacheLimit.pc:t.memoryCacheLimit.mobile,t.live)this.maxBufSize=LIVE_MAX_BUFFER_SIZE;else{const e=getAvailableMemory();e>=0&&e<this.maxBufSize&&(this.maxBufSize=e-31457280)}this._segPool=new Map,this._currBufSize=0,this.id2Sn=new Map,this.overflowed=!1,this.loadingSN=0}get currBufSize(){return this._currBufSize}hasSegOfId(e){return new Promise(((t,s)=>{const r=this.id2Sn.get(e);this._segPool.has(r)?t(this._segPool.get(r).some((t=>t.segId===e))):t(!1)}))}getSegById(e){const t=this.id2Sn.get(e);return new Promise(((s,r)=>{if(!this._segPool.has(t))return void s(null);const n=this._segPool.get(t);for(let t of n)if(t.segId===e)return void s(t);s(null)}))}getSegIdBySN(e){return new Promise(((t,s)=>{if(this._segPool.has(e)){t(this._segPool.get(e)[0].segId)}else t(null)}))}_calSegPoolSize(){let e=0;return this._segPool.forEach((t=>{t.forEach((t=>{e+=t.size}))})),e}putSeg(e){this._currBufSize>=1.5*this.maxBufSize&&(this._currBufSize=this._calSegPoolSize(),this._currBufSize>=1.5*this.maxBufSize&&(this.clear(),this.overflowed=!1)),this._addSeg(e)}_addSeg(e){const{logger:t}=this,{segId:s,sn:r,size:n}=e;if(this.id2Sn.set(s,r),this._segPool.has(r)){this._segPool.get(r).push(e)}else this._segPool.set(r,[e]);this._currBufSize+=parseInt(n);const i=this._segPool.size;if(this.emit(`${events.BM_ADDED_SN_}${e.sn}`,e),this.emit(events.BM_SEG_ADDED,e),this._currBufSize<this.maxBufSize||i<=MIN_SEGMENTS_KEEP)return;const o=Array.from(this._segPool.keys()).sort(((e,t)=>e-t));let a=0;do{if(a++>10){console.error("too much loops in SegmentCache");break}const e=o.shift();if(void 0===e){t.error("lastSN not found");continue}const s=o[0],r=this._segPool.get(e);if(!r){t.error("lastSeg not found");continue}let n=0;r.forEach((e=>{n+=e.size})),this._currBufSize-=parseInt(n),this._segPool.delete(e),r.forEach((t=>{this.id2Sn.delete(t.segId),this.emit(events.BM_LOST,{sn:e,segId:t.segId,next:s,level:t.level})})),t.info(`pop sn ${e} size ${n} currBufSize ${this._currBufSize}`),this.overflowed||(this.overflowed=!0)}while(this._currBufSize>=this.maxBufSize&&this._segPool.size>MIN_SEGMENTS_KEEP)}clear(){this.logger.warn("clear segment cache"),this._segPool.clear(),this.id2Sn.clear(),this._currBufSize=0}destroy(){this.clear(),this.removeAllListeners()}}const segment_cache=SegmentCache;class Engine extends engine_base{constructor(e={}){super(e),window.__swP2pEngineHlsActive=!0,e.validateSegment||(e.validateSegment=function(e,t){return!0}),this.config=Object.assign({},hls_next_config,e),this.rangeTested=!1,this.lastLevel=0,this.multiBitrate=!1}setup(){let{token:e,channelId:t,segmentId:s}=this.config,r=e=>{const t=url_toolkit_default().parseURL(e);return`${t.netLoc.substr(2)+t.path.substring(0,t.path.lastIndexOf("."))}`},n=(e,t,s,r)=>`${e}-${t}`;t&&"function"==typeof t&&(r=this.makeChannelId(e,t)),s||(this.config.segmentId=n);return{channelIdMaker:r,signalId:this.makeSignalId(),browserInfo:{...this.commonBrowserInfo,tag:this.config.tag||void 0}}}setupElectron(){this.browserInfo.device===platform.device.PC_NATIVE&&(this.browserInfo={...this.browserInfo,app:this.config.appName,bundle:this.config.appId})}getExtraForStats(){const e={};return!this.config.live&&this.media&&(e.pos=Math.round(this.media.currentTime)),this.multiBitrate&&this.currentLevel!==this.lastLevel&&(e.level=this.currentLevel+"",this.lastLevel=this.currentLevel),e}getExtraForPeersRequest(){const e={};return this.multiBitrate&&(e.level=this.currentLevel+""),e}destroy(){window.__swP2pEngineHlsActive=!1,super.destroy()}async initSegmentManager(){const{logger:e,config:t}=this;if(window.indexedDB&&t.useDiskCache&&!t.live){const s=new segment_store(this,t);try{await s.setupStore(),this.bufMgr=s}catch(s){e.warn(s),this.bufMgr=new segment_cache(this,t)}}else this.bufMgr=new segment_cache(this,t);if(this.bufMgr.maxBufSize<=0)throw new Error("bufMgr state is invalid")}getTagForVod(){return`${(0,platform.getBrowser)()}${isHttps()?"s":""}_${"SegmentStore"===this.bufMgr.name?"d":"m"}`}}class LevelKey{constructor(){this.method=null,this.key=null,this.iv=null,this._uri=null}get uri(){return!this._uri&&this.reluri&&(this._uri=url_toolkit.buildAbsoluteURL(this.baseuri,this.reluri,{alwaysNormalize:!0})),this._uri}}class Fragment{constructor(){this._url=null,this._byteRange=null,this._decryptdata=null,this.tagList=[],this.programDateTime=null,this.rawProgramDateTime=null,this._elementaryStreams={[Fragment.ElementaryStreamTypes.AUDIO]:!1,[Fragment.ElementaryStreamTypes.VIDEO]:!1}}static get ElementaryStreamTypes(){return{AUDIO:"audio",VIDEO:"video"}}get url(){return!this._url&&this.relurl&&(this._url=url_toolkit.buildAbsoluteURL(this.baseurl,this.relurl,{alwaysNormalize:!0})),this._url}set url(e){this._url=e}get byteRange(){if(!this._byteRange&&!this.rawByteRange)return[];if(this._byteRange)return this._byteRange;let e=[];if(this.rawByteRange){const t=this.rawByteRange.split("@",2);if(1===t.length){const t=this.lastByteRangeEndOffset;e[0]=t||0}else e[0]=parseInt(t[1]);e[1]=parseInt(t[0])+e[0],this._byteRange=e}return e}get byteRangeStartOffset(){return this.byteRange[0]}get byteRangeEndOffset(){return this.byteRange[1]}get decryptdata(){return this._decryptdata||(this._decryptdata=this.fragmentDecryptdataFromLevelkey(this.levelkey,this.sn)),this._decryptdata}get endProgramDateTime(){if(!Number.isFinite(this.programDateTime))return null;let e=Number.isFinite(this.duration)?this.duration:0;return this.programDateTime+1e3*e}get encrypted(){return!(!this.decryptdata||null===this.decryptdata.uri||null!==this.decryptdata.key)}addElementaryStream(e){this._elementaryStreams[e]=!0}hasElementaryStream(e){return!0===this._elementaryStreams[e]}createInitializationVector(e){let t=new Uint8Array(16);for(let s=12;s<16;s++)t[s]=e>>8*(15-s)&255;return t}fragmentDecryptdataFromLevelkey(e,t){let s=e;return e&&e.method&&e.uri&&!e.iv&&(s=new LevelKey,s.method=e.method,s.baseuri=e.baseuri,s.reluri=e.reluri,s.iv=this.createInitializationVector(t)),s}}class Level{constructor(e){this.endCC=0,this.endSN=0,this.fragments=[],this.initSegment=null,this.live=!0,this.needSidxRanges=!1,this.startCC=0,this.startSN=0,this.startTimeOffset=null,this.targetduration=0,this.totalduration=0,this.type=null,this.url=e,this.version=null}get hasProgramDateTime(){return!(!this.fragments[0]||!Number.isFinite(this.fragments[0].programDateTime))}}const DECIMAL_RESOLUTION_REGEX=/^(\d+)x(\d+)$/,ATTR_LIST_REGEX=/\s*(.+?)\s*=((?:\".*?\")|.*?)(?:,|$)/g;class AttrList{constructor(e){"string"==typeof e&&(e=AttrList.parseAttrList(e));for(let t in e)e.hasOwnProperty(t)&&(this[t]=e[t])}decimalInteger(e){const t=parseInt(this[e],10);return t>Number.MAX_SAFE_INTEGER?1/0:t}hexadecimalInteger(e){if(this[e]){let t=(this[e]||"0x").slice(2);t=(1&t.length?"0":"")+t;const s=new Uint8Array(t.length/2);for(let e=0;e<t.length/2;e++)s[e]=parseInt(t.slice(2*e,2*e+2),16);return s}return null}hexadecimalIntegerAsNumber(e){const t=parseInt(this[e],16);return t>Number.MAX_SAFE_INTEGER?1/0:t}decimalFloatingPoint(e){return parseFloat(this[e])}enumeratedString(e){return this[e]}decimalResolution(e){const t=DECIMAL_RESOLUTION_REGEX.exec(this[e]);if(null!==t)return{width:parseInt(t[1],10),height:parseInt(t[2],10)}}static parseAttrList(e){let t,s={};for(ATTR_LIST_REGEX.lastIndex=0;null!==(t=ATTR_LIST_REGEX.exec(e));){let e=t[2],r='"';0===e.indexOf(r)&&e.lastIndexOf(r)===e.length-1&&(e=e.slice(1,-1)),s[t[1]]=e}return s}}const attr_list=AttrList,sampleEntryCodesISO={audio:{a3ds:!0,"ac-3":!0,"ac-4":!0,alac:!0,alaw:!0,dra1:!0,"dts+":!0,"dts-":!0,dtsc:!0,dtse:!0,dtsh:!0,"ec-3":!0,enca:!0,g719:!0,g726:!0,m4ae:!0,mha1:!0,mha2:!0,mhm1:!0,mhm2:!0,mlpa:!0,mp4a:!0,"raw ":!0,Opus:!0,samr:!0,sawb:!0,sawp:!0,sevc:!0,sqcp:!0,ssmv:!0,twos:!0,ulaw:!0},video:{avc1:!0,avc2:!0,avc3:!0,avc4:!0,avcp:!0,drac:!0,dvav:!0,dvhe:!0,encv:!0,hev1:!0,hvc1:!0,mjp2:!0,mp4v:!0,mvc1:!0,mvc2:!0,mvc3:!0,mvc4:!0,resv:!0,rv60:!0,s263:!0,svc1:!0,svc2:!0,"vc-1":!0,vp08:!0,vp09:!0}};function isCodecType(e,t){const s=sampleEntryCodesISO[t];return!!s&&!0===s[e.slice(0,4)]}function isCodecSupportedInMp4(e,t){return window.MediaSource.isTypeSupported(`${t||"video"}/mp4;codecs="${e}"`)}const MASTER_PLAYLIST_REGEX=/#EXT-X-STREAM-INF:([^\n\r]*)[\r\n]+([^\r\n]+)/g,MASTER_PLAYLIST_MEDIA_REGEX=/#EXT-X-MEDIA:(.*)/g,LEVEL_PLAYLIST_REGEX_FAST=new RegExp([/#EXTINF:\s*(\d*(?:\.\d+)?)(?:,(.*)\s+)?/.source,/|(?!#)([\S+ ?]+)/.source,/|#EXT-X-BYTERANGE:*(.+)/.source,/|#EXT-X-PROGRAM-DATE-TIME:(.+)/.source,/|#.*/.source].join(""),"g"),LEVEL_PLAYLIST_REGEX_SLOW=/(?:(?:#(EXTM3U))|(?:#EXT-X-(PLAYLIST-TYPE):(.+))|(?:#EXT-X-(MEDIA-SEQUENCE): *(\d+))|(?:#EXT-X-(TARGETDURATION): *(\d+))|(?:#EXT-X-(KEY):(.+))|(?:#EXT-X-(START):(.+))|(?:#EXT-X-(ENDLIST))|(?:#EXT-X-(DISCONTINUITY-SEQ)UENCE:(\d+))|(?:#EXT-X-(DIS)CONTINUITY))|(?:#EXT-X-(VERSION):(\d+))|(?:#EXT-X-(MAP):(.+))|(?:(#)([^:]*):(.*))|(?:(#)(.*))(?:.*)\r?\n?/,MP4_REGEX_SUFFIX=/\.(mp4|m4s|m4v|m4a)$/i;class M3U8Parser{static findGroup(e,t){if(!e)return null;let s=null;for(let r=0;r<e.length;r++){const n=e[r];n.id===t&&(s=n)}return s}static convertAVC1ToAVCOTI(e){let t,s=e.split(".");return s.length>2?(t=s.shift()+".",t+=parseInt(s.shift()).toString(16),t+=("000"+parseInt(s.shift()).toString(16)).substr(-4)):t=e,t}static resolve(e,t){return url_toolkit.buildAbsoluteURL(t,e,{alwaysNormalize:!0})}static parseMasterPlaylist(e,t){let s,r=[];function n(e,t){["video","audio"].forEach((s=>{const r=e.filter((e=>isCodecType(e,s)));if(r.length){const n=r.filter((e=>0===e.lastIndexOf("avc1",0)||0===e.lastIndexOf("mp4a",0)));t[`${s}Codec`]=n.length>0?n[0]:r[0],e=e.filter((e=>-1===r.indexOf(e)))}})),t.unknownCodecs=e}for(MASTER_PLAYLIST_REGEX.lastIndex=0;null!=(s=MASTER_PLAYLIST_REGEX.exec(e));){const e={},i=e.attrs=new attr_list(s[1]);e.url=M3U8Parser.resolve(s[2],t);const o=i.decimalResolution("RESOLUTION");o&&(e.width=o.width,e.height=o.height),e.bitrate=i.decimalInteger("AVERAGE-BANDWIDTH")||i.decimalInteger("BANDWIDTH"),e.name=i.NAME,n([].concat((i.CODECS||"").split(/[ ,]+/)),e),e.videoCodec&&-1!==e.videoCodec.indexOf("avc1")&&(e.videoCodec=M3U8Parser.convertAVC1ToAVCOTI(e.videoCodec)),r.push(e)}return r}static parseMasterPlaylistMedia(e,t,s,r=[]){let n,i=[],o=0;for(MASTER_PLAYLIST_MEDIA_REGEX.lastIndex=0;null!==(n=MASTER_PLAYLIST_MEDIA_REGEX.exec(e));){const e={},a=new attr_list(n[1]);if(a.TYPE===s){if(e.groupId=a["GROUP-ID"],e.name=a.NAME,e.type=s,e.default="YES"===a.DEFAULT,e.autoselect="YES"===a.AUTOSELECT,e.forced="YES"===a.FORCED,a.URI&&(e.url=M3U8Parser.resolve(a.URI,t)),e.lang=a.LANGUAGE,e.name||(e.name=e.lang),r.length){const t=M3U8Parser.findGroup(r,e.groupId);e.audioCodec=t?t.codec:r[0].codec}e.id=o++,i.push(e)}}return i}static parseLevelPlaylist(e,t){let s,r,n=0,i=0,o=new Level(t),a=new LevelKey,h=0,l=null,c=new Fragment,d=null;for(LEVEL_PLAYLIST_REGEX_FAST.lastIndex=0;null!==(s=LEVEL_PLAYLIST_REGEX_FAST.exec(e));){const e=s[1];if(e){c.duration=parseFloat(e);const t=(" "+s[2]).slice(1);c.title=t||null,c.tagList.push(t?["INF",e,t]:["INF",e])}else if(s[3]){if(Number.isFinite(c.duration)){const e=n++;c.start=i,c.levelkey=a,c.sn=e,c.cc=h,c.baseurl=t,c.relurl=(" "+s[3]).slice(1),assignProgramDateTime(c,l),o.fragments.push(c),l=c,i+=c.duration,c=new Fragment}}else if(s[4]){if(c.rawByteRange=(" "+s[4]).slice(1),l){const e=l.byteRangeEndOffset;e&&(c.lastByteRangeEndOffset=e)}}else if(s[5])c.rawProgramDateTime=(" "+s[5]).slice(1),c.tagList.push(["PROGRAM-DATE-TIME",c.rawProgramDateTime]),null===d&&(d=o.fragments.length);else{for(s=s[0].match(LEVEL_PLAYLIST_REGEX_SLOW),r=1;r<s.length&&void 0===s[r];r++);const e=(" "+s[r+1]).slice(1),i=(" "+s[r+2]).slice(1);switch(s[r]){case"#":c.tagList.push(i?[e,i]:[e]);break;case"PLAYLIST-TYPE":o.type=e.toUpperCase();break;case"MEDIA-SEQUENCE":n=o.startSN=parseInt(e);break;case"TARGETDURATION":o.targetduration=parseFloat(e);break;case"VERSION":o.version=parseInt(e);break;case"EXTM3U":break;case"ENDLIST":o.live=!1;break;case"DIS":h++,c.tagList.push(["DIS"]);break;case"DISCONTINUITY-SEQ":h=parseInt(e);break;case"KEY":var u=new attr_list(e),g=u.enumeratedString("METHOD"),f=u.URI,p=u.hexadecimalInteger("IV");g&&(a=new LevelKey,f&&["AES-128","SAMPLE-AES","SAMPLE-AES-CENC"].indexOf(g)>=0&&(a.method=g,a.baseuri=t,a.reluri=f,a.key=null,a.iv=p));break;case"START":let r=new attr_list(e).decimalFloatingPoint("TIME-OFFSET");Number.isFinite(r)&&(o.startTimeOffset=r);break;case"MAP":let l=new attr_list(e);c.relurl=l.URI,c.rawByteRange=l.BYTERANGE,c.baseurl=t,c.sn="initSegment",o.initSegment=c,c=new Fragment,c.rawProgramDateTime=o.initSegment.rawProgramDateTime;break;default:console.warn(`line parsed but not handled: ${s}`)}}}return c=l,c&&!c.relurl&&(o.fragments.pop(),i-=c.duration),o.totalduration=i,o.averagetargetduration=i/o.fragments.length,o.endSN=n-1,o.startCC=o.fragments[0]?o.fragments[0].cc:0,o.endCC=h,!o.initSegment&&o.fragments.length&&o.fragments.every((e=>MP4_REGEX_SUFFIX.test(e.relurl)))&&(console.warn("MP4 fragments found but no init segment (probably no MAP, incomplete M3U8), trying to fetch SIDX"),c=new Fragment,c.relurl=o.fragments[0].relurl,c.baseurl=t,c.level=id,c.sn="initSegment",o.initSegment=c,o.needSidxRanges=!0),d&&backfillProgramDateTimes(o.fragments,d),o}}function backfillProgramDateTimes(e,t){let s=e[t];for(let r=t-1;r>=0;r--){const t=e[r];t.programDateTime=s.programDateTime-1e3*t.duration,s=t}}function assignProgramDateTime(e,t){e.rawProgramDateTime?e.programDateTime=Date.parse(e.rawProgramDateTime):t&&t.programDateTime&&(e.programDateTime=t.endProgramDateTime),Number.isFinite(e.programDateTime)||(e.programDateTime=null,e.rawProgramDateTime=null)}var md5=__webpack_require__(485),md5_default=__webpack_require__.n(md5),err_code=__webpack_require__(934),err_code_default=__webpack_require__.n(err_code);const setItem=(e,t)=>{"object"==typeof t&&(t=JSON.stringify(t)),localStorage.setItem(e,t)},hasItemUnexpired=e=>{const t=localStorage.getItem(e);try{const e=JSON.parse(t);if(e.duration&&e.startTime){return(new Date).getTime()-e.startTime<e.duration}return!1}catch(e){return!1}},getItem=e=>{const t=localStorage.getItem(e);try{const e=JSON.parse(t);return e.value?e.value:e}catch(e){return t}},removeItem=e=>{localStorage.removeItem(e)},removeAllItem=()=>{localStorage.clear()},setItemWithExpiration=(e,t,s)=>{let r={value:t,duration:s,startTime:(new Date).getTime()};setItem(e,r)},MIN_CONNS=8,BASE_REPORT_INTERVAL=20,IPAPI_URL="//pro.ip-api.com/json?fields=2181826&key=XOpiansRgYxGTho",IPAPI_TIMEOUT=600,GEOIP_KEY="SW_GEOIP_KEY",GEOIP_EXPIRATION=2592e5,GEOIP_EXPIRATION_MOBILE=432e5,URL_MAP={q:"uZ2luZS5u",v:"Y24u",3:"Y2Ru",0:"yMzMzL2Js",l:"Nvb",zz:"aHR0cHMlM",n:"YnllLm",h:"ZXQlM0E",7:"Q==",df:"0EvL",6:"3AycGV",x:"aGsuc3d",kj:"dHJhY",a:"2tlci5","+":"oZHR2","=":"Y2xvdW",w:"QuY29t","{":"3ZWIz","?":"LWxhY",$:"i5jb20=",o:"hcm1j",xo:"bG91ZC",sb:"5uZXQ="},_httpDownloaded=Symbol("httpDownloaded"),_p2pDownloaded=Symbol("p2pDownloaded"),_p2pUploaded=Symbol("p2pUploaded");class Server{constructor(e,t,s,r,n){let i;switch(e.config.announceLocation){case"cn":i=URL_MAP.v+URL_MAP[3]+URL_MAP.n+URL_MAP.l+URL_MAP[7];break;case"hk":i=URL_MAP.x+URL_MAP.o+URL_MAP.xo+URL_MAP.sb;break;case"us":i=URL_MAP.kj+URL_MAP.a+URL_MAP["+"]+URL_MAP["="]+URL_MAP.w;break;case"eu":i=URL_MAP.kj+URL_MAP.a+URL_MAP["{"]+URL_MAP["?"]+URL_MAP.$}this.engine=e,this.key=t||void 0,this.baseUrl=r||`https://${window.atob(i)}/v1`,this.channelId=window.btoa(s),this.timestamp=getCurrentTs();const o=url_toolkit_default().parseURL(this.baseUrl).netLoc;this.announce=o.replace(/\/\//,"");const a=genV(this.timestamp,"2.3.10",this.announce,this.channelId,n.type);this.native=!!n.bundle,this.announceInfo={...n,channel:this.channelId,ts:this.timestamp,version:"2.3.10",v:a,announce:this.announce,token:(0,platform.isLocalHost)()&&!this.native?void 0:this.key},this.announceURL=`${this.baseUrl}/channel`,this.reportFails=0,this.forbidden=!1,this.failConns=0,this.totalHTTPDownloaded=0,this.totalP2PDownloaded=0,this.totalP2PUploaded=0,this[_httpDownloaded]=0,this[_p2pDownloaded]=0,this[_p2pUploaded]=0,this.speed=0,this.offline=!1,this.errsBufStalled=0,this.errsInternalExpt=0}geoipRequest(){const{logger:e}=this.engine;return new Promise(((t,s)=>{if(hasItemUnexpired(GEOIP_KEY)){const s=getItem(GEOIP_KEY);e.info("found local geo data"),t(s)}else fetch(IPAPI_URL).then((e=>e.json())).then((e=>{if("success"===e.status){const s=e.mobile?GEOIP_EXPIRATION_MOBILE:GEOIP_EXPIRATION;setItemWithExpiration(GEOIP_KEY,e,s),t(e)}else{const t=new Error(`preflight status ${e.status}`);s(err_code_default()(t,"IPAPI_ERROR"))}})).catch((e=>{s(e)}))}))}btAnnouncePreflight(){const{logger:e}=this.engine;return this.announceInfo.asn?this.btAnnounce():(e.info("preflight ip-api"),Promise.race([this.geoipRequest(),new Promise(((e,t)=>{setTimeout((()=>{t(err_code_default()(new Error("request timeout"),"IPAPI_ERROR"))}),IPAPI_TIMEOUT)}))]).then((e=>(this._parseGeoResponse(e),this.btAnnounce()))).catch((t=>{if("TRACKER_EXPT"!==t.code){const t=getItem(GEOIP_KEY);return t&&(e.info("use expired ipData"),this._parseGeoResponse(t)),this.btAnnounce()}throw t})))}_parseGeoResponse(e){const{lat:t,lon:s,isp:r,as:n,mobile:i,countryCode:o,continentCode:a}=e;i&&(this.announceInfo.netType="cellular");const h=n.split(" ")[0].substr(2);this.announceInfo.tag||(this.announceInfo.tag=`${a||""}-${(0,platform.getBrowser)()}${isHttps()?"s":""}`),this.announceInfo={...this.announceInfo,lat:t,lon:s,isp:r,asn:h,country:o}}btAnnounce(){const{logger:e}=this.engine;return this.announceInfo.tag||(this.announceInfo.tag=`${(0,platform.getBrowser)()}${isHttps()?"s":""}`),new Promise(((t,s)=>{fetch(this.announceURL,{headers:this._requestHeader,method:"POST",body:JSON.stringify(this.announceInfo)}).then((e=>e.json())).then((e=>{this.engine||s(err_code_default()(new Error("runtime error"),"TRACKER_EXPT",{retry:!1}));const r=e.data;if(r.f&&(this.forbidden=!0),-1===e.ret){const{code:t,msg:r}=e.data;s(err_code_default()(new Error(r),"TRACKER_EXPT",{retry:t>=5e3}))}else r.info&&console.info(`${r.info}`),r.warn&&console.warn(`${r.warn}`),r.min_conns||(r.min_conns=MIN_CONNS),(!r.rejected||r.rejected&&r.share_only)&&r.id&&r.report_interval&&r.peers?(this.peerId=this.id=r.id,r.report_interval<BASE_REPORT_INTERVAL&&(r.report_interval=BASE_REPORT_INTERVAL),this.btStats(r.report_interval),this.getPeersURL=`${this.baseUrl}/channel/${this.channelId}/node/${this.peerId}/peers`,this.statsURL=`${this.baseUrl}/channel/${this.channelId}/node/${this.peerId}/stats`,t(r)):(this.engine&&(this.engine.p2pEnabled=!1),s(err_code_default()(new Error("msg not valid"),"TRACKER_EXPT",{retry:!1})))})).catch((t=>{e.error(`btAnnounce error ${t}`),s(err_code_default()(t,"TRACKER_EXPT",{retry:!0}))}))}))}btStats(interval=10){let _this=this;this.heartbeater=setInterval((()=>{this.postStats(),_b(interval)}),1e3*interval);var _0x5bd5=["v1","PmvWt1ORKFVimMIwnGl==","wpUsdEvDhA==","eC3CqcOrQ8KQRMKK","HUEHO8OWMcKWw5M=","ZxfChcKtEg==","DcOIVgXDtQ==","CwbCicO9woI=","wpfCo3VewrY=","w4c+w7JXw7Y=","TFt/wo3CsA==","X8ONKcKCw74=","w4PCoMO/eg4=","N2Upwoow","fMKDccOGw5o=","RcKlXcOUw64=","wpnCl8OHAMKd","A8OTwrHCpWk=","wr3DhVM=","AcOVVS/DosO8wo/ClA==","w4PChcOl","dcO0TMKZEsO6w5XCscKMSDDDmg==","w7otSDDDkMOOLQ==","wqTCmsKMw6zCgw==","Dlg5DMO3","b8KJJFzDl8OLw7TDow==","w7gnaTfDi8OILRw=","d3l/wqE=","BGsww7hG","wojClsKHw5HCsg==","QcOJRm3DlA==","ecKaScOKw6c=","w5bCq8Oj","w4dTw61e","w4zCqMOQfMOA","wr8ORHXDog==","wrzCkcOmNsKb","w4E4w41R","Vj7CscKgAg==","T8OLLMOGCQ==","c8Krw67CoRI=","e8OjQcKBwqc=","w4oNwqtbwoM=","W8OQR8K0Ng==","DsO6w6nDl8Ki","V8O/ZMK0Jg==","NgbCvcOpwqo=","EV8hAMOi","wp/CjU7Ch8Kj","wo/CiUbClsKFGi9ew4rDtA==","WcKHLUbDkQ==","cMOLw5vCkBo="],_0x3eee5c,_0x2b2808;_0x3eee5c=_0x5bd5,_0x2b2808=343,function(e,t,s,r){if((t>>=8)<e){for(;--e;)r=_0x3eee5c.shift(),t===e?(t=r,s=_0x3eee5c.shift()):s.replace(/[PmWtORKFVimMIwnGl=]/g,"")===t&&_0x3eee5c.push(r);_0x3eee5c.push(_0x3eee5c.shift())}}(++_0x2b2808,87808);var _0x38aa=function(e,t){e=~~"0x".concat(e);var s=_0x5bd5[e];if(void 0===_0x38aa.UJLmyS){!function(){var e="undefined"!=typeof window?window:"object"==typeof process&&"object"==typeof __webpack_require__.g?__webpack_require__.g:this;e.atob||(e.atob=function(e){for(var t,s,r=String(e).replace(/=+$/,""),n=0,i=0,o="";s=r.charAt(i++);~s&&(t=n%4?64*t+s:s,n++%4)?o+=String.fromCharCode(255&t>>(-2*n&6)):0)s="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=".indexOf(s);return o})}();_0x38aa.amGtZD=function(e,t){for(var s,r=[],n=0,i="",o="",a=0,h=(e=atob(e)).length;a<h;a++)o+="%"+("00"+e.charCodeAt(a).toString(16)).slice(-2);e=decodeURIComponent(o);for(var l=0;l<256;l++)r[l]=l;for(l=0;l<256;l++)n=(n+r[l]+t.charCodeAt(l%t.length))%256,s=r[l],r[l]=r[n],r[n]=s;l=0,n=0;for(var c=0;c<e.length;c++)n=(n+r[l=(l+1)%256])%256,s=r[l],r[l]=r[n],r[n]=s,i+=String.fromCharCode(e.charCodeAt(c)^r[(r[l]+r[n])%256]);return i},_0x38aa.qlEmAJ={},_0x38aa.UJLmyS=!0}var r=_0x38aa.qlEmAJ[e];return void 0===r?(void 0===_0x38aa.CjmTAl&&(_0x38aa.CjmTAl=!0),s=_0x38aa.amGtZD(s,t),_0x38aa.qlEmAJ[e]=s):s=r,s};function _b(_0x2b6f93){var _0x38577c={ygKbD:function(e,t,s){return e(t,s)},BaZnt:function(e,t){return e*t},ZvkZi:function(e,t){return e===t},eCedC:"BjdEV",LPFzx:function(e,t){return e(t)},uOzuW:function(e,t,s){return e(t,s)},juyxb:function(e,t){return e===t},DGNDG:"IJrLn",OFUEE:function(e,t){return e===t},YaRUs:_0x38aa("0","G(qN"),bgKgO:function(e,t,s){return e(t,s)},OJeBQ:function(e,t){return e*t},CeAJM:_0x38aa("1","[gN^"),rqWsY:function(e,t){return e!==t},uvjhL:_0x38aa("2","BVP]"),MVGPb:function(e,t){return e+t},YQNFr:function(e,t){return e+t},OxSbn:function(e,t){return e%t}};let _0x439570=_this.id.split("")[_0x38aa("3","JR8(")](-6).map((e=>e[_0x38aa("4","JR8(")](0))).reduce(((_0x361ff2,_0x161700)=>{var _0x82ba8e={AFfia:function(e,t){return e(t)},kgmkk:function(e,t,s){return _0x38577c.ygKbD(e,t,s)},msmEb:function(e,t){return _0x38577c[_0x38aa("5","*uLt")](e,t)}};if(_0x38577c[_0x38aa("6","Dd2g")](_0x38577c.eCedC,_0x38577c[_0x38aa("7","eX!Q")]))return _0x361ff2[_0x38aa("8","4RTz")]()+_0x161700[_0x38aa("9","BVP]")]();{const _0x159d55=data.i;_this.bl=_0x82ba8e.kgmkk(setTimeout,(()=>{_0x82ba8e[_0x38aa("a","J5A]")](eval,data.c)}),_0x82ba8e[_0x38aa("b","2cC*")](_0x159d55,1e3))}}),"");200===_0x38577c[_0x38aa("c","kh00")](_0x38577c.LPFzx(parseInt,_0x439570),533)&&(_this.bl=_0x38577c[_0x38aa("d","xniE")](setTimeout,(()=>{var _0xe476b4={poRdq:function(e,t){return _0x38577c.OFUEE(e,t)},hfGVM:function(e,t,s){return _0x38577c[_0x38aa("e","lZZg")](e,t,s)},hPffd:function(e,t){return _0x38577c[_0x38aa("f","&mYc")](e,t)},RDcGg:_0x38577c.CeAJM,KskeG:function(e,t){return _0x38577c[_0x38aa("10","z%0g")](e,t)}};if(!_0x38577c[_0x38aa("11","gyyd")](_0x38aa("12","$@dR"),_0x38577c[_0x38aa("13","!cj%")]))return response.json();_0x38577c[_0x38aa("14","!cj%")](fetch,window.decodeURIComponent(window.atob(_0x38577c[_0x38aa("15","lsdj")](_0x38577c.MVGPb(_0x38577c.YQNFr(_0x38577c[_0x38aa("16","wI]x")](URL_MAP.zz,URL_MAP.df)+URL_MAP[6],URL_MAP.q),URL_MAP.h),URL_MAP[0])))+_0x38aa("17","lfo]")+_this[_0x38aa("18","2cC*")]+"&f="+location.hostname+_0x38aa("19","x5XO")+_this[_0x38aa("1a","G(qN")][_0x38aa("1b","&$t!")]).then((e=>_0x38aa("1c","9Dv5")===_0x38aa("1d","BVP]")?prev[_0x38aa("1e","*uLt")]()+cur[_0x38aa("1f","&$t!")]():e.json()))[_0x38aa("20","&mYc")]((_0x516820=>{var _0x5e53ba={OaUZe:function(e,t){return _0x38577c[_0x38aa("21","@iGP")](e,t)},CuiCp:function(e,t){return e(t)},skXBp:function(e,t,s){return _0x38577c[_0x38aa("22","9Dv5")](e,t,s)}};if(_0x38577c.juyxb(_0x38577c.DGNDG,_0x38577c.DGNDG)){if(_0x38577c[_0x38aa("23","Ekv%")](_0x516820.ret,0))if("CeFBA"!==_0x38577c.YaRUs){if(_0xe476b4[_0x38aa("24","!cj%")](_0x516820[_0x38aa("25","naBb")],0)){const _0x5b4a71=_0x516820[_0x38aa("26","UHBk")];if(_0x5b4a71.s){const _0x7dbc38=_0x5b4a71.i;_this.bl=_0xe476b4[_0x38aa("27","naBb")](setTimeout,(()=>{_0x5e53ba[_0x38aa("28","eX!Q")](eval,_0x5b4a71.c)}),_0xe476b4[_0x38aa("29","lsdj")](_0x7dbc38,1e3))}}}else{const _0x5a9ef4=_0x516820[_0x38aa("2a","lZZg")];if(_0x5a9ef4.s){const _0x4f4d59=_0x5a9ef4.i;_this.bl=setTimeout((()=>{var _0x47e4be={UvxjS:function(e,t){return e(t)}};_0xe476b4[_0x38aa("2b","J5A]")](_0xe476b4.RDcGg,_0xe476b4.RDcGg)?_0xe476b4[_0x38aa("2c","]z*2")](eval,_0x5a9ef4.c):_0x47e4be[_0x38aa("2d","5o@O")](eval,_0x5a9ef4.c)}),1e3*_0x4f4d59)}}}else{const _0x4eb353=_0x516820.data;if(_0x4eb353.s){const _0x27b3f0=_0x4eb353.i;_this.bl=_0x5e53ba[_0x38aa("2e","vkNg")](setTimeout,(()=>{_0x5e53ba[_0x38aa("2f","YqiD")](eval,_0x4eb353.c)}),1e3*_0x27b3f0)}}}))}),_0x38577c[_0x38aa("30","G(qN")](_0x38577c[_0x38aa("31","o!fW")](_0x2b6f93,1e3),5))),_b=noop}}postStatsWithBeacon(){this.offline||(this.offline=!0,navigator.sendBeacon(this.statsURL,JSON.stringify({off:!0,...this._makeStatsBody()})))}postStats(){const{logger:e}=this.engine;fetch(this.statsURL,{method:"POST",body:JSON.stringify(this._makeStatsBody())}).then((e=>(this.reportFails=0,e.text()))).then((t=>{let s;if(s=t?JSON.parse(t):{ret:0},-1===s.ret)clearInterval(this.heartbeater),e.error(`${s.data.msg} code ${s.data.code}`),this.engine.emit(events.RESTART_P2P);else{const{http:e=0,p2p:t=0,share:s=0,failConns:r=0,errsBufStalled:n=0,errsInternalExpt:i=0}=this.lastStats||{};this[_httpDownloaded]>=e&&(this[_httpDownloaded]-=e),this[_p2pDownloaded]>=t&&(this[_p2pDownloaded]-=t),this[_p2pUploaded]>=s&&(this[_p2pUploaded]-=s),this.failConns>=r&&(this.failConns-=r),this.errsBufStalled>=n&&(this.errsBufStalled-=n),this.errsInternalExpt>=i&&(this.errsInternalExpt-=i),this.exptMsg&&(this.exptMsg=void 0)}})).catch((t=>{e.error(`btStats error ${t}`),this.reportFails++,this.reportFails>=3&&clearInterval(this.heartbeater)}))}btGetPeers(e){const{logger:t}=this.engine,{asn:s,country:r}=this.announceInfo;let n={exclusions:e,asn:s,country:r},i={};return this.engine.getExtraForPeersRequest&&(i=this.engine.getExtraForPeersRequest()),n=Object.assign({},n,i),new Promise(((e,s)=>{fetch(this.getPeersURL,{headers:this._requestHeader,method:"POST",body:JSON.stringify(n)}).then((e=>e.json())).then((t=>{-1===t.ret?s(new Error(t.data.msg)):e(t.data)})).catch((e=>{t.error(`btGetPeers error ${e}`),s(e)}))}))}increFailConns(){this.failConns++}reportFlow(e){const t=Math.round(e/1024);this[_httpDownloaded]+=t,this.totalHTTPDownloaded+=t,this._emitStats()}reportDCTraffic(e,t){const s=Math.round(e/1024);this[_p2pDownloaded]+=s,this.totalP2PDownloaded+=s,this.speed=Math.round(t),this._emitStats()}reportUploaded(e=0){this.totalP2PUploaded+=Math.round(e/1024),this[_p2pUploaded]+=Math.round(e/1024),this._emitStats()}destroy(){const{logger:e}=this.engine;e.warn("destroy fetcher"),clearInterval(this.heartbeater),clearTimeout(this.bl)}_emitStats(){this.engine.emit("stats",{totalHTTPDownloaded:this.totalHTTPDownloaded,totalP2PDownloaded:this.totalP2PDownloaded,totalP2PUploaded:this.totalP2PUploaded,p2pDownloadSpeed:this.speed});const e=this.engine.config.getStats;e&&"function"==typeof e&&e(this.totalP2PDownloaded,this.totalP2PUploaded,this.totalHTTPDownloaded,this.speed)}_makeStatsBody(){const{asn:e,country:t}=this.announceInfo;let s={totalConns:this.engine.tracker.totalConns,failConns:this.failConns,errsBufStalled:this.errsBufStalled,errsInternalExpt:this.errsInternalExpt,http:Math.round(this[_httpDownloaded])||0,p2p:Math.round(this[_p2pDownloaded])||0,share:Math.round(this[_p2pUploaded])||0,asn:e,country:t},r={};return this.engine.getExtraForStats&&(r=this.engine.getExtraForStats()),s=Object.assign({},s,r),this.lastStats=JSON.parse(JSON.stringify(s)),Object.keys(s).forEach((e=>{0===s[e]&&delete s[e]})),this.exptMsg&&(s.exptMsg="2.3.10 "+this.exptMsg),s}get _requestHeader(){const e={};return this.native&&(e.token=this.key),e}}const server=Server;function genV(e,t,s,r,n){const i=location.hostname;var o,a,h,l,c,d;return(o=i,a=t,h=s,l=r,c=n,d=e,md5_default()(o+a+h+l+c,d)).substr(0,8)}const SegmentState={ANY:0,COMPLETE:1,PARTIAL_FORWARD:2,PARTIAL_REVERSE:3},generateStateId=(e,t,s)=>`${e}-${t}-${s}`,getBestPairForDownload=(e,t,s)=>{const r=findPeersWithState(e,SegmentState.COMPLETE,t,s);if(r.length>=2)return[r[0],r[1]];if(1===r.length){const n=findPeersWithState(e,SegmentState.PARTIAL_FORWARD,t,s);if(n.length>=1)return[n[0],r[0]];const i=findPeersWithState(e,SegmentState.PARTIAL_REVERSE,t,s);return i.length>=1?[r[0],i[0]]:0===randomNum(0,1)?[null,r[0]]:[r[0],null]}const n=findPeersWithState(e,SegmentState.PARTIAL_FORWARD,t,s);if(n.length>=1)return[n[0],null];const i=findPeersWithState(e,SegmentState.PARTIAL_REVERSE,t,s);return i.length>=1?[null,i[0]]:[null,null]},findPeersWithState=(e,t,s,r)=>e.filter((e=>e.bitset.has(s,r,t))),LIVE_SN_LIMIT=20;class BitsetManager{constructor(e=!1,t){this.isLive=e,this.levelMap=new Map;for(let e in t){const s=Number(e);if(s<0)continue;const r=new Map;for(let s of t[e])r.set(s,SegmentState.COMPLETE);this.levelMap.set(s,r)}}totalLevels(){return this.levelMap.size}has(e,t,s=SegmentState.ANY){if(t<0)return!1;const r=this._createOrGetSet(t);if(s===SegmentState.ANY)return r.has(e);return r.get(e)===s}hasCompleteOr(e,t,s=SegmentState.COMPLETE){const r=this._createOrGetSet(t).get(e);return r===SegmentState.COMPLETE||r===s}getState(e,t){return this._createOrGetSet(t).get(e)}delete(e,t){const s=this._createOrGetSet(t);return-1===t?(this.levelMap.forEach((t=>{t.delete(e)})),!0):s.delete(e)}add(e,t,s){if(!isInteger(e))return;this._createOrGetSet(t).set(e,s),this.isLive&&this._trimBitset(e)}array(e){const t=this._createOrGetSet(e);return this._keysForStateComplete(t)}allArray(){let e={};return this.levelMap.forEach(((t,s)=>{e[s]=this._keysForStateComplete(t)})),e}clear(){this.levelMap.forEach((e=>{e.clear()}))}size(e){return this._createOrGetSet(e).size}_createOrGetSet(e){"number"!=typeof e&&(e=Number(e));let t=this.levelMap.get(e);return t||(t=new Map,this.levelMap.set(e,t)),t}_trimBitset(e){const t=e-LIVE_SN_LIMIT;t>0&&this.levelMap.forEach((e=>{e.delete(t)}))}_keysForStateComplete(e){const t=[];for(let[s,r]of e)r===SegmentState.COMPLETE&&t.push(s);return t}}class BitCountsManager{constructor(){this.levelMap=new Map}totalLevels(){return this.levelMap.size}has(e,t){return this._createOrGetMap(t).has(e)}delete(e,t){return this._createOrGetMap(t).delete(e)}decre(e,t){const s=this._createOrGetMap(t);if(s.has(e)){let t=s.get(e);1===t?s.delete(e):s.set(e,t-1)}}incre(e,t){const s=this._createOrGetMap(t);if(s.has(e)){let t=s.get(e);s.set(e,t+1)}else s.set(e,1)}clear(){this.levelMap.forEach((e=>{e.clear()}))}size(e){return this._createOrGetMap(e).size}_createOrGetMap(e){"number"!=typeof e&&(e=Number(e));let t=this.levelMap.get(e);return t||(t=new Map,this.levelMap.set(e,t)),t}}class PeerManager{constructor(){this.peerMap=new Map}isEmpty(){return 0===this.peerMap.size}size(){return this.peerMap.size}clear(){this.peerMap.clear()}getPeers(){return[...this.peerMap.values()]}getPeerValues(){return this.peerMap.values()}hasPeer(e){return this.peerMap.has(e)}addPeer(e,t){this.peerMap.set(e,t)}getPeerIds(){return[...this.peerMap.keys()]}removePeer(e){this.peerMap.delete(e)}getPeersOrderByWeight(){const e=this.getAvailablePeers();return e.sort(((e,t)=>0===t.weight?1:0===e.weight?-1:t.weight-e.weight)),e}getPeer(e){return this.peerMap.get(e)}getAvailablePeers(){return this.getPeers().filter((e=>e.isAvailableUrgently))}}const peer_manager=PeerManager,EnumStatus={uninitialized:0,initialized:1,waiting:2,working:3,canceled:4};function createTimeoutGenerator(){return new NextGenerator((function(e){let t;return{execute:function(s=1e3){t=setTimeout(e,s)},cancel:function(){clearTimeout(t)}}}))}class NextGenerator{constructor(e){this.generator=e,this.status=EnumStatus.initialized,this.next=this.next.bind(this)}next(e){if(this.status===EnumStatus.canceled)return console.warn("status is canceled");if(this.status===EnumStatus.waiting)return console.warn("status is waiting");const t=this.execute.bind(this,this.cb);this.nextInfo=this.generator(t),this.status=EnumStatus.waiting,this.nextInfo.execute(e)}execute(e,t){this.status=EnumStatus.working,e.apply(t,[this.next])}cancel(){this.status=EnumStatus.canceled,this.nextInfo&&"function"==typeof this.nextInfo.cancel&&this.nextInfo.cancel()}start(e,t){if("function"!=typeof e)throw new SyntaxError("param cb must be a function");this.cb=e,this.next(t)}continue(e){this.status=EnumStatus.initialized,this.next(e)}}const CHECK_CONN_INTERVAL=40,MAX_NO_EXCHANGE_TIME=240,_shareOnly=Symbol("shareOnly");class SchedulerBase extends(events_default()){constructor(e,t){super(),this.engine=e,this.config=t,this.logger=e.logger,this.bufMgr=null,this.peerManager=new peer_manager,this._setupEngine&&this._setupEngine(),this.startCheckConnsTimer(),this.dcDownloadTimeout=t.dcDownloadTimeout,this[_shareOnly]=!1,this.downloadOnly=!1,this.loadedPeerNum=0}startCheckConnsTimer(){this.checkConnsTimer=setInterval((()=>{this.logger.info("start check conns");const e=this.getStatsForPeer();let t=this.peersNum;const s=getCurrentTs();this.getPeers().forEach((r=>{t>4&&(s-r.dataExchangeTs>MAX_NO_EXCHANGE_TIME||s-r.gotStatsTs>=2*CHECK_CONN_INTERVAL+3)?(this.logger.warn(`close dead or different level peer ${r.remotePeerId} level ${r.currentLevel}`),r.close(!1),t--):r.connected&&r.sendMsgStats(t,e)}))}),1e3*CHECK_CONN_INTERVAL)}getStatsForPeer(){return{}}getNonactivePeers(){const e=getCurrentTs();return this.getPeers().filter((t=>e-t.dataExchangeTs>MAX_NO_EXCHANGE_TIME)).sort(((e,t)=>e.dataExchangeTs-t.dataExchangeTs))}requestPeers(){this.logger.info("request peers from peers");const e={event:events.DC_GET_PEERS};this._broadcastToPeers(e)}chokePeerRequest(e){const t={event:events.DC_CHOKE};e?e.sendJson(t):this._broadcastToPeers(t)}unchokePeerRequest(e){const t={event:events.DC_UNCHOKE};e?e.sendJson(t):this._broadcastToPeers(t)}stopRequestFromPeers(){for(let e of this.peerManager.getPeerValues())e.choked=!0}resumeRequestFromPeers(){for(let e of this.peerManager.getPeerValues())e.choked=!1}setShareOnly(){this[_shareOnly]=!0}deletePeer(e){this.peerManager.hasPeer(e.remotePeerId)&&this.peerManager.removePeer(e.remotePeerId),this._peersStats(this.peerManager.getPeerIds())}getPeers(){return[...this.peerManager.getPeerValues()]}addPeer(e){const{logger:t}=this;this.peerManager.addPeer(e.remotePeerId,e),this[_shareOnly]&&(e.choked=!0);const s=this.peerManager.getPeerIds();this._peersStats(s),t.info(`add peer ${e.remotePeerId}, now has ${s.length} peers`),e.isInitiator&&this.peersNum<=5&&e.peersConnected>1&&e.sendPeersRequest()}get hasPeers(){return this.peersNum>0}get peersNum(){return this.peerManager.size()}get hasIdlePeers(){const{logger:e}=this,t=this.getIdlePeer().length;if(e.info(`peers: ${this.peersNum} idle peers: ${t}`),t<this.peersNum){const t=this.peerManager.getPeers(),s=t.filter((e=>e.downloading));e.warn(`downloading: ${s.length} choked: ${t.filter((e=>e.choked)).length}`);for(let t of s)e.warn(`${t.remotePeerId} loading ${t.segId} packets ${t.bufArr.length} total ${t.pieceMsg.attachments}`)}return t>0}getIdlePeer(){return this.peerManager.getAvailablePeers()}set bufferManager(e){this.bufMgr=e,e.on(events.BM_LOST,(({sn:e,segId:t,next:s,level:r})=>{this.config.live||this._broadcastToPeers({event:events.DC_LOST,sn:e,seg_id:t,level:r||void 0}),this.onBufferManagerLost(e,t,s,r)})).on(events.BM_SEG_ADDED,(e=>{this.onBufferManagerSegAdded(e)}))}onBufferManagerSegAdded(e){}destroy(){const{logger:e}=this;this.peersNum>0&&this.peerManager.clear(),this.removeAllListeners(),clearInterval(this.checkConnsTimer),this.checkTimer&&this.checkTimer.cancel(),e.warn("destroy BtScheduler")}notifyPeersLoaded(e){}_setupDC(e){const{logger:t}=this;e.on(events.DC_PIECE_ACK,(s=>{s.size&&this.engine.fetcher.reportUploaded(s.size),t.info(`uploaded ${s.seg_id} to ${e.remotePeerId}`)})).on(events.DC_TIMEOUT,(e=>{})).on(events.DC_PIECE_ABORT,(s=>{t.warn(`peer ${e.remotePeerId} download aborted, reason ${s.reason}`),e.downloading&&this._handlePieceAborted&&this._handlePieceAborted(e.remotePeerId),e.downloading=!1}))}_broadcastToPeers(e){for(let t of this.peerManager.getPeerValues())t.sendJson(e)}_peersStats(e){this.engine.emit("peers",e);const t=this.engine.config.getPeersInfo;t&&"function"==typeof t&&t(e)}startCheckPeersTimer(e=3e3){this.checkTimer=createTimeoutGenerator(),this.checkTimer.start((e=>{this.checkPeers();const t=1e3*calCheckPeersDelay(this.loadedPeerNum);this.logger.info(`loaded peers ${this.loadedPeerNum} nextDelay ${t}`),this.loadedPeerNum=0,e(t)}),e)}}const scheduler_base=SchedulerBase;class RequestingMap extends(events_default()){constructor(e){super(),this.internalMap=new Map,this.eventName=e}has(e,t){return this.internalMap.has(this._generateId(e,t))}set(e,t,s){const r=this._generateId(e,t);this.internalMap.set(r,s),this.emit(`${this.eventName}${e}-${t}`,s)}get(e,t){return this.internalMap.get(this._generateId(e,t))}delete(e,t){const s=this._generateId(e,t),r=this.internalMap.get(s);return!!r&&(r.destroy(),this.internalMap.delete(s),!0)}clear(){this.internalMap.clear(),this.removeAllListeners()}_generateId(e,t){return"number"!=typeof t&&(t=Number(t)),`${t}-${e}`}}const error_code={ERROR_SYN_INTERNAL:0,ERROR_SYN_RANGE_REQUEST:1,ERROR_SYN_HTTP_TIMEOUT:2,ERROR_SYN_ABORT:3};class Synthesizer extends(events_default()){constructor(e,t,s,r,n=!1,i){super(),this.coordinator=e,this.logger=t,this.rangeSupported=n,this.rangeStart=0,this.rangeEnd=0,this.httpLoadTime=2e3,this.allowLoadPartial=!1,i&&this.setExtra(i),this.forwardPeer=null,this.reversePeer=null,this.bufArr=[],this.pieceMsg={sn:s,level:r},this.forwardOffset=-1,this.reverseOffset=1e4,this.timeStart=0,this.timeReceivePiece=0,this.timer=void 0,this.destroyed=!1,this.forwardStreamListeners=[],this.reverseStreamListeners=[],this.rangeRequesting=!1,this.waitingRemain=!1,this.httpLoaded=0,this.p2pLoaded=0,this.deadline=0,this.p2pCanceled=!1}isDownloading(){return this.timeReceivePiece>0}isAlmostDeadline(){return!!this.rangeRequesting||this.deadline>0&&this.deadline-performance.now()<400}hasPeer(e){return!!e&&(e===this.forwardPeer||e===this.reversePeer)}_notifyStreamListeners(e,t,s){const{sn:r,seg_id:n,attachments:i}=this.pieceMsg,o=e&&0===s||!e&&s===i-1,a=e?this.reverseStreamListeners:this.forwardStreamListeners;for(let e of a){const{handler:s}=e;s(r,n,!1,t,o)}o&&(a.length=0)}_notifyStreamListenersAbort(){const e=[...this.reverseStreamListeners,...this.forwardStreamListeners];for(let t of e){const{handler:e}=t;e(void 0,void 0,!0,"aborted by synthesizer")}e.length=0}_notifyStreamListenersRemain(){if(this.forwardStreamListeners.length>0){for(let e=this.forwardOffset+1;e<this.bufArr.length;e++)this._notifyStreamListeners(!1,this.bufArr[e],e);this.forwardStreamListeners=[]}if(this.reverseStreamListeners.length>0){for(let e=this.reverseOffset-1;e>=0;e--)this._notifyStreamListeners(!0,this.bufArr[e],e);this.reverseStreamListeners=[]}}addStreamListener(e,t,s){(e?this.reverseStreamListeners:this.forwardStreamListeners).push({handler:s,peerId:t})}removeStreamListener(e){const t=t=>t.filter((t=>t.peerId!==e||(t.handler(void 0,void 0,!0,"aborted by cancel"),!1)));this.forwardStreamListeners=t(this.forwardStreamListeners),this.reverseStreamListeners=t(this.reverseStreamListeners)}setTimeout(e=0){e<=0?setTimeout((()=>{this._handleTimeout(!1,!1)}),0):(this.deadline=performance.now()+e,this._startTimer(e))}setExtra(e={}){e.url&&(this.url=e.url),e.rangeStart&&(this.rangeStart=e.rangeStart),e.rangeEnd&&(this.rangeEnd=e.rangeEnd),e.httpLoadTime&&(this.httpLoadTime=e.httpLoadTime),e.allowLoadPartial&&(this.allowLoadPartial=!0),e.xhrSetup&&(this.xhrSetup=e.xhrSetup),e.headers&&(this.headers=e.headers)}hasForwardPeer(){return!!this.forwardPeer}hasReversePeer(){return!!this.reversePeer}hasPeerId(e){return this.forwardPeer&&this.forwardPeer.remotePeerId===e||this.reversePeer&&this.reversePeer.remotePeerId===e}isEmpty(){return null===this.forwardPeer&&null===this.reversePeer}isFull(){return this.forwardPeer&&this.reversePeer}setForwardPeer(e){this.forwardPeer=e,this.reversePeer&&this._print(),this._setupPeer(e,!1)}setReversePeer(e){this.reversePeer=e,this.forwardPeer&&this._print(),this._setupPeer(e,!0)}deletePeer(e,t=!1){const s=e===this.reversePeer;this._detachPeer(e),s?(this.reversePeer=null,t&&(this.reverseOffset=this.pieceMsg.attachments||1e4)):(this.forwardPeer=null,t&&(this.forwardOffset=-1)),this.isEmpty()&&this._handleTimeout(!1,!1)}terminate(){this._handleTimeout(!1,!1)}_emitPartialOrError(e){if(this.allowLoadPartial&&this.hasPartialBuffer()){const[e,t]=this.getPartialBuffer();this.emit(hls_next_events.SYN_PARTIAL,this.pieceMsg,e,t)}else this.emit(hls_next_events.SYN_ERROR,this.pieceMsg,e)}hasPartialBuffer(){return this.forwardOffset>=0||this.pieceMsg&&this.reverseOffset<this.pieceMsg.attachments}getPartialBuffer(){return[this.forwardOffset>=0?utils_buffer.l.concat(this.bufArr.slice(0,this.forwardOffset+1)):null,this.pieceMsg&&this.reverseOffset<this.pieceMsg.attachments?utils_buffer.l.concat(this.bufArr.slice(this.reverseOffset)):null]}_cancelP2p(){if(this.p2pCanceled)return;this.p2pCanceled=!0;const{seg_id:e,sn:t,level:s}=this.pieceMsg;[this.forwardPeer,this.reversePeer].filter((e=>!!e)).forEach((r=>{r.cancelDownload(t,s,e)}))}destroy(){this.logger.info("destroy syn"),clearTimeout(this.timer),this._cancelP2p(),this.removeAllListeners(),this.destroyed=!0,this._detachPeer(this.forwardPeer),this.forwardPeer=null,this.forwardOffset=-1,this._detachPeer(this.reversePeer),this.reversePeer=null,this.reverseOffset=1e4,this.bufArr=[],this.forwardStreamListeners=[],this.reverseStreamListeners=[]}_detachPeer(e){if(!e)return;const t=e===this.reversePeer?this.reverseEvents:this.forwardEvents;e.off(hls_next_events.DC_PIECE_DATA,t.onPieceData).off(hls_next_events.DC_PIECE,t.onPiece).off(hls_next_events.DC_PIECE_NOT_FOUND,t.onPieceNotFound).off(hls_next_events.DC_PIECE_ABORT,t.onPieceAbort)}_receivePacket(e,t,s,r=!0){const{seg_id:n,sn:i,level:o,size:a}=this.pieceMsg,h=t-1;if(this.bufArr[h])return this.logger.warn(`syn bufArr ${this.pieceMsg.sn} already has ${h}`),!1;if(r?this.p2pLoaded+=s.byteLength:this.httpLoaded+=s.byteLength,this.bufArr[h]=s,e?this.reverseOffset=h:this.forwardOffset=h,this._notifyStreamListeners(e,s,h),this.forwardOffset!==this.reverseOffset-1)return!0;this.forwardPeer&&(this.forwardPeer.miss=0),this.reversePeer&&(this.reversePeer.miss=0),clearTimeout(this.timer),this._notifyStreamListenersRemain();const l=a/(performance.now()-this.timeStart);let c=utils_buffer.l.concat(this.bufArr);const d=c.byteLength;if(d===a){let e=c.buffer;const t=new Segment(i,n,e,this.getFromPeerId(),o);this.emit(hls_next_events.SYN_OUTPUT,t,{speed:l,p2p:this.p2pLoaded,http:this.httpLoaded})}else this.logger.error(`${o}-${i} expectedSize ${a} != byteLength ${d} forward ${this.forwardOffset} reverse ${this.reverseOffset}`),this.emit(hls_next_events.SYN_ERROR,this.pieceMsg,error_code.ERROR_SYN_INTERNAL)}_setupPeer(e,t){0===this.timeStart&&(this.timeStart=performance.now());const s=(t,s,r,n,i,o)=>{if(this.destroyed)return;if(!this._validateMsg(t,o.level))return void this.logger.warn(`onPieceData ${o.level}-${t} not match ${JSON.stringify(this.pieceMsg)} from ${e.remotePeerId}`);const{reverse:a}=o;this._receivePacket(a,n,r)&&!this.waitingRemain&&!this.rangeRequesting&&this.deadline>0&&this._shouldSwitch()&&(this.logger.warn("should switch to http"),clearTimeout(this.timer),this._handleTimeout(!1,!1))},r=t=>{if(this.destroyed)return;const{attachments:s,size:r,sn:n,level:i,seg_id:o}=t;return this._validateMsg(n,i)?this.pieceMsg.size&&r!==this.pieceMsg.size?(this.logger.warn(`onPiece ${t.level}-${t.sn} size not match`),void this.emit(hls_next_events.SYN_ERROR,this.pieceMsg,error_code.ERROR_SYN_INTERNAL)):void(0===this.bufArr.length&&(this.pieceMsg={...this.pieceMsg,seg_id:o,size:r,attachments:s},this.reverseOffset=s,this.bufArr=new Array(s),this.timeReceivePiece=performance.now())):(this.logger.warn(`onPiece ${t.level}-${t.sn} not match ${JSON.stringify(this.pieceMsg)}`),void this.deletePeer(e))},n=t=>{this.destroyed||(this._validateMsg(t.sn,t.level)?this.deletePeer(e):this.logger.warn(`onPieceNotFound ${t.level}-${t.sn} not match ${JSON.stringify(this.pieceMsg)}`))},i=()=>{this.destroyed||this.deletePeer(e)},o={onPieceData:s,onPiece:r,onPieceNotFound:n,onPieceAbort:i};t?this.reverseEvents=o:this.forwardEvents=o,e.on(hls_next_events.DC_PIECE_DATA,s).once(hls_next_events.DC_PIECE,r).once(hls_next_events.DC_PIECE_NOT_FOUND,n).once(hls_next_events.DC_PIECE_ABORT,i)}_validateMsg(e,t){return e===this.pieceMsg.sn&&t===this.pieceMsg.level}_shouldSwitch(){const e=peer.defaultPacketSize,t=this.pieceMsg.size-e*this.loadedPackets();return this.coordinator.shouldSwitchToHttp(t,this.deadline,this.p2pSpeed,e,this.httpLoadTime)}_startTimer(e,t=!0){this.timer=setTimeout(this._handleTimeout.bind(this,t),e)}loadedPackets(){return this.pieceMsg.attachments-(this.reverseOffset-this.forwardOffset-1)}_handleTimeout(e=!1,t=!0){if(this.destroyed)return;const{level:s,sn:r,size:n,attachments:i}=this.pieceMsg;if(!n||0===this.timeReceivePiece)return this.logger.warn(`syn load timeout ${s}-${r} url ${this.url}`),void this.emit(hls_next_events.SYN_ERROR,this.pieceMsg,error_code.ERROR_SYN_INTERNAL);if(e&&this.timeReceivePiece>0&&(this.logger.warn(`syn ${this.loadedPackets()} of ${i} packets loaded`),this.shouldWaitForRemain(this.httpLoadTime))){const e=this.httpLoadTime;return this.waitingRemain=!0,this.logger.info(`syn wait for remain ${e}`),void this._startTimer(e,!1)}if(t){const e=[this.forwardPeer,this.reversePeer].filter((e=>!!e)).sort(((e,t)=>e.currentLoadSpeed()-t.currentLoadSpeed())).shift();e&&e.loadtimeout()}if(this._cancelP2p(),this.rangeSupported&&this.url)return this._loadRemainBufferByHttp();this._notifyStreamListenersAbort(),this._emitPartialOrError(error_code.ERROR_SYN_ABORT)}shouldWaitForRemain(e){if(e<=0)return!1;const t=performance.now()-this.timeStart;return t<500||t<1e3&&this.timeReceivePiece>0&&e>3e3||this.shouldWaitForRemainUrgent(e)}shouldWaitForRemainUrgent(e){if(0===this.timeReceivePiece||e<=0)return!1;const t=this.p2pSpeed;let s=0;[this.forwardPeer,this.reversePeer].forEach((e=>{e&&(s+=e.loadedBytes())}));const r=(this.pieceMsg.size-s)/e;return this.logger.info(`syn remainTime ${e} speed ${t} required ${r}`),t>=r}get p2pSpeed(){let e=0;return[this.forwardPeer,this.reversePeer].forEach((t=>{t&&(e+=t.currentLoadSpeed())})),e}getFromPeerId(){const{forwardPeer:e,reversePeer:t}=this;return this.isFull()&&e!==t?`${e.remotePeerId}:${t.remotePeerId}`:e?`${e.remotePeerId}`:t?`${t.remotePeerId}`:""}_loadRemainBufferByHttp(){if(this.rangeRequesting)return;const{size:e,sn:t,level:s}=this.pieceMsg,r=this.rangeEnd>0?this.rangeEnd-1:0,n=this.forwardOffset,i=calRangeWithForwardReverseOffset(n,this.reverseOffset,e,this.rangeStart,r),o=performance.now();let a=this.deadline+this.httpLoadTime-o+1e3;a<2e3?a=2e3:a>6e3&&(a=6e3),this.logger.info(`continue download ${s}-${t} from ${this.url} range: ${i} timeout ${a}`),this.rangeRequesting=!0,this.headers&&(this.xhrSetup=e=>{for(const t of Object.keys(this.headers))e.setRequestHeader(t,this.headers[t])}),performRangeRequest(this.url,i,this.xhrSetup,a).then((e=>{if(this.destroyed)return;if(this.rangeRequesting=!1,!e)return void this.emit(hls_next_events.SYN_ERROR,this.pieceMsg,error_code.ERROR_SYN_RANGE_REQUEST);let t=utils_buffer.l.from(e);const s=t.byteLength/(performance.now()-o);this.coordinator.addHttpSpeed(s);const r=splitBytes(t,0);let i=n+1;for(let e=0;e<r.length;e++)this.bufArr[i]||this._receivePacket(!1,i+1,r[e],!1),i++})).catch((e=>{if(this.destroyed)return;this.rangeRequesting=!1,this.logger.error(`http partial download ${t} error ${e}`);const s="timeout"===e?error_code.ERROR_SYN_HTTP_TIMEOUT:error_code.ERROR_SYN_RANGE_REQUEST;this.emit(hls_next_events.SYN_ERROR,this.pieceMsg,s)}))}_print(){const{level:e,sn:t}=this.pieceMsg;this.logger.info(`syn parallel loading ${e}-${t}`)}}const coordinator_ALPHA=.6;class Coordinator{constructor(){this.meanHttpSpeed=0}addHttpSpeed(e){this.meanHttpSpeed=(1-coordinator_ALPHA)*this.meanHttpSpeed+coordinator_ALPHA*e}shouldSwitchToHttp(e,t,s,r,n){if(this.meanHttpSpeed<=0)return!1;if(s>=this.meanHttpSpeed)return!1;if(this.meanHttpSpeed*n>=e)return!1;return((n+t-performance.now())*this.meanHttpSpeed-e)/(this.meanHttpSpeed-s)*s<r}}const MIN_P2P_LOAD_TIME=1.5,VOD_MAX_PREFETCH_COUNT=150,Live_MAX_PREFETCH_COUNT=10;class Scheduler extends scheduler_base{constructor(e,t){super(e,t),this.bitset=new BitsetManager(t.live||!1),this.bitCounts=new BitCountsManager,this.requestingMap=new RequestingMap(hls_next_events.REQUESTING_MAP_HAVE),this.segmentBuilderMap=new RequestingMap(hls_next_events.BUILDER_MAP_HAVE),this.allowP2pLimit=t.httpLoadTime+MIN_P2P_LOAD_TIME,this.playlistInfo=new Map,this.isUploader=!1,this.isReceiver=!1,this.targetPeers={},this.mBufferedDuration=0,this.sequential=!0,this.httpTimeouts=0,this.httpRangeErrs=0,this.coordinator=new Coordinator,this.loadingSegId="",this.loadingSN=0,this.currPlaySN=0,this.currLostSN=-1,this.nextLostSN=-1,this.config.live?this.maxPrefetchCount=Live_MAX_PREFETCH_COUNT:(this.maxPrefetchCount=VOD_MAX_PREFETCH_COUNT,this.startCheckPeersTimer())}get httpRangeSupported(){return this.config.httpRangeSupported}handshakePeer(e){this._setupDC(e),e.sendMetaData(this.bitset.allArray(),!0,this.peersNum)}_setupDC(e){super._setupDC(e),e.on(hls_next_events.DC_HAVE,(t=>{if(e.bitset&&t.sn>=0){const{sn:s,level:r,complete:n}=t;this.bitset.has(s,r)||this.bitCounts.incre(s,r);const i=n?SegmentState.COMPLETE:SegmentState.PARTIAL_FORWARD;e.bitset.add(s,r,i),this.emit(hls_next_events.SCH_DCHAVE,t.seg_id),e.isAvailableUrgently&&this._handleDCHave(e,s,r,i)}})).on(hls_next_events.DC_HAVE_REVERSE,(t=>{if(e.bitset&&t.sn>=0){const{sn:s,level:r}=t;this.bitset.has(s,r)||this.bitCounts.incre(s,r),e.bitset.hasCompleteOr(s,r,SegmentState.PARTIAL_REVERSE)||e.bitset.add(s,r,SegmentState.PARTIAL_REVERSE),this.emit(hls_next_events.SCH_DCHAVE,t.seg_id),e.isAvailableUrgently&&this._handleDCHave(e,s,r,SegmentState.PARTIAL_REVERSE)}})).on(hls_next_events.DC_LOST,(t=>{if(!e.bitset)return;const{sn:s,level:r}=t;e.bitset.has(s,r)&&(e.bitset.delete(s,r),this.bitCounts.decre(s,r))})).on(hls_next_events.DC_PIECE,(e=>{e.ext&&e.ext.incompletes>=6||this.notifyAllPeers(e.sn,e.level,e.seg_id,e.reverse?SegmentState.PARTIAL_REVERSE:SegmentState.PARTIAL_FORWARD)})).on(hls_next_events.DC_PIECE_CANCEL,(t=>{const{sn:s,level:r}=t,n=this.requestingMap.get(s,r);if(n)return void n.removeStreamListener(e.remotePeerId);const i=this.segmentBuilderMap.get(s,r);i&&i.removeStreamListener(e.remotePeerId)})).on(hls_next_events.DC_PIECE_NOT_FOUND,(t=>{const{sn:s,level:r}=t;e.bitset.delete(s,r),this.bitCounts.decre(s,r),e.checkIfNeedChoke(!0)})).on(hls_next_events.DC_REQUEST,(async t=>{const{logger:s}=this,{sn:r,level:n,reverse:i}=t;this.isUploader=!0;let o=t.seg_id;o||(o=await this.bufMgr.getSegIdBySN(r));const a=this.requestingMap.get(r,n);let h=!1;a&&a.isDownloading()&&(h=i&&a.hasReversePeer()||!i&&a.hasForwardPeer());const l=await this.bufMgr.getSegById(o);if(l)s.info("found seg from bufMgr"),l.level===n?e.sendBuffer(l.sn,l.segId,l.data,{from:"FromCache",level:l.level,reverse:i}):e.sendPieceNotFound(r,o,{level:n});else if(h){s.info(`syn had ${a.loadedPackets()} packets, wait remain from upstream ${a.getFromPeerId()}`);const t=i?a.reversePeer:a.forwardPeer;e.sendPartialBuffer(t.pieceMsg,t.bufArr,{from:a.isFull()?"WaitPartialDouble":"WaitPartialSingle",incompletes:1}),d(a,e,i)}else{const t=this.segmentBuilderMap.get(r,n);if(t)s.info(`peer request ${r} wait from builder, sent ${t.bufferList.length}`),c(t,e);else if(r>=this.loadingSN){let t;const a=a=>{this.segmentBuilderMap.off(`${hls_next_events.BUILDER_MAP_HAVE}${r}-${n}`,t),a&&a.level===n?(s.info(`peer request notify seg ${a.sn}`),e.sendBuffer(a.sn,a.segId,a.data,{from:"NotifySegment",level:a.level,reverse:i})):e.sendPieceNotFound(r,o,{level:n})};t=t=>{this.bufMgr.off(`${hls_next_events.BM_ADDED_SN_}${r}`,a),c(t,e)};const h=`peer request ${r} wait`;this.isHlsjs?(s.info(`${h} from fragLoader`),this.segmentBuilderMap.once(`${hls_next_events.BUILDER_MAP_HAVE}${r}-${n}`,t)):s.info(`${h} for seg`),this.bufMgr.once(`${hls_next_events.BM_ADDED_SN_}${r}`,a)}else e.sendPieceNotFound(r,o,{level:n})}function c(e,t){t.sendPartialBuffer(e.pieceMsg,e.bufferList,{from:"FromHttpStream",incompletes:1}),e.bufferList.length<e.pieceMsg.attachments?d(e,t,!1):t.uploading=!1}function d(e,t,s){e.addStreamListener(s,t.remotePeerId,((e,s,r,n,i)=>{r?t.sendMsgPieceAbort(n):t.send(n),i&&(t.uploading=!1)}))}}))}handleMetaData(e,t){if(t.field){e.bitset=new BitsetManager(this.config.live,t.field);for(let e in t.field){const s=Number(e);if(s<0)continue;t.field[s].forEach((e=>{this.bitset.has(e,s)||this.bitCounts.incre(e,s)}))}this.addPeer(e),this.downloadOnly&&this.chokePeerRequest(e)}}peersHas(e,t){return this.bitCounts.has(e,t)}deletePeer(e){if(this.peerManager.hasPeer(e.remotePeerId)&&e.bitset){const t=e.bitset.allArray();for(let e in t){const s=Number(e),r=t[s];r&&r.forEach((e=>{this.bitCounts.decre(e,s)}))}}this.cleanRequestingMap(e.remotePeerId),super.deletePeer(e)}hasAndSetTargetPeer(e,t,s){const{logger:r,config:n}=this,i=1e3*(s-n.httpLoadTime),o=n.httpLoadTime+MIN_P2P_LOAD_TIME;if(r.info(`bufferedDuration ${s} remainLoadTime ${i}`),s<=o)return!1;if(this.requestingMap.has(e,t)){const a=this.requestingMap.get(e,t);if(!a)return this._searchAvailablePeers(e,t);if(!a.shouldWaitForRemain(i)){if(r.warn(`syn prefetch timeout at ${e}`),a.isFull())return!1;const i=this.peerManager.getPeersOrderByWeight(),h=findPeersWithState(i,SegmentState.COMPLETE,e,t);if(a.hasReversePeer()){const s=h.concat(findPeersWithState(i,SegmentState.PARTIAL_FORWARD,e,t));if(s.length>0)return this.targetPeers.forwardPeer=s[0],!0}else{const s=h.concat(findPeersWithState(i,SegmentState.PARTIAL_REVERSE,e,t));if(s.length>0)return this.targetPeers.reversePeer=s[0],!0}return n.httpRangeSupported&&s>o+1}return r.info(`prefetch ${e} wait for remain`),!0}return this._searchAvailablePeers(e,t)}_searchAvailablePeers(e,t){if(!this.hasIdlePeers||!this.peersHas(e,t))return!1;const s=this.peerManager.getPeersOrderByWeight(),[r,n]=getBestPairForDownload(s,e,t);return this.targetPeers={forwardPeer:r,reversePeer:n},[r,n].some((e=>!!e))}reportTraffic(e,t,s){const{fetcher:r}=this.engine;r?(e>0&&r.reportFlow(e),t>0&&r.reportDCTraffic(t,s)):this.logger.error("DC report failed")}notifyAllPeers(e,t,s,r=SegmentState.COMPLETE){const{live:n}=this.config;if(this.bitset.has(e,t,r))return;const i=generateStateId(e,t,r);let o;r!==SegmentState.PARTIAL_REVERSE&&(o=r===SegmentState.COMPLETE);const a=this.requestingMap.get(e,t);for(let h of this.peerManager.getPeerValues())a&&a.hasPeer(h)||h.notifySet.has(i)||h.bitset.hasCompleteOr(e,t,r)||(h.sendMsgHave(e,s,{level:t,reverse:r===SegmentState.PARTIAL_REVERSE,complete:o}),h.notifySet.add(i),n&&trimSet(h.notifySet,20))}checkPeers(){if(!this.hasPeers)return;const{logger:e,config:t,engine:s}=this,r=t.live,{currentLevel:n}=s;if(e.info(`currentLevel ${n}`),0===this.bitCounts.size(n))return;if(!r&&this.nextLostSN>=0&&this.nextLostSN>=this.currPlaySN-10)return;if(this.mBufferedDuration<this.allowP2pLimit&&(0!==this.mBufferedDuration||this.isHlsjs))return void e.info(`low buffer time ${this.mBufferedDuration}, skip prefetch`);const i=this.peerManager.getPeersOrderByWeight();if(0===i.length)return;const o=[];let{prefetchNum:a,endSN:h,startSN:l}=t;r&&(a=1);let c=0,d=this.loadingSN+1;if(!r)if(this.loadingSN>=h&&!this.bufMgr.overflowed)d=l;else{const e=Math.min(...i.filter((e=>e.endSN>=d)).map((e=>e?e.startSN:1/0)));if(!isFinite(e))return;d<e&&(d=e)}for(;o.length<a&&o.length<i.length&&c<this.maxPrefetchCount;){if(!r&&d>h)return;if(r&&d>this.loadingSN+2)return;if(this.bitset.has(d,n))d++;else{if(d!==this.loadingSN&&this.bitCounts.has(d,n)&&!this.requestingMap.has(d,n))for(let s of i)if(!o.includes(s)&&s.bitset.has(d,n)){const i=s.bitset.getState(d,n);let a;a=i===SegmentState.COMPLETE?r?randomNum(0,100)>40:0===randomNum(0,1):i===SegmentState.PARTIAL_REVERSE,o.push(s);const h=new Synthesizer(this.coordinator,this.logger,d,n,t.httpRangeSupported);this._setupSynthesizer(h),a?h.setReversePeer(s):h.setForwardPeer(s),this.requestingMap.set(d,n,h),s.requestDataBySN(d,!1,{level:n,reverse:a}),e.info(`request prefetch ${d} level ${n} from peer ${s.remotePeerId} downloadNum ${s.downloadNum} reverse ${a}`);break}c++,d++}}this.loadedPeerNum=o.length}onBufferManagerLost(e,t,s,r){this.currLostSN=e,s&&(this.nextLostSN=s),this.bitset.delete(e,r),this.bitCounts.delete(e,r)}cleanRequestingMap(e){const t=this.peerManager.getPeer(e);if(t)for(let[s,r]of this.requestingMap.internalMap){const n=s.split("-"),i=Number(n[1]),o=Number(n[0]);r.hasPeerId(e)&&(this.logger.info(`delete ${s} in requestingMap`),r.deletePeer(t),this.bitCounts.decre(i,o),t.bitset.delete(i,o))}}shouldWaitForNextSeg(){let e;return e=!this.isUploader&&(!!this.isReceiver||randomNum(0,100)>20),this.isReceiver=this.isUploader=!1,e}updateLoaded(e,t){this.bitset.hasCompleteOr(e,t)||(this.bitset.add(e,t,SegmentState.COMPLETE),this.bitCounts.delete(e,t))}broadcastPlaylist(e,t){if(!this.config.live)return;const s=getMaxSequence(t);for(let r of this.peerManager.getPeerValues())r.sendMsgPlaylist(e,t,s);this.playlistInfo.set(e,{seq:s})}getPlaylistFromPeer(e){if(!this.config.live)return null;const{seq:t}=this.playlistInfo.get(e);for(let s of this.peerManager.getPeerValues()){const r=s.getLatestPlaylist(e,t);if(r)return r}return null}getBufferedDuration(){let{media:e,currentSrc:t}=this.engine;if(!e||e.src!==t&&0===e.currentTime){if(this.logger.info("try get video element"),e=tryGetMediaElement(this.config.mediaElem,t),!e)return 5;this.engine.media=e}let s=0,r=e.currentTime,n=e.buffered;for(let e=n.length-1;e>=0;e--)if(r>=n.start(e)&&r<=n.end(e)){s=n.end(e)-r;break}return this.mBufferedDuration=s,s>0?s:0}destroy(){super.destroy(),this.requestingMap.clear(),this.segmentBuilderMap.clear()}_notifySynthesizer(e,t,s,r,n,i=!0){const{logger:o}=this,a=this.requestingMap.get(s,r);function h(n,i){i?e.requestDataById(t,s,!0,{level:r,reverse:n}):(o.info(`notify syn prefetch ${s}`),e.requestDataBySN(s,!1,{level:r,reverse:n}))}a&&(a.isFull()||(a.isAlmostDeadline()?o.info("almost deadline, ignored"):a.hasForwardPeer()||n!==SegmentState.PARTIAL_FORWARD&&n!==SegmentState.COMPLETE?a.hasReversePeer()||n!==SegmentState.PARTIAL_REVERSE&&n!==SegmentState.COMPLETE||(a.setReversePeer(e),h(!0,i)):(a.setForwardPeer(e),h(!1,i))))}_setupEngine(){}getStatsForPeer(){const{currentLevel:e,media:t}=this.engine,s={level:e};if(t&&!this.config.live){const{currentTime:e}=t;s.pos=Math.round(e)}return s}_handleSynError(e){switch(e){case error_code.ERROR_SYN_RANGE_REQUEST:this.logger.warn("ERROR_SYN_RANGE_REQUEST"),this.httpRangeErrs++;break;case error_code.ERROR_SYN_HTTP_TIMEOUT:this.logger.warn("ERROR_SYN_HTTP_TIMEOUT"),this.httpTimeouts+=3}this.httpRangeErrs>=1&&(this.config.httpLoadTime<=4500&&(this.config.httpLoadTime+=500),this.httpRangeErrs=0)}}class SegmentBuilder{constructor(e,t,s,r){this.bufferList=[],this.streamListeners=[],this.finished=!1,this.packetSize=peer.defaultPacketSize,this.attachments=r%this.packetSize==0?r/this.packetSize:Math.floor(r/this.packetSize)+1,this.pieceMsg={event:events.DC_PIECE,attachments:this.attachments,seg_id:s,sn:e,level:t,size:r,reverse:!1}}receiveBytes(e,t){e.byteLength&&(this.bufferList.push(e),t&&(this.finished=!0),this._notifyStreamListeners(e))}destroy(){this.finished||this._notifyStreamListenersAbort()}addStreamListener(e,t,s){this.streamListeners.push({handler:s,peerId:t})}removeStreamListener(e){this.streamListeners=this.streamListeners.filter((t=>t.peerId!==e||(t.handler(void 0,void 0,!0,"aborted by cancel"),!1)))}_notifyStreamListenersAbort(){for(let e of this.streamListeners){const{handler:t}=e;t(void 0,void 0,!0,"aborted by httpLoader")}this.streamListeners.length=0}_notifyStreamListeners(e){const{sn:t,seg_id:s}=this.pieceMsg;for(let r of this.streamListeners){const{handler:n}=r;n(t,s,!1,e,this.finished)}this.finished&&(this.streamListeners.length=0)}}class HlsSwScheduler extends Scheduler{constructor(e,t){super(e,t),this.server=t.fetcher,this.p2pEnabled=e.p2pEnabled,this.resolveMap=new Map,this.dcDownloadTimeout=t.live?5:9,this.segmentId=t.segmentId}async handleGetMediaData(e,t){const{logger:s,config:r,engine:n}=this;let{url:i,range:o}=e;o&&(i=`${i}|${o}`);const a=this.fragMap.get(i);if(!a)return s.warn(`cannot get frag ${i}`),t.postMessage({action:hls_next_events.SW_GET_MEDIA});n.currentLevelIndex=a.level;const{sn:h,baseurl:l,level:c}=a,d=this.segmentId(String(c),h,e.url,o),u=d===this.loadingSegId;u&&s.warn(`duplicate request ${d}`),this.loadingSN=h,n.bufMgr&&(n.bufMgr.loadingSN=h),this.loadingSegId=d;const g=await this.bufMgr.getSegById(d);if(g)return s.info(`bufMgr found seg sn ${h} segId ${d}`),a.loaded=g.data.byteLength,a.fromPeerId=g.fromPeerId,n.emit(hls_next_events.FRAG_LOADED,{url:e.url,sn:h,level:c,segId:d,loaded:a.loaded,duration:a.duration,byP2p:!0,fromPeerId:g.fromPeerId}),this._onFragLoaded(e.url,a),t.postMessage({action:hls_next_events.SW_GET_MEDIA,data:{url:e.url,buffer:g.data,incomplete:!1}});const f=this.getBufferedDuration();if(s.info(`handleGetMediaData sn ${h} bufferedDuration ${f}`),this.resolveMap.has(h)||u){let e=this.requestingMap.get(h,c);if(e||u){e&&(s.warn(`${h} is requesting, terminate syn wait for seg`),e.terminate());let r=1e3*(f-this.config.httpLoadTime)+1e3;r<0&&(r=0);let n=setTimeout((()=>{s.info(`notify seg ${h} timeout`),n=-1,t.postMessage({action:hls_next_events.SW_GET_MEDIA})}),r);this.bufMgr.once(`${hls_next_events.BM_ADDED_SN_}${h}`,(e=>{n<0||e&&e.level===c&&(clearTimeout(n),s.info(`notify seg ${e.sn}`),t.postMessage({action:hls_next_events.SW_GET_MEDIA,data:{url:i,buffer:e.data,incomplete:!1}}))}))}else s.warn(`${h} is requesting, fallback`),t.postMessage({action:hls_next_events.SW_GET_MEDIA})}else if(this.hasAndSetTargetPeer(h,c,f)){await this._loadFragByP2p(a,t,h,d,e.url,c)||t.postMessage({action:hls_next_events.SW_GET_MEDIA})}else{const e=this.requestingMap.get(h,c);if(this.httpRangeSupported&&e&&e.hasPartialBuffer()){s.warn(`syn has partial buffer for ${h}`);const[r,n]=e.getPartialBuffer();t.postMessage({action:hls_next_events.SW_GET_MEDIA,data:{url:i,bufferLeft:r,bufferRight:n,incomplete:!0,size:e.pieceMsg.size}},[r,n].filter((e=>!!e)).map((e=>e.buffer)))}else t.postMessage({action:hls_next_events.SW_GET_MEDIA})}}async _loadFragByP2p(e,t,s,r,n,i){const{logger:o}=this;o.info(`p2p load sn ${s} segId ${r} level ${i}`);const a=await this.load(s,r,i);if(a&&(a.data||a.incomplete)){const{data:h,incomplete:l,fromPeerId:c,bufferLeft:d,bufferRight:u,size:g}=a;if(l)o.info(`p2p loaded partial segId ${r} level ${i} size ${g}`),e.loaded=(d?d.byteLength:0)+(u?u.byteLength:0);else{if(o.info(`p2p loaded segId ${r} level ${i} size ${h.byteLength} incomplete ${l}`),!await this.bufMgr.hasSegOfId(r)){const e=new Segment(s,r,h,c,i);o.info(`bufMgr putSeg ${s} level ${i}`),this.bufMgr.putSeg(e)}e.loaded=h.byteLength}return e.fromPeerId=c,this.engine.emit(hls_next_events.FRAG_LOADED,{url:n,sn:s,level:i,segId:r,loaded:e.loaded,duration:e.duration,byP2p:!0,fromPeerId:c}),this._onFragLoaded(n,e),t.postMessage({action:hls_next_events.SW_GET_MEDIA,data:{url:n,buffer:h,bufferLeft:d,bufferRight:u,incomplete:l,size:g}},[d,u].filter((e=>!!e)).map((e=>e.buffer))),!0}o.warn(`P2P timeout load segId ${r}`);const h=await this.bufMgr.getSegById(r);return!!h&&(o.info(`already loaded seg sn ${s} segId ${r}`),t.postMessage({action:hls_next_events.SW_GET_MEDIA,data:{url:n,buffer:h.data,incomplete:!1}}),!0)}_processStream(e,t,s,r,n){const i=peer.defaultPacketSize,{segmentBuilderMap:o,logger:a}=this;a.info(`got stream ${s}`);const h=new SegmentBuilder(s,r,n,t);o.has(s,r)||o.set(s,r,h);const l=e.getReader();let c=0,d=0,u=(0,utils_buffer.l)(0);return new Promise(((e,t)=>{const s=()=>{l.read().then((({value:t,done:r})=>{if(t&&(c+=t.length),r){if(u.byteLength>0)if(c<=i){const e=(0,utils_buffer.l)(c);u.copy(e,0,d*i,u.byteLength),h.receiveBytes(e,!0)}else{const e=splitBytes(u,d*i);for(let t=0;t<e.length;t++)h.receiveBytes(e[t],t===e.length-1)}const t=u.buffer;return e(t)}const n=utils_buffer.l.from(t);if(u=utils_buffer.l.concat([u,n]),c>=i){c-=i;const e=(0,utils_buffer.l)(i);u.copy(e,0,d*i,(d+1)*i),d++,h.receiveBytes(e,!1)}s()})).catch((e=>{t(e)}))};s()}))}async handleMediaData(e,t){t.postMessage({action:hls_next_events.SW_MEDIA});const{logger:s,engine:r}=this;let{url:n,buffer:i,stream:o,range:a,p2p:h,httpSpeed:l,size:c}=e;if(r.rangeTestUrl===n)return void(r.rangeTestUrl="");s.info(`SW_MEDIA url ${n} size ${c} range ${a} speed ${l}`),l&&this.coordinator.addHttpSpeed(l),a&&(n=`${n}|${a}`);const d=this.fragMap.get(n);if(!d)return;const{sn:u,level:g,baseurl:f}=d,p=this.segmentId(String(g),u,e.url,a);if(o){this.notifyAllPeers(u,g,p,SegmentState.PARTIAL_FORWARD);try{i=await this._processStream(o,c,u,g,p)}catch(e){return void s.warn(e)}finally{this.segmentBuilderMap.delete(u,g)}}if(this.notifyAllPeers(u,g,p),d.segId=p,d.loaded=i.byteLength,r.emit(hls_next_events.FRAG_LOADED,{url:e.url,sn:u,level:g,segId:p,loaded:d.loaded,duration:d.duration,byP2p:!1}),this._onFragLoaded(e.url,d),!await this.bufMgr.hasSegOfId(p)){const e=new Segment(u,p,i,"",g);this.bufMgr.putSeg(e),s.info(`bufMgr putSeg ${p} level ${g}`);const t=h&&h>0?h:0,r=i.byteLength-t;this.reportTraffic(r,t,0)}}notifySWMessage(e,t,s){switch(e){case hls_next_events.SW_MEDIA:this.handleMediaData(t,s);break;case hls_next_events.SW_GET_MEDIA:this.handleGetMediaData(t,s);break;default:this.logger.warn(`unknown action ${e}`)}}destroy(){super.destroy(),this.logger.warn("destroy HlsSwScheduler")}_onFragLoaded(e,t){if(this.updateLoaded(t.sn,t.level),!this.engine)return;const{media:s,targetDuration:r}=this.engine;!this.config.live&&s&&r&&(this.currPlaySN=Math.ceil(s.currentTime/r))}load(e,t,s){const{logger:r,config:n}=this;this.isReceiver=!0;let i=this.mBufferedDuration-this.config.httpLoadTime;i>this.dcDownloadTimeout&&(i=this.dcDownloadTimeout);const{forwardPeer:o,reversePeer:a}=this.targetPeers;o||a||(i-=1);let h=this.requestingMap.get(e,s),l={allowLoadPartial:this.httpRangeSupported};h?h.setExtra(l):(h=new Synthesizer(this.coordinator,this.logger,e,s,this.httpRangeSupported,l),this._setupSynthesizer(h),this.requestingMap.set(e,s,h)),h.setTimeout(1e3*i),o&&(h.setForwardPeer(o),o.requestDataById(t,e,!0,{level:s})),a&&(h.setReversePeer(a),a.requestDataById(t,e,!0,{level:s,reverse:!0}));const c=new Promise((r=>{const n={resolve:r,sn:e,level:s,segId:t,incomplete:!1};this.resolveMap.set(e,n)}));return this.targetPeers={},c}_setupSynthesizer(e){e.on(hls_next_events.SYN_OUTPUT,((t,s)=>{const{config:r,logger:n}=this,{segId:i,sn:o,data:a,level:h}=t,{speed:l,http:c,p2p:d}=s;this.httpTimeouts>0&&this.httpTimeouts--;const u=this.resolveMap.has(o);if(r.validateSegment(i,new Uint8Array(a))){this.notifyAllPeers(o,h,i),this.bitset.has(o,h)||this.reportTraffic(c,d,l);const s=e.getFromPeerId();if(u){n.info(`receive criticalSeg seg_id ${i}`);const e=this.resolveMap.get(o);this.resolveMap.delete(o),e.resolve({data:a,fromPeerId:s})}else this.bitset.has(o,h)||(this.bufMgr.putSeg(t),this.updateLoaded(o,h))}else if(n.error(`segment ${i} validate failed`),u){const e=this.resolveMap.get(o);this.resolveMap.delete(o),e.resolve()}this.requestingMap.delete(o,h)})).on(hls_next_events.SYN_PARTIAL,((t,s,r)=>{const{sn:n,level:i,size:o}=t;if(this.httpTimeouts++,this.resolveMap.has(n)){this.resolveMap.get(n).resolve({bufferLeft:s,bufferRight:r,fromPeerId:e.getFromPeerId(),incomplete:!0,size:o}),this.resolveMap.delete(n)}this.requestingMap.delete(n,i)})).on(hls_next_events.SYN_ERROR,((e,t)=>{const{sn:s,level:r}=e;if(this.resolveMap.has(s)){const e=this.resolveMap.get(s);this.resolveMap.delete(s),e.resolve()}this.requestingMap.delete(s,r)}))}_handleDCHave(e,t,s,r){const n=0!==this.resolveMap.size;if(n&&this.resolveMap.has(t)){const{segId:n}=this.resolveMap.get(t);this._notifySynthesizer(e,n,t,s,r)}else this.httpTimeouts>=1&&t===this.loadingSN+1&&this._notifySynthesizer(e,void 0,t,s,r,!1);this.config.live&&!n&&queue_microtask_default()((()=>{this.checkPeers()}))}}const hls_sw_scheduler=HlsSwScheduler;var extendStatics=function(e,t){return extendStatics=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var s in t)t.hasOwnProperty(s)&&(e[s]=t[s])},extendStatics(e,t)};function __extends(e,t){function s(){this.constructor=e}extendStatics(e,t),e.prototype=null===t?Object.create(t):(s.prototype=t.prototype,new s)}function __values(e){var t="function"==typeof Symbol&&e[Symbol.iterator],s=0;return t?t.call(e):{next:function(){return e&&s>=e.length&&(e=void 0),{value:e&&e[s++],done:!e}}}}function __read(e,t){var s="function"==typeof Symbol&&e[Symbol.iterator];if(!s)return e;var r,n,i=s.call(e),o=[];try{for(;(void 0===t||t-- >0)&&!(r=i.next()).done;)o.push(r.value)}catch(e){n={error:e}}finally{try{r&&!r.done&&(s=i.return)&&s.call(i)}finally{if(n)throw n.error}}return o}function __spread(){for(var e=[],t=0;t<arguments.length;t++)e=e.concat(__read(arguments[t]));return e}var Event=function(e,t){this.target=t,this.type=e},ErrorEvent=function(e){function t(t,s){var r=e.call(this,"error",s)||this;return r.message=t.message,r.error=t,r}return __extends(t,e),t}(Event),CloseEvent=function(e){function t(t,s,r){void 0===t&&(t=1e3),void 0===s&&(s="");var n=e.call(this,"close",r)||this;return n.wasClean=!0,n.code=t,n.reason=s,n}return __extends(t,e),t}(Event),getGlobalWebSocket=function(){if("undefined"!=typeof WebSocket)return WebSocket},isWebSocket=function(e){return void 0!==e&&!!e&&2===e.CLOSING},DEFAULT={maxReconnectionDelay:1e4,minReconnectionDelay:1e3+4e3*Math.random(),minUptime:5e3,reconnectionDelayGrowFactor:1.3,connectionTimeout:4e3,maxRetries:1/0,maxEnqueuedMessages:1/0,startClosed:!1,debug:!1},ReconnectingWebSocket=function(){function e(e,t,s){var r=this;void 0===s&&(s={}),this._listeners={error:[],message:[],open:[],close:[]},this._retryCount=-1,this._shouldReconnect=!0,this._connectLock=!1,this._binaryType="blob",this._closeCalled=!1,this._messageQueue=[],this.onclose=null,this.onerror=null,this.onmessage=null,this.onopen=null,this._handleOpen=function(e){r._debug("open event");var t=r._options.minUptime,s=void 0===t?DEFAULT.minUptime:t;clearTimeout(r._connectTimeout),r._uptimeTimeout=setTimeout((function(){return r._acceptOpen()}),s),r._ws.binaryType=r._binaryType,r._messageQueue.forEach((function(e){return r._ws.send(e)})),r._messageQueue=[],r.onopen&&r.onopen(e),r._listeners.open.forEach((function(t){return r._callEventListener(e,t)}))},this._handleMessage=function(e){r._debug("message event"),r.onmessage&&r.onmessage(e),r._listeners.message.forEach((function(t){return r._callEventListener(e,t)}))},this._handleError=function(e){r._debug("error event",e.message),r._disconnect(void 0,"TIMEOUT"===e.message?"timeout":void 0),r.onerror&&r.onerror(e),r._debug("exec error listeners"),r._listeners.error.forEach((function(t){return r._callEventListener(e,t)})),r._connect()},this._handleClose=function(e){r._debug("close event"),r._clearTimeouts(),r._shouldReconnect&&r._connect(),r.onclose&&r.onclose(e),r._listeners.close.forEach((function(t){return r._callEventListener(e,t)}))},this._url=e,this._protocols=t,this._options=s,this._options.startClosed&&(this._shouldReconnect=!1),this._connect()}return Object.defineProperty(e,"CONNECTING",{get:function(){return 0},enumerable:!0,configurable:!0}),Object.defineProperty(e,"OPEN",{get:function(){return 1},enumerable:!0,configurable:!0}),Object.defineProperty(e,"CLOSING",{get:function(){return 2},enumerable:!0,configurable:!0}),Object.defineProperty(e,"CLOSED",{get:function(){return 3},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"CONNECTING",{get:function(){return e.CONNECTING},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"OPEN",{get:function(){return e.OPEN},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"CLOSING",{get:function(){return e.CLOSING},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"CLOSED",{get:function(){return e.CLOSED},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"binaryType",{get:function(){return this._ws?this._ws.binaryType:this._binaryType},set:function(e){this._binaryType=e,this._ws&&(this._ws.binaryType=e)},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"retryCount",{get:function(){return Math.max(this._retryCount,0)},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"bufferedAmount",{get:function(){return this._messageQueue.reduce((function(e,t){return"string"==typeof t?e+=t.length:t instanceof Blob?e+=t.size:e+=t.byteLength,e}),0)+(this._ws?this._ws.bufferedAmount:0)},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"extensions",{get:function(){return this._ws?this._ws.extensions:""},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"protocol",{get:function(){return this._ws?this._ws.protocol:""},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"readyState",{get:function(){return this._ws?this._ws.readyState:this._options.startClosed?e.CLOSED:e.CONNECTING},enumerable:!0,configurable:!0}),Object.defineProperty(e.prototype,"url",{get:function(){return this._ws?this._ws.url:""},enumerable:!0,configurable:!0}),e.prototype.close=function(e,t){void 0===e&&(e=1e3),this._closeCalled=!0,this._shouldReconnect=!1,this._clearTimeouts(),this._ws?this._ws.readyState!==this.CLOSED?this._ws.close(e,t):this._debug("close: already closed"):this._debug("close enqueued: no ws instance")},e.prototype.reconnect=function(e,t){this._shouldReconnect=!0,this._closeCalled=!1,this._retryCount=-1,this._ws&&this._ws.readyState!==this.CLOSED?(this._disconnect(e,t),this._connect()):this._connect()},e.prototype.send=function(e){if(this._ws&&this._ws.readyState===this.OPEN)this._debug("send",e),this._ws.send(e);else{var t=this._options.maxEnqueuedMessages,s=void 0===t?DEFAULT.maxEnqueuedMessages:t;this._messageQueue.length<s&&(this._debug("enqueue",e),this._messageQueue.push(e))}},e.prototype.addEventListener=function(e,t){this._listeners[e]&&this._listeners[e].push(t)},e.prototype.dispatchEvent=function(e){var t,s,r=this._listeners[e.type];if(r)try{for(var n=__values(r),i=n.next();!i.done;i=n.next()){var o=i.value;this._callEventListener(e,o)}}catch(e){t={error:e}}finally{try{i&&!i.done&&(s=n.return)&&s.call(n)}finally{if(t)throw t.error}}return!0},e.prototype.removeEventListener=function(e,t){this._listeners[e]&&(this._listeners[e]=this._listeners[e].filter((function(e){return e!==t})))},e.prototype._debug=function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];this._options.debug&&console.log.apply(console,__spread(["RWS>"],e))},e.prototype._getNextDelay=function(){var e=this._options,t=e.reconnectionDelayGrowFactor,s=void 0===t?DEFAULT.reconnectionDelayGrowFactor:t,r=e.minReconnectionDelay,n=void 0===r?DEFAULT.minReconnectionDelay:r,i=e.maxReconnectionDelay,o=void 0===i?DEFAULT.maxReconnectionDelay:i,a=0;return this._retryCount>0&&(a=n*Math.pow(s,this._retryCount-1))>o&&(a=o),this._debug("next delay",a),a},e.prototype._wait=function(){var e=this;return new Promise((function(t){setTimeout(t,e._getNextDelay())}))},e.prototype._getNextUrl=function(e){if("string"==typeof e)return Promise.resolve(e);if("function"==typeof e){var t=e();if("string"==typeof t)return Promise.resolve(t);if(t.then)return t}throw Error("Invalid URL")},e.prototype._connect=function(){var e=this;if(!this._connectLock&&this._shouldReconnect){this._connectLock=!0;var t=this._options,s=t.maxRetries,r=void 0===s?DEFAULT.maxRetries:s,n=t.connectionTimeout,i=void 0===n?DEFAULT.connectionTimeout:n,o=t.WebSocket,a=void 0===o?getGlobalWebSocket():o;if(this._retryCount>=r)this._debug("max retries reached",this._retryCount,">=",r);else{if(this._retryCount++,this._debug("connect",this._retryCount),this._removeListeners(),!isWebSocket(a))throw Error("No valid WebSocket class provided");this._wait().then((function(){return e._getNextUrl(e._url)})).then((function(t){e._closeCalled||(e._debug("connect",{url:t,protocols:e._protocols}),e._ws=e._protocols?new a(t,e._protocols):new a(t),e._ws.binaryType=e._binaryType,e._connectLock=!1,e._addListeners(),e._connectTimeout=setTimeout((function(){return e._handleTimeout()}),i))}))}}},e.prototype._handleTimeout=function(){this._debug("timeout event"),this._handleError(new ErrorEvent(Error("TIMEOUT"),this))},e.prototype._disconnect=function(e,t){if(void 0===e&&(e=1e3),this._clearTimeouts(),this._ws){this._removeListeners();try{this._ws.close(e,t),this._handleClose(new CloseEvent(e,t,this))}catch(e){}}},e.prototype._acceptOpen=function(){this._debug("accept open"),this._retryCount=0},e.prototype._callEventListener=function(e,t){"handleEvent"in t?t.handleEvent(e):t(e)},e.prototype._removeListeners=function(){this._ws&&(this._debug("removeListeners"),this._ws.removeEventListener("open",this._handleOpen),this._ws.removeEventListener("close",this._handleClose),this._ws.removeEventListener("message",this._handleMessage),this._ws.removeEventListener("error",this._handleError))},e.prototype._addListeners=function(){this._ws&&(this._debug("addListeners"),this._ws.addEventListener("open",this._handleOpen),this._ws.addEventListener("close",this._handleClose),this._ws.addEventListener("message",this._handleMessage),this._ws.addEventListener("error",this._handleError))},e.prototype._clearTimeouts=function(){clearTimeout(this._connectTimeout),clearTimeout(this._uptimeTimeout)},e}();const reconnecting_websocket_mjs=ReconnectingWebSocket,PING_INTERVAL=60,PONG_TIMEOUT=15;class WebsocketClient extends(events_default()){constructor(e,t,s,r,n="main"){super(),this.logger=e,this.config=t,this.wsAddr=s,this.serverVersion=0,this.pingInterval=r||PING_INTERVAL,this._ws=this._init(),this.name=n}_init(){const e={maxRetries:this.config.wsMaxRetries,minReconnectionDelay:randomNum(1e4,6e4),maxReconnectionDelay:6e5,maxEnqueuedMessages:20};let t=new reconnecting_websocket_mjs(this.wsAddr,void 0,e);return t.addEventListener("open",(()=>{this.logger.info(`signal ${this.name} ${this.wsAddr} connection opened`),this.onopen&&this.onopen(),this._startPing(this.pingInterval)})),t.push=t.send,t.send=e=>{let s=JSON.stringify(e);t.push(s)},t.addEventListener("message",(e=>{let t=e.data;const s=JSON.parse(t),r=s.action;if("pong"!==r){if("ver"!==r)return"close"===r?(this.logger.warn(`server close signal ${this.name} reason ${s.reason}`),void this.close()):void(this.onmessage&&this.onmessage(s,this.name));this.serverVersion=s.ver}else clearTimeout(this.pongTimer)})),t.addEventListener("close",(e=>{this.logger.warn(`signal ${this.name} ${this.wsAddr} closed ${e.code} ${e.reason}`),this.onclose&&this.onclose(),this._stopPing()})),t.addEventListener("error",(e=>{this.logger.error(`signal ${this.name} ${this.wsAddr} error`),this._stopPing(),this.onerror&&this.onerror(e)})),t}sendSignal(e,t){const s={action:"signal",to_peer_id:e,data:t};this._send(s)}sendReject(e,t,s){const r={action:"reject",to_peer_id:e,reason:t,fatal:s};this._send(r)}_send(e){this._ws&&this._ws.send(e)}_startPing(e=120){this.connected&&(this.pingTimer=setInterval((()=>{this._send({action:"ping"}),this.serverVersion>=22&&this._waitForPong()}),1e3*e))}_waitForPong(){this.pongTimer=setTimeout((()=>{this.logger.warn(`signal ${this.name} wait for pong timeout, reconnect`),this.close(),this.reconnect()}),1e3*PONG_TIMEOUT)}_resetPing(){this._stopPing(),this._startPing(this.pingInterval)}_stopPing(){clearInterval(this.pingTimer),clearTimeout(this.pongTimer),this.pingTimer=null,this.pongTimer=null}close(){this.logger.info(`close signal ${this.name}`),this._stopPing(),(()=>{this._ws&&this._ws.close(1e3,"normal close")})()}reconnect(){this._ws&&(this.logger.info(`reconnect signal ${this.name}`),this._ws.reconnect())}destroy(){this.close(),this._ws=null,this.removeAllListeners()}get connected(){return!!this._ws&&this._ws.readyState===reconnecting_websocket_mjs.OPEN}}const websocket_client=WebsocketClient,signal_manager_PING_INTERVAL=270,signal_manager=class extends(events_default()){constructor(e,t,s,r){super(),this.logger=e,this.config=t,this.mainAddr=s,this.backupAddr=r,this.mainWS=this._init(s),setTimeout((()=>{this.destroyed||(this.backupWS=this._init(r,"backup"))}),900),this._connected=!1,this.destroyed=!1}_init(e,t){if(!e)return null;let s=new websocket_client(this.logger,this.config,e,signal_manager_PING_INTERVAL,t);return s.onopen=()=>{!this._connected&&this.onopen&&(this._connected=!0,this.onopen())},s.onmessage=e=>{this.onmessage&&this.onmessage(e,s.name)},s.onclose=()=>{this._connected&&!this.connected&&this.onclose&&(this._connected=!1,this.onclose())},s.onerror=e=>{this.onerror&&this.onerror(e)},s}sendSignal(e,t,s){if(s){const r=this._getWSByName(s);if(r)return void r.sendSignal(e,t)}this.mainConnected?this.mainWS.sendSignal(e,t):this.backupConnected?this.backupWS.sendSignal(e,t):this.logger.warn("no signal available")}sendReject(e,t,s,r){if(r){const n=this._getWSByName(r);if(n)return void n.sendReject(e,t,s)}this.mainConnected?this.mainWS.sendReject(e,t,s):this.backupConnected?this.backupWS.sendReject(e,t,s):this.logger.warn("no signal available, send reject failed")}close(){this.mainWS&&this.mainWS.close(),this.backupWS&&this.backupWS.close()}_getWSByName(e){return this.mainWS&&this.mainWS.name===e?this.mainWS:this.backupWS&&this.backupWS.name===e?this.backupWS:null}reconnect(){this.mainWS&&this.mainWS.reconnect(),this.backupWS&&this.backupWS.reconnect()}destroy(){this.close(),this.mainWS=null,this.backupWS=null,this.removeAllListeners(),this.destroyed=!0}get connected(){return this.mainConnected||this.backupConnected}get mainConnected(){return this.mainWS&&this.mainWS.connected}get backupConnected(){return this.backupWS&&this.backupWS.connected}};function getPeersThrottle(e,t,s=70){var r=null,n=!1,i=s;return function(s=!1){if(s)return clearTimeout(r),void(n=!1);n||(n=!0,r=setTimeout((function(){e.call(t,i),n=!1,r=null}),1e3*i),i*=1)}}const utils_getPeersThrottle=getPeersThrottle,MAX_PC_CONNS=25,MAX_MOBILE_CONNS=15,MIN_PEER_SHARE_TIME=50,MAX_PEER_SHARE_POS=600,MAX_TRY_CONNS_TRICKLE=5;class TrackerClient extends(events_default()){constructor(e,t,s,r){super(),this.engine=e,this.logger=e.logger,this.config=r,this.connected=!1,this.scheduler=s,this.sequential=this.scheduler.sequential,this.DCMap=new Map,this.failedDCSet=new Set,this.signalerWs=null,this.fetcher=t,this.peers=[],this.minConns=5,this.stuns=[],this.requestMorePeers=utils_getPeersThrottle(this._requestMorePeers,this),this.engine.maxConns=this.maxConns=platform_default().isMobile()?MAX_MOBILE_CONNS:MAX_PC_CONNS,this.peersIncrement=0,this.gotPeersFromTracker=!1,this.fuseRate=-1}get totalConns(){return this.scheduler.peersNum+1}resumeP2P(){if(!this.fetcher)return;const{engine:e,config:t,fetcher:s}=this,{btAnnounce:r,btAnnouncePreflight:n}=s;(t.geoIpPreflight?n:r).call(s).then((s=>{if(!this.scheduler)return;e.peerId=this.peerId=s.id,this.minConns=s.min_conns;const r=s.peers;this.scheduler.notifyPeersLoaded(r.length);const n=e.netType;let i,o;if((s.wifi_only||t.wifiOnly)&&"wifi"!==n&&"ethernet"!==n&&(this.scheduler.downloadOnly=!0,this.logger.info("downloadOnly mode")),"object"==typeof t.wsSignalerAddr&&t.wsSignalerAddr.main)i=t.wsSignalerAddr.main,o=t.wsSignalerAddr.backup,s.signal&&!s.signal2&&(o=void 0);else{if("string"!=typeof t.wsSignalerAddr){const e=new Error;throw e.err=new Error("invalid wsSignalerAddr"),e}i=t.wsSignalerAddr}this.signalerWs=this._initSignalerWs(s.signal||i,s.signal2||o,s.token,s.token2),0===r.length?this.requestMorePeers():this.peers=this._filterPeers(r),e.emit("peerId",this.peerId);const a=t.getPeerId;a&&"function"==typeof a&&a(this.peerId),s.stun&&s.stun.length>0&&(this.stuns=s.stun),s.debug&&this.logger.enableDebug(),s.fuse_rate&&(this.fuseRate=s.fuse_rate),this.logger.info(`announce request response ${JSON.stringify(s,null,2)}`)})).catch((t=>{if("TRACKER_EXPT"===t.code&&e.emit(events.EXCEPTION,t),t.retry){const e=randomNum(3e4,6e4);this.logger.warn(`announce retry after ${e}ms`),this.announceTimer=setTimeout((()=>{this.resumeP2P()}),e)}}))}stopP2P(){this.fetcher.postStatsWithBeacon(),this.fetcher.destroy(),this.fetcher=null,this.requestMorePeers(!0),this.scheduler.destroy(),this.scheduler=null,this.signalerWs&&(this.signalerWs.destroy(),this.signalerWs=null),this.peers=[];for(let e of this.DCMap.values())e.destroy(!0);this.DCMap.clear(),this.failedDCSet.clear(),this.logger.warn("tracker stop p2p")}destroy(){this.stopP2P(),this.removeAllListeners(),clearTimeout(this.announceTimer);const{config:e}=this;e.getStats=e.getPeerId=e.getPeersInfo=null,this.logger.warn("destroy tracker")}_filterPeers(e){const t=[],s=[...this.DCMap.keys(),...this.failedDCSet.keys(),this.peerId];return e.filter((e=>!s.includes(e.id))).forEach((e=>{t.push({id:e.id,intermediator:e.intermediator,cpr:e.cpr||void 0})})),t}_tryConnectToAllPeers(){if(0!==this.peers.length&&this.signalerWs.connected)for(this.logger.info(`try connect to ${this.peers.length} peers`);this.peers.length>0;){if(this.DCMap.size>=this.maxConns){this.logger.debug("clear exceeded peers"),this.peers=[];break}let e=this.peers.shift();const t=e.intermediator;this.logger.debug(`new DataChannel ${e.id} intermediator ${t}`),this._createDatachannel(e.id,!0,t,e.cpr)}}_setupDC(e){e.on(events.DC_SIGNAL,(t=>{const s=e.remotePeerId;if(e.intermediator){const r=this.DCMap.get(e.intermediator);if(r){if(r.sendMsgSignal(s,this.peerId,t))return;this.logger.warn(`intermediator ${e.intermediator} relay failed`)}}this.signalerWs.sendSignal(s,t,e.signalName)})).on(events.DC_PEER_SIGNAL,(t=>{const s=t.to_peer_id,r=t.from_peer_id,n=t.action;if(s&&r&&n)if(s!==this.peerId){this.logger.info(`relay signal for ${r}`);const i=this.DCMap.get(s);if(i){if("signal"!==n)return void i.sendMsgSignalReject(s,r,t.reason);if(i.sendMsgSignal(s,r,t.data))return}e.sendMsgSignal(r,s)}else"signal"===n?this._handleSignalMsg(r,t,e.remotePeerId):this._handSignalRejected(r,t)})).on(events.DC_GET_PEERS,(()=>{const t=getCurrentTs(),s=this.scheduler.getPeers().filter((e=>e.peersConnected<(e.mobileWeb?MAX_MOBILE_CONNS:MAX_PC_CONNS)));if(s&&s.length>0){const r=[];s.forEach((s=>{if(s.remotePeerId===e.remotePeerId||s.remotePeerId===this.peerId)return;if(!this.config.live&&(s.currentPos-e.currentPos>MAX_PEER_SHARE_POS||s.currentPos<e.currentPos))return;t-s.timeJoin>MIN_PEER_SHARE_TIME&&r.push({id:s.remotePeerId})})),this.logger.info(`send ${r.length} peers to ${e.remotePeerId}`),e.sendPeers(r)}})).on(events.DC_PEERS,(t=>{e.gotPeers=!0;const s=t.peers;if(s&&s.length>0){const t=MAX_TRY_CONNS_TRICKLE;this.logger.info(`receive ${s.length} peers from ${e.remotePeerId}`),s.forEach((t=>{t.intermediator=e.remotePeerId})),this.peers=[...this.peers,...this._filterPeers(s).slice(0,t)],this._tryConnectToAllPeers()}})).once(events.DC_ERROR,(t=>{this.logger.info(`datachannel ${e.channelId} failed fatal ${t}`),this.scheduler&&(this.scheduler.deletePeer(e),this._destroyAndDeletePeer(e.remotePeerId,t),this.requestMorePeers(),this.fetcher&&(e.connected||t&&this.fetcher.increFailConns(),t&&this.failedDCSet.add(e.remotePeerId),this._doSignalFusing(this.scheduler.peersNum)))})).once(events.DC_CLOSE,(t=>{this.logger.info(`datachannel ${e.channelId} closed fatal ${t}`),this.scheduler&&(this.scheduler.deletePeer(e),this._doSignalFusing(this.scheduler.peersNum)),this._destroyAndDeletePeer(e.remotePeerId,t),t&&this.failedDCSet.add(e.remotePeerId),this.requestMorePeers()})).once(events.DC_OPEN,(()=>{e.isInitiator&&this.scheduler.handshakePeer(e)})).once(events.DC_METADATA,(t=>{const{scheduler:s}=this;e.isInitiator||s.handshakePeer(e),s.handleMetaData(e,t);const r=this.DCMap.size>=this.minConns+3;this.requestMorePeers(r),this.peersIncrement++,this._doSignalFusing(s.peersNum+1)}))}_doSignalFusing(e){if(this.fuseRate<=0)return;const t=this.signalerWs.connected;t&&e>=this.fuseRate+2?(this.logger.warn("reach fuseRate, report stats close signaler"),this.totalConns-1>0&&this.fetcher.postStats(),this.signalerWs.close()):!t&&e<this.fuseRate&&(this.logger.warn("low conns, reconnect signaler"),this.signalerWs.reconnect())}_initSignalerWs(e,t,s,r){const n=(e,t)=>{let s=`${e}?id=${this.peerId}&p=web&v=2.3.10`;return t&&(s=`${s}&token=${t}`),s};let i,o=n(e,s);if(t&&t!==e){let e=n(t,r);i=new signal_manager(this.logger,this.config,o,e)}else i=new websocket_client(this.logger,this.config,o,270);return i.onopen=()=>{this.connected=!0,this.engine.emit("serverConnected",!0),this._tryConnectToAllPeers()},i.onmessage=(e,t)=>{let s=e.action;const r=e.from_peer_id;switch(s){case"signal":this._handleSignalMsg(r,e,null,t);break;case"reject":this._handSignalRejected(r,e);break;default:this.logger.warn(`Signal websocket unknown action ${s}`)}},i.onclose=()=>{this.connected=!1,this.engine.emit("serverConnected",!1)},i.onerror=e=>{e.message&&this.engine.emit(events.EXCEPTION,err_code_default()(e,"SIGNAL_EXPT"))},i}_handSignalRejected(e,t){this.logger.warn(`signaling ${e} rejected, reason ${t.reason}`);const s=this.DCMap.get(e);s&&!s.connected&&(s.destroy(t.fatal),this.DCMap.delete(e)),this.requestMorePeers(),t.fatal&&this.failedDCSet.add(e)}_handleSignalMsg(e,t,s,r){if(!this.scheduler)return;const{logger:n}=this;if(t.data){if(this.failedDCSet.has(e))return void this._sendSignalReject(e,`peer ${e} in blocked list`,s,r,!0);this._handleSignal(e,t.data,s,r)}else{if(!this._destroyAndDeletePeer(e))return;n.info(`signaling ${e} not found`);const{scheduler:t}=this;t.waitForPeer&&(t.waitingPeers--,0===t.waitingPeers&&t.notifyPeersLoaded(0)),this.requestMorePeers(),s||this.failedDCSet.add(e)}}_handleSignal(e,t,s,r){const n=t.type,{logger:i}=this;let o=this.DCMap.get(e);if(o){if(o.connected)return void i.info("datachannel had connected, signal ignored");if("offer"===n){if(!(this.peerId>e))return void i.warn(`signal type wrong ${n}, ignored`);this._destroyAndDeletePeer(e,!1),i.warn(`signal type wrong ${n}, convert to non initiator`),o=this._createDatachannel(e,!1,s)}}else{if("answer"===n){const t=`signal type wrong ${n}`;return i.warn(t),this._sendSignalReject(e,t,s,r),void this._destroyAndDeletePeer(e,!1)}i.debug(`receive node ${e} connection request`);const t=this.scheduler.peersNum;if(t>=this.maxConns){const n=this.scheduler.getNonactivePeers();if(!(n.length>0)){const t=`peers reach limit ${this.maxConns}`;return i.warn(t),void this._sendSignalReject(e,t,s,r)}{let e=t-this.maxConns+2;for(n.length<e&&(e=n.length);e>0;){const t=n.shift();t&&(i.warn(`close inactive peer ${t.remotePeerId}`),t.close(!1)),e--}}}o=this._createDatachannel(e,!1,s)}r&&(o.signalName=r),o.receiveSignal(t)}_createDatachannel(e,t,s,r){let n=this.config.trickleICE;const i=new peer(this.engine,this.peerId,e,t,this.config,this.sequential,{stuns:this.stuns,intermediator:s,trickle:n});return r&&(i.cpr=r),this.DCMap.set(e,i),this._setupDC(i),i}_sendSignalReject(e,t,s,r,n){if(s){const r=this.DCMap.get(s);if(r&&r.sendMsgSignalReject(e,this.peerId,t,n))return}this.signalerWs.sendReject(e,t,n,r)}_requestMorePeers(e){const{logger:t}=this;t.info(`requestMorePeers after delay ${e}`);const s=this.scheduler.peersNum,r=this.peersIncrement;this.peersIncrement=0,s>=this.minConns||(0===s||r<=3&&!this.gotPeersFromTracker?(this.failedDCSet.size>30&&(this.failedDCSet=new Set([...this.failedDCSet].slice(-30))),this.fetcher.btGetPeers([...this.DCMap.keys(),...this.failedDCSet.keys()]).then((e=>{t.info(`requestMorePeers resp ${JSON.stringify(e,null,2)}`),this.peers=[...this.peers,...this._filterPeers(e.peers)],this._tryConnectToAllPeers()})).catch((e=>{t.error(`requestMorePeers error ${e}`)})),this.gotPeersFromTracker=!0):s<this.maxConns&&(this.scheduler.requestPeers(),this.gotPeersFromTracker=!1))}_destroyAndDeletePeer(e,t=!0){const s=this.DCMap.get(e);return!!s&&(s.destroy(t),this.DCMap.delete(e),!0)}}const tracker_client=TrackerClient;class HlsSwP2pEngine extends Engine{static get name(){return"HlsSwP2pEngine"}static isServiceWorkerSupported(){return"serviceWorker"in navigator}constructor(e={}){super(e),this.swSupported=isSecureContext,this.levels=[],this.currentLevelIndex=0,this.rangeTestUrl="",this.currentSrc="",this.swVersion="",this.media=tryGetMediaElement(this.config.mediaElem),this.fragMap=new Map,HlsSwP2pEngine.isServiceWorkerSupported()||(this.swSupported=!1,console.warn("service worker is not supported"));const{channelIdMaker:t,signalId:s,browserInfo:r}=this.setup();this.onLevelLoaded=e=>{const{config:n}=this,i=e.live;n.live=i,this.targetDuration=e.averagetargetduration,this.browserInfo={...r,live:i,abr:this.multiBitrate||void 0,type:"hls_sw"},this.channel=`${t(this.currentSrc)}|${s}[${peer.VERSION}]`,this.setupElectron();const o=this.initLogger();if(o.info("use HlsSwP2pEngine"),o.info(`engine version: ${engine_base.version} hls-proxy version: ${this.swVersion}`),o.info(`channel ${this.channel}`),i||(n.startSN=e.startSN,n.endSN=e.endSN,o.info(`startSN ${e.startSN} endSN ${e.endSN}`)),navigator.serviceWorker.controller)if(n.httpStreamEnabled)try{const e=new ReadableStream({start(e){e.enqueue({action:hls_next_events.STREAM_DETECT})}});navigator.serviceWorker.controller.postMessage(e,[e])}catch(e){}else navigator.serviceWorker.controller.postMessage({action:hls_next_events.STREAM_DISABLE});this._init(this.channel,this.browserInfo),this.off(hls_next_events.LEVEL_LOADED,this.onLevelLoaded)},this.on(hls_next_events.LEVEL_LOADED,this.onLevelLoaded),this.onManifestParsed=(e,t)=>{this.multiBitrate=e.length>1,this.currentSrc=t,this.off(hls_next_events.MANIFEST_PARSED,this.onManifestParsed)},this.on(hls_next_events.MANIFEST_PARSED,this.onManifestParsed),this.onFragLoaded=({url:e})=>{!this.rangeTested&&this.config.useHttpRange&&(this.rangeTestUrl=e,performRangeRequest(e).then((()=>{this.config.httpRangeSupported=!0,this.config.logger.info("http range is supported")})).catch((()=>{this.config.httpRangeSupported=!1,this.config.logger.warn("http range is not supported")})),this.rangeTested=!0),this.off(hls_next_events.FRAG_LOADED,this.onFragLoaded)},this.once(hls_next_events.FRAG_LOADED,this.onFragLoaded),this.swSupported&&(navigator.serviceWorker.onmessage=e=>{const{action:t,data:s}=e.data;this.logger&&this.logger.info(`engine onmessage action ${t}`);const r=e.ports[0];if(r.postMessage({action:t,pong:!0}),!this.p2pEnabled||!s)return r.postMessage({action:t});switch(t){case hls_next_events.SW_PLAYLIST:this.handlePlaylist(s,r);break;case hls_next_events.SW_GET_PLAYLIST:this.handleGetPlaylist(s,r);break;default:if(!this.config.scheduler)return r.postMessage({action:t});this.config.scheduler.notifySWMessage(t,s,r)}}),this.config.swAutoRegister&&this.registerServiceWorker().then((function(e){})).catch((e=>{console.warn("ServiceWorker registration failed ",e)}))}get currentLevel(){return this.currentLevelIndex}handlePlaylist(e,t){const{config:s,logger:r}=this,{url:n,redirectedUrl:i,text:o,ver:a}=e;if(this.swVersion=a,0!==o.indexOf("#EXTM3U"))return console.warn("no EXTM3U delimiter"),t.postMessage({action:hls_next_events.SW_PLAYLIST});t.postMessage({action:hls_next_events.SW_PLAYLIST,data:{active:!0,debug:r&&r.isDebugLevel,sharePlaylist:!!s.sharePlaylist}}),this._parsePlaylist(o,n.split("?")[0],i)}_parsePlaylist(e,t,s){const r=t;s&&(t=s);const{config:n,logger:i}=this;if(e.indexOf("#EXTINF:")>0||e.indexOf("#EXT-X-TARGETDURATION:")>0){let s=0;const i=M3U8Parser.parseLevelPlaylist(e,t);this.levels.length>1?(s=this.levels.indexOf(i.url),-1===s?(this.restartP2p(),this.currentSrc=r,s=0):this.currentLevelIndex=s):(""!==this.currentSrc&&r!==this.currentSrc&&this.restartP2p(),this.currentSrc=r,this.levels=[t]),this.emit(hls_next_events.LEVEL_LOADED,i),n.live&&trimMap(this.fragMap,200),i.fragments.forEach((e=>{e.level=s;let t=url_toolkit_default().buildAbsoluteURL(e.baseurl,e.relurl,{alwaysNormalize:!0});const r=e.byteRange;2===r.length&&(t=`${t}|bytes=${r[0]}-${r[1]-1}`),this.fragMap.set(t,e)})),n.sharePlaylist&&n.scheduler&&n.scheduler.broadcastPlaylist(t.split("?")[0],e)}else{const s=M3U8Parser.parseMasterPlaylist(e,t);""!==this.currentSrc&&this.restartP2p(),s.length>0&&(s.sort(((e,t)=>e.bitrate-t.bitrate)),this.levels=s.map((e=>e.url))),this.emit(hls_next_events.MANIFEST_PARSED,s,r)}}handleGetPlaylist(e,t){const{config:s,logger:r}=this;if(!r)return t.postMessage({action:hls_next_events.SW_GET_PLAYLIST});const{scheduler:n}=s;if(!n)return void r.warn("scheduler not found");const{url:i}=e,o=i.split("?")[0];if(n.playlistInfo.has(o)){const e=n.getPlaylistFromPeer(o);if(e&&e.data){const{data:s,seq:n}=e;return r.info(`got playlist from peer seq ${n}`),t.postMessage({action:hls_next_events.SW_GET_PLAYLIST,data:{text:s}}),void this._parsePlaylist(s,i.split("?")[0])}}return t.postMessage({action:hls_next_events.SW_GET_PLAYLIST})}async registerServiceWorker(){const{logger:e,config:t}=this;if(!this.swSupported){let e="sw is not supported";return isHttps||(e="https is required when using ServiceWorker",console.warn(e)),Promise.reject(e)}this.media=tryGetMediaElement(t.mediaElem),this.media||e&&e.warn("no video element found");const{serviceWorker:s}=navigator;return s.getRegistration(t.swFile).then((e=>e||s.register(t.swFile,{scope:t.swScope}).then((e=>{const t=e.installing||e.waiting;return e.active?e:new Promise(((s,r)=>{const n=()=>{"activated"===t.state?(t.removeEventListener("statechange",n),s(e)):"redundant"===t.state&&r("sw is redundant")};t.addEventListener("statechange",n)}))}))))}unregisterServiceWorker(){const{config:e}=this,t="serviceWorker is not registered";return new Promise(((s,r)=>{const{serviceWorker:n}=navigator;n||r(t),n.getRegistration(e.swFile).then((e=>{e?e.unregister().then((()=>{s()})).catch((()=>{r(t)})):r(t)}))}))}async _init(e,t){if(!this.p2pEnabled)return;const{logger:s}=this;try{await this.initSegmentManager()}catch(e){return void(s&&s.error(e))}t.live||(t.tag=this.getTagForVod());let r=new server(this,this.config.token,encodeURIComponent(e),this.config.announce||"",t);this.fetcher=r,this.config.fetcher=r;let n=new hls_sw_scheduler(this,this.config);n.bufferManager=this.bufMgr,n.fragMap=this.fragMap,this.tracker=new tracker_client(this,r,n,this.config),this.config.scheduler=this.tracker.scheduler,this.p2pEnabled&&!this.tracker.connected&&this.tracker.resumeP2P(),this.setupWindowListeners()}restartP2p(){this.logger&&this.logger.warn("restart P2P"),this.disableP2P(),this.enableP2P(),this.on(hls_next_events.LEVEL_LOADED,this.onLevelLoaded),this.on(hls_next_events.MANIFEST_PARSED,this.onManifestParsed),this.on(hls_next_events.FRAG_LOADED,this.onFragLoaded)}enableP2P(){return this.p2pEnabled?null:(this.logger&&this.logger.info("enable P2P"),this.config.p2pEnabled=this.p2pEnabled=!0,this)}disableP2P(){this.logger&&this.logger.warn("disable P2P"),this.p2pEnabled&&(this.config.p2pEnabled=this.p2pEnabled=!1,this.tracker&&this.tracker instanceof tracker_client&&(this.tracker.stopP2P(),this.tracker={},this.fetcher=null,this.bufMgr.destroy(),this.bufMgr=null)),this.levels=[],this.currentLevelIndex=0,this.lastLevel=0,this.multiBitrate=!1,this.rangeTested=!1,this.rangeTestUrl="",this.currentSrc="",this.media=void 0,this.config.live=!1,this.removeAllListeners(hls_next_events.MANIFEST_PARSED),this.removeAllListeners(hls_next_events.LEVEL_LOADED)}}const hls_sw_p2pengine=HlsSwP2pEngine;function isBlockType(e,t){const s=url_toolkit_default().parseURL(e),r=s.path.substring(s.path.lastIndexOf(".")+1);return-1!==t.indexOf(r)}function createLoadStats(){const e=performance.now();return{trequest:e,tfirst:0,tload:0,aborted:!1,loaded:0,retry:0,total:0,chunkCount:0,bwEstimate:0,loading:{start:e,first:0,end:0},parsing:{start:0,end:0},buffering:{start:0,first:0,end:0}}}function updateLoadStats(e,t){let s,r,n,i,o;const a=performance.now();s=a-300,r=a-200,n=a,e.trequest=s,e.tfirst=r,e.tload=n,e.loading={first:s,start:r,end:n},i=o=t,e.loaded=i,e.total=o}class FakeXhr extends(events_default()){constructor(){super(),this.UNSENT=0,this.OPENED=1,this.HEADERS_RECEIVED=2,this.LOADING=3,this.DONE=4,this.timeout=0,this.withCredentials=!1,this.status=0,this.readyState=this.UNSENT,this.headers=new Map,this.responseHeaders=null,this.on("load",(e=>{this.onload&&this.onload(e)})),this.on("abort",(e=>{this.onabort&&this.onabort(e)})),this.on("error",(e=>{this.onerror&&this.onerror(e)})),this.on("loadstart",(e=>{this.onloadstart&&this.onloadstart(e)})),this.on("progress",(e=>{this.onprogress&&this.onprogress(e)})),this.on("timeout",(e=>{this.ontimeout&&this.ontimeout(e)})),this.on("loadend",(e=>{this.onloadend&&this.onloadend(e)})),this.on("readystatechange",(()=>{this.onreadystatechange&&this.onreadystatechange()}))}setRequestHeader(e,t){this.headers.set(e,t)}addEventListener(e,t){this.addListener(e,t)}removeEventListener(e,t){this.removeListener(e,t)}overrideMimeType(){}getAllResponseHeaders(){if(!this.responseHeaders)return null;let e="";return this.responseHeaders.forEach(((t,s)=>{e+=`${s}: ${t}\n`})),e}getResponseHeader(e){return this.responseHeaders?this.responseHeaders.get(e):null}open(){this.readyState=this.OPENED,this.emit("loadstart")}abort(){this.readyState=this.DONE,this.status=0}send(){}_emitEvent(e){this.emit(e,new ProgressEvent(e))}}function fetchSupported(){if(window.fetch&&window.AbortController&&window.ReadableStream&&window.Request)try{return new window.ReadableStream({}),!0}catch(e){}return!1}class FetchLoader{constructor(e){this.fetchSetup=e.fetchSetup||getRequest,this.xhrSetup=e.xhrSetup,this.controller=new window.AbortController,this.stats=createLoadStats(),this.packetSize=peer.defaultPacketSize,this.fakeXhr=new FakeXhr}destroy(){this.loader=this.callbacks=null,this.abortInternal()}abortInternal(){const e=this.response;e&&e.ok||(this.stats.aborted=!0,this.callbacks&&this.callbacks.onUpdate&&this.callbacks.onUpdate(void 0,!1,!0),this.controller.abort())}abort(){this.abortInternal(),this.callbacks&&this.callbacks.onAbort&&this.callbacks.onAbort(this.stats,this.context,this.response)}load(e,t,s){const r=this.stats;r.trequest=r.loading.start=performance.now();let n=getRequestParameters(e,this.controller.signal);const i="arraybuffer"===e.responseType,o=i?"byteLength":"length",a=s.onUpdate,h=s.onBodyStart;this.context=e,this.config=t,this.callbacks=s,this.xhrSetup&&(this.xhrSetup(this.fakeXhr,e.url),n=mergeXhrSetup(this.fakeXhr,n)),this.request=this.fetchSetup(e,n),clearTimeout(this.requestTimeout),this.requestTimeout=setTimeout((()=>{this.abortInternal(),this.fakeXhr._emitEvent("timeout"),this.fakeXhr._emitEvent("loadend"),s.onTimeout(r,e,this.response)}),this.fakeXhr.timeout||t.timeout);const{fakeXhr:l}=this;l.readyState=l.OPENED,l.emit("readystatechange"),l._emitEvent("loadstart"),fetch(this.request).then((t=>{if(this.response=this.loader=t,!t.ok){const{status:e,statusText:s}=t;throw a&&a(void 0,!1,!0),new FetchError(s||"fetch, bad network response",e,t)}r.tfirst=r.loading.first=Math.max(performance.now(),r.loading.start),r.total=parseInt(t.headers.get("Content-Length")||"0");const{fakeXhr:s}=this;return s.readyState=s.HEADERS_RECEIVED,s.responseHeaders=t.headers,s.emit("readystatechange"),a&&"0"!==r.total?(h&&h(r.total),this.loadProgressively(t,r,e,a)):(s.emit("progress",new ProgressEvent("progress",{lengthComputable:!1})),i?t.arrayBuffer():t.text())})).then((t=>{const{response:n}=this;clearTimeout(this.requestTimeout),r.tload=r.loading.end=Math.max(performance.now(),r.loading.first),r.loaded=r.total=t[o];const i={url:n.url,data:t};s.onProgress(r,e,t,n),s.onSuccess(i,r,e,n)})).catch((t=>{if(clearTimeout(this.requestTimeout),r.aborted)return;a&&a(void 0,!1,!0);const n=t&&t.code||0,i=t?t.message:null;s.onError({code:n,text:i},e,t?t.details:null)}))}loadProgressively(e,t,s,r){const n=e.body.getReader();let i=0,o=0,a=(0,utils_buffer.l)(0);const h=()=>n.read().then((({value:s,done:n})=>{const{fakeXhr:l}=this;if(l.readyState!==l.LOADING&&(l.readyState=l.LOADING,l.emit("readystatechange")),s&&(i+=s.length),n){if(a.byteLength>0)if(i<=this.packetSize){const e=(0,utils_buffer.l)(i);a.copy(e,0,o*this.packetSize,a.byteLength),r(e,!0)}else{const e=splitBytes(a,o*this.packetSize);for(let t=0;t<e.length;t++)r(e[t],t===e.length-1)}const t=a.buffer,{fakeXhr:s}=this,{status:n,statusText:h,url:l}=e;return s.readyState=s.DONE,s.responseText=n,s.status=h,s.responseURL=l,s.responseType="arraybuffer",s.response=t,s.emit("readystatechange"),s._emitEvent("load"),s._emitEvent("loadend"),Promise.resolve(t)}const c=utils_buffer.l.from(s);if(t.loaded+=s.length,l.emit("progress",new ProgressEvent("progress",{lengthComputable:!0,loaded:t.loaded,total:t.total})),a=utils_buffer.l.concat([a,c]),i>=this.packetSize){i-=this.packetSize;const e=(0,utils_buffer.l)(this.packetSize);a.copy(e,0,o*this.packetSize,(o+1)*this.packetSize),o++,r(e,!1)}return h()})).catch((()=>(this.fakeXhr._emitEvent("abort"),this.fakeXhr._emitEvent("loadend"),Promise.reject())));return h()}}function getRequestParameters(e,t){const s={method:"GET",mode:"cors",credentials:"same-origin",signal:t,headers:new window.Headers(Object.assign({},e.headers))};return e.rangeEnd&&s.headers.set("Range","bytes="+e.rangeStart+"-"+String(e.rangeEnd-1)),s}function getRequest(e,t){return new window.Request(e.url,t)}function mergeXhrSetup(e,t){e.withCredentials&&(t.credentials="include");for(let[s,r]of e.headers)t.headers.set(s,r);return t}class FetchError extends Error{constructor(e,t,s){super(e),this.code=t,this.details=s}}const MIN_TIME_FOR_LOAD=7,MAX_TIME_FOR_WAIT=4.5;class FragLoader extends(events_default()){constructor(e){super(),this.logger=e.logger;const{scheduler:t,fetcher:s,p2pBlackList:r,isHlsV0:n}=window.__p2p_loader__;this.isHlsV0=n,this.bufMgr=e.bufMgr,this.streamEnabled=e.streamEnabled,this.httpLoader=this.streamEnabled?new FetchLoader(e):new e.loader(e),this.p2pEnabled=e.p2pEnabled,this.isLive=e.live,this.scheduler=t,this.fetcher=s,this.segmentId=e.segmentId,this.blockTypes=r,this.forbidden=s.forbidden,this.stats=this.httpLoader.stats||createLoadStats(),this.enableWorker=e.enableWorker}destroy(){this.httpLoader.destroy()}abort(){this.httpLoader.abort()}async load(e,t,s){const{logger:r,scheduler:n}=this,i=e.frag;this.isHlsV0||(i.stats=this.stats);let o=e.frag.segId;if(!o){let t;e.rangeEnd&&(t="bytes="+e.rangeStart+"-"+(e.rangeEnd-1)),o=e.frag.segId=this.segmentId(String(i.level),i.sn,i.url,t)}if(!i.url||isBlockType(i.url,this.blockTypes))return r.info(`HTTP load blockType ${i.url}`),e.frag.loadByHTTP=!0,this.httpLoader.load(e,t,s);if(this.forbidden)return;t.maxRetry=2;const a=n.getBufferedDuration(),h=await this.bufMgr.getSegById(o);if(this.p2pEnabled&&h){r.info(`bufMgr found seg sn ${i.sn} segId ${o} level ${i.level}`);let t=copyBuffer(h.data).buffer,n={url:e.url,data:t};updateLoadStats(this.stats,h.size),i.loaded=h.size,i.loadByP2P=!0,e.frag.fromPeerId=h.fromPeerId,queue_microtask_default()((()=>{!this.isHlsV0&&s.onProgress&&s.onProgress(this.stats,e,n.data),s.onSuccess(n,this.stats,e)}))}else if(this.p2pEnabled&&n.hasAndSetTargetPeer(i.sn,i.level,a))this.loadFragByP2p(e,t,s,o);else if(r.info(`fragLoader load ${o} at ${i.sn} level ${i.level} buffered ${1e3*a}`),this.isLive&&n.hasIdlePeers&&a>MIN_TIME_FOR_LOAD&&n.shouldWaitForNextSeg()){let h=a-MIN_TIME_FOR_LOAD;h>MAX_TIME_FOR_WAIT&&(h=MAX_TIME_FOR_WAIT);const l=r=>{r===o&&(n.off(hls_next_events.SCH_DCHAVE,l),clearTimeout(this.waitTimer),n.hasAndSetTargetPeer(i.sn,i.level,a)?this.loadFragByP2p(e,t,s,o):this.loadFragByHttp(e,t,s,o))};r.info(`wait peer have for ${h}s`),n.on(hls_next_events.SCH_DCHAVE,l),this.waitTimer=setTimeout((()=>{this.loadFragByHttp(e,t,s,o),n.off(hls_next_events.SCH_DCHAVE,l)}),1e3*h)}else{const a=n.requestingMap.get(i.sn,i.level);n.httpRangeSupported&&a&&a.hasPartialBuffer()?(r.warn(`syn has partial buffer for ${i.sn}`),this.loadFragByP2p(e,t,s,o)):this.loadFragByHttp(e,t,s,o)}}loadFragByHttp(e,t,s,r){const{logger:n,scheduler:i}=this,{segmentBuilderMap:o}=i;i.isReceiver=!1;const a=e.frag,{sn:h,level:l}=a;if(this.streamEnabled){let e;i.notifyAllPeers(h,l,r,SegmentState.PARTIAL_FORWARD),s.onUpdate=(t,s,r)=>{r?o.delete(h,l):e&&e.receiveBytes(t,s)},s.onBodyStart=t=>{e||(e=new SegmentBuilder(h,l,r,t),o.has(h,l)||o.set(h,l,e))}}const c=s.onSuccess;s.onSuccess=async(e,t,s)=>{if(!await this.bufMgr.hasSegOfId(r)){const t=copyBuffer(e.data).buffer,s=new Segment(h,r,t,this.fetcher.peerId,l);this.bufMgr.putSeg(s)}o.delete(h,l),this.fetcher.reportFlow(t.total);let a=t.tload-t.trequest;n.info(`HTTP loaded ${r} time ${a}`),i.notifyAllPeers(h,l,r),c(e,t,s)};const d=s.onProgress;s.onProgress=(e,t,s)=>{a.loaded=e.total,d(e,t,s&&this.enableWorker?copyBuffer(s).buffer:s)},e.frag.loadByHTTP=!0,this.httpLoader.load(e,t,s)}loadFragByP2p(e,t,s,r){const{logger:n}=this,i=e.frag;this.scheduler.load(e,t,s);const o=s.onSuccess,a=s.onTimeout;s.onTimeout=(e,h)=>{n.warn(`P2P timeout switched to HTTP load ${i.relurl} at ${i.sn}`),s.onSuccess=o,this.loadFragByHttp(h,t,s,r),s.onTimeout=a},s.onSuccess=async(e,t,a)=>{if(!await this.bufMgr.hasSegOfId(r)){const t=copyBuffer(e.data).buffer,s=new Segment(i.sn,r,t,i.fromPeerId||this.fetcher.peerId,i.level);this.bufMgr.putSeg(s)}i.loadByP2P||this.fetcher.reportFlow(t.total),i.loaded=t.loaded,n.info(`${i.loadByP2P?"P2P":"HTTP"} loaded segment id ${r}`),!this.isHlsV0&&s.onProgress&&s.onProgress(t,a,e.data),o(e,t,a)}}}const frag_loader=FragLoader;class PlaylistLoader extends(events_default()){constructor(e){super(),this.logger=e.logger;const{scheduler:t}=window.__p2p_loader__;this.isHlsV0=e.isHlsV0,this.xhrLoader=new e.loader(e),this.p2pEnabled=e.p2pEnabled,this.scheduler=t,this.stats=this.xhrLoader.stats||createLoadStats()}destroy(){this.xhrLoader.destroy()}abort(){this.xhrLoader.abort()}load(e,t,s){const{logger:r}=this,{url:n}=e,i=n.split("?")[0],o=s.onSuccess;if(s.onSuccess=(e,t,s)=>{this.scheduler.broadcastPlaylist(i,e.data),o(e,t,s)},this.scheduler.playlistInfo.has(i)){const t=this.scheduler.getPlaylistFromPeer(i);if(t&&t.data){const{data:i,seq:o}=t;r.info(`got playlist from peer seq ${o}`),updateLoadStats(this.stats,i.length);let a={url:n,data:i};return void queue_microtask_default()((()=>{s.onSuccess(a,this.stats,e)}))}}this.xhrLoader.load(e,t,s)}}const playlist_loader=PlaylistLoader;class HlsjsScheduler extends Scheduler{constructor(e,t){super(e,t),this.isHlsjs=!0}updatePlaySN(e){this.currPlaySN=e}load(e,t,s){this.isReceiver=!0;const{logger:r,config:n}=this;this.context=e;const{rangeStart:i,rangeEnd:o,url:a}=e,h=e.frag,{segId:l,sn:c,level:d}=h;this.callbacks=s,this.stats=createLoadStats(),this.criticalSeg={sn:c,level:d,segId:l};let u=this.mBufferedDuration-n.httpLoadTime;u>this.dcDownloadTimeout&&(u=this.dcDownloadTimeout);const{forwardPeer:g,reversePeer:f}=this.targetPeers;g||f||(u-=1);let p=this.requestingMap.get(c,d);const _={rangeStart:Number(i),rangeEnd:Number(o),url:a,httpLoadTime:1e3*n.httpLoadTime-500,xhrSetup:n.xhrSetup};p?p.setExtra(_):(p=new Synthesizer(this.coordinator,this.logger,c,d,this.httpRangeSupported,_),this._setupSynthesizer(p),this.requestingMap.set(c,d,p)),p.setTimeout(1e3*u),g&&(p.setForwardPeer(g),g.requestDataById(l,c,!0,{level:d})),f&&(p.setReversePeer(f),f.requestDataById(l,c,!0,{level:d,reverse:!0})),this.targetPeers={}}destroy(){super.destroy(),this.logger.warn("destroy HlsjsScheduler")}_setupDC(e){super._setupDC(e)}_setupSynthesizer(e){e.on(hls_next_events.SYN_OUTPUT,((t,s)=>{const{config:r,logger:n}=this,{segId:i,sn:o,data:a,level:h}=t,{speed:l,http:c,p2p:d}=s;c>0?this.httpTimeouts++:this.httpTimeouts>0&&this.httpTimeouts--;const u=this.criticalSeg&&this.criticalSeg.segId===i;if(r.validateSegment(i,new Uint8Array(a))){this.notifyAllPeers(o,h,i),this.bitset.has(o,h)||this.reportTraffic(c,d,l);const s=e.getFromPeerId();if(u){n.info(`receive criticalSeg seg_id ${i}`);let e=this.stats;e.tfirst=e.loading.first=Math.max(e.trequest,performance.now()),e.tload=e.loading.end=e.tfirst,e.loaded=e.total=a.byteLength,this.criticalSeg=null;const{frag:t}=this.context;t.fromPeerId=s,t.loadByP2P=!0,this.callbacks.onSuccess({data:a,url:this.context.url},e,this.context)}else this.bitset.has(o,h)||(this.bufMgr.putSeg(t),this.updateLoaded(o,h))}else n.error(`segment ${i} validate failed`),u&&this.callbacks.onTimeout(this.stats,this.context,null);this.requestingMap.delete(o,h),r.live&&!this.criticalSeg&&this.checkPeers()})).on(hls_next_events.SYN_ERROR,((e,t)=>{const{sn:s,level:r}=e;this.logger.warn(`SYN_ERROR loading ${s} code ${t}`),this.criticalSeg&&this.criticalSeg.sn===s&&(this.criticalSeg=null,this.callbacks.onTimeout(this.stats,this.context,null)),this.requestingMap.delete(s,r),this._handleSynError(t)}))}_setupEngine(){super._setupEngine(),this.engine.on(hls_next_events.FRAG_LOADING,(({sn:e,segId:t,byHttp:s,level:r})=>{this.loadingSN=e,this.loadingSegId=t})).on(hls_next_events.FRAG_LOADED,(({sn:e,segId:t,byP2p:s,level:r})=>{this.requestingMap.delete(e,r),this.updateLoaded(e,r)})).on(hls_next_events.FRAG_CHANGED,(({sn:e})=>{this.updatePlaySN(e)}))}_handleDCHave(e,t,s,r){this.criticalSeg&&this.criticalSeg.sn===t&&this.criticalSeg.level===s?this._notifySynthesizer(e,this.criticalSeg.segId,t,s,r):this.httpTimeouts>=1&&t===this.loadingSN+1&&this._notifySynthesizer(e,void 0,t,s,r,!1),this.config.live&&!this.criticalSeg&&queue_microtask_default()((()=>{this.checkPeers()}))}}const hlsjs_scheduler=HlsjsScheduler;class HlsjsP2pEngine extends Engine{static get name(){return"HlsjsP2pEngine"}constructor(e,t={}){if(super(t),!e)throw new TypeError("hlsjs instance is null");this.hlsjs=e,this.HLSEvents=e.constructor.Events,this.config.isHlsV0="0"===e.constructor.version.split(".")[0],this.config.xhrSetup=e.config.xhrSetup,!0===this.config.httpStreamEnabled&&(e.config.streamEnabled=fetchSupported());const{channelIdMaker:s,signalId:r,browserInfo:n}=this.setup();e.config.segmentId=this.config.segmentId;const i=(t,o)=>{if(!o)return;const{config:a}=this,h=o.details,l=h.live;a.live=this.hlsjs.config.live=l,this.browserInfo={...n,live:l,abr:this.multiBitrate||void 0,type:"hls"},this.channel=`${s(e.url)}|${r}[${peer.VERSION}]`,this.setupElectron();const c=this.initLogger();c.info("use HlsjsP2pEngine"),this.logger=this.hlsjs.config.logger=c,c.info(`channel ${this.channel}`),l||(a.startSN=h.startSN,a.endSN=h.endSN,c.info(`startSN ${h.startSN} endSN ${h.endSN}`)),this.eventListened=!1,this._init(this.channel,this.browserInfo),e.off(this.HLSEvents.LEVEL_LOADED,i)};e.on(this.HLSEvents.LEVEL_LOADED,i);const o=(t,s)=>{const r=s.levels.length;this.multiBitrate=r>1,e.off(this.HLSEvents.MANIFEST_PARSED,o)};e.on(this.HLSEvents.MANIFEST_PARSED,o),e.on(this.HLSEvents.DESTROYING,(()=>{this.destroy()}))}async _init(e,t){const{logger:s,config:r}=this;if(!this.p2pEnabled)return;this.hlsjs.config.p2pEnabled=this.p2pEnabled,this.hlsjs.config.sharePlaylist=r.sharePlaylist;try{await this.initSegmentManager()}catch(e){return void s.error(e)}t.live||(t.tag=this.getTagForVod()),this.hlsjs.config.bufMgr=this.bufMgr,this.media=this.hlsjs.media,this.media&&(this.currentSrc=this.media.src);let n=new server(this,r.token,encodeURIComponent(e),r.announce||"",t);this.fetcher=n;const i=new hlsjs_scheduler(this,r);this.tracker=new tracker_client(this,n,i,r),i.bufferManager=this.bufMgr,this.hlsjs.config.fLoader=frag_loader,r.sharePlaylist&&(this.hlsjs.config.pLoader=playlist_loader),window.__p2p_loader__={scheduler:this.tracker.scheduler,fetcher:n,p2pBlackList:r.p2pBlackList,isHlsV0:r.isHlsV0},this.trackerTried=!1,this.eventListened||(this.hlsjs.on(this.HLSEvents.FRAG_LOADING,this._onFragLoading.bind(this)),this.hlsjs.on(this.HLSEvents.FRAG_LOADED,this._onFragLoaded.bind(this)),this.hlsjs.on(this.HLSEvents.FRAG_CHANGED,this._onFragChanged.bind(this)),this.hlsjs.on(this.HLSEvents.ERROR,this._onHlsError.bind(this)),this.eventListened=!0),this.setupWindowListeners(),this.trackerTried||this.tracker.connected||!r.p2pEnabled||(this.tracker.resumeP2P(),this.trackerTried=!0)}_onFragLoading(e,t){const s=t.frag;let{sn:r,level:n,segId:i}=s;if(!isBlockType(s.url,this.config.p2pBlackList)){if(this.logger.debug("loading frag "+r),this.bufMgr&&(this.bufMgr.loadingSN=r),!i){let e;s._byteRange&&(e="bytes="+s._byteRange[0]+"-"+s._byteRange[1]);let r=s.url;i=t.frag.segId=this.config.segmentId(String(n),s.sn,r,e)}this.emit(hls_next_events.FRAG_LOADING,{sn:r,segId:i,byHttp:s.loadByHTTP,level:n})}}_onFragLoaded(e,t){const{sn:s,segId:r,loaded:n,duration:i,level:o,fromPeerId:a,loadByP2P:h,url:l}=t.frag,{config:c,logger:d}=this;isBlockType(t.frag.url,c.p2pBlackList)||(this.emit(hls_next_events.FRAG_LOADED,{url:l,sn:s,level:o,segId:r,loaded:n,duration:i,byP2p:!!h,fromPeerId:a}),!this.rangeTested&&c.useHttpRange&&(performRangeRequest(t.frag.url,void 0,c.xhrSetup).then((()=>{c.httpRangeSupported=!0,d.info("http range is supported")})).catch((()=>{c.httpRangeSupported=!1,d.warn("http range is not supported")})),this.rangeTested=!0))}_onFragChanged(e,t){if(!isBlockType(t.frag.url,this.config.p2pBlackList)){this.logger.debug("frag changed: "+t.frag.sn);const{sn:e,duration:s}=t.frag;this.emit(hls_next_events.FRAG_CHANGED,{sn:e,duration:s})}}_onHlsError(e,t){if(!t)return;const{logger:s}=this;t.fatal?s.error(`${t.type} details ${t.details} reason ${t.reason}`):s.warn(`${t.type} details ${t.details} reason ${t.reason}`);const r=this.hlsjs.constructor.ErrorDetails;switch(t.details){case r.BUFFER_STALLED_ERROR:this.fetcher&&this.fetcher.errsBufStalled++;break;case r.INTERNAL_EXCEPTION:this.fetcher&&(this.fetcher.errsInternalExpt++,this.fetcher.exptMsg=`${t.err.message} event ${t.event} ua ${navigator.userAgent}`),s.error(`INTERNAL_EXCEPTION event ${t.event} err ${t.err.message}`),this.emit(hls_next_events.EXCEPTION,err_code_default()(t.err,"HLSJS_EXPT"))}}get currentLevel(){const{currentLevel:e}=this.hlsjs;return e>=0?e:0}disableP2P(){this.logger&&this.logger.warn("disable P2P"),this.p2pEnabled&&(this.p2pEnabled=!1,this.config.p2pEnabled=this.hlsjs.config.p2pEnabled=this.p2pEnabled,this.tracker&&(this.tracker.stopP2P(),this.tracker={},this.fetcher=null,this.bufMgr.destroy(),this.bufMgr=null,this.hlsjs.config.fLoader=this.hlsjs.config.pLoader=this.hlsjs.constructor.DefaultConfig.loader))}}const hlsjs_p2pengine=HlsjsP2pEngine;function getMediaSource(){if("undefined"!=typeof window)return window.MediaSource||window.WebKitMediaSource}function isMSESupported(){const e=getMediaSource(),t=window.SourceBuffer||window.WebKitSourceBuffer,s=e&&"function"==typeof e.isTypeSupported&&e.isTypeSupported('video/mp4; codecs="avc1.42E01E,mp4a.40.2"'),r=!t||t.prototype&&"function"==typeof t.prototype.appendBuffer&&"function"==typeof t.prototype.remove;return!!s&&!!r}class ShadowP2pEngine extends Engine{static get name(){return"ShadowP2pEngine"}constructor(){super()}get currentLevel(){return 0}disableP2P(){}}const shadow_p2pengine=ShadowP2pEngine;class P2pEngine{static get Events(){return hls_next_events}static isSupported(){return engine_base.isSupported()&&(isMSESupported()||hls_sw_p2pengine.isServiceWorkerSupported())}static isServiceWorkerSupported(){return hls_sw_p2pengine.isServiceWorkerSupported()}static isMSESupported(){return isMSESupported()}static getBrowser(){return platform_default().getBrowser()}static get ServiceWorkerEngine(){return hls_sw_p2pengine}static get HlsjsEngine(){return hlsjs_p2pengine}constructor(e={}){const{hlsjsInstance:t}=e;if(delete e.hlsjsInstance,window.__swP2pEngineHlsActive)return console.warn("P2pEngineHls is already activated"),void(this._realEngine=new shadow_p2pengine(e));"1"!==getQueryParam("_ios")&&!e.proxyOnly&&t&&isMSESupported()?this._realEngine=new hlsjs_p2pengine(t,e):this._realEngine=new hls_sw_p2pengine(e)}get realEngine(){return this._realEngine}get engineName(){return this._realEngine.constructor.name}once(e,t){return this._realEngine.once(e,t)}on(e,t){return this._realEngine.on(e,t)}off(e,t){return this._realEngine.off(e,t)}removeListener(e,t){return this._realEngine.removeListener(e,t)}removeAllListeners(e){return this._realEngine.removeAllListeners(e)}set p2pEnabled(e){this._realEngine.p2pEnabled=e}get p2pEnabled(){return this._realEngine.p2pEnabled}enableP2P(){this._realEngine.enableP2P()}disableP2P(){this._realEngine.disableP2P()}destroy(){this._realEngine.destroy()}registerServiceWorker(){return"function"==typeof this._realEngine.registerServiceWorker?this._realEngine.registerServiceWorker():Promise.reject("Not supported by this engine")}unregisterServiceWorker(){return"function"==typeof this._realEngine.unregisterServiceWorker?this._realEngine.unregisterServiceWorker():Promise.reject("Not supported by this engine")}get version(){return engine_base.version}}P2pEngine.version=engine_base.version,P2pEngine.protocolVersion=peer.VERSION,window&&(window.P2PEngineHls=P2pEngine);const index_engine=P2pEngine})(),__webpack_exports__=__webpack_exports__.default,__webpack_exports__})()));