{"version":3,"sources":["webpack://kurentoUtils/webpack/universalModuleDefinition","webpack://kurentoUtils/webpack/bootstrap","webpack://kurentoUtils/./node_modules/sdp/sdp.js","webpack://kurentoUtils/./node_modules/wrtc/lib/browser.js","webpack://kurentoUtils/./WebRtcPeerCore.js","webpack://kurentoUtils/./node_modules/rtcpeerconnection-shim/rtcpeerconnection.js","webpack://kurentoUtils/./index.js","webpack://kurentoUtils/./WebRtcPeer.js","webpack://kurentoUtils/./node_modules/ua-parser-js/src/ua-parser.js","webpack://kurentoUtils/./node_modules/events/events.js","webpack://kurentoUtils/./node_modules/canvas/browser.js","webpack://kurentoUtils/./node_modules/canvas/lib/parse-font.js","webpack://kurentoUtils/./node_modules/freeice/index.js","webpack://kurentoUtils/./node_modules/normalice/index.js","webpack://kurentoUtils/./node_modules/merge/merge.js","webpack://kurentoUtils/(webpack)/buildin/module.js","webpack://kurentoUtils/./node_modules/webrtc-adapter/src/js/utils.js","webpack://kurentoUtils/./node_modules/webrtc-adapter/src/js/chrome/getusermedia.js","webpack://kurentoUtils/./node_modules/webrtc-adapter/src/js/chrome/getdisplaymedia.js","webpack://kurentoUtils/./node_modules/webrtc-adapter/src/js/chrome/chrome_shim.js","webpack://kurentoUtils/./node_modules/webrtc-adapter/src/js/edge/getusermedia.js","webpack://kurentoUtils/./node_modules/webrtc-adapter/src/js/edge/getdisplaymedia.js","webpack://kurentoUtils/./node_modules/webrtc-adapter/src/js/edge/edge_shim.js","webpack://kurentoUtils/./node_modules/webrtc-adapter/src/js/edge/filtericeservers.js","webpack://kurentoUtils/./node_modules/webrtc-adapter/src/js/firefox/getusermedia.js","webpack://kurentoUtils/./node_modules/webrtc-adapter/src/js/firefox/getdisplaymedia.js","webpack://kurentoUtils/./node_modules/webrtc-adapter/src/js/firefox/firefox_shim.js","webpack://kurentoUtils/./node_modules/webrtc-adapter/src/js/safari/safari_shim.js","webpack://kurentoUtils/./node_modules/webrtc-adapter/src/js/common_shim.js","webpack://kurentoUtils/./node_modules/webrtc-adapter/src/js/adapter_core.js","webpack://kurentoUtils/./node_modules/webrtc-adapter/src/js/adapter_factory.js","webpack://kurentoUtils/./node_modules/uuid/dist/esm-browser/rng.js","webpack://kurentoUtils/./node_modules/uuid/dist/esm-browser/regex.js","webpack://kurentoUtils/./node_modules/uuid/dist/esm-browser/stringify.js","webpack://kurentoUtils/./node_modules/uuid/dist/esm-browser/validate.js","webpack://kurentoUtils/./node_modules/uuid/dist/esm-browser/v1.js","webpack://kurentoUtils/./node_modules/uuid/dist/esm-browser/parse.js","webpack://kurentoUtils/./node_modules/uuid/dist/esm-browser/v35.js","webpack://kurentoUtils/./node_modules/uuid/dist/esm-browser/md5.js","webpack://kurentoUtils/./node_modules/uuid/dist/esm-browser/v3.js","webpack://kurentoUtils/./node_modules/uuid/dist/esm-browser/v4.js","webpack://kurentoUtils/./node_modules/uuid/dist/esm-browser/sha1.js","webpack://kurentoUtils/./node_modules/uuid/dist/esm-browser/v5.js","webpack://kurentoUtils/./node_modules/uuid/dist/esm-browser/nil.js","webpack://kurentoUtils/./node_modules/uuid/dist/esm-browser/version.js"],"names":["root","factory","exports","module","define","amd","window","installedModules","__webpack_require__","moduleId","i","l","modules","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","SDPUtils","Math","random","toString","substr","localCName","generateIdentifier","splitLines","blob","trim","split","map","line","splitSections","part","index","getDescription","sections","getMediaSections","shift","matchPrefix","prefix","filter","indexOf","parseCandidate","parts","candidate","foundation","substring","component","parseInt","protocol","toLowerCase","priority","ip","address","port","type","length","relatedAddress","relatedPort","tcpType","ufrag","usernameFragment","writeCandidate","sdp","push","toUpperCase","join","parseIceOptions","parseRtpMap","parsed","payloadType","clockRate","channels","numChannels","writeRtpMap","codec","pt","undefined","preferredPayloadType","parseExtmap","id","direction","uri","writeExtmap","headerExtension","preferredId","parseFmtp","kv","j","writeFmtp","parameters","keys","params","forEach","param","parseRtcpFb","parameter","writeRtcpFb","lines","rtcpFeedback","fb","parseSsrcMedia","sp","ssrc","colon","attribute","parseSsrcGroup","semantics","ssrcs","getMid","mediaSection","mid","parseFingerprint","algorithm","getDtlsParameters","sessionpart","role","fingerprints","writeDtlsParameters","setupType","fp","parseCryptoLine","tag","cryptoSuite","keyParams","sessionParams","slice","writeCryptoLine","writeCryptoKeyParams","parseCryptoKeyParams","keyMethod","keySalt","lifeTime","mkiValue","mkiLength","getCryptoParameters","getIceParameters","pwd","password","writeIceParameters","parseRtpParameters","description","codecs","headerExtensions","fecMechanisms","rtcp","mline","rtpmapline","fmtps","writeRtpDescription","kind","caps","maxptime","extension","parseRtpEncodingParameters","secondarySsrc","encodingParameters","hasRed","hasUlpfec","primarySsrc","flows","apt","encParam","codecPayloadType","rtx","JSON","parse","stringify","fec","mechanism","bandwidth","maxBitrate","parseRtcpParameters","rtcpParameters","remoteSsrc","obj","cname","rsize","reducedSize","compound","mux","parseMsid","spec","stream","track","planB","msidParts","parseSctpDescription","maxMessageSize","parseMLine","maxSizeLine","isNaN","sctpPort","fmt","writeSctpDescription","media","sctp","output","generateSessionId","writeSessionBoilerplate","sessId","sessVer","sessUser","version","writeMediaSection","transceiver","iceGatherer","getLocalParameters","dtlsTransport","rtpSender","rtpReceiver","msid","sendEncodingParameters","getDirection","getKind","isRejected","parseOLine","username","sessionId","sessionVersion","netType","addressType","isValidSDP","charAt","MediaStream","MediaStreamTrack","RTCDataChannel","RTCDataChannelEvent","RTCDtlsTransport","RTCIceCandidate","RTCIceTransport","RTCPeerConnection","RTCPeerConnectionIceEvent","RTCRtpReceiver","RTCRtpSender","RTCRtpTransceiver","RTCSctpTransport","RTCSessionDescription","getUserMedia","mediaDevices","navigator","_canvas","createCanvas","WebRtcPeerCore","default","_events","_interopRequireDefault","_freeice","_merge","_uuid","_wrtc","_classPrivateMethodGet","receiver","privateSet","fn","has","TypeError","_classPrivateFieldGet","privateMap","descriptor","_classApplyDescriptorGet","_classExtractFieldDescriptor","_classPrivateFieldSet","set","writable","_classApplyDescriptorSet","action","recursive","MEDIA_CONSTRAINTS","audio","video","width","framerate","asCallback","promise","callback","then","filterTracksType","this","replaceTrack","sender","stop","replaceTracks","removeFIDFromOffer","getFirstVideoTrack","getAudioTracks","result","tracks","getVideoTracks","getMediaEnabled","senders","peerConnection","getSenders","enabled","setMediaEnabled","_audioStream","WeakMap","_candidategatheringdone","_candidatesQueueOut","_dataChannelConfig","_dataChannels","_id","_interop","_dataChannel","_lastFrame","_logger","_mediaConstraints","_mode","_onnegotiationneeded","_ontrack","_peerConnection","_peerconnectionConfiguration","_ready","_sendSource","_simulcast","_usePlanB","_videoStream","_videoSink","_getMedia","WeakSet","_getSimulcastInfo","_initPeerConnection","_onConnectionStateChange","_onFrame","_onIcecandidate","_onNewListener","_replaceTrack","_setLocalDescription","_setVideoStream","_setRemoteVideo","_start","_options","Function","audioStream","configuration","dataChannelConfig","dataChannels","freeice","freeiceOpts","_id2","v4","logger","console","mediaConstraints","oncandidategatheringdone","onicecandidate","onnegotiationneeded","onstreamended","ontrack","sendSource","simulcast","usePlanB","videoStream","_videoStream2","super","add","debug","connectionState","_initPeerConnection2","frame","listenerCount","emit","Promise","all","localDescription","_getSimulcastInfo2","warn","setLocalDescription","removeEventListener","nonstandard","getReceivers","RTCVideoSink","addEventListener","Error","self","streamEndedListener","getTracks","addTrack","iceServers","on","_onNewListener2","ready","lastFrame","height","rgba","Uint8ClampedArray","rgbaFrame","createImageData","i420ToRgba","canvas","getContext","putImageData","audioEnabled","videoEnabled","remoteDescription","addIceCandidate","pc","close","err","removeAllListeners","useAudio","useVideo","addTransceiver","getTransceivers","createOffer","reject","answer","setRemoteDescription","offer","createAnswer","_setVideoStream2","flatMap","_getMedia2","resolve","data","_classPrivateFieldGet2","readyState","send","method","constraints","videoTracks","onbufferedamountlow","onclose","onerror","error","onmessage","onopen","options","createDataChannel","event","listener","iscandidategatheringdone","dtlsRole","trackId","_initialTrackId","getCommonCapabilities","localCapabilities","remoteCapabilities","commonCapabilities","findCodecByPayloadType","rtxCapabilityMatches","lRtx","rRtx","lCodecs","rCodecs","lCodec","rCodec","min","lHeaderExtension","rHeaderExtension","isActionAllowedInSignalingState","signalingState","maybeAddCandidate","iceTransport","alreadyAdded","getRemoteCandidates","find","remoteCandidate","addRemoteCandidate","makeError","e","code","NotSupportedError","InvalidStateError","InvalidAccessError","OperationError","edgeVersion","addTrackToStreamAndFireEvent","dispatchEvent","MediaStreamTrackEvent","fireAddTrack","streams","trackEvent","Event","setTimeout","_dispatchEvent","config","_eventTarget","document","createDocumentFragment","canTrickleIceCandidates","needNegotiation","localStreams","remoteStreams","_localDescription","_remoteDescription","iceConnectionState","iceGatheringState","usingBundle","bundlePolicy","rtcpMuxPolicy","iceTransportPolicy","hasTurn","server","urls","url","isString","filterIceServers","_iceGatherers","iceCandidatePoolSize","RTCIceGatherer","gatherPolicy","_config","transceivers","_sdpSessionId","_sdpSessionVersion","_dtlsRole","_isClosed","configurable","onaddstream","onremovestream","onsignalingstatechange","oniceconnectionstatechange","onconnectionstatechange","onicegatheringstatechange","ondatachannel","_emitGatheringStateChange","getConfiguration","getLocalStreams","getRemoteStreams","_createTransceiver","doNotAdd","hasBundleTransport","recvEncodingParameters","associatedRemoteMediaStreams","wantReceive","transports","_createIceAndDtlsTransports","_maybeFireNegotiationNeeded","addStream","clonedStream","clone","idx","clonedTrack","removeTrack","splice","removeStream","_createIceGatherer","sdpMLineIndex","bufferedCandidateEvents","bufferCandidates","end","state","_gather","onlocalcandidate","evt","sdpMid","cand","serializedCandidate","assign","toJSON","complete","every","onicestatechange","_updateIceConnectionState","_updateConnectionState","ondtlsstatechange","_disposeIceAndDtlsTransports","_transceive","recv","encodings","receive","isIceLite","rejected","remoteIceParameters","remoteDtlsParameters","start","_updateSignalingState","receiverList","iceOptions","remoteMsid","isComplete","cands","setTransport","setRemoteCandidates","getCapabilities","isNewTrack","nativeTrack","removeTrackFromStreamAndFireEvent","sid","item","newState","states","closed","checking","connected","completed","disconnected","failed","new","connecting","numAudioTracks","numVideoTracks","offerOptions","arguments","mandatory","optional","offerToReceiveAudio","offerToReceiveVideo","remoteCodec","hdrExt","rHdrExt","getLocalCandidates","desc","mediaSectionsInOffer","localTrack","candidateString","getStats","selector","senderOrReceiver","promises","allStats","results","Map","stats","stat","ortcObjectName","nativeGetstats","apply","nativeStats","mapStats","inboundrtp","outboundrtp","candidatepair","localcandidate","remotecandidate","methods","nativeMethod","args","WebRtcPeerRecvonly","WebRtcPeerSendonly","WebRtcPeerSendrecv","_WebRtcPeer","WebRtcPeer","_WebRtcPeerCore","constructor","__proto__","_default","_window$navigator","_uaParserJs","ua","userAgent","parser","getBrowser","_localVideo","_remoteVideo","_setLocalVideo","localVideo","remoteVideo","coreOptions","pause","srcObject","load","_setLocalVideo2","HAVE_CURRENT_DATA","receivers","createElement","videoWidth","videoHeight","drawImage","muted","dispose","getSender","MODEL","NAME","TYPE","VENDOR","VERSION","MOBILE","TABLET","SMARTTV","util","extend","regexes","extensions","mergedRegexes","concat","str1","str2","lowerize","str","major","replace","len","mapper","rgx","arrays","k","q","matches","match","regex","props","exec","test","maps","browser","oldSafari","oldEdge","os","windows","cpu","device","engine","UAParser","getResult","_ua","_rgxmap","_browser","getCPU","_cpu","architecture","getDevice","_device","vendor","model","getEngine","_engine","getOS","_os","getUA","setUA","BROWSER","MAJOR","CPU","ARCHITECTURE","DEVICE","CONSOLE","WEARABLE","EMBEDDED","ENGINE","OS","$","jQuery","Zepto","uastring","prop","ReflectOwnKeys","R","Reflect","ReflectApply","target","ownKeys","getOwnPropertySymbols","getOwnPropertyNames","NumberIsNaN","Number","EventEmitter","init","once","emitter","errorListener","removeListener","resolver","eventTargetAgnosticAddListener","handler","flags","addErrorHandlerIfEventEmitter","_eventsCount","_maxListeners","defaultMaxListeners","checkListener","_getMaxListeners","that","_addListener","prepend","events","existing","warning","newListener","unshift","warned","w","String","count","onceWrapper","fired","wrapFn","_onceWrap","wrapped","_listeners","unwrap","evlistener","arr","ret","Array","unwrapListeners","arrayClone","copy","wrapListener","arg","RangeError","getPrototypeOf","setMaxListeners","getMaxListeners","doError","er","message","context","listeners","addListener","prependListener","prependOnceListener","list","position","originalListener","pop","spliceOne","off","rawListeners","eventNames","parseFont","array","ImageData","loadImage","src","image","cleanup","onload","string","weightRe","RegExp","styleRe","variantRe","stretchRe","sizeFamilyRe","cache","sizeFamily","font","weight","style","stretch","variant","size","parseFloat","unit","family","normalice","opts","selected","servers","stun","turn","stunCount","turnCount","getServers","out","input","protocols","credential","isNode","Public","merge","merge_recursive","base","typeOf","argv","sitem","webpackPolyfill","deprecate","paths","children","logDisabled_","deprecationWarnings_","extractVersion","expr","pos","wrapPeerConnectionEvent","eventNameToWrap","wrapper","proto","nativeAddEventListener","nativeEventName","cb","wrappedCallback","modifiedEvent","handleEvent","_eventMap","nativeRemoveEventListener","unwrappedCb","delete","disableLog","bool","disableWarnings","log","deprecated","oldMethod","newMethod","isObject","val","compactObject","reduce","accumulator","isObj","isEmptyObject","filterStats","outbound","streamStatsType","filteredResult","trackStats","trackIdentifier","trackStat","walkStats","resultSet","endsWith","shimGetUserMedia","browserDetails","constraintsToChrome_","cc","ideal","exact","max","oldname_","oc","mix","advanced","shimConstraints_","func","remap","a","b","face","facingMode","getSupportedFacingModeLies","getSupportedConstraints","enumerateDevices","devices","dev","some","label","includes","deviceId","shimError_","PermissionDeniedError","PermissionDismissedError","DevicesNotFoundError","ConstraintNotSatisfiedError","TrackStartError","MediaDeviceFailedDueToShutdown","MediaDeviceKillSwitchOn","TabCaptureError","ScreenCaptureError","DeviceCaptureError","constraint","constraintName","onSuccess","onError","webkitGetUserMedia","origGetUserMedia","cs","DOMException","shimGetDisplayMedia","getSourceId","getDisplayMedia","sourceId","widthSpecified","heightSpecified","frameRateSpecified","frameRate","chromeMediaSource","chromeMediaSourceId","maxFrameRate","maxWidth","maxHeight","shimMediaStream","webkitMediaStream","shimOnTrack","f","origSetRemoteDescription","_ontrackpoly","te","shimGetSendersWithDtmf","shimSenderWithDtmf","_dtmf","createDTMFSender","_pc","_senders","origAddTrack","origRemoveTrack","origAddStream","origRemoveStream","origGetSenders","shimGetStats","origGetStats","onSucc","onErr","fixChromeStats_","response","standardReport","report","standardStats","timestamp","names","makeMapStats","successCallbackWrapper_","shimSenderReceiverGetStats","origGetReceivers","srcElement","shimAddTrackRemoveTrackWithNative","_shimmedLocalStreams","streamId","existingSenders","newSenders","newSender","shimAddTrackRemoveTrack","origGetLocalStreams","nativeStreams","_reverseStreams","_streams","newStream","replaceInternalStreamId","internalId","externalStream","internalStream","replaceExternalStreamId","alreadyExists","oldStream","methodObj","origSetLocalDescription","origLocalDescription","getOwnPropertyDescriptor","streamid","shimPeerConnection","webkitRTCPeerConnection","fixNegotiationNeeded","sdpSemantics","catch","origMSTEnabled","ev","RTCDtmfSender","RTCDTMFSender","RTCPeerConnectionShim","validTurn","startsWith","shimReplaceTrack","setTrack","nativeGetUserMedia","getSettings","nativeGetSettings","applyConstraints","nativeApplyConstraints","preferredMediaSource","mediaSource","RTCTrackEvent","mozRTCPeerConnection","modernStatsTypes","nativeGetStats","shimSenderGetStats","shimReceiverGetStats","shimRemoveStream","shimRTCDataChannel","DataChannel","shimAddTransceiver","origAddTransceiver","setParametersPromises","initParameters","shouldPerformCheck","sendEncodings","encodingParam","rid","scaleResolutionDownBy","maxFramerate","getParameters","setParameters","shimGetParameters","origGetParameters","shimCreateOffer","origCreateOffer","finally","shimCreateAnswer","origCreateAnswer","shimLocalStreamsAPI","_localStreams","_addTrack","shimRemoteStreamsAPI","_remoteStreams","_onaddstream","_onaddstreampoly","shimCallbacksAPI","successCallback","failureCallback","withCallback","_getUserMedia","shimConstraints","errcb","shimRTCIceServerUrls","OrigPeerConnection","pcConfig","pcConstraints","newIceServers","generateCertificate","shimTrackEventTransceiver","shimCreateOfferLegacy","audioTransceiver","setDirection","videoTransceiver","shimAudioContext","AudioContext","webkitAudioContext","shimRTCIceCandidate","NativeRTCIceCandidate","nativeCandidate","parsedCandidate","augmentedCandidate","shimMaxMessageSize","_sctp","sctpInDescription","mLine","getRemoteFirefoxVersion","getCanSendMaxMessageSize","remoteIsFirefox","canSendMaxMessageSize","getMaxMessageSize","isFirefox","canSendMMS","remoteMMS","POSITIVE_INFINITY","shimSendThrowTypeError","wrapDcSend","dc","origDataChannelSend","byteLength","origCreateDataChannel","dataChannel","channel","shimConnectionState","_onconnectionstatechange","origMethod","_connectionstatechangepoly","_lastConnectionState","newEvent","removeExtmapAllowMixed","nativeSRD","shimAddIceCandidateNullOrEmpty","nativeAddIceCandidate","shimChrome","shimFirefox","shimEdge","shimSafari","logging","mozGetUserMedia","isSecureContext","supportsUnifiedPlan","adapter","commonShim","browserShim","adapterFactory","getRandomValues","rnds8","Uint8Array","rng","crypto","msCrypto","uuid","byteToHex","_nodeId","_clockseq","offset","_lastMSecs","_lastNSecs","buf","node","clockseq","seedBytes","msecs","Date","now","nsecs","dt","tl","tmh","v","generateUUID","namespace","unescape","encodeURIComponent","bytes","charCodeAt","stringToBytes","hashfunc","DNS","URL","getOutputLength","inputLength8","safeAdd","x","y","lsw","md5cmn","num","cnt","md5ff","md5gg","md5hh","md5ii","v35","msg","length32","hex","md5ToHexEncodedArray","olda","oldb","oldc","oldd","wordsToMd5","length8","Uint32Array","bytesToWords","rnds","z","ROTL","K","H","isArray","N","ceil","M","_i","pow","floor","_i2","W","_t","_t2","T"],"mappings":"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","file":"kurento-utils.min.js","sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"kurentoUtils\"] = factory();\n\telse\n\t\troot[\"kurentoUtils\"] = factory();\n})(window, function() {\nreturn "," \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 4);\n","/* eslint-env node */\n'use strict';\n\n// SDP helpers.\nvar SDPUtils = {};\n\n// Generate an alphanumeric identifier for cname or mids.\n// TODO: use UUIDs instead? https://gist.github.com/jed/982883\nSDPUtils.generateIdentifier = function() {\n  return Math.random().toString(36).substr(2, 10);\n};\n\n// The RTCP CNAME used by all peerconnections from the same JS.\nSDPUtils.localCName = SDPUtils.generateIdentifier();\n\n// Splits SDP into lines, dealing with both CRLF and LF.\nSDPUtils.splitLines = function(blob) {\n  return blob.trim().split('\\n').map(function(line) {\n    return line.trim();\n  });\n};\n// Splits SDP into sessionpart and mediasections. Ensures CRLF.\nSDPUtils.splitSections = function(blob) {\n  var parts = blob.split('\\nm=');\n  return parts.map(function(part, index) {\n    return (index > 0 ? 'm=' + part : part).trim() + '\\r\\n';\n  });\n};\n\n// returns the session description.\nSDPUtils.getDescription = function(blob) {\n  var sections = SDPUtils.splitSections(blob);\n  return sections && sections[0];\n};\n\n// returns the individual media sections.\nSDPUtils.getMediaSections = function(blob) {\n  var sections = SDPUtils.splitSections(blob);\n  sections.shift();\n  return sections;\n};\n\n// Returns lines that start with a certain prefix.\nSDPUtils.matchPrefix = function(blob, prefix) {\n  return SDPUtils.splitLines(blob).filter(function(line) {\n    return line.indexOf(prefix) === 0;\n  });\n};\n\n// Parses an ICE candidate line. Sample input:\n// candidate:702786350 2 udp 41819902 8.8.8.8 60769 typ relay raddr 8.8.8.8\n// rport 55996\"\nSDPUtils.parseCandidate = function(line) {\n  var parts;\n  // Parse both variants.\n  if (line.indexOf('a=candidate:') === 0) {\n    parts = line.substring(12).split(' ');\n  } else {\n    parts = line.substring(10).split(' ');\n  }\n\n  var candidate = {\n    foundation: parts[0],\n    component: parseInt(parts[1], 10),\n    protocol: parts[2].toLowerCase(),\n    priority: parseInt(parts[3], 10),\n    ip: parts[4],\n    address: parts[4], // address is an alias for ip.\n    port: parseInt(parts[5], 10),\n    // skip parts[6] == 'typ'\n    type: parts[7]\n  };\n\n  for (var i = 8; i < parts.length; i += 2) {\n    switch (parts[i]) {\n      case 'raddr':\n        candidate.relatedAddress = parts[i + 1];\n        break;\n      case 'rport':\n        candidate.relatedPort = parseInt(parts[i + 1], 10);\n        break;\n      case 'tcptype':\n        candidate.tcpType = parts[i + 1];\n        break;\n      case 'ufrag':\n        candidate.ufrag = parts[i + 1]; // for backward compability.\n        candidate.usernameFragment = parts[i + 1];\n        break;\n      default: // extension handling, in particular ufrag\n        candidate[parts[i]] = parts[i + 1];\n        break;\n    }\n  }\n  return candidate;\n};\n\n// Translates a candidate object into SDP candidate attribute.\nSDPUtils.writeCandidate = function(candidate) {\n  var sdp = [];\n  sdp.push(candidate.foundation);\n  sdp.push(candidate.component);\n  sdp.push(candidate.protocol.toUpperCase());\n  sdp.push(candidate.priority);\n  sdp.push(candidate.address || candidate.ip);\n  sdp.push(candidate.port);\n\n  var type = candidate.type;\n  sdp.push('typ');\n  sdp.push(type);\n  if (type !== 'host' && candidate.relatedAddress &&\n      candidate.relatedPort) {\n    sdp.push('raddr');\n    sdp.push(candidate.relatedAddress);\n    sdp.push('rport');\n    sdp.push(candidate.relatedPort);\n  }\n  if (candidate.tcpType && candidate.protocol.toLowerCase() === 'tcp') {\n    sdp.push('tcptype');\n    sdp.push(candidate.tcpType);\n  }\n  if (candidate.usernameFragment || candidate.ufrag) {\n    sdp.push('ufrag');\n    sdp.push(candidate.usernameFragment || candidate.ufrag);\n  }\n  return 'candidate:' + sdp.join(' ');\n};\n\n// Parses an ice-options line, returns an array of option tags.\n// a=ice-options:foo bar\nSDPUtils.parseIceOptions = function(line) {\n  return line.substr(14).split(' ');\n};\n\n// Parses an rtpmap line, returns RTCRtpCoddecParameters. Sample input:\n// a=rtpmap:111 opus/48000/2\nSDPUtils.parseRtpMap = function(line) {\n  var parts = line.substr(9).split(' ');\n  var parsed = {\n    payloadType: parseInt(parts.shift(), 10) // was: id\n  };\n\n  parts = parts[0].split('/');\n\n  parsed.name = parts[0];\n  parsed.clockRate = parseInt(parts[1], 10); // was: clockrate\n  parsed.channels = parts.length === 3 ? parseInt(parts[2], 10) : 1;\n  // legacy alias, got renamed back to channels in ORTC.\n  parsed.numChannels = parsed.channels;\n  return parsed;\n};\n\n// Generate an a=rtpmap line from RTCRtpCodecCapability or\n// RTCRtpCodecParameters.\nSDPUtils.writeRtpMap = function(codec) {\n  var pt = codec.payloadType;\n  if (codec.preferredPayloadType !== undefined) {\n    pt = codec.preferredPayloadType;\n  }\n  var channels = codec.channels || codec.numChannels || 1;\n  return 'a=rtpmap:' + pt + ' ' + codec.name + '/' + codec.clockRate +\n      (channels !== 1 ? '/' + channels : '') + '\\r\\n';\n};\n\n// Parses an a=extmap line (headerextension from RFC 5285). Sample input:\n// a=extmap:2 urn:ietf:params:rtp-hdrext:toffset\n// a=extmap:2/sendonly urn:ietf:params:rtp-hdrext:toffset\nSDPUtils.parseExtmap = function(line) {\n  var parts = line.substr(9).split(' ');\n  return {\n    id: parseInt(parts[0], 10),\n    direction: parts[0].indexOf('/') > 0 ? parts[0].split('/')[1] : 'sendrecv',\n    uri: parts[1]\n  };\n};\n\n// Generates a=extmap line from RTCRtpHeaderExtensionParameters or\n// RTCRtpHeaderExtension.\nSDPUtils.writeExtmap = function(headerExtension) {\n  return 'a=extmap:' + (headerExtension.id || headerExtension.preferredId) +\n      (headerExtension.direction && headerExtension.direction !== 'sendrecv'\n        ? '/' + headerExtension.direction\n        : '') +\n      ' ' + headerExtension.uri + '\\r\\n';\n};\n\n// Parses an ftmp line, returns dictionary. Sample input:\n// a=fmtp:96 vbr=on;cng=on\n// Also deals with vbr=on; cng=on\nSDPUtils.parseFmtp = function(line) {\n  var parsed = {};\n  var kv;\n  var parts = line.substr(line.indexOf(' ') + 1).split(';');\n  for (var j = 0; j < parts.length; j++) {\n    kv = parts[j].trim().split('=');\n    parsed[kv[0].trim()] = kv[1];\n  }\n  return parsed;\n};\n\n// Generates an a=ftmp line from RTCRtpCodecCapability or RTCRtpCodecParameters.\nSDPUtils.writeFmtp = function(codec) {\n  var line = '';\n  var pt = codec.payloadType;\n  if (codec.preferredPayloadType !== undefined) {\n    pt = codec.preferredPayloadType;\n  }\n  if (codec.parameters && Object.keys(codec.parameters).length) {\n    var params = [];\n    Object.keys(codec.parameters).forEach(function(param) {\n      if (codec.parameters[param]) {\n        params.push(param + '=' + codec.parameters[param]);\n      } else {\n        params.push(param);\n      }\n    });\n    line += 'a=fmtp:' + pt + ' ' + params.join(';') + '\\r\\n';\n  }\n  return line;\n};\n\n// Parses an rtcp-fb line, returns RTCPRtcpFeedback object. Sample input:\n// a=rtcp-fb:98 nack rpsi\nSDPUtils.parseRtcpFb = function(line) {\n  var parts = line.substr(line.indexOf(' ') + 1).split(' ');\n  return {\n    type: parts.shift(),\n    parameter: parts.join(' ')\n  };\n};\n// Generate a=rtcp-fb lines from RTCRtpCodecCapability or RTCRtpCodecParameters.\nSDPUtils.writeRtcpFb = function(codec) {\n  var lines = '';\n  var pt = codec.payloadType;\n  if (codec.preferredPayloadType !== undefined) {\n    pt = codec.preferredPayloadType;\n  }\n  if (codec.rtcpFeedback && codec.rtcpFeedback.length) {\n    // FIXME: special handling for trr-int?\n    codec.rtcpFeedback.forEach(function(fb) {\n      lines += 'a=rtcp-fb:' + pt + ' ' + fb.type +\n      (fb.parameter && fb.parameter.length ? ' ' + fb.parameter : '') +\n          '\\r\\n';\n    });\n  }\n  return lines;\n};\n\n// Parses an RFC 5576 ssrc media attribute. Sample input:\n// a=ssrc:3735928559 cname:something\nSDPUtils.parseSsrcMedia = function(line) {\n  var sp = line.indexOf(' ');\n  var parts = {\n    ssrc: parseInt(line.substr(7, sp - 7), 10)\n  };\n  var colon = line.indexOf(':', sp);\n  if (colon > -1) {\n    parts.attribute = line.substr(sp + 1, colon - sp - 1);\n    parts.value = line.substr(colon + 1);\n  } else {\n    parts.attribute = line.substr(sp + 1);\n  }\n  return parts;\n};\n\nSDPUtils.parseSsrcGroup = function(line) {\n  var parts = line.substr(13).split(' ');\n  return {\n    semantics: parts.shift(),\n    ssrcs: parts.map(function(ssrc) {\n      return parseInt(ssrc, 10);\n    })\n  };\n};\n\n// Extracts the MID (RFC 5888) from a media section.\n// returns the MID or undefined if no mid line was found.\nSDPUtils.getMid = function(mediaSection) {\n  var mid = SDPUtils.matchPrefix(mediaSection, 'a=mid:')[0];\n  if (mid) {\n    return mid.substr(6);\n  }\n};\n\nSDPUtils.parseFingerprint = function(line) {\n  var parts = line.substr(14).split(' ');\n  return {\n    algorithm: parts[0].toLowerCase(), // algorithm is case-sensitive in Edge.\n    value: parts[1]\n  };\n};\n\n// Extracts DTLS parameters from SDP media section or sessionpart.\n// FIXME: for consistency with other functions this should only\n//   get the fingerprint line as input. See also getIceParameters.\nSDPUtils.getDtlsParameters = function(mediaSection, sessionpart) {\n  var lines = SDPUtils.matchPrefix(mediaSection + sessionpart,\n    'a=fingerprint:');\n  // Note: a=setup line is ignored since we use the 'auto' role.\n  // Note2: 'algorithm' is not case sensitive except in Edge.\n  return {\n    role: 'auto',\n    fingerprints: lines.map(SDPUtils.parseFingerprint)\n  };\n};\n\n// Serializes DTLS parameters to SDP.\nSDPUtils.writeDtlsParameters = function(params, setupType) {\n  var sdp = 'a=setup:' + setupType + '\\r\\n';\n  params.fingerprints.forEach(function(fp) {\n    sdp += 'a=fingerprint:' + fp.algorithm + ' ' + fp.value + '\\r\\n';\n  });\n  return sdp;\n};\n\n// Parses a=crypto lines into\n//   https://rawgit.com/aboba/edgertc/master/msortc-rs4.html#dictionary-rtcsrtpsdesparameters-members\nSDPUtils.parseCryptoLine = function(line) {\n  var parts = line.substr(9).split(' ');\n  return {\n    tag: parseInt(parts[0], 10),\n    cryptoSuite: parts[1],\n    keyParams: parts[2],\n    sessionParams: parts.slice(3),\n  };\n};\n\nSDPUtils.writeCryptoLine = function(parameters) {\n  return 'a=crypto:' + parameters.tag + ' ' +\n    parameters.cryptoSuite + ' ' +\n    (typeof parameters.keyParams === 'object'\n      ? SDPUtils.writeCryptoKeyParams(parameters.keyParams)\n      : parameters.keyParams) +\n    (parameters.sessionParams ? ' ' + parameters.sessionParams.join(' ') : '') +\n    '\\r\\n';\n};\n\n// Parses the crypto key parameters into\n//   https://rawgit.com/aboba/edgertc/master/msortc-rs4.html#rtcsrtpkeyparam*\nSDPUtils.parseCryptoKeyParams = function(keyParams) {\n  if (keyParams.indexOf('inline:') !== 0) {\n    return null;\n  }\n  var parts = keyParams.substr(7).split('|');\n  return {\n    keyMethod: 'inline',\n    keySalt: parts[0],\n    lifeTime: parts[1],\n    mkiValue: parts[2] ? parts[2].split(':')[0] : undefined,\n    mkiLength: parts[2] ? parts[2].split(':')[1] : undefined,\n  };\n};\n\nSDPUtils.writeCryptoKeyParams = function(keyParams) {\n  return keyParams.keyMethod + ':'\n    + keyParams.keySalt +\n    (keyParams.lifeTime ? '|' + keyParams.lifeTime : '') +\n    (keyParams.mkiValue && keyParams.mkiLength\n      ? '|' + keyParams.mkiValue + ':' + keyParams.mkiLength\n      : '');\n};\n\n// Extracts all SDES paramters.\nSDPUtils.getCryptoParameters = function(mediaSection, sessionpart) {\n  var lines = SDPUtils.matchPrefix(mediaSection + sessionpart,\n    'a=crypto:');\n  return lines.map(SDPUtils.parseCryptoLine);\n};\n\n// Parses ICE information from SDP media section or sessionpart.\n// FIXME: for consistency with other functions this should only\n//   get the ice-ufrag and ice-pwd lines as input.\nSDPUtils.getIceParameters = function(mediaSection, sessionpart) {\n  var ufrag = SDPUtils.matchPrefix(mediaSection + sessionpart,\n    'a=ice-ufrag:')[0];\n  var pwd = SDPUtils.matchPrefix(mediaSection + sessionpart,\n    'a=ice-pwd:')[0];\n  if (!(ufrag && pwd)) {\n    return null;\n  }\n  return {\n    usernameFragment: ufrag.substr(12),\n    password: pwd.substr(10),\n  };\n};\n\n// Serializes ICE parameters to SDP.\nSDPUtils.writeIceParameters = function(params) {\n  return 'a=ice-ufrag:' + params.usernameFragment + '\\r\\n' +\n      'a=ice-pwd:' + params.password + '\\r\\n';\n};\n\n// Parses the SDP media section and returns RTCRtpParameters.\nSDPUtils.parseRtpParameters = function(mediaSection) {\n  var description = {\n    codecs: [],\n    headerExtensions: [],\n    fecMechanisms: [],\n    rtcp: []\n  };\n  var lines = SDPUtils.splitLines(mediaSection);\n  var mline = lines[0].split(' ');\n  for (var i = 3; i < mline.length; i++) { // find all codecs from mline[3..]\n    var pt = mline[i];\n    var rtpmapline = SDPUtils.matchPrefix(\n      mediaSection, 'a=rtpmap:' + pt + ' ')[0];\n    if (rtpmapline) {\n      var codec = SDPUtils.parseRtpMap(rtpmapline);\n      var fmtps = SDPUtils.matchPrefix(\n        mediaSection, 'a=fmtp:' + pt + ' ');\n      // Only the first a=fmtp:<pt> is considered.\n      codec.parameters = fmtps.length ? SDPUtils.parseFmtp(fmtps[0]) : {};\n      codec.rtcpFeedback = SDPUtils.matchPrefix(\n        mediaSection, 'a=rtcp-fb:' + pt + ' ')\n        .map(SDPUtils.parseRtcpFb);\n      description.codecs.push(codec);\n      // parse FEC mechanisms from rtpmap lines.\n      switch (codec.name.toUpperCase()) {\n        case 'RED':\n        case 'ULPFEC':\n          description.fecMechanisms.push(codec.name.toUpperCase());\n          break;\n        default: // only RED and ULPFEC are recognized as FEC mechanisms.\n          break;\n      }\n    }\n  }\n  SDPUtils.matchPrefix(mediaSection, 'a=extmap:').forEach(function(line) {\n    description.headerExtensions.push(SDPUtils.parseExtmap(line));\n  });\n  // FIXME: parse rtcp.\n  return description;\n};\n\n// Generates parts of the SDP media section describing the capabilities /\n// parameters.\nSDPUtils.writeRtpDescription = function(kind, caps) {\n  var sdp = '';\n\n  // Build the mline.\n  sdp += 'm=' + kind + ' ';\n  sdp += caps.codecs.length > 0 ? '9' : '0'; // reject if no codecs.\n  sdp += ' UDP/TLS/RTP/SAVPF ';\n  sdp += caps.codecs.map(function(codec) {\n    if (codec.preferredPayloadType !== undefined) {\n      return codec.preferredPayloadType;\n    }\n    return codec.payloadType;\n  }).join(' ') + '\\r\\n';\n\n  sdp += 'c=IN IP4 0.0.0.0\\r\\n';\n  sdp += 'a=rtcp:9 IN IP4 0.0.0.0\\r\\n';\n\n  // Add a=rtpmap lines for each codec. Also fmtp and rtcp-fb.\n  caps.codecs.forEach(function(codec) {\n    sdp += SDPUtils.writeRtpMap(codec);\n    sdp += SDPUtils.writeFmtp(codec);\n    sdp += SDPUtils.writeRtcpFb(codec);\n  });\n  var maxptime = 0;\n  caps.codecs.forEach(function(codec) {\n    if (codec.maxptime > maxptime) {\n      maxptime = codec.maxptime;\n    }\n  });\n  if (maxptime > 0) {\n    sdp += 'a=maxptime:' + maxptime + '\\r\\n';\n  }\n  sdp += 'a=rtcp-mux\\r\\n';\n\n  if (caps.headerExtensions) {\n    caps.headerExtensions.forEach(function(extension) {\n      sdp += SDPUtils.writeExtmap(extension);\n    });\n  }\n  // FIXME: write fecMechanisms.\n  return sdp;\n};\n\n// Parses the SDP media section and returns an array of\n// RTCRtpEncodingParameters.\nSDPUtils.parseRtpEncodingParameters = function(mediaSection) {\n  var encodingParameters = [];\n  var description = SDPUtils.parseRtpParameters(mediaSection);\n  var hasRed = description.fecMechanisms.indexOf('RED') !== -1;\n  var hasUlpfec = description.fecMechanisms.indexOf('ULPFEC') !== -1;\n\n  // filter a=ssrc:... cname:, ignore PlanB-msid\n  var ssrcs = SDPUtils.matchPrefix(mediaSection, 'a=ssrc:')\n    .map(function(line) {\n      return SDPUtils.parseSsrcMedia(line);\n    })\n    .filter(function(parts) {\n      return parts.attribute === 'cname';\n    });\n  var primarySsrc = ssrcs.length > 0 && ssrcs[0].ssrc;\n  var secondarySsrc;\n\n  var flows = SDPUtils.matchPrefix(mediaSection, 'a=ssrc-group:FID')\n    .map(function(line) {\n      var parts = line.substr(17).split(' ');\n      return parts.map(function(part) {\n        return parseInt(part, 10);\n      });\n    });\n  if (flows.length > 0 && flows[0].length > 1 && flows[0][0] === primarySsrc) {\n    secondarySsrc = flows[0][1];\n  }\n\n  description.codecs.forEach(function(codec) {\n    if (codec.name.toUpperCase() === 'RTX' && codec.parameters.apt) {\n      var encParam = {\n        ssrc: primarySsrc,\n        codecPayloadType: parseInt(codec.parameters.apt, 10)\n      };\n      if (primarySsrc && secondarySsrc) {\n        encParam.rtx = {ssrc: secondarySsrc};\n      }\n      encodingParameters.push(encParam);\n      if (hasRed) {\n        encParam = JSON.parse(JSON.stringify(encParam));\n        encParam.fec = {\n          ssrc: primarySsrc,\n          mechanism: hasUlpfec ? 'red+ulpfec' : 'red'\n        };\n        encodingParameters.push(encParam);\n      }\n    }\n  });\n  if (encodingParameters.length === 0 && primarySsrc) {\n    encodingParameters.push({\n      ssrc: primarySsrc\n    });\n  }\n\n  // we support both b=AS and b=TIAS but interpret AS as TIAS.\n  var bandwidth = SDPUtils.matchPrefix(mediaSection, 'b=');\n  if (bandwidth.length) {\n    if (bandwidth[0].indexOf('b=TIAS:') === 0) {\n      bandwidth = parseInt(bandwidth[0].substr(7), 10);\n    } else if (bandwidth[0].indexOf('b=AS:') === 0) {\n      // use formula from JSEP to convert b=AS to TIAS value.\n      bandwidth = parseInt(bandwidth[0].substr(5), 10) * 1000 * 0.95\n          - (50 * 40 * 8);\n    } else {\n      bandwidth = undefined;\n    }\n    encodingParameters.forEach(function(params) {\n      params.maxBitrate = bandwidth;\n    });\n  }\n  return encodingParameters;\n};\n\n// parses http://draft.ortc.org/#rtcrtcpparameters*\nSDPUtils.parseRtcpParameters = function(mediaSection) {\n  var rtcpParameters = {};\n\n  // Gets the first SSRC. Note tha with RTX there might be multiple\n  // SSRCs.\n  var remoteSsrc = SDPUtils.matchPrefix(mediaSection, 'a=ssrc:')\n    .map(function(line) {\n      return SDPUtils.parseSsrcMedia(line);\n    })\n    .filter(function(obj) {\n      return obj.attribute === 'cname';\n    })[0];\n  if (remoteSsrc) {\n    rtcpParameters.cname = remoteSsrc.value;\n    rtcpParameters.ssrc = remoteSsrc.ssrc;\n  }\n\n  // Edge uses the compound attribute instead of reducedSize\n  // compound is !reducedSize\n  var rsize = SDPUtils.matchPrefix(mediaSection, 'a=rtcp-rsize');\n  rtcpParameters.reducedSize = rsize.length > 0;\n  rtcpParameters.compound = rsize.length === 0;\n\n  // parses the rtcp-mux attrіbute.\n  // Note that Edge does not support unmuxed RTCP.\n  var mux = SDPUtils.matchPrefix(mediaSection, 'a=rtcp-mux');\n  rtcpParameters.mux = mux.length > 0;\n\n  return rtcpParameters;\n};\n\n// parses either a=msid: or a=ssrc:... msid lines and returns\n// the id of the MediaStream and MediaStreamTrack.\nSDPUtils.parseMsid = function(mediaSection) {\n  var parts;\n  var spec = SDPUtils.matchPrefix(mediaSection, 'a=msid:');\n  if (spec.length === 1) {\n    parts = spec[0].substr(7).split(' ');\n    return {stream: parts[0], track: parts[1]};\n  }\n  var planB = SDPUtils.matchPrefix(mediaSection, 'a=ssrc:')\n    .map(function(line) {\n      return SDPUtils.parseSsrcMedia(line);\n    })\n    .filter(function(msidParts) {\n      return msidParts.attribute === 'msid';\n    });\n  if (planB.length > 0) {\n    parts = planB[0].value.split(' ');\n    return {stream: parts[0], track: parts[1]};\n  }\n};\n\n// SCTP\n// parses draft-ietf-mmusic-sctp-sdp-26 first and falls back\n// to draft-ietf-mmusic-sctp-sdp-05\nSDPUtils.parseSctpDescription = function(mediaSection) {\n  var mline = SDPUtils.parseMLine(mediaSection);\n  var maxSizeLine = SDPUtils.matchPrefix(mediaSection, 'a=max-message-size:');\n  var maxMessageSize;\n  if (maxSizeLine.length > 0) {\n    maxMessageSize = parseInt(maxSizeLine[0].substr(19), 10);\n  }\n  if (isNaN(maxMessageSize)) {\n    maxMessageSize = 65536;\n  }\n  var sctpPort = SDPUtils.matchPrefix(mediaSection, 'a=sctp-port:');\n  if (sctpPort.length > 0) {\n    return {\n      port: parseInt(sctpPort[0].substr(12), 10),\n      protocol: mline.fmt,\n      maxMessageSize: maxMessageSize\n    };\n  }\n  var sctpMapLines = SDPUtils.matchPrefix(mediaSection, 'a=sctpmap:');\n  if (sctpMapLines.length > 0) {\n    var parts = SDPUtils.matchPrefix(mediaSection, 'a=sctpmap:')[0]\n      .substr(10)\n      .split(' ');\n    return {\n      port: parseInt(parts[0], 10),\n      protocol: parts[1],\n      maxMessageSize: maxMessageSize\n    };\n  }\n};\n\n// SCTP\n// outputs the draft-ietf-mmusic-sctp-sdp-26 version that all browsers\n// support by now receiving in this format, unless we originally parsed\n// as the draft-ietf-mmusic-sctp-sdp-05 format (indicated by the m-line\n// protocol of DTLS/SCTP -- without UDP/ or TCP/)\nSDPUtils.writeSctpDescription = function(media, sctp) {\n  var output = [];\n  if (media.protocol !== 'DTLS/SCTP') {\n    output = [\n      'm=' + media.kind + ' 9 ' + media.protocol + ' ' + sctp.protocol + '\\r\\n',\n      'c=IN IP4 0.0.0.0\\r\\n',\n      'a=sctp-port:' + sctp.port + '\\r\\n'\n    ];\n  } else {\n    output = [\n      'm=' + media.kind + ' 9 ' + media.protocol + ' ' + sctp.port + '\\r\\n',\n      'c=IN IP4 0.0.0.0\\r\\n',\n      'a=sctpmap:' + sctp.port + ' ' + sctp.protocol + ' 65535\\r\\n'\n    ];\n  }\n  if (sctp.maxMessageSize !== undefined) {\n    output.push('a=max-message-size:' + sctp.maxMessageSize + '\\r\\n');\n  }\n  return output.join('');\n};\n\n// Generate a session ID for SDP.\n// https://tools.ietf.org/html/draft-ietf-rtcweb-jsep-20#section-5.2.1\n// recommends using a cryptographically random +ve 64-bit value\n// but right now this should be acceptable and within the right range\nSDPUtils.generateSessionId = function() {\n  return Math.random().toString().substr(2, 21);\n};\n\n// Write boilder plate for start of SDP\n// sessId argument is optional - if not supplied it will\n// be generated randomly\n// sessVersion is optional and defaults to 2\n// sessUser is optional and defaults to 'thisisadapterortc'\nSDPUtils.writeSessionBoilerplate = function(sessId, sessVer, sessUser) {\n  var sessionId;\n  var version = sessVer !== undefined ? sessVer : 2;\n  if (sessId) {\n    sessionId = sessId;\n  } else {\n    sessionId = SDPUtils.generateSessionId();\n  }\n  var user = sessUser || 'thisisadapterortc';\n  // FIXME: sess-id should be an NTP timestamp.\n  return 'v=0\\r\\n' +\n      'o=' + user + ' ' + sessionId + ' ' + version +\n        ' IN IP4 127.0.0.1\\r\\n' +\n      's=-\\r\\n' +\n      't=0 0\\r\\n';\n};\n\nSDPUtils.writeMediaSection = function(transceiver, caps, type, stream) {\n  var sdp = SDPUtils.writeRtpDescription(transceiver.kind, caps);\n\n  // Map ICE parameters (ufrag, pwd) to SDP.\n  sdp += SDPUtils.writeIceParameters(\n    transceiver.iceGatherer.getLocalParameters());\n\n  // Map DTLS parameters to SDP.\n  sdp += SDPUtils.writeDtlsParameters(\n    transceiver.dtlsTransport.getLocalParameters(),\n    type === 'offer' ? 'actpass' : 'active');\n\n  sdp += 'a=mid:' + transceiver.mid + '\\r\\n';\n\n  if (transceiver.direction) {\n    sdp += 'a=' + transceiver.direction + '\\r\\n';\n  } else if (transceiver.rtpSender && transceiver.rtpReceiver) {\n    sdp += 'a=sendrecv\\r\\n';\n  } else if (transceiver.rtpSender) {\n    sdp += 'a=sendonly\\r\\n';\n  } else if (transceiver.rtpReceiver) {\n    sdp += 'a=recvonly\\r\\n';\n  } else {\n    sdp += 'a=inactive\\r\\n';\n  }\n\n  if (transceiver.rtpSender) {\n    // spec.\n    var msid = 'msid:' + stream.id + ' ' +\n        transceiver.rtpSender.track.id + '\\r\\n';\n    sdp += 'a=' + msid;\n\n    // for Chrome.\n    sdp += 'a=ssrc:' + transceiver.sendEncodingParameters[0].ssrc +\n        ' ' + msid;\n    if (transceiver.sendEncodingParameters[0].rtx) {\n      sdp += 'a=ssrc:' + transceiver.sendEncodingParameters[0].rtx.ssrc +\n          ' ' + msid;\n      sdp += 'a=ssrc-group:FID ' +\n          transceiver.sendEncodingParameters[0].ssrc + ' ' +\n          transceiver.sendEncodingParameters[0].rtx.ssrc +\n          '\\r\\n';\n    }\n  }\n  // FIXME: this should be written by writeRtpDescription.\n  sdp += 'a=ssrc:' + transceiver.sendEncodingParameters[0].ssrc +\n      ' cname:' + SDPUtils.localCName + '\\r\\n';\n  if (transceiver.rtpSender && transceiver.sendEncodingParameters[0].rtx) {\n    sdp += 'a=ssrc:' + transceiver.sendEncodingParameters[0].rtx.ssrc +\n        ' cname:' + SDPUtils.localCName + '\\r\\n';\n  }\n  return sdp;\n};\n\n// Gets the direction from the mediaSection or the sessionpart.\nSDPUtils.getDirection = function(mediaSection, sessionpart) {\n  // Look for sendrecv, sendonly, recvonly, inactive, default to sendrecv.\n  var lines = SDPUtils.splitLines(mediaSection);\n  for (var i = 0; i < lines.length; i++) {\n    switch (lines[i]) {\n      case 'a=sendrecv':\n      case 'a=sendonly':\n      case 'a=recvonly':\n      case 'a=inactive':\n        return lines[i].substr(2);\n      default:\n        // FIXME: What should happen here?\n    }\n  }\n  if (sessionpart) {\n    return SDPUtils.getDirection(sessionpart);\n  }\n  return 'sendrecv';\n};\n\nSDPUtils.getKind = function(mediaSection) {\n  var lines = SDPUtils.splitLines(mediaSection);\n  var mline = lines[0].split(' ');\n  return mline[0].substr(2);\n};\n\nSDPUtils.isRejected = function(mediaSection) {\n  return mediaSection.split(' ', 2)[1] === '0';\n};\n\nSDPUtils.parseMLine = function(mediaSection) {\n  var lines = SDPUtils.splitLines(mediaSection);\n  var parts = lines[0].substr(2).split(' ');\n  return {\n    kind: parts[0],\n    port: parseInt(parts[1], 10),\n    protocol: parts[2],\n    fmt: parts.slice(3).join(' ')\n  };\n};\n\nSDPUtils.parseOLine = function(mediaSection) {\n  var line = SDPUtils.matchPrefix(mediaSection, 'o=')[0];\n  var parts = line.substr(2).split(' ');\n  return {\n    username: parts[0],\n    sessionId: parts[1],\n    sessionVersion: parseInt(parts[2], 10),\n    netType: parts[3],\n    addressType: parts[4],\n    address: parts[5]\n  };\n};\n\n// a very naive interpretation of a valid SDP.\nSDPUtils.isValidSDP = function(blob) {\n  if (typeof blob !== 'string' || blob.length === 0) {\n    return false;\n  }\n  var lines = SDPUtils.splitLines(blob);\n  for (var i = 0; i < lines.length; i++) {\n    if (lines[i].length < 2 || lines[i].charAt(1) !== '=') {\n      return false;\n    }\n    // TODO: check the modifier a bit more.\n  }\n  return true;\n};\n\n// Expose public methods.\nif (typeof module === 'object') {\n  module.exports = SDPUtils;\n}\n","'use strict';\n\nexports.MediaStream = window.MediaStream;\nexports.MediaStreamTrack = window.MediaStreamTrack;\nexports.RTCDataChannel = window.RTCDataChannel;\nexports.RTCDataChannelEvent = window.RTCDataChannelEvent;\nexports.RTCDtlsTransport = window.RTCDtlsTransport;\nexports.RTCIceCandidate = window.RTCIceCandidate;\nexports.RTCIceTransport = window.RTCIceTransport;\nexports.RTCPeerConnection = window.RTCPeerConnection;\nexports.RTCPeerConnectionIceEvent = window.RTCPeerConnectionIceEvent;\nexports.RTCRtpReceiver = window.RTCRtpReceiver;\nexports.RTCRtpSender = window.RTCRtpSender;\nexports.RTCRtpTransceiver = window.RTCRtpTransceiver;\nexports.RTCSctpTransport = window.RTCSctpTransport;\nexports.RTCSessionDescription = window.RTCSessionDescription;\nexports.getUserMedia = window.getUserMedia;\nexports.mediaDevices = navigator.mediaDevices;\n","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nObject.defineProperty(exports, \"createCanvas\", {\n  enumerable: true,\n  get: function () {\n    return _canvas.createCanvas;\n  }\n});\nexports.WebRtcPeerCore = exports.default = void 0;\n\nvar _events = _interopRequireDefault(require(\"events\"));\n\nrequire(\"webrtc-adapter\");\n\nvar _canvas = require(\"canvas\");\n\nvar _freeice = _interopRequireDefault(require(\"freeice\"));\n\nvar _merge = _interopRequireDefault(require(\"merge\"));\n\nvar _uuid = require(\"uuid\");\n\nvar _wrtc = require(\"wrtc\");\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classPrivateMethodGet(receiver, privateSet, fn) { if (!privateSet.has(receiver)) { throw new TypeError(\"attempted to get private field on non-instance\"); } return fn; }\n\nfunction _classPrivateFieldGet(receiver, privateMap) { var descriptor = _classExtractFieldDescriptor(receiver, privateMap, \"get\"); return _classApplyDescriptorGet(receiver, descriptor); }\n\nfunction _classApplyDescriptorGet(receiver, descriptor) { if (descriptor.get) { return descriptor.get.call(receiver); } return descriptor.value; }\n\nfunction _classPrivateFieldSet(receiver, privateMap, value) { var descriptor = _classExtractFieldDescriptor(receiver, privateMap, \"set\"); _classApplyDescriptorSet(receiver, descriptor, value); return value; }\n\nfunction _classExtractFieldDescriptor(receiver, privateMap, action) { if (!privateMap.has(receiver)) { throw new TypeError(\"attempted to \" + action + \" private field on non-instance\"); } return privateMap.get(receiver); }\n\nfunction _classApplyDescriptorSet(receiver, descriptor, value) { if (descriptor.set) { descriptor.set.call(receiver, value); } else { if (!descriptor.writable) { throw new TypeError(\"attempted to set read only private field\"); } descriptor.value = value; } }\n\nconst recursive = _merge.default.recursive.bind(undefined, true);\n\nconst MEDIA_CONSTRAINTS = {\n  audio: true,\n  video: {\n    width: 640,\n    framerate: 15\n  }\n};\n/**\r\n * Apply an optional callback to a promise and return the new one\r\n *\r\n * @param Promise promise\r\n * @param {} [callback]\r\n */\n\nfunction asCallback(promise, callback) {\n  if (callback) return promise.then(callback.bind(null, null), callback);\n  return promise;\n}\n\nfunction filterTracksType({\n  track: {\n    kind\n  }\n}) {\n  return this.kind === kind;\n}\n\nfunction replaceTrack(sender) {\n  const {\n    track\n  } = sender;\n  return sender.replaceTrack(this).then(track === null || track === void 0 ? void 0 : track.stop.bind(track));\n}\n\nfunction replaceTracks(track) {\n  return this.filter(filterTracksType, track).map(replaceTrack, track);\n}\n/* Simulcast utilities */\n\n\nfunction removeFIDFromOffer(sdp) {\n  const n = sdp.indexOf(\"a=ssrc-group:FID\");\n  if (n === -1) return sdp;\n  return sdp.slice(0, n);\n}\n\nfunction getFirstVideoTrack(stream) {\n  // Ensure all video tracks except first one and all audio tracks are stopped\n  for (const track of stream.getAudioTracks()) track.stop();\n\n  const [result, ...tracks] = stream.getVideoTracks();\n\n  for (const track of tracks) track.stop();\n\n  return result;\n}\n\nfunction getMediaEnabled(type) {\n  // [ToDo] Should return undefined if not all tracks have the same value?\n  const senders = this.peerConnection.getSenders();\n  if (!senders.length) return;\n  type = type.toLowerCase();\n\n  for (const {\n    track\n  } of senders) if (track.kind === type && !track.enabled) return false;\n\n  return true;\n}\n\nfunction setMediaEnabled(type, value) {\n  type = type.toLowerCase();\n\n  for (const {\n    track\n  } of this.peerConnection.getSenders()) if (track.kind === type) track.enabled = value;\n}\n/**\r\n * Wrapper object of an {RTCPeerConnection}. This object is aimed to simplify\r\n * the development of WebRTC-based applications.\r\n */\n\n\nvar _audioStream = /*#__PURE__*/new WeakMap();\n\nvar _candidategatheringdone = /*#__PURE__*/new WeakMap();\n\nvar _candidatesQueueOut = /*#__PURE__*/new WeakMap();\n\nvar _dataChannelConfig = /*#__PURE__*/new WeakMap();\n\nvar _dataChannels = /*#__PURE__*/new WeakMap();\n\nvar _id = /*#__PURE__*/new WeakMap();\n\nvar _interop = /*#__PURE__*/new WeakMap();\n\nvar _dataChannel = /*#__PURE__*/new WeakMap();\n\nvar _lastFrame = /*#__PURE__*/new WeakMap();\n\nvar _logger = /*#__PURE__*/new WeakMap();\n\nvar _mediaConstraints = /*#__PURE__*/new WeakMap();\n\nvar _mode = /*#__PURE__*/new WeakMap();\n\nvar _onnegotiationneeded = /*#__PURE__*/new WeakMap();\n\nvar _ontrack = /*#__PURE__*/new WeakMap();\n\nvar _peerConnection = /*#__PURE__*/new WeakMap();\n\nvar _peerconnectionConfiguration = /*#__PURE__*/new WeakMap();\n\nvar _ready = /*#__PURE__*/new WeakMap();\n\nvar _sendSource = /*#__PURE__*/new WeakMap();\n\nvar _simulcast = /*#__PURE__*/new WeakMap();\n\nvar _usePlanB = /*#__PURE__*/new WeakMap();\n\nvar _videoStream = /*#__PURE__*/new WeakMap();\n\nvar _videoSink = /*#__PURE__*/new WeakMap();\n\nvar _getMedia = /*#__PURE__*/new WeakSet();\n\nvar _getSimulcastInfo = /*#__PURE__*/new WeakSet();\n\nvar _initPeerConnection = /*#__PURE__*/new WeakSet();\n\nvar _onConnectionStateChange = /*#__PURE__*/new WeakMap();\n\nvar _onFrame = /*#__PURE__*/new WeakMap();\n\nvar _onIcecandidate = /*#__PURE__*/new WeakMap();\n\nvar _onNewListener = /*#__PURE__*/new WeakSet();\n\nvar _replaceTrack = /*#__PURE__*/new WeakMap();\n\nvar _setLocalDescription = /*#__PURE__*/new WeakMap();\n\nvar _setVideoStream = /*#__PURE__*/new WeakSet();\n\nvar _setRemoteVideo = /*#__PURE__*/new WeakMap();\n\nvar _start = /*#__PURE__*/new WeakMap();\n\nclass WebRtcPeerCore extends _events.default {\n  /**\r\n   * @constructor module:kurentoUtils.WebRtcPeer\r\n   *\r\n   * @param {String} mode Mode in which the PeerConnection will be configured.\r\n   *  Valid values are: 'recv', 'send', and 'sendRecv'\r\n   * @param {Object} [options]\r\n   * @param {MediaStream} [options.audioStream] Stream to be used as second\r\n   *  source (typically for audio) for localVideo and to be added as stream to\r\n   *  the {RTCPeerConnection}\r\n   * @param {MediaStream} [options.videoStream] Stream to be used as primary\r\n   *  source (typically video and audio, or only video if combined with\r\n   *  audioStream) for localVideo and to be added as stream to the\r\n   *  {RTCPeerConnection}\r\n   * @param {} [callback] Deprecated\r\n   */\n  constructor(mode, _options, callback) {\n    if (_options instanceof Function) {\n      callback = _options;\n      _options = undefined;\n    }\n\n    const {\n      audioStream,\n      configuration,\n      dataChannelConfig = {},\n      dataChannels,\n      freeice: freeiceOpts,\n      id: _id2 = (0, _uuid.v4)(),\n      logger = console,\n      mediaConstraints = MEDIA_CONSTRAINTS,\n      oncandidategatheringdone,\n      onicecandidate,\n      onnegotiationneeded,\n      onstreamended,\n      ontrack,\n      peerConnection,\n      sendSource = 'webcam',\n      simulcast,\n      usePlanB,\n      videoStream: _videoStream2\n    } = _options || {};\n    super();\n\n    _setVideoStream.add(this);\n\n    _onNewListener.add(this);\n\n    _initPeerConnection.add(this);\n\n    _getSimulcastInfo.add(this);\n\n    _getMedia.add(this);\n\n    _audioStream.set(this, {\n      writable: true,\n      value: void 0\n    });\n\n    _candidategatheringdone.set(this, {\n      writable: true,\n      value: void 0\n    });\n\n    _candidatesQueueOut.set(this, {\n      writable: true,\n      value: []\n    });\n\n    _dataChannelConfig.set(this, {\n      writable: true,\n      value: void 0\n    });\n\n    _dataChannels.set(this, {\n      writable: true,\n      value: void 0\n    });\n\n    _id.set(this, {\n      writable: true,\n      value: void 0\n    });\n\n    _interop.set(this, {\n      writable: true,\n      value: void 0\n    });\n\n    _dataChannel.set(this, {\n      writable: true,\n      value: void 0\n    });\n\n    _lastFrame.set(this, {\n      writable: true,\n      value: void 0\n    });\n\n    _logger.set(this, {\n      writable: true,\n      value: void 0\n    });\n\n    _mediaConstraints.set(this, {\n      writable: true,\n      value: void 0\n    });\n\n    _mode.set(this, {\n      writable: true,\n      value: void 0\n    });\n\n    _onnegotiationneeded.set(this, {\n      writable: true,\n      value: void 0\n    });\n\n    _ontrack.set(this, {\n      writable: true,\n      value: void 0\n    });\n\n    _peerConnection.set(this, {\n      writable: true,\n      value: void 0\n    });\n\n    _peerconnectionConfiguration.set(this, {\n      writable: true,\n      value: void 0\n    });\n\n    _ready.set(this, {\n      writable: true,\n      value: void 0\n    });\n\n    _sendSource.set(this, {\n      writable: true,\n      value: void 0\n    });\n\n    _simulcast.set(this, {\n      writable: true,\n      value: void 0\n    });\n\n    _usePlanB.set(this, {\n      writable: true,\n      value: void 0\n    });\n\n    _videoStream.set(this, {\n      writable: true,\n      value: void 0\n    });\n\n    _videoSink.set(this, {\n      writable: true,\n      value: void 0\n    });\n\n    _onConnectionStateChange.set(this, {\n      writable: true,\n      value: () => {\n        _classPrivateFieldGet(this, _logger).debug('onConnectionStateChange', _classPrivateFieldGet(this, _peerConnection).connectionState);\n\n        switch (_classPrivateFieldGet(this, _peerConnection).connectionState) {\n          case \"connected\": // The connection has become fully connected\n\n          case \"disconnected\": // One or more transports has terminated\n\n          case \"failed\":\n            // unexpectedly or in an error\n            break;\n\n          case \"closed\":\n            // The connection has been closed\n            _classPrivateFieldSet(this, _peerConnection, new _wrtc.RTCPeerConnection(_classPrivateFieldGet(this, _peerconnectionConfiguration)));\n\n            _classPrivateMethodGet(this, _initPeerConnection, _initPeerConnection2).call(this);\n\n            break;\n        }\n      }\n    });\n\n    _onFrame.set(this, {\n      writable: true,\n      value: ({\n        frame\n      }) => _classPrivateFieldSet(this, _lastFrame, frame)\n    });\n\n    _onIcecandidate.set(this, {\n      writable: true,\n      value: ({\n        candidate\n      }) => {\n        _classPrivateFieldGet(this, _logger).debug('onIcecandidate', candidate);\n\n        if (this.listenerCount('icecandidate') || this.listenerCount('candidategatheringdone')) {\n          if (candidate) {\n            this.emit('icecandidate', candidate);\n\n            _classPrivateFieldSet(this, _candidategatheringdone, false);\n          } else if (!_classPrivateFieldGet(this, _candidategatheringdone)) {\n            this.emit('candidategatheringdone');\n\n            _classPrivateFieldSet(this, _candidategatheringdone, true);\n          }\n        } // Not listening to 'icecandidate' or 'candidategatheringdone' events,\n        // queue the candidate until one of them is listened\n        else if (!_classPrivateFieldGet(this, _candidategatheringdone)) {\n            _classPrivateFieldGet(this, _candidatesQueueOut).push(candidate);\n\n            if (!candidate) _classPrivateFieldSet(this, _candidategatheringdone, true);\n          }\n      }\n    });\n\n    _replaceTrack.set(this, {\n      writable: true,\n      value: (track = null) => {\n        let senders = this.peerConnection.getSenders();\n        if (track) senders = senders.filter(filterTracksType, track);\n        return Promise.all(senders.map(replaceTrack, track));\n      }\n    });\n\n    _setLocalDescription.set(this, {\n      writable: true,\n      value: localDescription => {\n        if (_classPrivateFieldGet(this, _simulcast)) if (!_classPrivateFieldGet(this, _usePlanB)) _classPrivateFieldGet(this, _logger).warn('Simulcast is only available in Chrome browser.');else {\n          _classPrivateFieldGet(this, _logger).debug('Adding multicast info');\n\n          localDescription = new _wrtc.RTCSessionDescription({\n            type: localDescription.type,\n            sdp: removeFIDFromOffer(localDescription.sdp) + _classPrivateMethodGet(this, _getSimulcastInfo, _getSimulcastInfo2).call(this, _classPrivateFieldGet(this, _videoStream))\n          });\n        }\n        return _classPrivateFieldGet(this, _peerConnection).setLocalDescription(localDescription);\n      }\n    });\n\n    _setRemoteVideo.set(this, {\n      writable: true,\n      value: () => {\n        if (_classPrivateFieldGet(this, _videoSink)) {\n          _classPrivateFieldGet(this, _videoSink).stop();\n\n          _classPrivateFieldGet(this, _videoSink).removeEventListener('frame', _classPrivateFieldGet(this, _onFrame));\n        }\n\n        this.emit('setRemoteVideo');\n        if (!_wrtc.nonstandard) return;\n        const [receiver] = this.peerConnection.getReceivers().filter(filterTracksType, {\n          kind: 'video'\n        });\n\n        if (receiver) {\n          _classPrivateFieldSet(this, _videoSink, new _wrtc.nonstandard.RTCVideoSink(receiver.track));\n\n          _classPrivateFieldGet(this, _videoSink).addEventListener('frame', _classPrivateFieldGet(this, _onFrame));\n\n          return;\n        }\n\n        _classPrivateFieldSet(this, _lastFrame, null);\n\n        _classPrivateFieldSet(this, _videoSink, null);\n      }\n    });\n\n    _start.set(this, {\n      writable: true,\n      value: () => {\n        if (_classPrivateFieldGet(this, _peerConnection).connectionState === 'closed') throw new Error('The peer connection object is in `closed` state. This ' + 'is most likely due to an invocation of the `dispose` method before ' + 'accepting in the dialogue');\n        const self = this; // TODO maybe this can be deleted?\n\n        function streamEndedListener() {\n          self.emit('streamended', this);\n        }\n\n        if (_classPrivateFieldGet(this, _videoStream)) {\n          _classPrivateFieldGet(this, _videoStream).addEventListener('ended', streamEndedListener);\n\n          for (const track of _classPrivateFieldGet(this, _videoStream).getTracks()) _classPrivateFieldGet(this, _peerConnection).addTrack(track);\n        }\n\n        if (_classPrivateFieldGet(this, _audioStream)) {\n          _classPrivateFieldGet(this, _audioStream).addEventListener('ended', streamEndedListener);\n\n          for (const track of _classPrivateFieldGet(this, _audioStream).getTracks()) _classPrivateFieldGet(this, _peerConnection).addTrack(track);\n        }\n      }\n    });\n\n    _classPrivateFieldSet(this, _audioStream, audioStream);\n\n    _classPrivateFieldSet(this, _dataChannelConfig, dataChannelConfig);\n\n    _classPrivateFieldSet(this, _dataChannels, dataChannels);\n\n    _classPrivateFieldSet(this, _id, _id2);\n\n    _classPrivateFieldSet(this, _logger, logger);\n\n    _classPrivateFieldSet(this, _mediaConstraints, mediaConstraints);\n\n    _classPrivateFieldSet(this, _mode, mode);\n\n    _classPrivateFieldSet(this, _onnegotiationneeded, onnegotiationneeded);\n\n    _classPrivateFieldSet(this, _ontrack, ontrack);\n\n    _classPrivateFieldSet(this, _peerConnection, peerConnection);\n\n    _classPrivateFieldSet(this, _sendSource, sendSource);\n\n    _classPrivateFieldSet(this, _simulcast, simulcast);\n\n    _classPrivateFieldSet(this, _usePlanB, usePlanB);\n\n    _classPrivateFieldSet(this, _videoStream, _videoStream2);\n\n    _classPrivateFieldSet(this, _peerconnectionConfiguration, recursive({\n      iceServers: (0, _freeice.default)(freeiceOpts)\n    }, configuration));\n\n    if (usePlanB) _classPrivateFieldGet(this, _logger).debug(name + \": using SDP PlanB\");\n    this.on('newListener', _classPrivateMethodGet(this, _onNewListener, _onNewListener2));\n    if (oncandidategatheringdone) this.on('candidategatheringdone', oncandidategatheringdone);\n    if (onicecandidate) this.on('icecandidate', onicecandidate);\n    if (onstreamended) this.on('streamended', onstreamended); // Init PeerConnection\n\n    if (!_classPrivateFieldGet(this, _peerConnection)) {\n      _classPrivateFieldSet(this, _peerConnection, new _wrtc.RTCPeerConnection(_classPrivateFieldGet(this, _peerconnectionConfiguration)));\n    }\n\n    _classPrivateMethodGet(this, _initPeerConnection, _initPeerConnection2).call(this);\n\n    asCallback(this.ready, callback);\n  } //\n  // Public API\n  //\n\n\n  get audioEnabled() {\n    return getMediaEnabled.call(this, 'Audio');\n  }\n\n  set audioEnabled(value) {\n    setMediaEnabled.call(this, 'Audio', value);\n  }\n  /**\r\n   * @member {(external:ImageData|undefined)} currentFrame\r\n   */\n\n\n  get currentFrame() {\n    if (!_wrtc.nonstandard) throw new Error('Stream-based `currentFrame` only available in Node.js');\n\n    const lastFrame = _classPrivateFieldGet(this, _lastFrame);\n\n    if (!lastFrame) throw new Error('No remote video stream available');\n    const {\n      height,\n      width\n    } = lastFrame;\n    const rgba = new Uint8ClampedArray(width * height * 4);\n    const rgbaFrame = (0, _canvas.createImageData)(rgba, width, height);\n\n    _wrtc.nonstandard.i420ToRgba(lastFrame, rgbaFrame);\n\n    const canvas = (0, _canvas.createCanvas)(width, height);\n    canvas.getContext('2d').putImageData(rgbaFrame, 0, 0);\n    return canvas;\n  }\n\n  get dataChannel() {\n    return _classPrivateFieldGet(this, _dataChannel);\n  }\n\n  get enabled() {\n    return this.audioEnabled && this.videoEnabled;\n  }\n\n  set enabled(value) {\n    this.audioEnabled = this.videoEnabled = value;\n  }\n\n  get id() {\n    return _classPrivateFieldGet(this, _id);\n  }\n\n  get localSessionDescriptor() {\n    return _classPrivateFieldGet(this, _peerConnection).localDescription;\n  }\n\n  get peerConnection() {\n    return _classPrivateFieldGet(this, _peerConnection);\n  }\n\n  get ready() {\n    return _classPrivateFieldGet(this, _ready);\n  }\n\n  get remoteSessionDescriptor() {\n    return _classPrivateFieldGet(this, _peerConnection).remoteDescription;\n  }\n\n  get videoEnabled() {\n    return getMediaEnabled.call(this, 'Video');\n  }\n\n  set videoEnabled(value) {\n    setMediaEnabled.call(this, 'Video', value);\n  }\n\n  get videoStream() {\n    return _classPrivateFieldGet(this, _videoStream);\n  }\n  /**\r\n   * Callback function invoked when an ICE candidate is received. Developers are\r\n   * expected to invoke this function in order to complete the SDP negotiation.\r\n   *\r\n   * @function module:kurentoUtils.WebRtcPeer.prototype.addIceCandidate\r\n   *\r\n   * @param candidate - Literal object with the ICE candidate description\r\n   * @param [callback] - Deprecated: Called when the ICE candidate has been added\r\n   *\r\n   * @returns Promise\r\n   */\n\n\n  addIceCandidate(candidate, callback) {\n    _classPrivateFieldGet(this, _logger).debug('Remote ICE candidate received', candidate);\n\n    return asCallback(_classPrivateFieldGet(this, _peerConnection).addIceCandidate(candidate), callback);\n  }\n  /**\r\n   * @description This method frees the resources used by WebRtcPeer.\r\n   *\r\n   * @function module:kurentoUtils.WebRtcPeer.prototype.dispose\r\n   */\n\n\n  dispose() {\n    _classPrivateFieldGet(this, _logger).debug('Disposing WebRtcPeerCore');\n\n    const pc = _classPrivateFieldGet(this, _peerConnection);\n\n    if (pc.connectionState === 'closed') return;\n\n    try {\n      pc.close();\n    } catch (err) {\n      _classPrivateFieldGet(this, _logger).warn('Exception disposing webrtc peer:', err);\n    }\n\n    if (_classPrivateFieldGet(this, _audioStream)) for (const track of _classPrivateFieldGet(this, _audioStream).getTracks()) track.stop();\n    if (_classPrivateFieldGet(this, _videoStream)) for (const track of _classPrivateFieldGet(this, _videoStream).getTracks()) track.stop();\n    this.removeAllListeners();\n  }\n  /**\r\n   * @param [callback] - Deprecated\r\n   *\r\n   * @returns {Promise}\r\n   */\n\n\n  generateOffer(callback) {\n    switch (_classPrivateFieldGet(this, _mode)) {\n      case 'recvonly':\n        {\n          /* Add reception tracks on the RTCPeerConnection. Send tracks are\r\n           * unconditionally added to \"sendonly\" and \"sendrecv\" modes, in the\r\n           * constructor's \"start()\" method, but nothing is done for \"recvonly\".\r\n           *\r\n           * Here, we add new transceivers to receive audio and/or video, so the\r\n           * SDP Offer that will be generated by the PC includes these medias\r\n           * with the \"a=recvonly\" attribute.\r\n           */\n          const useAudio = typeof _classPrivateFieldGet(this, _mediaConstraints).audio === 'boolean' ? _classPrivateFieldGet(this, _mediaConstraints).audio : true;\n          const useVideo = typeof _classPrivateFieldGet(this, _mediaConstraints).video === 'boolean' ? _classPrivateFieldGet(this, _mediaConstraints).video : true;\n\n          if (useAudio) {\n            _classPrivateFieldGet(this, _peerConnection).addTransceiver('audio', {\n              direction: 'recvonly'\n            });\n          }\n\n          if (useVideo) {\n            _classPrivateFieldGet(this, _peerConnection).addTransceiver('video', {\n              direction: 'recvonly'\n            });\n          }\n        }\n        break;\n\n      case 'sendonly':\n        /* The constructor's \"start()\" method already added any available track,\r\n         * which by default creates Transceiver with \"sendrecv\" direction.\r\n         *\r\n         * Here, we set all transceivers to only send audio and/or video, so\r\n         * the SDP Offer that will be generated by the PC includes these medias\r\n         * with the \"a=sendonly\" attribute.\r\n         */\n        for (const transceiver of _classPrivateFieldGet(this, _peerConnection).getTransceivers()) transceiver.direction = \"sendonly\";\n\n    }\n\n    const promise = _classPrivateFieldGet(this, _peerConnection).createOffer().then(_classPrivateFieldGet(this, _setLocalDescription)).then(() => {\n      const {\n        localDescription\n      } = _classPrivateFieldGet(this, _peerConnection);\n\n      _classPrivateFieldGet(this, _logger).debug('Local description set\\n', localDescription.sdp);\n\n      return localDescription.sdp;\n    });\n\n    return asCallback(promise, callback);\n  }\n  /**\r\n   *\r\n   * @param {Integer} [index]\r\n   */\n\n\n  getReceiver(index = 0) {\n    return _classPrivateFieldGet(this, _peerConnection).getReceivers()[index];\n  }\n  /**\r\n   *\r\n   * @param {Integer} [index]\r\n   */\n\n\n  getSender(index = 0) {\n    return _classPrivateFieldGet(this, _peerConnection).getSenders()[index];\n  }\n  /**\r\n   * Callback function invoked when a SDP answer is received\r\n   *\r\n   * Developers are expected to invoke this function in order to complete the\r\n   * SDP negotiation.\r\n   *\r\n   * @function module:kurentoUtils.WebRtcPeer.prototype.processAnswer\r\n   *\r\n   * @param sdp - Description of sdpAnswer\r\n   * @param {} [callback] - Deprecated: Invoked after the SDP answer is\r\n   *  processed, or there is an error\r\n   *\r\n   * @returns {Promise}\r\n   */\n\n\n  processAnswer(sdp, callback) {\n    if (_classPrivateFieldGet(this, _peerConnection).connectionState === 'closed') return Promise.reject(new Error('PeerConnection is closed'));\n    const answer = new _wrtc.RTCSessionDescription({\n      type: 'answer',\n      sdp\n    });\n\n    const promise = _classPrivateFieldGet(this, _peerConnection).setRemoteDescription(answer).then(_classPrivateFieldGet(this, _setRemoteVideo));\n\n    return asCallback(promise, callback);\n  }\n  /**\r\n   * Callback function invoked when a SDP offer is received\r\n   *\r\n   * Developers are expected to invoke this function in order to complete the\r\n   * SDP negotiation.\r\n   *\r\n   * @function module:kurentoUtils.WebRtcPeer.prototype.processOffer\r\n   *\r\n   * @param sdp - Description of sdpOffer\r\n   * @param {} [callback] - Deprecated: Called when the remote description has\r\n   *  been set successfully\r\n   *\r\n   * @returns {Promise}\r\n   */\n\n\n  processOffer(sdp, callback) {\n    if (_classPrivateFieldGet(this, _peerConnection).connectionState === 'closed') return Promise.reject(new Error('PeerConnection is closed'));\n    const offer = new _wrtc.RTCSessionDescription({\n      type: 'offer',\n      sdp\n    });\n\n    const promise = _classPrivateFieldGet(this, _peerConnection).setRemoteDescription(offer).then(_classPrivateFieldGet(this, _setRemoteVideo)).then(_classPrivateFieldGet(this, _peerConnection).createAnswer.bind(_classPrivateFieldGet(this, _peerConnection))).then(_classPrivateFieldGet(this, _setLocalDescription)).then(() => _classPrivateFieldGet(this, _peerConnection).localDescription.sdp);\n\n    return asCallback(promise, callback);\n  }\n  /**\r\n   * Fully replace the sending stream without re-negotiation\r\n   *\r\n   * @param {MediaStream} stream\r\n   *\r\n   * @returns {Promise}\r\n   */\n\n\n  replaceStream(stream) {\n    // Replace local video\n    if (_classPrivateFieldGet(this, _videoStream)) for (const track of _classPrivateFieldGet(this, _videoStream).getTracks()) track.stop();\n\n    _classPrivateMethodGet(this, _setVideoStream, _setVideoStream2).call(this, stream); // Replace senders\n\n\n    const senders = this.peerConnection.getSenders();\n    return Promise.all(stream.getTracks().flatMap(replaceTracks, senders));\n  }\n  /**\r\n   * Replace the video track in the sending stream without re-negotiation\r\n   *\r\n   * @param {MediaTrack|String} track\r\n   *\r\n   * @returns {Promise}\r\n   */\n\n\n  replaceTrack(track) {\n    const promise = typeof track === 'string' ? _classPrivateMethodGet(this, _getMedia, _getMedia2).call(this, track).then(getFirstVideoTrack) : Promise.resolve(track);\n    return promise.then(_classPrivateFieldGet(this, _replaceTrack));\n  }\n  /**\r\n   * Send a message using the DataChannel instance\r\n   *\r\n   * @param {*} data\r\n   */\n\n\n  send(data) {\n    var _classPrivateFieldGet2;\n\n    if (((_classPrivateFieldGet2 = _classPrivateFieldGet(this, _dataChannel)) === null || _classPrivateFieldGet2 === void 0 ? void 0 : _classPrivateFieldGet2.readyState) === 'open') return _classPrivateFieldGet(this, _dataChannel).send(data);\n\n    _classPrivateFieldGet(this, _logger).warn('Trying to send data over a non-existing or closed data channel');\n  } //\n  // Private API\n  //\n\n\n} // https://github.com/Automattic/node-canvas/issues/487\n\n\nexports.WebRtcPeerCore = exports.default = WebRtcPeerCore;\n\nfunction _getMedia2(track) {\n  let method = 'getUserMedia';\n\n  let constraints = _classPrivateFieldGet(this, _mediaConstraints);\n\n  if (track === 'screen') {\n    method = 'getDisplayMedia';\n    constraints = {\n      audio: false,\n      video: true\n    };\n  }\n\n  return _wrtc.mediaDevices[method](constraints).then(stream => {\n    if (_classPrivateFieldGet(this, _videoStream)) {\n      for (const track of _classPrivateFieldGet(this, _videoStream).getVideoTracks()) track.stop();\n\n      if (track === 'screen') for (const track of _classPrivateFieldGet(this, _videoStream).getAudioTracks()) stream.addTrack(track);\n    }\n\n    _classPrivateMethodGet(this, _setVideoStream, _setVideoStream2).call(this, stream);\n\n    return stream;\n  });\n}\n\nfunction _getSimulcastInfo2(videoStream) {\n  const videoTracks = videoStream.getVideoTracks();\n\n  if (!videoTracks.length) {\n    _classPrivateFieldGet(this, _logger).warn('No video tracks available in the video stream');\n\n    return '';\n  }\n\n  const [{\n    id\n  }] = videoTracks;\n  return ['a=x-google-flag:conference', 'a=ssrc-group:SIM 1 2 3', 'a=ssrc:1 cname:localVideo', 'a=ssrc:1 msid:' + videoStream.id + ' ' + id, 'a=ssrc:1 mslabel:' + videoStream.id, 'a=ssrc:1 label:' + id, 'a=ssrc:2 cname:localVideo', 'a=ssrc:2 msid:' + videoStream.id + ' ' + id, 'a=ssrc:2 mslabel:' + videoStream.id, 'a=ssrc:2 label:' + id, 'a=ssrc:3 cname:localVideo', 'a=ssrc:3 msid:' + videoStream.id + ' ' + id, 'a=ssrc:3 mslabel:' + videoStream.id, 'a=ssrc:3 label:' + id, ''].join('\\n');\n}\n\nfunction _initPeerConnection2() {\n  if (_classPrivateFieldGet(this, _dataChannels)) {\n    const {\n      id = `WebRtcPeer-${_classPrivateFieldGet(this, _id)}`,\n      onbufferedamountlow,\n      onclose,\n      onerror = _classPrivateFieldGet(this, _logger).error,\n      onmessage,\n      onopen,\n      options\n    } = _classPrivateFieldGet(this, _dataChannelConfig);\n\n    _classPrivateFieldSet(this, _dataChannel, _classPrivateFieldGet(this, _peerConnection).createDataChannel(id, options));\n\n    _classPrivateFieldGet(this, _dataChannel).addEventListener('open', onopen);\n\n    _classPrivateFieldGet(this, _dataChannel).addEventListener('close', onclose);\n\n    _classPrivateFieldGet(this, _dataChannel).addEventListener('message', onmessage);\n\n    _classPrivateFieldGet(this, _dataChannel).addEventListener('bufferedamountlow', onbufferedamountlow);\n\n    _classPrivateFieldGet(this, _dataChannel).addEventListener('error', onerror);\n  }\n\n  _classPrivateFieldGet(this, _peerConnection).addEventListener('connectionstatechange', _classPrivateFieldGet(this, _onConnectionStateChange));\n\n  _classPrivateFieldGet(this, _peerConnection).addEventListener('icecandidate', _classPrivateFieldGet(this, _onIcecandidate));\n\n  if (_classPrivateFieldGet(this, _onnegotiationneeded)) _classPrivateFieldGet(this, _peerConnection).addEventListener('negotiationneeded', _classPrivateFieldGet(this, _onnegotiationneeded));\n  if (_classPrivateFieldGet(this, _ontrack)) _classPrivateFieldGet(this, _peerConnection).addEventListener('track', _classPrivateFieldGet(this, _ontrack));\n  let promise;\n\n  if (_classPrivateFieldGet(this, _mode) === 'recvonly' || _classPrivateFieldGet(this, _videoStream) || _classPrivateFieldGet(this, _audioStream)) {\n    this.emit('setLocalVideo');\n    promise = Promise.resolve();\n  } else promise = _classPrivateMethodGet(this, _getMedia, _getMedia2).call(this, _classPrivateFieldGet(this, _sendSource));\n\n  _classPrivateFieldSet(this, _ready, promise.then(_classPrivateFieldGet(this, _start)));\n}\n\nfunction _onNewListener2(event, listener) {\n  const iscandidategatheringdone = event === 'candidategatheringdone';\n  if (iscandidategatheringdone && event !== 'icecandidate') return;\n  let candidate;\n\n  while (candidate = _classPrivateFieldGet(this, _candidatesQueueOut).shift()) if (!candidate === iscandidategatheringdone) listener(candidate);\n}\n\nfunction _setVideoStream2(stream) {\n  _classPrivateFieldSet(this, _videoStream, stream);\n\n  this.emit('setLocalVideo');\n}","/*\n *  Copyright (c) 2017 The WebRTC project authors. All Rights Reserved.\n *\n *  Use of this source code is governed by a BSD-style license\n *  that can be found in the LICENSE file in the root of the source\n *  tree.\n */\n /* eslint-env node */\n'use strict';\n\nvar SDPUtils = require('sdp');\n\nfunction fixStatsType(stat) {\n  return {\n    inboundrtp: 'inbound-rtp',\n    outboundrtp: 'outbound-rtp',\n    candidatepair: 'candidate-pair',\n    localcandidate: 'local-candidate',\n    remotecandidate: 'remote-candidate'\n  }[stat.type] || stat.type;\n}\n\nfunction writeMediaSection(transceiver, caps, type, stream, dtlsRole) {\n  var sdp = SDPUtils.writeRtpDescription(transceiver.kind, caps);\n\n  // Map ICE parameters (ufrag, pwd) to SDP.\n  sdp += SDPUtils.writeIceParameters(\n      transceiver.iceGatherer.getLocalParameters());\n\n  // Map DTLS parameters to SDP.\n  sdp += SDPUtils.writeDtlsParameters(\n      transceiver.dtlsTransport.getLocalParameters(),\n      type === 'offer' ? 'actpass' : dtlsRole || 'active');\n\n  sdp += 'a=mid:' + transceiver.mid + '\\r\\n';\n\n  if (transceiver.rtpSender && transceiver.rtpReceiver) {\n    sdp += 'a=sendrecv\\r\\n';\n  } else if (transceiver.rtpSender) {\n    sdp += 'a=sendonly\\r\\n';\n  } else if (transceiver.rtpReceiver) {\n    sdp += 'a=recvonly\\r\\n';\n  } else {\n    sdp += 'a=inactive\\r\\n';\n  }\n\n  if (transceiver.rtpSender) {\n    var trackId = transceiver.rtpSender._initialTrackId ||\n        transceiver.rtpSender.track.id;\n    transceiver.rtpSender._initialTrackId = trackId;\n    // spec.\n    var msid = 'msid:' + (stream ? stream.id : '-') + ' ' +\n        trackId + '\\r\\n';\n    sdp += 'a=' + msid;\n    // for Chrome. Legacy should no longer be required.\n    sdp += 'a=ssrc:' + transceiver.sendEncodingParameters[0].ssrc +\n        ' ' + msid;\n\n    // RTX\n    if (transceiver.sendEncodingParameters[0].rtx) {\n      sdp += 'a=ssrc:' + transceiver.sendEncodingParameters[0].rtx.ssrc +\n          ' ' + msid;\n      sdp += 'a=ssrc-group:FID ' +\n          transceiver.sendEncodingParameters[0].ssrc + ' ' +\n          transceiver.sendEncodingParameters[0].rtx.ssrc +\n          '\\r\\n';\n    }\n  }\n  // FIXME: this should be written by writeRtpDescription.\n  sdp += 'a=ssrc:' + transceiver.sendEncodingParameters[0].ssrc +\n      ' cname:' + SDPUtils.localCName + '\\r\\n';\n  if (transceiver.rtpSender && transceiver.sendEncodingParameters[0].rtx) {\n    sdp += 'a=ssrc:' + transceiver.sendEncodingParameters[0].rtx.ssrc +\n        ' cname:' + SDPUtils.localCName + '\\r\\n';\n  }\n  return sdp;\n}\n\n// Edge does not like\n// 1) stun: filtered after 14393 unless ?transport=udp is present\n// 2) turn: that does not have all of turn:host:port?transport=udp\n// 3) turn: with ipv6 addresses\n// 4) turn: occurring muliple times\nfunction filterIceServers(iceServers, edgeVersion) {\n  var hasTurn = false;\n  iceServers = JSON.parse(JSON.stringify(iceServers));\n  return iceServers.filter(function(server) {\n    if (server && (server.urls || server.url)) {\n      var urls = server.urls || server.url;\n      if (server.url && !server.urls) {\n        console.warn('RTCIceServer.url is deprecated! Use urls instead.');\n      }\n      var isString = typeof urls === 'string';\n      if (isString) {\n        urls = [urls];\n      }\n      urls = urls.filter(function(url) {\n        var validTurn = url.indexOf('turn:') === 0 &&\n            url.indexOf('transport=udp') !== -1 &&\n            url.indexOf('turn:[') === -1 &&\n            !hasTurn;\n\n        if (validTurn) {\n          hasTurn = true;\n          return true;\n        }\n        return url.indexOf('stun:') === 0 && edgeVersion >= 14393 &&\n            url.indexOf('?transport=udp') === -1;\n      });\n\n      delete server.url;\n      server.urls = isString ? urls[0] : urls;\n      return !!urls.length;\n    }\n  });\n}\n\n// Determines the intersection of local and remote capabilities.\nfunction getCommonCapabilities(localCapabilities, remoteCapabilities) {\n  var commonCapabilities = {\n    codecs: [],\n    headerExtensions: [],\n    fecMechanisms: []\n  };\n\n  var findCodecByPayloadType = function(pt, codecs) {\n    pt = parseInt(pt, 10);\n    for (var i = 0; i < codecs.length; i++) {\n      if (codecs[i].payloadType === pt ||\n          codecs[i].preferredPayloadType === pt) {\n        return codecs[i];\n      }\n    }\n  };\n\n  var rtxCapabilityMatches = function(lRtx, rRtx, lCodecs, rCodecs) {\n    var lCodec = findCodecByPayloadType(lRtx.parameters.apt, lCodecs);\n    var rCodec = findCodecByPayloadType(rRtx.parameters.apt, rCodecs);\n    return lCodec && rCodec &&\n        lCodec.name.toLowerCase() === rCodec.name.toLowerCase();\n  };\n\n  localCapabilities.codecs.forEach(function(lCodec) {\n    for (var i = 0; i < remoteCapabilities.codecs.length; i++) {\n      var rCodec = remoteCapabilities.codecs[i];\n      if (lCodec.name.toLowerCase() === rCodec.name.toLowerCase() &&\n          lCodec.clockRate === rCodec.clockRate) {\n        if (lCodec.name.toLowerCase() === 'rtx' &&\n            lCodec.parameters && rCodec.parameters.apt) {\n          // for RTX we need to find the local rtx that has a apt\n          // which points to the same local codec as the remote one.\n          if (!rtxCapabilityMatches(lCodec, rCodec,\n              localCapabilities.codecs, remoteCapabilities.codecs)) {\n            continue;\n          }\n        }\n        rCodec = JSON.parse(JSON.stringify(rCodec)); // deepcopy\n        // number of channels is the highest common number of channels\n        rCodec.numChannels = Math.min(lCodec.numChannels,\n            rCodec.numChannels);\n        // push rCodec so we reply with offerer payload type\n        commonCapabilities.codecs.push(rCodec);\n\n        // determine common feedback mechanisms\n        rCodec.rtcpFeedback = rCodec.rtcpFeedback.filter(function(fb) {\n          for (var j = 0; j < lCodec.rtcpFeedback.length; j++) {\n            if (lCodec.rtcpFeedback[j].type === fb.type &&\n                lCodec.rtcpFeedback[j].parameter === fb.parameter) {\n              return true;\n            }\n          }\n          return false;\n        });\n        // FIXME: also need to determine .parameters\n        //  see https://github.com/openpeer/ortc/issues/569\n        break;\n      }\n    }\n  });\n\n  localCapabilities.headerExtensions.forEach(function(lHeaderExtension) {\n    for (var i = 0; i < remoteCapabilities.headerExtensions.length;\n         i++) {\n      var rHeaderExtension = remoteCapabilities.headerExtensions[i];\n      if (lHeaderExtension.uri === rHeaderExtension.uri) {\n        commonCapabilities.headerExtensions.push(rHeaderExtension);\n        break;\n      }\n    }\n  });\n\n  // FIXME: fecMechanisms\n  return commonCapabilities;\n}\n\n// is action=setLocalDescription with type allowed in signalingState\nfunction isActionAllowedInSignalingState(action, type, signalingState) {\n  return {\n    offer: {\n      setLocalDescription: ['stable', 'have-local-offer'],\n      setRemoteDescription: ['stable', 'have-remote-offer']\n    },\n    answer: {\n      setLocalDescription: ['have-remote-offer', 'have-local-pranswer'],\n      setRemoteDescription: ['have-local-offer', 'have-remote-pranswer']\n    }\n  }[type][action].indexOf(signalingState) !== -1;\n}\n\nfunction maybeAddCandidate(iceTransport, candidate) {\n  // Edge's internal representation adds some fields therefore\n  // not all fieldѕ are taken into account.\n  var alreadyAdded = iceTransport.getRemoteCandidates()\n      .find(function(remoteCandidate) {\n        return candidate.foundation === remoteCandidate.foundation &&\n            candidate.ip === remoteCandidate.ip &&\n            candidate.port === remoteCandidate.port &&\n            candidate.priority === remoteCandidate.priority &&\n            candidate.protocol === remoteCandidate.protocol &&\n            candidate.type === remoteCandidate.type;\n      });\n  if (!alreadyAdded) {\n    iceTransport.addRemoteCandidate(candidate);\n  }\n  return !alreadyAdded;\n}\n\n\nfunction makeError(name, description) {\n  var e = new Error(description);\n  e.name = name;\n  // legacy error codes from https://heycam.github.io/webidl/#idl-DOMException-error-names\n  e.code = {\n    NotSupportedError: 9,\n    InvalidStateError: 11,\n    InvalidAccessError: 15,\n    TypeError: undefined,\n    OperationError: undefined\n  }[name];\n  return e;\n}\n\nmodule.exports = function(window, edgeVersion) {\n  // https://w3c.github.io/mediacapture-main/#mediastream\n  // Helper function to add the track to the stream and\n  // dispatch the event ourselves.\n  function addTrackToStreamAndFireEvent(track, stream) {\n    stream.addTrack(track);\n    stream.dispatchEvent(new window.MediaStreamTrackEvent('addtrack',\n        {track: track}));\n  }\n\n  function removeTrackFromStreamAndFireEvent(track, stream) {\n    stream.removeTrack(track);\n    stream.dispatchEvent(new window.MediaStreamTrackEvent('removetrack',\n        {track: track}));\n  }\n\n  function fireAddTrack(pc, track, receiver, streams) {\n    var trackEvent = new Event('track');\n    trackEvent.track = track;\n    trackEvent.receiver = receiver;\n    trackEvent.transceiver = {receiver: receiver};\n    trackEvent.streams = streams;\n    window.setTimeout(function() {\n      pc._dispatchEvent('track', trackEvent);\n    });\n  }\n\n  var RTCPeerConnection = function(config) {\n    var pc = this;\n\n    var _eventTarget = document.createDocumentFragment();\n    ['addEventListener', 'removeEventListener', 'dispatchEvent']\n        .forEach(function(method) {\n          pc[method] = _eventTarget[method].bind(_eventTarget);\n        });\n\n    this.canTrickleIceCandidates = null;\n\n    this.needNegotiation = false;\n\n    this.localStreams = [];\n    this.remoteStreams = [];\n\n    this._localDescription = null;\n    this._remoteDescription = null;\n\n    this.signalingState = 'stable';\n    this.iceConnectionState = 'new';\n    this.connectionState = 'new';\n    this.iceGatheringState = 'new';\n\n    config = JSON.parse(JSON.stringify(config || {}));\n\n    this.usingBundle = config.bundlePolicy === 'max-bundle';\n    if (config.rtcpMuxPolicy === 'negotiate') {\n      throw(makeError('NotSupportedError',\n          'rtcpMuxPolicy \\'negotiate\\' is not supported'));\n    } else if (!config.rtcpMuxPolicy) {\n      config.rtcpMuxPolicy = 'require';\n    }\n\n    switch (config.iceTransportPolicy) {\n      case 'all':\n      case 'relay':\n        break;\n      default:\n        config.iceTransportPolicy = 'all';\n        break;\n    }\n\n    switch (config.bundlePolicy) {\n      case 'balanced':\n      case 'max-compat':\n      case 'max-bundle':\n        break;\n      default:\n        config.bundlePolicy = 'balanced';\n        break;\n    }\n\n    config.iceServers = filterIceServers(config.iceServers || [], edgeVersion);\n\n    this._iceGatherers = [];\n    if (config.iceCandidatePoolSize) {\n      for (var i = config.iceCandidatePoolSize; i > 0; i--) {\n        this._iceGatherers.push(new window.RTCIceGatherer({\n          iceServers: config.iceServers,\n          gatherPolicy: config.iceTransportPolicy\n        }));\n      }\n    } else {\n      config.iceCandidatePoolSize = 0;\n    }\n\n    this._config = config;\n\n    // per-track iceGathers, iceTransports, dtlsTransports, rtpSenders, ...\n    // everything that is needed to describe a SDP m-line.\n    this.transceivers = [];\n\n    this._sdpSessionId = SDPUtils.generateSessionId();\n    this._sdpSessionVersion = 0;\n\n    this._dtlsRole = undefined; // role for a=setup to use in answers.\n\n    this._isClosed = false;\n  };\n\n  Object.defineProperty(RTCPeerConnection.prototype, 'localDescription', {\n    configurable: true,\n    get: function() {\n      return this._localDescription;\n    }\n  });\n  Object.defineProperty(RTCPeerConnection.prototype, 'remoteDescription', {\n    configurable: true,\n    get: function() {\n      return this._remoteDescription;\n    }\n  });\n\n  // set up event handlers on prototype\n  RTCPeerConnection.prototype.onicecandidate = null;\n  RTCPeerConnection.prototype.onaddstream = null;\n  RTCPeerConnection.prototype.ontrack = null;\n  RTCPeerConnection.prototype.onremovestream = null;\n  RTCPeerConnection.prototype.onsignalingstatechange = null;\n  RTCPeerConnection.prototype.oniceconnectionstatechange = null;\n  RTCPeerConnection.prototype.onconnectionstatechange = null;\n  RTCPeerConnection.prototype.onicegatheringstatechange = null;\n  RTCPeerConnection.prototype.onnegotiationneeded = null;\n  RTCPeerConnection.prototype.ondatachannel = null;\n\n  RTCPeerConnection.prototype._dispatchEvent = function(name, event) {\n    if (this._isClosed) {\n      return;\n    }\n    this.dispatchEvent(event);\n    if (typeof this['on' + name] === 'function') {\n      this['on' + name](event);\n    }\n  };\n\n  RTCPeerConnection.prototype._emitGatheringStateChange = function() {\n    var event = new Event('icegatheringstatechange');\n    this._dispatchEvent('icegatheringstatechange', event);\n  };\n\n  RTCPeerConnection.prototype.getConfiguration = function() {\n    return this._config;\n  };\n\n  RTCPeerConnection.prototype.getLocalStreams = function() {\n    return this.localStreams;\n  };\n\n  RTCPeerConnection.prototype.getRemoteStreams = function() {\n    return this.remoteStreams;\n  };\n\n  // internal helper to create a transceiver object.\n  // (which is not yet the same as the WebRTC 1.0 transceiver)\n  RTCPeerConnection.prototype._createTransceiver = function(kind, doNotAdd) {\n    var hasBundleTransport = this.transceivers.length > 0;\n    var transceiver = {\n      track: null,\n      iceGatherer: null,\n      iceTransport: null,\n      dtlsTransport: null,\n      localCapabilities: null,\n      remoteCapabilities: null,\n      rtpSender: null,\n      rtpReceiver: null,\n      kind: kind,\n      mid: null,\n      sendEncodingParameters: null,\n      recvEncodingParameters: null,\n      stream: null,\n      associatedRemoteMediaStreams: [],\n      wantReceive: true\n    };\n    if (this.usingBundle && hasBundleTransport) {\n      transceiver.iceTransport = this.transceivers[0].iceTransport;\n      transceiver.dtlsTransport = this.transceivers[0].dtlsTransport;\n    } else {\n      var transports = this._createIceAndDtlsTransports();\n      transceiver.iceTransport = transports.iceTransport;\n      transceiver.dtlsTransport = transports.dtlsTransport;\n    }\n    if (!doNotAdd) {\n      this.transceivers.push(transceiver);\n    }\n    return transceiver;\n  };\n\n  RTCPeerConnection.prototype.addTrack = function(track, stream) {\n    if (this._isClosed) {\n      throw makeError('InvalidStateError',\n          'Attempted to call addTrack on a closed peerconnection.');\n    }\n\n    var alreadyExists = this.transceivers.find(function(s) {\n      return s.track === track;\n    });\n\n    if (alreadyExists) {\n      throw makeError('InvalidAccessError', 'Track already exists.');\n    }\n\n    var transceiver;\n    for (var i = 0; i < this.transceivers.length; i++) {\n      if (!this.transceivers[i].track &&\n          this.transceivers[i].kind === track.kind) {\n        transceiver = this.transceivers[i];\n      }\n    }\n    if (!transceiver) {\n      transceiver = this._createTransceiver(track.kind);\n    }\n\n    this._maybeFireNegotiationNeeded();\n\n    if (this.localStreams.indexOf(stream) === -1) {\n      this.localStreams.push(stream);\n    }\n\n    transceiver.track = track;\n    transceiver.stream = stream;\n    transceiver.rtpSender = new window.RTCRtpSender(track,\n        transceiver.dtlsTransport);\n    return transceiver.rtpSender;\n  };\n\n  RTCPeerConnection.prototype.addStream = function(stream) {\n    var pc = this;\n    if (edgeVersion >= 15025) {\n      stream.getTracks().forEach(function(track) {\n        pc.addTrack(track, stream);\n      });\n    } else {\n      // Clone is necessary for local demos mostly, attaching directly\n      // to two different senders does not work (build 10547).\n      // Fixed in 15025 (or earlier)\n      var clonedStream = stream.clone();\n      stream.getTracks().forEach(function(track, idx) {\n        var clonedTrack = clonedStream.getTracks()[idx];\n        track.addEventListener('enabled', function(event) {\n          clonedTrack.enabled = event.enabled;\n        });\n      });\n      clonedStream.getTracks().forEach(function(track) {\n        pc.addTrack(track, clonedStream);\n      });\n    }\n  };\n\n  RTCPeerConnection.prototype.removeTrack = function(sender) {\n    if (this._isClosed) {\n      throw makeError('InvalidStateError',\n          'Attempted to call removeTrack on a closed peerconnection.');\n    }\n\n    if (!(sender instanceof window.RTCRtpSender)) {\n      throw new TypeError('Argument 1 of RTCPeerConnection.removeTrack ' +\n          'does not implement interface RTCRtpSender.');\n    }\n\n    var transceiver = this.transceivers.find(function(t) {\n      return t.rtpSender === sender;\n    });\n\n    if (!transceiver) {\n      throw makeError('InvalidAccessError',\n          'Sender was not created by this connection.');\n    }\n    var stream = transceiver.stream;\n\n    transceiver.rtpSender.stop();\n    transceiver.rtpSender = null;\n    transceiver.track = null;\n    transceiver.stream = null;\n\n    // remove the stream from the set of local streams\n    var localStreams = this.transceivers.map(function(t) {\n      return t.stream;\n    });\n    if (localStreams.indexOf(stream) === -1 &&\n        this.localStreams.indexOf(stream) > -1) {\n      this.localStreams.splice(this.localStreams.indexOf(stream), 1);\n    }\n\n    this._maybeFireNegotiationNeeded();\n  };\n\n  RTCPeerConnection.prototype.removeStream = function(stream) {\n    var pc = this;\n    stream.getTracks().forEach(function(track) {\n      var sender = pc.getSenders().find(function(s) {\n        return s.track === track;\n      });\n      if (sender) {\n        pc.removeTrack(sender);\n      }\n    });\n  };\n\n  RTCPeerConnection.prototype.getSenders = function() {\n    return this.transceivers.filter(function(transceiver) {\n      return !!transceiver.rtpSender;\n    })\n    .map(function(transceiver) {\n      return transceiver.rtpSender;\n    });\n  };\n\n  RTCPeerConnection.prototype.getReceivers = function() {\n    return this.transceivers.filter(function(transceiver) {\n      return !!transceiver.rtpReceiver;\n    })\n    .map(function(transceiver) {\n      return transceiver.rtpReceiver;\n    });\n  };\n\n\n  RTCPeerConnection.prototype._createIceGatherer = function(sdpMLineIndex,\n      usingBundle) {\n    var pc = this;\n    if (usingBundle && sdpMLineIndex > 0) {\n      return this.transceivers[0].iceGatherer;\n    } else if (this._iceGatherers.length) {\n      return this._iceGatherers.shift();\n    }\n    var iceGatherer = new window.RTCIceGatherer({\n      iceServers: this._config.iceServers,\n      gatherPolicy: this._config.iceTransportPolicy\n    });\n    Object.defineProperty(iceGatherer, 'state',\n        {value: 'new', writable: true}\n    );\n\n    this.transceivers[sdpMLineIndex].bufferedCandidateEvents = [];\n    this.transceivers[sdpMLineIndex].bufferCandidates = function(event) {\n      var end = !event.candidate || Object.keys(event.candidate).length === 0;\n      // polyfill since RTCIceGatherer.state is not implemented in\n      // Edge 10547 yet.\n      iceGatherer.state = end ? 'completed' : 'gathering';\n      if (pc.transceivers[sdpMLineIndex].bufferedCandidateEvents !== null) {\n        pc.transceivers[sdpMLineIndex].bufferedCandidateEvents.push(event);\n      }\n    };\n    iceGatherer.addEventListener('localcandidate',\n      this.transceivers[sdpMLineIndex].bufferCandidates);\n    return iceGatherer;\n  };\n\n  // start gathering from an RTCIceGatherer.\n  RTCPeerConnection.prototype._gather = function(mid, sdpMLineIndex) {\n    var pc = this;\n    var iceGatherer = this.transceivers[sdpMLineIndex].iceGatherer;\n    if (iceGatherer.onlocalcandidate) {\n      return;\n    }\n    var bufferedCandidateEvents =\n      this.transceivers[sdpMLineIndex].bufferedCandidateEvents;\n    this.transceivers[sdpMLineIndex].bufferedCandidateEvents = null;\n    iceGatherer.removeEventListener('localcandidate',\n      this.transceivers[sdpMLineIndex].bufferCandidates);\n    iceGatherer.onlocalcandidate = function(evt) {\n      if (pc.usingBundle && sdpMLineIndex > 0) {\n        // if we know that we use bundle we can drop candidates with\n        // ѕdpMLineIndex > 0. If we don't do this then our state gets\n        // confused since we dispose the extra ice gatherer.\n        return;\n      }\n      var event = new Event('icecandidate');\n      event.candidate = {sdpMid: mid, sdpMLineIndex: sdpMLineIndex};\n\n      var cand = evt.candidate;\n      // Edge emits an empty object for RTCIceCandidateComplete‥\n      var end = !cand || Object.keys(cand).length === 0;\n      if (end) {\n        // polyfill since RTCIceGatherer.state is not implemented in\n        // Edge 10547 yet.\n        if (iceGatherer.state === 'new' || iceGatherer.state === 'gathering') {\n          iceGatherer.state = 'completed';\n        }\n      } else {\n        if (iceGatherer.state === 'new') {\n          iceGatherer.state = 'gathering';\n        }\n        // RTCIceCandidate doesn't have a component, needs to be added\n        cand.component = 1;\n        // also the usernameFragment. TODO: update SDP to take both variants.\n        cand.ufrag = iceGatherer.getLocalParameters().usernameFragment;\n\n        var serializedCandidate = SDPUtils.writeCandidate(cand);\n        event.candidate = Object.assign(event.candidate,\n            SDPUtils.parseCandidate(serializedCandidate));\n\n        event.candidate.candidate = serializedCandidate;\n        event.candidate.toJSON = function() {\n          return {\n            candidate: event.candidate.candidate,\n            sdpMid: event.candidate.sdpMid,\n            sdpMLineIndex: event.candidate.sdpMLineIndex,\n            usernameFragment: event.candidate.usernameFragment\n          };\n        };\n      }\n\n      // update local description.\n      var sections = SDPUtils.getMediaSections(pc._localDescription.sdp);\n      if (!end) {\n        sections[event.candidate.sdpMLineIndex] +=\n            'a=' + event.candidate.candidate + '\\r\\n';\n      } else {\n        sections[event.candidate.sdpMLineIndex] +=\n            'a=end-of-candidates\\r\\n';\n      }\n      pc._localDescription.sdp =\n          SDPUtils.getDescription(pc._localDescription.sdp) +\n          sections.join('');\n      var complete = pc.transceivers.every(function(transceiver) {\n        return transceiver.iceGatherer &&\n            transceiver.iceGatherer.state === 'completed';\n      });\n\n      if (pc.iceGatheringState !== 'gathering') {\n        pc.iceGatheringState = 'gathering';\n        pc._emitGatheringStateChange();\n      }\n\n      // Emit candidate. Also emit null candidate when all gatherers are\n      // complete.\n      if (!end) {\n        pc._dispatchEvent('icecandidate', event);\n      }\n      if (complete) {\n        pc._dispatchEvent('icecandidate', new Event('icecandidate'));\n        pc.iceGatheringState = 'complete';\n        pc._emitGatheringStateChange();\n      }\n    };\n\n    // emit already gathered candidates.\n    window.setTimeout(function() {\n      bufferedCandidateEvents.forEach(function(e) {\n        iceGatherer.onlocalcandidate(e);\n      });\n    }, 0);\n  };\n\n  // Create ICE transport and DTLS transport.\n  RTCPeerConnection.prototype._createIceAndDtlsTransports = function() {\n    var pc = this;\n    var iceTransport = new window.RTCIceTransport(null);\n    iceTransport.onicestatechange = function() {\n      pc._updateIceConnectionState();\n      pc._updateConnectionState();\n    };\n\n    var dtlsTransport = new window.RTCDtlsTransport(iceTransport);\n    dtlsTransport.ondtlsstatechange = function() {\n      pc._updateConnectionState();\n    };\n    dtlsTransport.onerror = function() {\n      // onerror does not set state to failed by itself.\n      Object.defineProperty(dtlsTransport, 'state',\n          {value: 'failed', writable: true});\n      pc._updateConnectionState();\n    };\n\n    return {\n      iceTransport: iceTransport,\n      dtlsTransport: dtlsTransport\n    };\n  };\n\n  // Destroy ICE gatherer, ICE transport and DTLS transport.\n  // Without triggering the callbacks.\n  RTCPeerConnection.prototype._disposeIceAndDtlsTransports = function(\n      sdpMLineIndex) {\n    var iceGatherer = this.transceivers[sdpMLineIndex].iceGatherer;\n    if (iceGatherer) {\n      delete iceGatherer.onlocalcandidate;\n      delete this.transceivers[sdpMLineIndex].iceGatherer;\n    }\n    var iceTransport = this.transceivers[sdpMLineIndex].iceTransport;\n    if (iceTransport) {\n      delete iceTransport.onicestatechange;\n      delete this.transceivers[sdpMLineIndex].iceTransport;\n    }\n    var dtlsTransport = this.transceivers[sdpMLineIndex].dtlsTransport;\n    if (dtlsTransport) {\n      delete dtlsTransport.ondtlsstatechange;\n      delete dtlsTransport.onerror;\n      delete this.transceivers[sdpMLineIndex].dtlsTransport;\n    }\n  };\n\n  // Start the RTP Sender and Receiver for a transceiver.\n  RTCPeerConnection.prototype._transceive = function(transceiver,\n      send, recv) {\n    var params = getCommonCapabilities(transceiver.localCapabilities,\n        transceiver.remoteCapabilities);\n    if (send && transceiver.rtpSender) {\n      params.encodings = transceiver.sendEncodingParameters;\n      params.rtcp = {\n        cname: SDPUtils.localCName,\n        compound: transceiver.rtcpParameters.compound\n      };\n      if (transceiver.recvEncodingParameters.length) {\n        params.rtcp.ssrc = transceiver.recvEncodingParameters[0].ssrc;\n      }\n      transceiver.rtpSender.send(params);\n    }\n    if (recv && transceiver.rtpReceiver && params.codecs.length > 0) {\n      // remove RTX field in Edge 14942\n      if (transceiver.kind === 'video'\n          && transceiver.recvEncodingParameters\n          && edgeVersion < 15019) {\n        transceiver.recvEncodingParameters.forEach(function(p) {\n          delete p.rtx;\n        });\n      }\n      if (transceiver.recvEncodingParameters.length) {\n        params.encodings = transceiver.recvEncodingParameters;\n      } else {\n        params.encodings = [{}];\n      }\n      params.rtcp = {\n        compound: transceiver.rtcpParameters.compound\n      };\n      if (transceiver.rtcpParameters.cname) {\n        params.rtcp.cname = transceiver.rtcpParameters.cname;\n      }\n      if (transceiver.sendEncodingParameters.length) {\n        params.rtcp.ssrc = transceiver.sendEncodingParameters[0].ssrc;\n      }\n      transceiver.rtpReceiver.receive(params);\n    }\n  };\n\n  RTCPeerConnection.prototype.setLocalDescription = function(description) {\n    var pc = this;\n\n    // Note: pranswer is not supported.\n    if (['offer', 'answer'].indexOf(description.type) === -1) {\n      return Promise.reject(makeError('TypeError',\n          'Unsupported type \"' + description.type + '\"'));\n    }\n\n    if (!isActionAllowedInSignalingState('setLocalDescription',\n        description.type, pc.signalingState) || pc._isClosed) {\n      return Promise.reject(makeError('InvalidStateError',\n          'Can not set local ' + description.type +\n          ' in state ' + pc.signalingState));\n    }\n\n    var sections;\n    var sessionpart;\n    if (description.type === 'offer') {\n      // VERY limited support for SDP munging. Limited to:\n      // * changing the order of codecs\n      sections = SDPUtils.splitSections(description.sdp);\n      sessionpart = sections.shift();\n      sections.forEach(function(mediaSection, sdpMLineIndex) {\n        var caps = SDPUtils.parseRtpParameters(mediaSection);\n        pc.transceivers[sdpMLineIndex].localCapabilities = caps;\n      });\n\n      pc.transceivers.forEach(function(transceiver, sdpMLineIndex) {\n        pc._gather(transceiver.mid, sdpMLineIndex);\n      });\n    } else if (description.type === 'answer') {\n      sections = SDPUtils.splitSections(pc._remoteDescription.sdp);\n      sessionpart = sections.shift();\n      var isIceLite = SDPUtils.matchPrefix(sessionpart,\n          'a=ice-lite').length > 0;\n      sections.forEach(function(mediaSection, sdpMLineIndex) {\n        var transceiver = pc.transceivers[sdpMLineIndex];\n        var iceGatherer = transceiver.iceGatherer;\n        var iceTransport = transceiver.iceTransport;\n        var dtlsTransport = transceiver.dtlsTransport;\n        var localCapabilities = transceiver.localCapabilities;\n        var remoteCapabilities = transceiver.remoteCapabilities;\n\n        // treat bundle-only as not-rejected.\n        var rejected = SDPUtils.isRejected(mediaSection) &&\n            SDPUtils.matchPrefix(mediaSection, 'a=bundle-only').length === 0;\n\n        if (!rejected && !transceiver.rejected) {\n          var remoteIceParameters = SDPUtils.getIceParameters(\n              mediaSection, sessionpart);\n          var remoteDtlsParameters = SDPUtils.getDtlsParameters(\n              mediaSection, sessionpart);\n          if (isIceLite) {\n            remoteDtlsParameters.role = 'server';\n          }\n\n          if (!pc.usingBundle || sdpMLineIndex === 0) {\n            pc._gather(transceiver.mid, sdpMLineIndex);\n            if (iceTransport.state === 'new') {\n              iceTransport.start(iceGatherer, remoteIceParameters,\n                  isIceLite ? 'controlling' : 'controlled');\n            }\n            if (dtlsTransport.state === 'new') {\n              dtlsTransport.start(remoteDtlsParameters);\n            }\n          }\n\n          // Calculate intersection of capabilities.\n          var params = getCommonCapabilities(localCapabilities,\n              remoteCapabilities);\n\n          // Start the RTCRtpSender. The RTCRtpReceiver for this\n          // transceiver has already been started in setRemoteDescription.\n          pc._transceive(transceiver,\n              params.codecs.length > 0,\n              false);\n        }\n      });\n    }\n\n    pc._localDescription = {\n      type: description.type,\n      sdp: description.sdp\n    };\n    if (description.type === 'offer') {\n      pc._updateSignalingState('have-local-offer');\n    } else {\n      pc._updateSignalingState('stable');\n    }\n\n    return Promise.resolve();\n  };\n\n  RTCPeerConnection.prototype.setRemoteDescription = function(description) {\n    var pc = this;\n\n    // Note: pranswer is not supported.\n    if (['offer', 'answer'].indexOf(description.type) === -1) {\n      return Promise.reject(makeError('TypeError',\n          'Unsupported type \"' + description.type + '\"'));\n    }\n\n    if (!isActionAllowedInSignalingState('setRemoteDescription',\n        description.type, pc.signalingState) || pc._isClosed) {\n      return Promise.reject(makeError('InvalidStateError',\n          'Can not set remote ' + description.type +\n          ' in state ' + pc.signalingState));\n    }\n\n    var streams = {};\n    pc.remoteStreams.forEach(function(stream) {\n      streams[stream.id] = stream;\n    });\n    var receiverList = [];\n    var sections = SDPUtils.splitSections(description.sdp);\n    var sessionpart = sections.shift();\n    var isIceLite = SDPUtils.matchPrefix(sessionpart,\n        'a=ice-lite').length > 0;\n    var usingBundle = SDPUtils.matchPrefix(sessionpart,\n        'a=group:BUNDLE ').length > 0;\n    pc.usingBundle = usingBundle;\n    var iceOptions = SDPUtils.matchPrefix(sessionpart,\n        'a=ice-options:')[0];\n    if (iceOptions) {\n      pc.canTrickleIceCandidates = iceOptions.substr(14).split(' ')\n          .indexOf('trickle') >= 0;\n    } else {\n      pc.canTrickleIceCandidates = false;\n    }\n\n    sections.forEach(function(mediaSection, sdpMLineIndex) {\n      var lines = SDPUtils.splitLines(mediaSection);\n      var kind = SDPUtils.getKind(mediaSection);\n      // treat bundle-only as not-rejected.\n      var rejected = SDPUtils.isRejected(mediaSection) &&\n          SDPUtils.matchPrefix(mediaSection, 'a=bundle-only').length === 0;\n      var protocol = lines[0].substr(2).split(' ')[2];\n\n      var direction = SDPUtils.getDirection(mediaSection, sessionpart);\n      var remoteMsid = SDPUtils.parseMsid(mediaSection);\n\n      var mid = SDPUtils.getMid(mediaSection) || SDPUtils.generateIdentifier();\n\n      // Reject datachannels which are not implemented yet.\n      if (rejected || (kind === 'application' && (protocol === 'DTLS/SCTP' ||\n          protocol === 'UDP/DTLS/SCTP'))) {\n        // TODO: this is dangerous in the case where a non-rejected m-line\n        //     becomes rejected.\n        pc.transceivers[sdpMLineIndex] = {\n          mid: mid,\n          kind: kind,\n          protocol: protocol,\n          rejected: true\n        };\n        return;\n      }\n\n      if (!rejected && pc.transceivers[sdpMLineIndex] &&\n          pc.transceivers[sdpMLineIndex].rejected) {\n        // recycle a rejected transceiver.\n        pc.transceivers[sdpMLineIndex] = pc._createTransceiver(kind, true);\n      }\n\n      var transceiver;\n      var iceGatherer;\n      var iceTransport;\n      var dtlsTransport;\n      var rtpReceiver;\n      var sendEncodingParameters;\n      var recvEncodingParameters;\n      var localCapabilities;\n\n      var track;\n      // FIXME: ensure the mediaSection has rtcp-mux set.\n      var remoteCapabilities = SDPUtils.parseRtpParameters(mediaSection);\n      var remoteIceParameters;\n      var remoteDtlsParameters;\n      if (!rejected) {\n        remoteIceParameters = SDPUtils.getIceParameters(mediaSection,\n            sessionpart);\n        remoteDtlsParameters = SDPUtils.getDtlsParameters(mediaSection,\n            sessionpart);\n        remoteDtlsParameters.role = 'client';\n      }\n      recvEncodingParameters =\n          SDPUtils.parseRtpEncodingParameters(mediaSection);\n\n      var rtcpParameters = SDPUtils.parseRtcpParameters(mediaSection);\n\n      var isComplete = SDPUtils.matchPrefix(mediaSection,\n          'a=end-of-candidates', sessionpart).length > 0;\n      var cands = SDPUtils.matchPrefix(mediaSection, 'a=candidate:')\n          .map(function(cand) {\n            return SDPUtils.parseCandidate(cand);\n          })\n          .filter(function(cand) {\n            return cand.component === 1;\n          });\n\n      // Check if we can use BUNDLE and dispose transports.\n      if ((description.type === 'offer' || description.type === 'answer') &&\n          !rejected && usingBundle && sdpMLineIndex > 0 &&\n          pc.transceivers[sdpMLineIndex]) {\n        pc._disposeIceAndDtlsTransports(sdpMLineIndex);\n        pc.transceivers[sdpMLineIndex].iceGatherer =\n            pc.transceivers[0].iceGatherer;\n        pc.transceivers[sdpMLineIndex].iceTransport =\n            pc.transceivers[0].iceTransport;\n        pc.transceivers[sdpMLineIndex].dtlsTransport =\n            pc.transceivers[0].dtlsTransport;\n        if (pc.transceivers[sdpMLineIndex].rtpSender) {\n          pc.transceivers[sdpMLineIndex].rtpSender.setTransport(\n              pc.transceivers[0].dtlsTransport);\n        }\n        if (pc.transceivers[sdpMLineIndex].rtpReceiver) {\n          pc.transceivers[sdpMLineIndex].rtpReceiver.setTransport(\n              pc.transceivers[0].dtlsTransport);\n        }\n      }\n      if (description.type === 'offer' && !rejected) {\n        transceiver = pc.transceivers[sdpMLineIndex] ||\n            pc._createTransceiver(kind);\n        transceiver.mid = mid;\n\n        if (!transceiver.iceGatherer) {\n          transceiver.iceGatherer = pc._createIceGatherer(sdpMLineIndex,\n              usingBundle);\n        }\n\n        if (cands.length && transceiver.iceTransport.state === 'new') {\n          if (isComplete && (!usingBundle || sdpMLineIndex === 0)) {\n            transceiver.iceTransport.setRemoteCandidates(cands);\n          } else {\n            cands.forEach(function(candidate) {\n              maybeAddCandidate(transceiver.iceTransport, candidate);\n            });\n          }\n        }\n\n        localCapabilities = window.RTCRtpReceiver.getCapabilities(kind);\n\n        // filter RTX until additional stuff needed for RTX is implemented\n        // in adapter.js\n        if (edgeVersion < 15019) {\n          localCapabilities.codecs = localCapabilities.codecs.filter(\n              function(codec) {\n                return codec.name !== 'rtx';\n              });\n        }\n\n        sendEncodingParameters = transceiver.sendEncodingParameters || [{\n          ssrc: (2 * sdpMLineIndex + 2) * 1001\n        }];\n\n        // TODO: rewrite to use http://w3c.github.io/webrtc-pc/#set-associated-remote-streams\n        var isNewTrack = false;\n        if (direction === 'sendrecv' || direction === 'sendonly') {\n          isNewTrack = !transceiver.rtpReceiver;\n          rtpReceiver = transceiver.rtpReceiver ||\n              new window.RTCRtpReceiver(transceiver.dtlsTransport, kind);\n\n          if (isNewTrack) {\n            var stream;\n            track = rtpReceiver.track;\n            // FIXME: does not work with Plan B.\n            if (remoteMsid && remoteMsid.stream === '-') {\n              // no-op. a stream id of '-' means: no associated stream.\n            } else if (remoteMsid) {\n              if (!streams[remoteMsid.stream]) {\n                streams[remoteMsid.stream] = new window.MediaStream();\n                Object.defineProperty(streams[remoteMsid.stream], 'id', {\n                  get: function() {\n                    return remoteMsid.stream;\n                  }\n                });\n              }\n              Object.defineProperty(track, 'id', {\n                get: function() {\n                  return remoteMsid.track;\n                }\n              });\n              stream = streams[remoteMsid.stream];\n            } else {\n              if (!streams.default) {\n                streams.default = new window.MediaStream();\n              }\n              stream = streams.default;\n            }\n            if (stream) {\n              addTrackToStreamAndFireEvent(track, stream);\n              transceiver.associatedRemoteMediaStreams.push(stream);\n            }\n            receiverList.push([track, rtpReceiver, stream]);\n          }\n        } else if (transceiver.rtpReceiver && transceiver.rtpReceiver.track) {\n          transceiver.associatedRemoteMediaStreams.forEach(function(s) {\n            var nativeTrack = s.getTracks().find(function(t) {\n              return t.id === transceiver.rtpReceiver.track.id;\n            });\n            if (nativeTrack) {\n              removeTrackFromStreamAndFireEvent(nativeTrack, s);\n            }\n          });\n          transceiver.associatedRemoteMediaStreams = [];\n        }\n\n        transceiver.localCapabilities = localCapabilities;\n        transceiver.remoteCapabilities = remoteCapabilities;\n        transceiver.rtpReceiver = rtpReceiver;\n        transceiver.rtcpParameters = rtcpParameters;\n        transceiver.sendEncodingParameters = sendEncodingParameters;\n        transceiver.recvEncodingParameters = recvEncodingParameters;\n\n        // Start the RTCRtpReceiver now. The RTPSender is started in\n        // setLocalDescription.\n        pc._transceive(pc.transceivers[sdpMLineIndex],\n            false,\n            isNewTrack);\n      } else if (description.type === 'answer' && !rejected) {\n        transceiver = pc.transceivers[sdpMLineIndex];\n        iceGatherer = transceiver.iceGatherer;\n        iceTransport = transceiver.iceTransport;\n        dtlsTransport = transceiver.dtlsTransport;\n        rtpReceiver = transceiver.rtpReceiver;\n        sendEncodingParameters = transceiver.sendEncodingParameters;\n        localCapabilities = transceiver.localCapabilities;\n\n        pc.transceivers[sdpMLineIndex].recvEncodingParameters =\n            recvEncodingParameters;\n        pc.transceivers[sdpMLineIndex].remoteCapabilities =\n            remoteCapabilities;\n        pc.transceivers[sdpMLineIndex].rtcpParameters = rtcpParameters;\n\n        if (cands.length && iceTransport.state === 'new') {\n          if ((isIceLite || isComplete) &&\n              (!usingBundle || sdpMLineIndex === 0)) {\n            iceTransport.setRemoteCandidates(cands);\n          } else {\n            cands.forEach(function(candidate) {\n              maybeAddCandidate(transceiver.iceTransport, candidate);\n            });\n          }\n        }\n\n        if (!usingBundle || sdpMLineIndex === 0) {\n          if (iceTransport.state === 'new') {\n            iceTransport.start(iceGatherer, remoteIceParameters,\n                'controlling');\n          }\n          if (dtlsTransport.state === 'new') {\n            dtlsTransport.start(remoteDtlsParameters);\n          }\n        }\n\n        // If the offer contained RTX but the answer did not,\n        // remove RTX from sendEncodingParameters.\n        var commonCapabilities = getCommonCapabilities(\n          transceiver.localCapabilities,\n          transceiver.remoteCapabilities);\n\n        var hasRtx = commonCapabilities.codecs.filter(function(c) {\n          return c.name.toLowerCase() === 'rtx';\n        }).length;\n        if (!hasRtx && transceiver.sendEncodingParameters[0].rtx) {\n          delete transceiver.sendEncodingParameters[0].rtx;\n        }\n\n        pc._transceive(transceiver,\n            direction === 'sendrecv' || direction === 'recvonly',\n            direction === 'sendrecv' || direction === 'sendonly');\n\n        // TODO: rewrite to use http://w3c.github.io/webrtc-pc/#set-associated-remote-streams\n        if (rtpReceiver &&\n            (direction === 'sendrecv' || direction === 'sendonly')) {\n          track = rtpReceiver.track;\n          if (remoteMsid) {\n            if (!streams[remoteMsid.stream]) {\n              streams[remoteMsid.stream] = new window.MediaStream();\n            }\n            addTrackToStreamAndFireEvent(track, streams[remoteMsid.stream]);\n            receiverList.push([track, rtpReceiver, streams[remoteMsid.stream]]);\n          } else {\n            if (!streams.default) {\n              streams.default = new window.MediaStream();\n            }\n            addTrackToStreamAndFireEvent(track, streams.default);\n            receiverList.push([track, rtpReceiver, streams.default]);\n          }\n        } else {\n          // FIXME: actually the receiver should be created later.\n          delete transceiver.rtpReceiver;\n        }\n      }\n    });\n\n    if (pc._dtlsRole === undefined) {\n      pc._dtlsRole = description.type === 'offer' ? 'active' : 'passive';\n    }\n\n    pc._remoteDescription = {\n      type: description.type,\n      sdp: description.sdp\n    };\n    if (description.type === 'offer') {\n      pc._updateSignalingState('have-remote-offer');\n    } else {\n      pc._updateSignalingState('stable');\n    }\n    Object.keys(streams).forEach(function(sid) {\n      var stream = streams[sid];\n      if (stream.getTracks().length) {\n        if (pc.remoteStreams.indexOf(stream) === -1) {\n          pc.remoteStreams.push(stream);\n          var event = new Event('addstream');\n          event.stream = stream;\n          window.setTimeout(function() {\n            pc._dispatchEvent('addstream', event);\n          });\n        }\n\n        receiverList.forEach(function(item) {\n          var track = item[0];\n          var receiver = item[1];\n          if (stream.id !== item[2].id) {\n            return;\n          }\n          fireAddTrack(pc, track, receiver, [stream]);\n        });\n      }\n    });\n    receiverList.forEach(function(item) {\n      if (item[2]) {\n        return;\n      }\n      fireAddTrack(pc, item[0], item[1], []);\n    });\n\n    // check whether addIceCandidate({}) was called within four seconds after\n    // setRemoteDescription.\n    window.setTimeout(function() {\n      if (!(pc && pc.transceivers)) {\n        return;\n      }\n      pc.transceivers.forEach(function(transceiver) {\n        if (transceiver.iceTransport &&\n            transceiver.iceTransport.state === 'new' &&\n            transceiver.iceTransport.getRemoteCandidates().length > 0) {\n          console.warn('Timeout for addRemoteCandidate. Consider sending ' +\n              'an end-of-candidates notification');\n          transceiver.iceTransport.addRemoteCandidate({});\n        }\n      });\n    }, 4000);\n\n    return Promise.resolve();\n  };\n\n  RTCPeerConnection.prototype.close = function() {\n    this.transceivers.forEach(function(transceiver) {\n      /* not yet\n      if (transceiver.iceGatherer) {\n        transceiver.iceGatherer.close();\n      }\n      */\n      if (transceiver.iceTransport) {\n        transceiver.iceTransport.stop();\n      }\n      if (transceiver.dtlsTransport) {\n        transceiver.dtlsTransport.stop();\n      }\n      if (transceiver.rtpSender) {\n        transceiver.rtpSender.stop();\n      }\n      if (transceiver.rtpReceiver) {\n        transceiver.rtpReceiver.stop();\n      }\n    });\n    // FIXME: clean up tracks, local streams, remote streams, etc\n    this._isClosed = true;\n    this._updateSignalingState('closed');\n  };\n\n  // Update the signaling state.\n  RTCPeerConnection.prototype._updateSignalingState = function(newState) {\n    this.signalingState = newState;\n    var event = new Event('signalingstatechange');\n    this._dispatchEvent('signalingstatechange', event);\n  };\n\n  // Determine whether to fire the negotiationneeded event.\n  RTCPeerConnection.prototype._maybeFireNegotiationNeeded = function() {\n    var pc = this;\n    if (this.signalingState !== 'stable' || this.needNegotiation === true) {\n      return;\n    }\n    this.needNegotiation = true;\n    window.setTimeout(function() {\n      if (pc.needNegotiation) {\n        pc.needNegotiation = false;\n        var event = new Event('negotiationneeded');\n        pc._dispatchEvent('negotiationneeded', event);\n      }\n    }, 0);\n  };\n\n  // Update the ice connection state.\n  RTCPeerConnection.prototype._updateIceConnectionState = function() {\n    var newState;\n    var states = {\n      'new': 0,\n      closed: 0,\n      checking: 0,\n      connected: 0,\n      completed: 0,\n      disconnected: 0,\n      failed: 0\n    };\n    this.transceivers.forEach(function(transceiver) {\n      if (transceiver.iceTransport && !transceiver.rejected) {\n        states[transceiver.iceTransport.state]++;\n      }\n    });\n\n    newState = 'new';\n    if (states.failed > 0) {\n      newState = 'failed';\n    } else if (states.checking > 0) {\n      newState = 'checking';\n    } else if (states.disconnected > 0) {\n      newState = 'disconnected';\n    } else if (states.new > 0) {\n      newState = 'new';\n    } else if (states.connected > 0) {\n      newState = 'connected';\n    } else if (states.completed > 0) {\n      newState = 'completed';\n    }\n\n    if (newState !== this.iceConnectionState) {\n      this.iceConnectionState = newState;\n      var event = new Event('iceconnectionstatechange');\n      this._dispatchEvent('iceconnectionstatechange', event);\n    }\n  };\n\n  // Update the connection state.\n  RTCPeerConnection.prototype._updateConnectionState = function() {\n    var newState;\n    var states = {\n      'new': 0,\n      closed: 0,\n      connecting: 0,\n      connected: 0,\n      completed: 0,\n      disconnected: 0,\n      failed: 0\n    };\n    this.transceivers.forEach(function(transceiver) {\n      if (transceiver.iceTransport && transceiver.dtlsTransport &&\n          !transceiver.rejected) {\n        states[transceiver.iceTransport.state]++;\n        states[transceiver.dtlsTransport.state]++;\n      }\n    });\n    // ICETransport.completed and connected are the same for this purpose.\n    states.connected += states.completed;\n\n    newState = 'new';\n    if (states.failed > 0) {\n      newState = 'failed';\n    } else if (states.connecting > 0) {\n      newState = 'connecting';\n    } else if (states.disconnected > 0) {\n      newState = 'disconnected';\n    } else if (states.new > 0) {\n      newState = 'new';\n    } else if (states.connected > 0) {\n      newState = 'connected';\n    }\n\n    if (newState !== this.connectionState) {\n      this.connectionState = newState;\n      var event = new Event('connectionstatechange');\n      this._dispatchEvent('connectionstatechange', event);\n    }\n  };\n\n  RTCPeerConnection.prototype.createOffer = function() {\n    var pc = this;\n\n    if (pc._isClosed) {\n      return Promise.reject(makeError('InvalidStateError',\n          'Can not call createOffer after close'));\n    }\n\n    var numAudioTracks = pc.transceivers.filter(function(t) {\n      return t.kind === 'audio';\n    }).length;\n    var numVideoTracks = pc.transceivers.filter(function(t) {\n      return t.kind === 'video';\n    }).length;\n\n    // Determine number of audio and video tracks we need to send/recv.\n    var offerOptions = arguments[0];\n    if (offerOptions) {\n      // Reject Chrome legacy constraints.\n      if (offerOptions.mandatory || offerOptions.optional) {\n        throw new TypeError(\n            'Legacy mandatory/optional constraints not supported.');\n      }\n      if (offerOptions.offerToReceiveAudio !== undefined) {\n        if (offerOptions.offerToReceiveAudio === true) {\n          numAudioTracks = 1;\n        } else if (offerOptions.offerToReceiveAudio === false) {\n          numAudioTracks = 0;\n        } else {\n          numAudioTracks = offerOptions.offerToReceiveAudio;\n        }\n      }\n      if (offerOptions.offerToReceiveVideo !== undefined) {\n        if (offerOptions.offerToReceiveVideo === true) {\n          numVideoTracks = 1;\n        } else if (offerOptions.offerToReceiveVideo === false) {\n          numVideoTracks = 0;\n        } else {\n          numVideoTracks = offerOptions.offerToReceiveVideo;\n        }\n      }\n    }\n\n    pc.transceivers.forEach(function(transceiver) {\n      if (transceiver.kind === 'audio') {\n        numAudioTracks--;\n        if (numAudioTracks < 0) {\n          transceiver.wantReceive = false;\n        }\n      } else if (transceiver.kind === 'video') {\n        numVideoTracks--;\n        if (numVideoTracks < 0) {\n          transceiver.wantReceive = false;\n        }\n      }\n    });\n\n    // Create M-lines for recvonly streams.\n    while (numAudioTracks > 0 || numVideoTracks > 0) {\n      if (numAudioTracks > 0) {\n        pc._createTransceiver('audio');\n        numAudioTracks--;\n      }\n      if (numVideoTracks > 0) {\n        pc._createTransceiver('video');\n        numVideoTracks--;\n      }\n    }\n\n    var sdp = SDPUtils.writeSessionBoilerplate(pc._sdpSessionId,\n        pc._sdpSessionVersion++);\n    pc.transceivers.forEach(function(transceiver, sdpMLineIndex) {\n      // For each track, create an ice gatherer, ice transport,\n      // dtls transport, potentially rtpsender and rtpreceiver.\n      var track = transceiver.track;\n      var kind = transceiver.kind;\n      var mid = transceiver.mid || SDPUtils.generateIdentifier();\n      transceiver.mid = mid;\n\n      if (!transceiver.iceGatherer) {\n        transceiver.iceGatherer = pc._createIceGatherer(sdpMLineIndex,\n            pc.usingBundle);\n      }\n\n      var localCapabilities = window.RTCRtpSender.getCapabilities(kind);\n      // filter RTX until additional stuff needed for RTX is implemented\n      // in adapter.js\n      if (edgeVersion < 15019) {\n        localCapabilities.codecs = localCapabilities.codecs.filter(\n            function(codec) {\n              return codec.name !== 'rtx';\n            });\n      }\n      localCapabilities.codecs.forEach(function(codec) {\n        // work around https://bugs.chromium.org/p/webrtc/issues/detail?id=6552\n        // by adding level-asymmetry-allowed=1\n        if (codec.name === 'H264' &&\n            codec.parameters['level-asymmetry-allowed'] === undefined) {\n          codec.parameters['level-asymmetry-allowed'] = '1';\n        }\n\n        // for subsequent offers, we might have to re-use the payload\n        // type of the last offer.\n        if (transceiver.remoteCapabilities &&\n            transceiver.remoteCapabilities.codecs) {\n          transceiver.remoteCapabilities.codecs.forEach(function(remoteCodec) {\n            if (codec.name.toLowerCase() === remoteCodec.name.toLowerCase() &&\n                codec.clockRate === remoteCodec.clockRate) {\n              codec.preferredPayloadType = remoteCodec.payloadType;\n            }\n          });\n        }\n      });\n      localCapabilities.headerExtensions.forEach(function(hdrExt) {\n        var remoteExtensions = transceiver.remoteCapabilities &&\n            transceiver.remoteCapabilities.headerExtensions || [];\n        remoteExtensions.forEach(function(rHdrExt) {\n          if (hdrExt.uri === rHdrExt.uri) {\n            hdrExt.id = rHdrExt.id;\n          }\n        });\n      });\n\n      // generate an ssrc now, to be used later in rtpSender.send\n      var sendEncodingParameters = transceiver.sendEncodingParameters || [{\n        ssrc: (2 * sdpMLineIndex + 1) * 1001\n      }];\n      if (track) {\n        // add RTX\n        if (edgeVersion >= 15019 && kind === 'video' &&\n            !sendEncodingParameters[0].rtx) {\n          sendEncodingParameters[0].rtx = {\n            ssrc: sendEncodingParameters[0].ssrc + 1\n          };\n        }\n      }\n\n      if (transceiver.wantReceive) {\n        transceiver.rtpReceiver = new window.RTCRtpReceiver(\n            transceiver.dtlsTransport, kind);\n      }\n\n      transceiver.localCapabilities = localCapabilities;\n      transceiver.sendEncodingParameters = sendEncodingParameters;\n    });\n\n    // always offer BUNDLE and dispose on return if not supported.\n    if (pc._config.bundlePolicy !== 'max-compat') {\n      sdp += 'a=group:BUNDLE ' + pc.transceivers.map(function(t) {\n        return t.mid;\n      }).join(' ') + '\\r\\n';\n    }\n    sdp += 'a=ice-options:trickle\\r\\n';\n\n    pc.transceivers.forEach(function(transceiver, sdpMLineIndex) {\n      sdp += writeMediaSection(transceiver, transceiver.localCapabilities,\n          'offer', transceiver.stream, pc._dtlsRole);\n      sdp += 'a=rtcp-rsize\\r\\n';\n\n      if (transceiver.iceGatherer && pc.iceGatheringState !== 'new' &&\n          (sdpMLineIndex === 0 || !pc.usingBundle)) {\n        transceiver.iceGatherer.getLocalCandidates().forEach(function(cand) {\n          cand.component = 1;\n          sdp += 'a=' + SDPUtils.writeCandidate(cand) + '\\r\\n';\n        });\n\n        if (transceiver.iceGatherer.state === 'completed') {\n          sdp += 'a=end-of-candidates\\r\\n';\n        }\n      }\n    });\n\n    var desc = new window.RTCSessionDescription({\n      type: 'offer',\n      sdp: sdp\n    });\n    return Promise.resolve(desc);\n  };\n\n  RTCPeerConnection.prototype.createAnswer = function() {\n    var pc = this;\n\n    if (pc._isClosed) {\n      return Promise.reject(makeError('InvalidStateError',\n          'Can not call createAnswer after close'));\n    }\n\n    if (!(pc.signalingState === 'have-remote-offer' ||\n        pc.signalingState === 'have-local-pranswer')) {\n      return Promise.reject(makeError('InvalidStateError',\n          'Can not call createAnswer in signalingState ' + pc.signalingState));\n    }\n\n    var sdp = SDPUtils.writeSessionBoilerplate(pc._sdpSessionId,\n        pc._sdpSessionVersion++);\n    if (pc.usingBundle) {\n      sdp += 'a=group:BUNDLE ' + pc.transceivers.map(function(t) {\n        return t.mid;\n      }).join(' ') + '\\r\\n';\n    }\n    sdp += 'a=ice-options:trickle\\r\\n';\n\n    var mediaSectionsInOffer = SDPUtils.getMediaSections(\n        pc._remoteDescription.sdp).length;\n    pc.transceivers.forEach(function(transceiver, sdpMLineIndex) {\n      if (sdpMLineIndex + 1 > mediaSectionsInOffer) {\n        return;\n      }\n      if (transceiver.rejected) {\n        if (transceiver.kind === 'application') {\n          if (transceiver.protocol === 'DTLS/SCTP') { // legacy fmt\n            sdp += 'm=application 0 DTLS/SCTP 5000\\r\\n';\n          } else {\n            sdp += 'm=application 0 ' + transceiver.protocol +\n                ' webrtc-datachannel\\r\\n';\n          }\n        } else if (transceiver.kind === 'audio') {\n          sdp += 'm=audio 0 UDP/TLS/RTP/SAVPF 0\\r\\n' +\n              'a=rtpmap:0 PCMU/8000\\r\\n';\n        } else if (transceiver.kind === 'video') {\n          sdp += 'm=video 0 UDP/TLS/RTP/SAVPF 120\\r\\n' +\n              'a=rtpmap:120 VP8/90000\\r\\n';\n        }\n        sdp += 'c=IN IP4 0.0.0.0\\r\\n' +\n            'a=inactive\\r\\n' +\n            'a=mid:' + transceiver.mid + '\\r\\n';\n        return;\n      }\n\n      // FIXME: look at direction.\n      if (transceiver.stream) {\n        var localTrack;\n        if (transceiver.kind === 'audio') {\n          localTrack = transceiver.stream.getAudioTracks()[0];\n        } else if (transceiver.kind === 'video') {\n          localTrack = transceiver.stream.getVideoTracks()[0];\n        }\n        if (localTrack) {\n          // add RTX\n          if (edgeVersion >= 15019 && transceiver.kind === 'video' &&\n              !transceiver.sendEncodingParameters[0].rtx) {\n            transceiver.sendEncodingParameters[0].rtx = {\n              ssrc: transceiver.sendEncodingParameters[0].ssrc + 1\n            };\n          }\n        }\n      }\n\n      // Calculate intersection of capabilities.\n      var commonCapabilities = getCommonCapabilities(\n          transceiver.localCapabilities,\n          transceiver.remoteCapabilities);\n\n      var hasRtx = commonCapabilities.codecs.filter(function(c) {\n        return c.name.toLowerCase() === 'rtx';\n      }).length;\n      if (!hasRtx && transceiver.sendEncodingParameters[0].rtx) {\n        delete transceiver.sendEncodingParameters[0].rtx;\n      }\n\n      sdp += writeMediaSection(transceiver, commonCapabilities,\n          'answer', transceiver.stream, pc._dtlsRole);\n      if (transceiver.rtcpParameters &&\n          transceiver.rtcpParameters.reducedSize) {\n        sdp += 'a=rtcp-rsize\\r\\n';\n      }\n    });\n\n    var desc = new window.RTCSessionDescription({\n      type: 'answer',\n      sdp: sdp\n    });\n    return Promise.resolve(desc);\n  };\n\n  RTCPeerConnection.prototype.addIceCandidate = function(candidate) {\n    var pc = this;\n    var sections;\n    if (candidate && !(candidate.sdpMLineIndex !== undefined ||\n        candidate.sdpMid)) {\n      return Promise.reject(new TypeError('sdpMLineIndex or sdpMid required'));\n    }\n\n    // TODO: needs to go into ops queue.\n    return new Promise(function(resolve, reject) {\n      if (!pc._remoteDescription) {\n        return reject(makeError('InvalidStateError',\n            'Can not add ICE candidate without a remote description'));\n      } else if (!candidate || candidate.candidate === '') {\n        for (var j = 0; j < pc.transceivers.length; j++) {\n          if (pc.transceivers[j].rejected) {\n            continue;\n          }\n          pc.transceivers[j].iceTransport.addRemoteCandidate({});\n          sections = SDPUtils.getMediaSections(pc._remoteDescription.sdp);\n          sections[j] += 'a=end-of-candidates\\r\\n';\n          pc._remoteDescription.sdp =\n              SDPUtils.getDescription(pc._remoteDescription.sdp) +\n              sections.join('');\n          if (pc.usingBundle) {\n            break;\n          }\n        }\n      } else {\n        var sdpMLineIndex = candidate.sdpMLineIndex;\n        if (candidate.sdpMid) {\n          for (var i = 0; i < pc.transceivers.length; i++) {\n            if (pc.transceivers[i].mid === candidate.sdpMid) {\n              sdpMLineIndex = i;\n              break;\n            }\n          }\n        }\n        var transceiver = pc.transceivers[sdpMLineIndex];\n        if (transceiver) {\n          if (transceiver.rejected) {\n            return resolve();\n          }\n          var cand = Object.keys(candidate.candidate).length > 0 ?\n              SDPUtils.parseCandidate(candidate.candidate) : {};\n          // Ignore Chrome's invalid candidates since Edge does not like them.\n          if (cand.protocol === 'tcp' && (cand.port === 0 || cand.port === 9)) {\n            return resolve();\n          }\n          // Ignore RTCP candidates, we assume RTCP-MUX.\n          if (cand.component && cand.component !== 1) {\n            return resolve();\n          }\n          // when using bundle, avoid adding candidates to the wrong\n          // ice transport. And avoid adding candidates added in the SDP.\n          if (sdpMLineIndex === 0 || (sdpMLineIndex > 0 &&\n              transceiver.iceTransport !== pc.transceivers[0].iceTransport)) {\n            if (!maybeAddCandidate(transceiver.iceTransport, cand)) {\n              return reject(makeError('OperationError',\n                  'Can not add ICE candidate'));\n            }\n          }\n\n          // update the remoteDescription.\n          var candidateString = candidate.candidate.trim();\n          if (candidateString.indexOf('a=') === 0) {\n            candidateString = candidateString.substr(2);\n          }\n          sections = SDPUtils.getMediaSections(pc._remoteDescription.sdp);\n          sections[sdpMLineIndex] += 'a=' +\n              (cand.type ? candidateString : 'end-of-candidates')\n              + '\\r\\n';\n          pc._remoteDescription.sdp =\n              SDPUtils.getDescription(pc._remoteDescription.sdp) +\n              sections.join('');\n        } else {\n          return reject(makeError('OperationError',\n              'Can not add ICE candidate'));\n        }\n      }\n      resolve();\n    });\n  };\n\n  RTCPeerConnection.prototype.getStats = function(selector) {\n    if (selector && selector instanceof window.MediaStreamTrack) {\n      var senderOrReceiver = null;\n      this.transceivers.forEach(function(transceiver) {\n        if (transceiver.rtpSender &&\n            transceiver.rtpSender.track === selector) {\n          senderOrReceiver = transceiver.rtpSender;\n        } else if (transceiver.rtpReceiver &&\n            transceiver.rtpReceiver.track === selector) {\n          senderOrReceiver = transceiver.rtpReceiver;\n        }\n      });\n      if (!senderOrReceiver) {\n        throw makeError('InvalidAccessError', 'Invalid selector.');\n      }\n      return senderOrReceiver.getStats();\n    }\n\n    var promises = [];\n    this.transceivers.forEach(function(transceiver) {\n      ['rtpSender', 'rtpReceiver', 'iceGatherer', 'iceTransport',\n          'dtlsTransport'].forEach(function(method) {\n            if (transceiver[method]) {\n              promises.push(transceiver[method].getStats());\n            }\n          });\n    });\n    return Promise.all(promises).then(function(allStats) {\n      var results = new Map();\n      allStats.forEach(function(stats) {\n        stats.forEach(function(stat) {\n          results.set(stat.id, stat);\n        });\n      });\n      return results;\n    });\n  };\n\n  // fix low-level stat names and return Map instead of object.\n  var ortcObjects = ['RTCRtpSender', 'RTCRtpReceiver', 'RTCIceGatherer',\n    'RTCIceTransport', 'RTCDtlsTransport'];\n  ortcObjects.forEach(function(ortcObjectName) {\n    var obj = window[ortcObjectName];\n    if (obj && obj.prototype && obj.prototype.getStats) {\n      var nativeGetstats = obj.prototype.getStats;\n      obj.prototype.getStats = function() {\n        return nativeGetstats.apply(this)\n        .then(function(nativeStats) {\n          var mapStats = new Map();\n          Object.keys(nativeStats).forEach(function(id) {\n            nativeStats[id].type = fixStatsType(nativeStats[id]);\n            mapStats.set(id, nativeStats[id]);\n          });\n          return mapStats;\n        });\n      };\n    }\n  });\n\n  // legacy callback shims. Should be moved to adapter.js some days.\n  var methods = ['createOffer', 'createAnswer'];\n  methods.forEach(function(method) {\n    var nativeMethod = RTCPeerConnection.prototype[method];\n    RTCPeerConnection.prototype[method] = function() {\n      var args = arguments;\n      if (typeof args[0] === 'function' ||\n          typeof args[1] === 'function') { // legacy\n        return nativeMethod.apply(this, [arguments[2]])\n        .then(function(description) {\n          if (typeof args[0] === 'function') {\n            args[0].apply(null, [description]);\n          }\n        }, function(error) {\n          if (typeof args[1] === 'function') {\n            args[1].apply(null, [error]);\n          }\n        });\n      }\n      return nativeMethod.apply(this, arguments);\n    };\n  });\n\n  methods = ['setLocalDescription', 'setRemoteDescription', 'addIceCandidate'];\n  methods.forEach(function(method) {\n    var nativeMethod = RTCPeerConnection.prototype[method];\n    RTCPeerConnection.prototype[method] = function() {\n      var args = arguments;\n      if (typeof args[1] === 'function' ||\n          typeof args[2] === 'function') { // legacy\n        return nativeMethod.apply(this, arguments)\n        .then(function() {\n          if (typeof args[1] === 'function') {\n            args[1].apply(null);\n          }\n        }, function(error) {\n          if (typeof args[2] === 'function') {\n            args[2].apply(null, [error]);\n          }\n        });\n      }\n      return nativeMethod.apply(this, arguments);\n    };\n  });\n\n  // getStats is special. It doesn't have a spec legacy method yet we support\n  // getStats(something, cb) without error callbacks.\n  ['getStats'].forEach(function(method) {\n    var nativeMethod = RTCPeerConnection.prototype[method];\n    RTCPeerConnection.prototype[method] = function() {\n      var args = arguments;\n      if (typeof args[1] === 'function') {\n        return nativeMethod.apply(this, arguments)\n        .then(function() {\n          if (typeof args[1] === 'function') {\n            args[1].apply(null);\n          }\n        });\n      }\n      return nativeMethod.apply(this, arguments);\n    };\n  });\n\n  return RTCPeerConnection;\n};\n","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nexports.WebRtcPeerRecvonly = WebRtcPeerRecvonly;\nexports.WebRtcPeerSendonly = WebRtcPeerSendonly;\nexports.WebRtcPeerSendrecv = WebRtcPeerSendrecv;\nObject.defineProperty(exports, \"createCanvas\", {\n  enumerable: true,\n  get: function () {\n    return _WebRtcPeer.createCanvas;\n  }\n});\nObject.defineProperty(exports, \"WebRtcPeer\", {\n  enumerable: true,\n  get: function () {\n    return _WebRtcPeer.WebRtcPeer;\n  }\n});\nObject.defineProperty(exports, \"WebRtcPeerCore\", {\n  enumerable: true,\n  get: function () {\n    return _WebRtcPeerCore.default;\n  }\n});\nexports.default = void 0;\n\nvar _WebRtcPeer = require(\"./WebRtcPeer\");\n\nvar _WebRtcPeerCore = _interopRequireDefault(require(\"./WebRtcPeerCore\"));\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/*\r\n * (C) Copyright 2014-2020 Kurento (http://kurento.org/)\r\n *\r\n * Licensed under the Apache License, Version 2.0 (the \"License\");\r\n * you may not use this file except in compliance with the License.\r\n * You may obtain a copy of the License at\r\n *\r\n *   http://www.apache.org/licenses/LICENSE-2.0\r\n *\r\n * Unless required by applicable law or agreed to in writing, software\r\n * distributed under the License is distributed on an \"AS IS\" BASIS,\r\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n * See the License for the specific language governing permissions and\r\n * limitations under the License.\r\n */\n\n/**\r\n * This module contains a set of reusable components that have been found useful\r\n * during the development of the WebRTC applications with Kurento.\r\n *\r\n * @module kurentoUtils\r\n *\r\n * @copyright 2014 Kurento (http://kurento.org/)\r\n * @license ALv2\r\n *\r\n * @author Jesús Leganés Combarro \"piranna\" (piranna@gmail.com)\r\n * @since 4.2.4\r\n */\n//\n// Specialized child classes\n//\nfunction WebRtcPeerRecvonly(options, callback) {\n  const result = new _WebRtcPeer.WebRtcPeer('recvonly', options, callback);\n  result.constructor = WebRtcPeerRecvonly;\n  result.__proto__ = WebRtcPeerRecvonly.prototype;\n  return result;\n}\n\nWebRtcPeerRecvonly.prototype = _WebRtcPeer.WebRtcPeer.prototype;\n\nfunction WebRtcPeerSendonly(options, callback) {\n  const result = new _WebRtcPeer.WebRtcPeer('sendonly', options, callback);\n  result.constructor = WebRtcPeerSendonly;\n  result.__proto__ = WebRtcPeerSendonly.prototype;\n  return result;\n}\n\nWebRtcPeerSendonly.prototype = _WebRtcPeer.WebRtcPeer.prototype;\n\nfunction WebRtcPeerSendrecv(options, callback) {\n  const result = new _WebRtcPeer.WebRtcPeer('sendrecv', options, callback);\n  result.constructor = WebRtcPeerSendrecv;\n  result.__proto__ = WebRtcPeerSendrecv.prototype;\n  return result;\n}\n\nWebRtcPeerSendrecv.prototype = _WebRtcPeer.WebRtcPeer.prototype;\nvar _default = {\n  WebRtcPeer: _WebRtcPeer.WebRtcPeer,\n  WebRtcPeerCore: _WebRtcPeerCore.default,\n  WebRtcPeerRecvonly,\n  WebRtcPeerSendonly,\n  WebRtcPeerSendrecv\n}; // https://github.com/Automattic/node-canvas/issues/487\n\nexports.default = _default;","\"use strict\";\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\nObject.defineProperty(exports, \"createCanvas\", {\n  enumerable: true,\n  get: function () {\n    return _WebRtcPeerCore.createCanvas;\n  }\n});\nexports.default = exports.WebRtcPeer = void 0;\n\nvar _uaParserJs = _interopRequireDefault(require(\"ua-parser-js\"));\n\nvar _wrtc = require(\"wrtc\");\n\nvar _WebRtcPeerCore = require(\"./WebRtcPeerCore\");\n\nvar _window$navigator;\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classPrivateMethodGet(receiver, privateSet, fn) { if (!privateSet.has(receiver)) { throw new TypeError(\"attempted to get private field on non-instance\"); } return fn; }\n\nfunction _classPrivateFieldGet(receiver, privateMap) { var descriptor = _classExtractFieldDescriptor(receiver, privateMap, \"get\"); return _classApplyDescriptorGet(receiver, descriptor); }\n\nfunction _classApplyDescriptorGet(receiver, descriptor) { if (descriptor.get) { return descriptor.get.call(receiver); } return descriptor.value; }\n\nfunction _classPrivateFieldSet(receiver, privateMap, value) { var descriptor = _classExtractFieldDescriptor(receiver, privateMap, \"set\"); _classApplyDescriptorSet(receiver, descriptor, value); return value; }\n\nfunction _classExtractFieldDescriptor(receiver, privateMap, action) { if (!privateMap.has(receiver)) { throw new TypeError(\"attempted to \" + action + \" private field on non-instance\"); } return privateMap.get(receiver); }\n\nfunction _classApplyDescriptorSet(receiver, descriptor, value) { if (descriptor.set) { descriptor.set.call(receiver, value); } else { if (!descriptor.writable) { throw new TypeError(\"attempted to set read only private field\"); } descriptor.value = value; } }\n\n// Somehow, the UAParser constructor gets an empty window object.\n// We need to pass the user agent string in order to get information\nconst ua = typeof window !== 'undefined' && ((_window$navigator = window.navigator) === null || _window$navigator === void 0 ? void 0 : _window$navigator.userAgent) || '';\nconst parser = new _uaParserJs.default(ua);\nconst {\n  name\n} = parser.getBrowser();\nconst usePlanB = name === 'Chrome' || name === 'Chromium';\n/**\r\n * Wrapper object of an {RTCPeerConnection}. This object is aimed to simplify\r\n * the development of WebRTC-based applications.\r\n */\n\nvar _localVideo = /*#__PURE__*/new WeakMap();\n\nvar _remoteVideo = /*#__PURE__*/new WeakMap();\n\nvar _setRemoteVideo = /*#__PURE__*/new WeakMap();\n\nvar _setLocalVideo = /*#__PURE__*/new WeakSet();\n\nclass WebRtcPeer extends _WebRtcPeerCore.WebRtcPeerCore {\n  /**\r\n   * @constructor module:kurentoUtils.WebRtcPeer\r\n   *\r\n   * @param {String} mode Mode in which the PeerConnection will be configured.\r\n   *  Valid values are: 'recv', 'send', and 'sendRecv'\r\n   * @param {Object} [options]\r\n   * @param {MediaStream} [options.audioStream] Stream to be used as second\r\n   *  source (typically for audio) for localVideo and to be added as stream to\r\n   *  the {RTCPeerConnection}\r\n   * @param {HTMLVideoElement} [options.localVideo] Video tag for the local\r\n   *  stream\r\n   * @param {HTMLVideoElement} [options.remoteVideo] Video tag for the remote\r\n   *  stream\r\n   * @param {MediaStream} [options.videoStream] Stream to be used as primary\r\n   *  source (typically video and audio, or only video if combined with\r\n   *  audioStream) for localVideo and to be added as stream to the\r\n   *  {RTCPeerConnection}\r\n   */\n  constructor(mode, options, callback) {\n    if (options instanceof Function) {\n      callback = options;\n      options = undefined;\n    }\n\n    const {\n      localVideo,\n      remoteVideo,\n      ...coreOptions\n    } = options || {};\n    super(mode, {\n      usePlanB,\n      ...coreOptions\n    }, callback);\n\n    _setLocalVideo.add(this);\n\n    _localVideo.set(this, {\n      writable: true,\n      value: void 0\n    });\n\n    _remoteVideo.set(this, {\n      writable: true,\n      value: void 0\n    });\n\n    _setRemoteVideo.set(this, {\n      writable: true,\n      value: () => {\n        if (!_classPrivateFieldGet(this, _remoteVideo)) return;\n        const stream = new _wrtc.MediaStream();\n\n        for (const {\n          track\n        } of this.peerConnection.getReceivers()) stream.addTrack(track);\n\n        _classPrivateFieldGet(this, _remoteVideo).pause();\n\n        _classPrivateFieldGet(this, _remoteVideo).srcObject = stream;\n\n        _classPrivateFieldGet(this, _remoteVideo).load();\n      }\n    });\n\n    _classPrivateFieldSet(this, _localVideo, localVideo);\n\n    _classPrivateFieldSet(this, _remoteVideo, remoteVideo);\n\n    this.on('setRemoteVideo', _classPrivateFieldGet(this, _setRemoteVideo));\n    this.on('setLocalVideo', _classPrivateMethodGet(this, _setLocalVideo, _setLocalVideo2));\n  } //\n  // Public API\n  //\n\n  /**\r\n   * @member {(external:ImageData|undefined)} currentFrame\r\n   */\n\n\n  get currentFrame() {\n    let video = _classPrivateFieldGet(this, _remoteVideo);\n\n    if (!video) {\n      // We have a remote stream but we didn't set a remoteVideo tag\n      const receivers = this.peerConnection.getReceivers();\n      if (!receivers.length) throw new Error('No remote video stream available');\n      const stream = new _wrtc.MediaStream();\n\n      for (const {\n        track\n      } of receivers) stream.addTrack(track);\n\n      video = document.createElement('video');\n      video.srcObject = stream;\n    } else if (video.readyState < video.HAVE_CURRENT_DATA) throw new Error('No remote video stream data available');\n\n    const canvas = (0, _WebRtcPeerCore.createCanvas)(video.videoWidth, video.videoHeight);\n    canvas.getContext('2d').drawImage(video, 0, 0);\n\n    if (!_classPrivateFieldGet(this, _remoteVideo)) {\n      video.pause();\n      video.srcObject = null;\n      video.load();\n    }\n\n    return canvas;\n  }\n\n  get localVideo() {\n    return _classPrivateFieldGet(this, _localVideo);\n  }\n\n  get remoteVideo() {\n    return _classPrivateFieldGet(this, _remoteVideo);\n  }\n  /**\r\n   * @description This method frees the resources used by WebRtcPeer.\r\n   *\r\n   * @function module:kurentoUtils.WebRtcPeer.prototype.dispose\r\n   */\n\n\n  dispose() {\n    if (_classPrivateFieldGet(this, _localVideo)) {\n      _classPrivateFieldGet(this, _localVideo).pause();\n\n      _classPrivateFieldGet(this, _localVideo).srcObject = null;\n\n      _classPrivateFieldGet(this, _localVideo).load();\n\n      _classPrivateFieldGet(this, _localVideo).muted = false;\n    }\n\n    if (_classPrivateFieldGet(this, _remoteVideo)) {\n      _classPrivateFieldGet(this, _remoteVideo).pause();\n\n      _classPrivateFieldGet(this, _remoteVideo).srcObject = null;\n\n      _classPrivateFieldGet(this, _remoteVideo).load();\n    }\n\n    super.dispose();\n  } //\n  // Deprecated public APIs\n  //\n\n  /**\r\n   * Get local session descriptor\r\n   *\r\n   * @deprecated use `WebRtcPeerCore.peerConnection.localDescription` instead\r\n   */\n\n  /* istanbul ignore next */\n\n\n  getLocalSessionDescriptor() {\n    return this.peerConnection.localDescription;\n  }\n  /**\r\n   * Get local stream\r\n   *\r\n   * @deprecated use directly `WebRtcPeerCore.getSender()`\r\n   */\n\n  /* istanbul ignore next */\n\n\n  getLocalStream(index) {\n    const stream = new _wrtc.MediaStream();\n\n    for (const {\n      track\n    } of this.getSender(index)) stream.addTrack(track);\n\n    return stream;\n  }\n  /**\r\n   * Get remote session descriptor\r\n   *\r\n   * @deprecated use `WebRtcPeerCore.peerConnection.remoteDescription` instead\r\n   */\n\n  /* istanbul ignore next */\n\n\n  getRemoteSessionDescriptor() {\n    return this.peerConnection.remoteDescription;\n  }\n  /**\r\n   * Get remote stream\r\n   *\r\n   * @deprecated use directly `WebRtcPeerCore.getReceiver()`\r\n   */\n\n  /* istanbul ignore next */\n\n\n  getRemoteStream(index) {\n    const stream = new _wrtc.MediaStream();\n\n    for (const {\n      track\n    } of this.getSender(index)) stream.addTrack(track);\n\n    return stream;\n  }\n  /**\r\n   * Set the local video to the current local video stream\r\n   *\r\n   * @deprecated Local video is automatically set, this is a no-op, don't use it\r\n   */\n\n  /* istanbul ignore next */\n\n\n  showLocalVideo() {} //\n  // Private API\n  //\n\n\n}\n\nexports.WebRtcPeer = WebRtcPeer;\n\nfunction _setLocalVideo2() {\n  if (!_classPrivateFieldGet(this, _localVideo)) return;\n  _classPrivateFieldGet(this, _localVideo).srcObject = this.videoStream;\n  _classPrivateFieldGet(this, _localVideo).muted = true;\n}\n\nvar _default = WebRtcPeer; // https://github.com/Automattic/node-canvas/issues/487\n\nexports.default = _default;","/*!@license\n * UAParser.js v0.7.28\n * Lightweight JavaScript-based User-Agent string parser\n * https://github.com/faisalman/ua-parser-js\n *\n * Copyright © 2012-2021 Faisal Salman <f@faisalman.com>\n * Licensed under MIT License\n */\n\n(function (window, undefined) {\n\n    'use strict';\n\n    //////////////\n    // Constants\n    /////////////\n\n\n    var LIBVERSION  = '0.7.28',\n        EMPTY       = '',\n        UNKNOWN     = '?',\n        FUNC_TYPE   = 'function',\n        UNDEF_TYPE  = 'undefined',\n        OBJ_TYPE    = 'object',\n        STR_TYPE    = 'string',\n        MAJOR       = 'major', // deprecated\n        MODEL       = 'model',\n        NAME        = 'name',\n        TYPE        = 'type',\n        VENDOR      = 'vendor',\n        VERSION     = 'version',\n        ARCHITECTURE= 'architecture',\n        CONSOLE     = 'console',\n        MOBILE      = 'mobile',\n        TABLET      = 'tablet',\n        SMARTTV     = 'smarttv',\n        WEARABLE    = 'wearable',\n        EMBEDDED    = 'embedded',\n        UA_MAX_LENGTH = 255;\n\n\n    ///////////\n    // Helper\n    //////////\n\n\n    var util = {\n        extend : function (regexes, extensions) {\n            var mergedRegexes = {};\n            for (var i in regexes) {\n                if (extensions[i] && extensions[i].length % 2 === 0) {\n                    mergedRegexes[i] = extensions[i].concat(regexes[i]);\n                } else {\n                    mergedRegexes[i] = regexes[i];\n                }\n            }\n            return mergedRegexes;\n        },\n        has : function (str1, str2) {\n            return typeof str1 === STR_TYPE ? str2.toLowerCase().indexOf(str1.toLowerCase()) !== -1 : false;\n        },\n        lowerize : function (str) {\n            return str.toLowerCase();\n        },\n        major : function (version) {\n            return typeof(version) === STR_TYPE ? version.replace(/[^\\d\\.]/g,'').split(\".\")[0] : undefined;\n        },\n        trim : function (str, len) {\n            str = str.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, '');\n            return typeof(len) === UNDEF_TYPE ? str : str.substring(0, UA_MAX_LENGTH);\n        }\n    };\n\n\n    ///////////////\n    // Map helper\n    //////////////\n\n\n    var mapper = {\n\n        rgx : function (ua, arrays) {\n\n            var i = 0, j, k, p, q, matches, match;\n\n            // loop through all regexes maps\n            while (i < arrays.length && !matches) {\n\n                var regex = arrays[i],       // even sequence (0,2,4,..)\n                    props = arrays[i + 1];   // odd sequence (1,3,5,..)\n                j = k = 0;\n\n                // try matching uastring with regexes\n                while (j < regex.length && !matches) {\n\n                    matches = regex[j++].exec(ua);\n\n                    if (!!matches) {\n                        for (p = 0; p < props.length; p++) {\n                            match = matches[++k];\n                            q = props[p];\n                            // check if given property is actually array\n                            if (typeof q === OBJ_TYPE && q.length > 0) {\n                                if (q.length == 2) {\n                                    if (typeof q[1] == FUNC_TYPE) {\n                                        // assign modified match\n                                        this[q[0]] = q[1].call(this, match);\n                                    } else {\n                                        // assign given value, ignore regex match\n                                        this[q[0]] = q[1];\n                                    }\n                                } else if (q.length == 3) {\n                                    // check whether function or regex\n                                    if (typeof q[1] === FUNC_TYPE && !(q[1].exec && q[1].test)) {\n                                        // call function (usually string mapper)\n                                        this[q[0]] = match ? q[1].call(this, match, q[2]) : undefined;\n                                    } else {\n                                        // sanitize match using given regex\n                                        this[q[0]] = match ? match.replace(q[1], q[2]) : undefined;\n                                    }\n                                } else if (q.length == 4) {\n                                        this[q[0]] = match ? q[3].call(this, match.replace(q[1], q[2])) : undefined;\n                                }\n                            } else {\n                                this[q] = match ? match : undefined;\n                            }\n                        }\n                    }\n                }\n                i += 2;\n            }\n        },\n\n        str : function (str, map) {\n\n            for (var i in map) {\n                // check if array\n                if (typeof map[i] === OBJ_TYPE && map[i].length > 0) {\n                    for (var j = 0; j < map[i].length; j++) {\n                        if (util.has(map[i][j], str)) {\n                            return (i === UNKNOWN) ? undefined : i;\n                        }\n                    }\n                } else if (util.has(map[i], str)) {\n                    return (i === UNKNOWN) ? undefined : i;\n                }\n            }\n            return str;\n        }\n    };\n\n\n    ///////////////\n    // String map\n    //////////////\n\n\n    var maps = {\n\n        browser : {\n            // Safari < 3.0\n            oldSafari : {\n                version : {\n                    '1.0'   : '/8',\n                    '1.2'   : '/1',\n                    '1.3'   : '/3',\n                    '2.0'   : '/412',\n                    '2.0.2' : '/416',\n                    '2.0.3' : '/417',\n                    '2.0.4' : '/419',\n                    '?'     : '/'\n                }\n            },\n            oldEdge : {\n                version : {\n                    '0.1'   : '12.',\n                    '21'    : '13.',\n                    '31'    : '14.',\n                    '39'    : '15.',\n                    '41'    : '16.',\n                    '42'    : '17.',\n                    '44'    : '18.'\n                }\n            }\n        },\n\n        os : {\n            windows : {\n                version : {\n                    'ME'        : '4.90',\n                    'NT 3.11'   : 'NT3.51',\n                    'NT 4.0'    : 'NT4.0',\n                    '2000'      : 'NT 5.0',\n                    'XP'        : ['NT 5.1', 'NT 5.2'],\n                    'Vista'     : 'NT 6.0',\n                    '7'         : 'NT 6.1',\n                    '8'         : 'NT 6.2',\n                    '8.1'       : 'NT 6.3',\n                    '10'        : ['NT 6.4', 'NT 10.0'],\n                    'RT'        : 'ARM'\n                }\n            }\n        }\n    };\n\n\n    //////////////\n    // Regex map\n    /////////////\n\n\n    var regexes = {\n\n        browser : [[\n\n            /\\b(?:crmo|crios)\\/([\\w\\.]+)/i                                      // Chrome for Android/iOS\n            ], [VERSION, [NAME, 'Chrome']], [\n            /edg(?:e|ios|a)?\\/([\\w\\.]+)/i                                       // Microsoft Edge\n            ], [VERSION, [NAME, 'Edge']], [\n            // breaking change (reserved for next major release):\n            ///edge\\/([\\w\\.]+)/i                                                  // Old Edge (Trident)\n            //], [[VERSION, mapper.str, maps.browser.oldEdge.version], [NAME, 'Edge']], [\n\n            // Presto based\n            /(opera\\smini)\\/([\\w\\.-]+)/i,                                       // Opera Mini\n            /(opera\\s[mobiletab]{3,6})\\b.+version\\/([\\w\\.-]+)/i,                // Opera Mobi/Tablet\n            /(opera)(?:.+version\\/|[\\/\\s]+)([\\w\\.]+)/i,                         // Opera\n            ], [NAME, VERSION], [\n            /opios[\\/\\s]+([\\w\\.]+)/i                                            // Opera mini on iphone >= 8.0\n            ], [VERSION, [NAME, 'Opera Mini']], [\n            /\\sopr\\/([\\w\\.]+)/i                                                 // Opera Webkit\n            ], [VERSION, [NAME, 'Opera']], [\n\n            // Mixed\n            /(kindle)\\/([\\w\\.]+)/i,                                             // Kindle\n            /(lunascape|maxthon|netfront|jasmine|blazer)[\\/\\s]?([\\w\\.]*)/i,     // Lunascape/Maxthon/Netfront/Jasmine/Blazer\n            // Trident based\n            /(avant\\s|iemobile|slim)(?:browser)?[\\/\\s]?([\\w\\.]*)/i,             // Avant/IEMobile/SlimBrowser\n            /(ba?idubrowser)[\\/\\s]?([\\w\\.]+)/i,                                 // Baidu Browser\n            /(?:ms|\\()(ie)\\s([\\w\\.]+)/i,                                        // Internet Explorer\n\n            // Webkit/KHTML based\n            /(flock|rockmelt|midori|epiphany|silk|skyfire|ovibrowser|bolt|iron|vivaldi|iridium|phantomjs|bowser|quark|qupzilla|falkon)\\/([\\w\\.-]+)/i,\n                                                                                // Flock/RockMelt/Midori/Epiphany/Silk/Skyfire/Bolt/Iron/Iridium/PhantomJS/Bowser/QupZilla/Falkon\n            /(rekonq|puffin|brave|whale|qqbrowserlite|qq)\\/([\\w\\.]+)/i,         // Rekonq/Puffin/Brave/Whale/QQBrowserLite/QQ, aka ShouQ\n            /(weibo)__([\\d\\.]+)/i                                               // Weibo\n            ], [NAME, VERSION], [\n            /(?:[\\s\\/]uc?\\s?browser|(?:juc.+)ucweb)[\\/\\s]?([\\w\\.]+)/i           // UCBrowser\n            ], [VERSION, [NAME, 'UCBrowser']], [\n            /(?:windowswechat)?\\sqbcore\\/([\\w\\.]+)\\b.*(?:windowswechat)?/i      // WeChat Desktop for Windows Built-in Browser\n            ], [VERSION, [NAME, 'WeChat(Win) Desktop']], [\n            /micromessenger\\/([\\w\\.]+)/i                                        // WeChat\n            ], [VERSION, [NAME, 'WeChat']], [\n            /konqueror\\/([\\w\\.]+)/i                                             // Konqueror\n            ], [VERSION, [NAME, 'Konqueror']], [\n            /trident.+rv[:\\s]([\\w\\.]{1,9})\\b.+like\\sgecko/i                     // IE11\n            ], [VERSION, [NAME, 'IE']], [\n            /yabrowser\\/([\\w\\.]+)/i                                             // Yandex\n            ], [VERSION, [NAME, 'Yandex']], [\n            /(avast|avg)\\/([\\w\\.]+)/i                                           // Avast/AVG Secure Browser\n            ], [[NAME, /(.+)/, '$1 Secure Browser'], VERSION], [\n            /focus\\/([\\w\\.]+)/i                                                 // Firefox Focus\n            ], [VERSION, [NAME, 'Firefox Focus']], [\n            /opt\\/([\\w\\.]+)/i                                                   // Opera Touch\n            ], [VERSION, [NAME, 'Opera Touch']], [\n            /coc_coc_browser\\/([\\w\\.]+)/i                                       // Coc Coc Browser\n            ], [VERSION, [NAME, 'Coc Coc']], [\n            /dolfin\\/([\\w\\.]+)/i                                                // Dolphin\n            ], [VERSION, [NAME, 'Dolphin']], [\n            /coast\\/([\\w\\.]+)/i                                                 // Opera Coast\n            ], [VERSION, [NAME, 'Opera Coast']],\n            [/xiaomi\\/miuibrowser\\/([\\w\\.]+)/i                                  // MIUI Browser\n            ], [VERSION, [NAME, 'MIUI Browser']], [\n            /fxios\\/([\\w\\.-]+)/i                                                // Firefox for iOS\n            ], [VERSION, [NAME, 'Firefox']], [\n            /(qihu|qhbrowser|qihoobrowser|360browser)/i                         // 360\n            ], [[NAME, '360 Browser']], [\n            /(oculus|samsung|sailfish)browser\\/([\\w\\.]+)/i\n            ], [[NAME, /(.+)/, '$1 Browser'], VERSION], [                       // Oculus/Samsung/Sailfish Browser\n            /(comodo_dragon)\\/([\\w\\.]+)/i                                       // Comodo Dragon\n            ], [[NAME, /_/g, ' '], VERSION], [\n            /\\s(electron)\\/([\\w\\.]+)\\ssafari/i,                                 // Electron-based App\n            /(tesla)(?:\\sqtcarbrowser|\\/(20[12]\\d\\.[\\w\\.-]+))/i,                // Tesla\n            /m?(qqbrowser|baiduboxapp|2345Explorer)[\\/\\s]?([\\w\\.]+)/i           // QQBrowser/Baidu App/2345 Browser\n            ], [NAME, VERSION], [\n            /(MetaSr)[\\/\\s]?([\\w\\.]+)/i,                                        // SouGouBrowser\n            /(LBBROWSER)/i                                                      // LieBao Browser\n            ], [NAME], [\n\n            // WebView\n            /;fbav\\/([\\w\\.]+);/i                                                // Facebook App for iOS & Android with version\n            ], [VERSION, [NAME, 'Facebook']], [\n            /FBAN\\/FBIOS|FB_IAB\\/FB4A/i                                         // Facebook App for iOS & Android without version\n            ], [[NAME, 'Facebook']], [\n            /safari\\s(line)\\/([\\w\\.]+)/i,                                       // Line App for iOS\n            /\\b(line)\\/([\\w\\.]+)\\/iab/i,                                        // Line App for Android\n            /(chromium|instagram)[\\/\\s]([\\w\\.-]+)/i                             // Chromium/Instagram\n            ], [NAME, VERSION], [\n            /\\bgsa\\/([\\w\\.]+)\\s.*safari\\//i                                     // Google Search Appliance on iOS\n            ], [VERSION, [NAME, 'GSA']], [\n\n            /headlesschrome(?:\\/([\\w\\.]+)|\\s)/i                                 // Chrome Headless\n            ], [VERSION, [NAME, 'Chrome Headless']], [\n\n            /\\swv\\).+(chrome)\\/([\\w\\.]+)/i                                      // Chrome WebView\n            ], [[NAME, 'Chrome WebView'], VERSION], [\n\n            /droid.+\\sversion\\/([\\w\\.]+)\\b.+(?:mobile\\ssafari|safari)/i         // Android Browser\n            ], [VERSION, [NAME, 'Android Browser']], [\n\n            /(chrome|omniweb|arora|[tizenoka]{5}\\s?browser)\\/v?([\\w\\.]+)/i      // Chrome/OmniWeb/Arora/Tizen/Nokia\n            ], [NAME, VERSION], [\n\n            /version\\/([\\w\\.]+)\\s.*mobile\\/\\w+\\s(safari)/i                      // Mobile Safari\n            ], [VERSION, [NAME, 'Mobile Safari']], [\n            /version\\/([\\w\\.]+)\\s.*(mobile\\s?safari|safari)/i                   // Safari & Safari Mobile\n            ], [VERSION, NAME], [\n            /webkit.+?(mobile\\s?safari|safari)(\\/[\\w\\.]+)/i                     // Safari < 3.0\n            ], [NAME, [VERSION, mapper.str, maps.browser.oldSafari.version]], [\n\n            /(webkit|khtml)\\/([\\w\\.]+)/i\n            ], [NAME, VERSION], [\n\n            // Gecko based\n            /(navigator|netscape)\\/([\\w\\.-]+)/i                                 // Netscape\n            ], [[NAME, 'Netscape'], VERSION], [\n            /ile\\svr;\\srv:([\\w\\.]+)\\).+firefox/i                                // Firefox Reality\n            ], [VERSION, [NAME, 'Firefox Reality']], [\n            /ekiohf.+(flow)\\/([\\w\\.]+)/i,                                       // Flow\n            /(swiftfox)/i,                                                      // Swiftfox\n            /(icedragon|iceweasel|camino|chimera|fennec|maemo\\sbrowser|minimo|conkeror)[\\/\\s]?([\\w\\.\\+]+)/i,\n                                                                                // IceDragon/Iceweasel/Camino/Chimera/Fennec/Maemo/Minimo/Conkeror\n            /(firefox|seamonkey|k-meleon|icecat|iceape|firebird|phoenix|palemoon|basilisk|waterfox)\\/([\\w\\.-]+)$/i,\n                                                                                // Firefox/SeaMonkey/K-Meleon/IceCat/IceApe/Firebird/Phoenix\n            /(firefox)\\/([\\w\\.]+)\\s[\\w\\s\\-]+\\/[\\w\\.]+$/i,                       // Other Firefox-based\n            /(mozilla)\\/([\\w\\.]+)\\s.+rv\\:.+gecko\\/\\d+/i,                        // Mozilla\n\n            // Other\n            /(polaris|lynx|dillo|icab|doris|amaya|w3m|netsurf|sleipnir)[\\/\\s]?([\\w\\.]+)/i,\n                                                                                // Polaris/Lynx/Dillo/iCab/Doris/Amaya/w3m/NetSurf/Sleipnir\n            /(links)\\s\\(([\\w\\.]+)/i,                                            // Links\n            /(gobrowser)\\/?([\\w\\.]*)/i,                                         // GoBrowser\n            /(ice\\s?browser)\\/v?([\\w\\._]+)/i,                                   // ICE Browser\n            /(mosaic)[\\/\\s]([\\w\\.]+)/i                                          // Mosaic\n            ], [NAME, VERSION]\n        ],\n\n        cpu : [[\n\n            /(?:(amd|x(?:(?:86|64)[_-])?|wow|win)64)[;\\)]/i                     // AMD64 (x64)\n            ], [[ARCHITECTURE, 'amd64']], [\n\n            /(ia32(?=;))/i                                                      // IA32 (quicktime)\n            ], [[ARCHITECTURE, util.lowerize]], [\n\n            /((?:i[346]|x)86)[;\\)]/i                                            // IA32 (x86)\n            ], [[ARCHITECTURE, 'ia32']], [\n\n            /\\b(aarch64|armv?8e?l?)\\b/i                                         // ARM64\n            ], [[ARCHITECTURE, 'arm64']], [\n\n            /\\b(arm(?:v[67])?ht?n?[fl]p?)\\b/i                                   // ARMHF\n            ], [[ARCHITECTURE, 'armhf']], [\n\n            // PocketPC mistakenly identified as PowerPC\n            /windows\\s(ce|mobile);\\sppc;/i\n            ], [[ARCHITECTURE, 'arm']], [\n\n            /((?:ppc|powerpc)(?:64)?)(?:\\smac|;|\\))/i                           // PowerPC\n            ], [[ARCHITECTURE, /ower/, '', util.lowerize]], [\n\n            /(sun4\\w)[;\\)]/i                                                    // SPARC\n            ], [[ARCHITECTURE, 'sparc']], [\n\n            /((?:avr32|ia64(?=;))|68k(?=\\))|\\barm(?:64|(?=v(?:[1-7]|[5-7]1)l?|;|eabi))|(?=atmel\\s)avr|(?:irix|mips|sparc)(?:64)?\\b|pa-risc)/i\n                                                                                // IA64, 68K, ARM/64, AVR/32, IRIX/64, MIPS/64, SPARC/64, PA-RISC\n            ], [[ARCHITECTURE, util.lowerize]]\n        ],\n\n        device : [[\n\n            //////////////////////////\n            // MOBILES & TABLETS\n            // Ordered by popularity\n            /////////////////////////\n\n            // Samsung\n            /\\b(sch-i[89]0\\d|shw-m380s|sm-[pt]\\w{2,4}|gt-[pn]\\d{2,4}|sgh-t8[56]9|nexus\\s10)/i\n            ], [MODEL, [VENDOR, 'Samsung'], [TYPE, TABLET]], [\n            /\\b((?:s[cgp]h|gt|sm)-\\w+|galaxy\\snexus)/i,\n            /\\ssamsung[\\s-]([\\w-]+)/i,\n            /sec-(sgh\\w+)/i\n            ], [MODEL, [VENDOR, 'Samsung'], [TYPE, MOBILE]], [\n\n            // Apple\n            /\\((ip(?:hone|od)[\\s\\w]*);/i                                        // iPod/iPhone\n            ], [MODEL, [VENDOR, 'Apple'], [TYPE, MOBILE]], [\n            /\\((ipad);[\\w\\s\\),;-]+apple/i,                                      // iPad\n            /applecoremedia\\/[\\w\\.]+\\s\\((ipad)/i,\n            /\\b(ipad)\\d\\d?,\\d\\d?[;\\]].+ios/i\n            ], [MODEL, [VENDOR, 'Apple'], [TYPE, TABLET]], [\n\n            // Huawei\n            /\\b((?:agr|ags[23]|bah2?|sht?)-a?[lw]\\d{2})/i,\n            ], [MODEL, [VENDOR, 'Huawei'], [TYPE, TABLET]], [\n            /d\\/huawei([\\w\\s-]+)[;\\)]/i,\n            /\\b(nexus\\s6p|vog-[at]?l\\d\\d|ane-[at]?l[x\\d]\\d|eml-a?l\\d\\da?|lya-[at]?l\\d[\\dc]|clt-a?l\\d\\di?|ele-l\\d\\d)/i,\n            /\\b(\\w{2,4}-[atu][ln][01259][019])[;\\)\\s]/i\n            ], [MODEL, [VENDOR, 'Huawei'], [TYPE, MOBILE]], [\n\n            // Xiaomi\n            /\\b(poco[\\s\\w]+)(?:\\sbuild|\\))/i,                                   // Xiaomi POCO\n            /\\b;\\s(\\w+)\\sbuild\\/hm\\1/i,                                         // Xiaomi Hongmi 'numeric' models\n            /\\b(hm[\\s\\-_]?note?[\\s_]?(?:\\d\\w)?)\\sbuild/i,                       // Xiaomi Hongmi\n            /\\b(redmi[\\s\\-_]?(?:note|k)?[\\w\\s_]+)(?:\\sbuild|\\))/i,              // Xiaomi Redmi\n            /\\b(mi[\\s\\-_]?(?:a\\d|one|one[\\s_]plus|note lte)?[\\s_]?(?:\\d?\\w?)[\\s_]?(?:plus)?)\\sbuild/i  // Xiaomi Mi\n            ], [[MODEL, /_/g, ' '], [VENDOR, 'Xiaomi'], [TYPE, MOBILE]], [\n            /\\b(mi[\\s\\-_]?(?:pad)(?:[\\w\\s_]+))(?:\\sbuild|\\))/i                  // Mi Pad tablets\n            ],[[MODEL, /_/g, ' '], [VENDOR, 'Xiaomi'], [TYPE, TABLET]], [\n\n            // OPPO\n            /;\\s(\\w+)\\sbuild.+\\soppo/i,\n            /\\s(cph[12]\\d{3}|p(?:af|c[al]|d\\w|e[ar])[mt]\\d0|x9007)\\b/i\n            ], [MODEL, [VENDOR, 'OPPO'], [TYPE, MOBILE]], [\n\n            // Vivo\n            /\\svivo\\s(\\w+)(?:\\sbuild|\\))/i,\n            /\\s(v[12]\\d{3}\\w?[at])(?:\\sbuild|;)/i\n            ], [MODEL, [VENDOR, 'Vivo'], [TYPE, MOBILE]], [\n\n            // Realme\n            /\\s(rmx[12]\\d{3})(?:\\sbuild|;)/i\n            ], [MODEL, [VENDOR, 'Realme'], [TYPE, MOBILE]], [\n\n            // Motorola\n            /\\s(milestone|droid(?:[2-4x]|\\s(?:bionic|x2|pro|razr))?:?(\\s4g)?)\\b[\\w\\s]+build\\//i,\n            /\\smot(?:orola)?[\\s-](\\w*)/i,\n            /((?:moto[\\s\\w\\(\\)]+|xt\\d{3,4}|nexus\\s6)(?=\\sbuild|\\)))/i\n            ], [MODEL, [VENDOR, 'Motorola'], [TYPE, MOBILE]], [\n            /\\s(mz60\\d|xoom[\\s2]{0,2})\\sbuild\\//i\n            ], [MODEL, [VENDOR, 'Motorola'], [TYPE, TABLET]], [\n\n            // LG\n            /((?=lg)?[vl]k\\-?\\d{3})\\sbuild|\\s3\\.[\\s\\w;-]{10}lg?-([06cv9]{3,4})/i\n            ], [MODEL, [VENDOR, 'LG'], [TYPE, TABLET]], [\n            /(lm-?f100[nv]?|nexus\\s[45])/i,\n            /lg[e;\\s\\/-]+((?!browser|netcast)\\w+)/i,\n            /\\blg(\\-?[\\d\\w]+)\\sbuild/i\n            ], [MODEL, [VENDOR, 'LG'], [TYPE, MOBILE]], [\n\n            // Lenovo\n            /(ideatab[\\w\\-\\s]+)/i,\n            /lenovo\\s?(s(?:5000|6000)(?:[\\w-]+)|tab(?:[\\s\\w]+)|yt[\\d\\w-]{6}|tb[\\d\\w-]{6})/i        // Lenovo tablets\n            ], [MODEL, [VENDOR, 'Lenovo'], [TYPE, TABLET]], [\n\n            // Nokia\n            /(?:maemo|nokia).*(n900|lumia\\s\\d+)/i,\n            /nokia[\\s_-]?([\\w\\.-]*)/i\n            ], [[MODEL, /_/g, ' '], [VENDOR, 'Nokia'], [TYPE, MOBILE]], [\n\n            // Google\n            /droid.+;\\s(pixel\\sc)[\\s)]/i                                        // Google Pixel C\n            ], [MODEL, [VENDOR, 'Google'], [TYPE, TABLET]], [\n            /droid.+;\\s(pixel[\\s\\daxl]{0,6})(?:\\sbuild|\\))/i                    // Google Pixel\n            ], [MODEL, [VENDOR, 'Google'], [TYPE, MOBILE]], [\n\n            // Sony\n            /droid.+\\s([c-g]\\d{4}|so[-l]\\w+|xq-a\\w[4-7][12])(?=\\sbuild\\/|\\).+chrome\\/(?![1-6]{0,1}\\d\\.))/i\n            ], [MODEL, [VENDOR, 'Sony'], [TYPE, MOBILE]], [\n            /sony\\stablet\\s[ps]\\sbuild\\//i,\n            /(?:sony)?sgp\\w+(?:\\sbuild\\/|\\))/i\n            ], [[MODEL, 'Xperia Tablet'], [VENDOR, 'Sony'], [TYPE, TABLET]], [\n\n            // OnePlus\n            /\\s(kb2005|in20[12]5|be20[12][59])\\b/i,\n            /\\ba000(1)\\sbuild/i,                                                // OnePlus\n            /\\boneplus\\s(a\\d{4})[\\s)]/i\n            ], [MODEL, [VENDOR, 'OnePlus'], [TYPE, MOBILE]], [\n\n            // Amazon\n            /(alexa)webm/i,\n            /(kf[a-z]{2}wi)(\\sbuild\\/|\\))/i,                                    // Kindle Fire without Silk\n            /(kf[a-z]+)(\\sbuild\\/|\\)).+silk\\//i                                 // Kindle Fire HD\n            ], [MODEL, [VENDOR, 'Amazon'], [TYPE, TABLET]], [\n            /(sd|kf)[0349hijorstuw]+(\\sbuild\\/|\\)).+silk\\//i                    // Fire Phone\n            ], [[MODEL, 'Fire Phone'], [VENDOR, 'Amazon'], [TYPE, MOBILE]], [\n\n            // BlackBerry\n            /\\((playbook);[\\w\\s\\),;-]+(rim)/i                                   // BlackBerry PlayBook\n            ], [MODEL, VENDOR, [TYPE, TABLET]], [\n            /((?:bb[a-f]|st[hv])100-\\d)/i,\n            /\\(bb10;\\s(\\w+)/i                                                   // BlackBerry 10\n            ], [MODEL, [VENDOR, 'BlackBerry'], [TYPE, MOBILE]], [\n\n            // Asus\n            /(?:\\b|asus_)(transfo[prime\\s]{4,10}\\s\\w+|eeepc|slider\\s\\w+|nexus\\s7|padfone|p00[cj])/i\n            ], [MODEL, [VENDOR, 'ASUS'], [TYPE, TABLET]], [\n            /\\s(z[es]6[027][01][km][ls]|zenfone\\s\\d\\w?)\\b/i\n            ], [MODEL, [VENDOR, 'ASUS'], [TYPE, MOBILE]], [\n\n            // HTC\n            /(nexus\\s9)/i                                                       // HTC Nexus 9\n            ], [MODEL, [VENDOR, 'HTC'], [TYPE, TABLET]], [\n            /(htc)[;_\\s-]{1,2}([\\w\\s]+(?=\\)|\\sbuild)|\\w+)/i,                    // HTC\n\n            // ZTE\n            /(zte)-(\\w*)/i,\n            /(alcatel|geeksphone|nexian|panasonic|(?=;\\s)sony)[_\\s-]?([\\w-]*)/i // Alcatel/GeeksPhone/Nexian/Panasonic/Sony\n            ], [VENDOR, [MODEL, /_/g, ' '], [TYPE, MOBILE]], [\n\n            // Acer\n            /droid[x\\d\\.\\s;]+\\s([ab][1-7]\\-?[0178a]\\d\\d?)/i\n            ], [MODEL, [VENDOR, 'Acer'], [TYPE, TABLET]], [\n\n            // Meizu\n            /droid.+;\\s(m[1-5]\\snote)\\sbuild/i,\n            /\\bmz-([\\w-]{2,})/i\n            ], [MODEL, [VENDOR, 'Meizu'], [TYPE, MOBILE]], [\n\n            // MIXED\n            /(blackberry|benq|palm(?=\\-)|sonyericsson|acer|asus|dell|meizu|motorola|polytron)[\\s_-]?([\\w-]*)/i,\n                                                                                // BlackBerry/BenQ/Palm/Sony-Ericsson/Acer/Asus/Dell/Meizu/Motorola/Polytron\n            /(hp)\\s([\\w\\s]+\\w)/i,                                               // HP iPAQ\n            /(asus)-?(\\w+)/i,                                                   // Asus\n            /(microsoft);\\s(lumia[\\s\\w]+)/i,                                    // Microsoft Lumia\n            /(lenovo)[_\\s-]?([\\w-]+)/i,                                         // Lenovo\n            /linux;.+(jolla);/i,                                                // Jolla\n            /droid.+;\\s(oppo)\\s?([\\w\\s]+)\\sbuild/i                              // OPPO\n            ], [VENDOR, MODEL, [TYPE, MOBILE]], [\n\n            /(archos)\\s(gamepad2?)/i,                                           // Archos\n            /(hp).+(touchpad(?!.+tablet)|tablet)/i,                             // HP TouchPad\n            /(kindle)\\/([\\w\\.]+)/i,                                             // Kindle\n            /\\s(nook)[\\w\\s]+build\\/(\\w+)/i,                                     // Nook\n            /(dell)\\s(strea[kpr\\s\\d]*[\\dko])/i,                                 // Dell Streak\n            /[;\\/]\\s?(le[\\s\\-]+pan)[\\s\\-]+(\\w{1,9})\\sbuild/i,                   // Le Pan Tablets\n            /[;\\/]\\s?(trinity)[\\-\\s]*(t\\d{3})\\sbuild/i,                         // Trinity Tablets\n            /\\b(gigaset)[\\s\\-]+(q\\w{1,9})\\sbuild/i,                             // Gigaset Tablets\n            /\\b(vodafone)\\s([\\w\\s]+)(?:\\)|\\sbuild)/i                            // Vodafone\n            ], [VENDOR, MODEL, [TYPE, TABLET]], [\n\n            /\\s(surface\\sduo)\\s/i                                               // Surface Duo\n            ], [MODEL, [VENDOR, 'Microsoft'], [TYPE, TABLET]], [\n            /droid\\s[\\d\\.]+;\\s(fp\\du?)\\sbuild/i\n            ], [MODEL, [VENDOR, 'Fairphone'], [TYPE, MOBILE]], [\n            /\\s(u304aa)\\sbuild/i                                                // AT&T\n            ], [MODEL, [VENDOR, 'AT&T'], [TYPE, MOBILE]], [\n            /sie-(\\w*)/i                                                        // Siemens\n            ], [MODEL, [VENDOR, 'Siemens'], [TYPE, MOBILE]], [\n            /[;\\/]\\s?(rct\\w+)\\sbuild/i                                          // RCA Tablets\n            ], [MODEL, [VENDOR, 'RCA'], [TYPE, TABLET]], [\n            /[;\\/\\s](venue[\\d\\s]{2,7})\\sbuild/i                                 // Dell Venue Tablets\n            ], [MODEL, [VENDOR, 'Dell'], [TYPE, TABLET]], [\n            /[;\\/]\\s?(q(?:mv|ta)\\w+)\\sbuild/i                                   // Verizon Tablet\n            ], [MODEL, [VENDOR, 'Verizon'], [TYPE, TABLET]], [\n            /[;\\/]\\s(?:barnes[&\\s]+noble\\s|bn[rt])([\\w\\s\\+]*)\\sbuild/i          // Barnes & Noble Tablet\n            ], [MODEL, [VENDOR, 'Barnes & Noble'], [TYPE, TABLET]], [\n            /[;\\/]\\s(tm\\d{3}\\w+)\\sbuild/i\n            ], [MODEL, [VENDOR, 'NuVision'], [TYPE, TABLET]], [\n            /;\\s(k88)\\sbuild/i                                                  // ZTE K Series Tablet\n            ], [MODEL, [VENDOR, 'ZTE'], [TYPE, TABLET]], [\n            /;\\s(nx\\d{3}j)\\sbuild/i                                             // ZTE Nubia\n            ], [MODEL, [VENDOR, 'ZTE'], [TYPE, MOBILE]], [\n            /[;\\/]\\s?(gen\\d{3})\\sbuild.*49h/i                                   // Swiss GEN Mobile\n            ], [MODEL, [VENDOR, 'Swiss'], [TYPE, MOBILE]], [\n            /[;\\/]\\s?(zur\\d{3})\\sbuild/i                                        // Swiss ZUR Tablet\n            ], [MODEL, [VENDOR, 'Swiss'], [TYPE, TABLET]], [\n            /[;\\/]\\s?((zeki)?tb.*\\b)\\sbuild/i                                   // Zeki Tablets\n            ], [MODEL, [VENDOR, 'Zeki'], [TYPE, TABLET]], [\n            /[;\\/]\\s([yr]\\d{2})\\sbuild/i,\n            /[;\\/]\\s(dragon[\\-\\s]+touch\\s|dt)(\\w{5})\\sbuild/i                   // Dragon Touch Tablet\n            ], [[VENDOR, 'Dragon Touch'], MODEL, [TYPE, TABLET]], [\n            /[;\\/]\\s?(ns-?\\w{0,9})\\sbuild/i                                     // Insignia Tablets\n            ], [MODEL, [VENDOR, 'Insignia'], [TYPE, TABLET]], [\n            /[;\\/]\\s?((nxa|Next)-?\\w{0,9})\\sbuild/i                             // NextBook Tablets\n            ], [MODEL, [VENDOR, 'NextBook'], [TYPE, TABLET]], [\n            /[;\\/]\\s?(xtreme\\_)?(v(1[045]|2[015]|[3469]0|7[05]))\\sbuild/i\n            ], [[VENDOR, 'Voice'], MODEL, [TYPE, MOBILE]], [                    // Voice Xtreme Phones\n            /[;\\/]\\s?(lvtel\\-)?(v1[12])\\sbuild/i                                // LvTel Phones\n            ], [[VENDOR, 'LvTel'], MODEL, [TYPE, MOBILE]], [\n            /;\\s(ph-1)\\s/i\n            ], [MODEL, [VENDOR, 'Essential'], [TYPE, MOBILE]], [                // Essential PH-1\n            /[;\\/]\\s?(v(100md|700na|7011|917g).*\\b)\\sbuild/i                    // Envizen Tablets\n            ], [MODEL, [VENDOR, 'Envizen'], [TYPE, TABLET]], [\n            /[;\\/]\\s?(trio[\\s\\w\\-\\.]+)\\sbuild/i                                 // MachSpeed Tablets\n            ], [MODEL, [VENDOR, 'MachSpeed'], [TYPE, TABLET]], [\n            /[;\\/]\\s?tu_(1491)\\sbuild/i                                         // Rotor Tablets\n            ], [MODEL, [VENDOR, 'Rotor'], [TYPE, TABLET]], [\n            /(shield[\\w\\s]+)\\sbuild/i                                           // Nvidia Shield Tablets\n            ], [MODEL, [VENDOR, 'Nvidia'], [TYPE, TABLET]], [\n            /(sprint)\\s(\\w+)/i                                                  // Sprint Phones\n            ], [VENDOR, MODEL, [TYPE, MOBILE]], [\n            /(kin\\.[onetw]{3})/i                                                // Microsoft Kin\n            ], [[MODEL, /\\./g, ' '], [VENDOR, 'Microsoft'], [TYPE, MOBILE]], [\n            /droid\\s[\\d\\.]+;\\s(cc6666?|et5[16]|mc[239][23]x?|vc8[03]x?)\\)/i     // Zebra\n            ], [MODEL, [VENDOR, 'Zebra'], [TYPE, TABLET]], [\n            /droid\\s[\\d\\.]+;\\s(ec30|ps20|tc[2-8]\\d[kx])\\)/i\n            ], [MODEL, [VENDOR, 'Zebra'], [TYPE, MOBILE]], [\n\n            ///////////////////\n            // CONSOLES\n            ///////////////////\n\n            /\\s(ouya)\\s/i,                                                      // Ouya\n            /(nintendo)\\s([wids3utch]+)/i                                       // Nintendo\n            ], [VENDOR, MODEL, [TYPE, CONSOLE]], [\n            /droid.+;\\s(shield)\\sbuild/i                                        // Nvidia\n            ], [MODEL, [VENDOR, 'Nvidia'], [TYPE, CONSOLE]], [\n            /(playstation\\s[345portablevi]+)/i                                  // Playstation\n            ], [MODEL, [VENDOR, 'Sony'], [TYPE, CONSOLE]], [\n            /[\\s\\(;](xbox(?:\\sone)?(?!;\\sxbox))[\\s\\);]/i                        // Microsoft Xbox\n            ], [MODEL, [VENDOR, 'Microsoft'], [TYPE, CONSOLE]], [\n\n            ///////////////////\n            // SMARTTVS\n            ///////////////////\n\n            /smart-tv.+(samsung)/i                                              // Samsung\n            ], [VENDOR, [TYPE, SMARTTV]], [\n            /hbbtv.+maple;(\\d+)/i\n            ], [[MODEL, /^/, 'SmartTV'], [VENDOR, 'Samsung'], [TYPE, SMARTTV]], [\n            /(?:linux;\\snetcast.+smarttv|lg\\snetcast\\.tv-201\\d)/i,              // LG SmartTV\n            ], [[VENDOR, 'LG'], [TYPE, SMARTTV]], [\n            /(apple)\\s?tv/i                                                     // Apple TV\n            ], [VENDOR, [MODEL, 'Apple TV'], [TYPE, SMARTTV]], [\n            /crkey/i                                                            // Google Chromecast\n            ], [[MODEL, 'Chromecast'], [VENDOR, 'Google'], [TYPE, SMARTTV]], [\n            /droid.+aft([\\w])(\\sbuild\\/|\\))/i                                   // Fire TV\n            ], [MODEL, [VENDOR, 'Amazon'], [TYPE, SMARTTV]], [\n            /\\(dtv[\\);].+(aquos)/i                                              // Sharp\n            ], [MODEL, [VENDOR, 'Sharp'], [TYPE, SMARTTV]], [\n            /hbbtv\\/\\d+\\.\\d+\\.\\d+\\s+\\([\\w\\s]*;\\s*(\\w[^;]*);([^;]*)/i            // HbbTV devices\n            ], [[VENDOR, util.trim], [MODEL, util.trim], [TYPE, SMARTTV]], [\n            /[\\s\\/\\(](android\\s|smart[-\\s]?|opera\\s)tv[;\\)\\s]/i                 // SmartTV from Unidentified Vendors\n            ], [[TYPE, SMARTTV]], [\n\n            ///////////////////\n            // WEARABLES\n            ///////////////////\n\n            /((pebble))app\\/[\\d\\.]+\\s/i                                         // Pebble\n            ], [VENDOR, MODEL, [TYPE, WEARABLE]], [\n            /droid.+;\\s(glass)\\s\\d/i                                            // Google Glass\n            ], [MODEL, [VENDOR, 'Google'], [TYPE, WEARABLE]], [\n            /droid\\s[\\d\\.]+;\\s(wt63?0{2,3})\\)/i\n            ], [MODEL, [VENDOR, 'Zebra'], [TYPE, WEARABLE]], [\n\n            ///////////////////\n            // EMBEDDED\n            ///////////////////\n\n            /(tesla)(?:\\sqtcarbrowser|\\/20[12]\\d\\.[\\w\\.-]+)/i                   // Tesla\n            ], [VENDOR, [TYPE, EMBEDDED]], [\n\n            ////////////////////\n            // MIXED (GENERIC)\n            ///////////////////\n\n            /droid .+?; ([^;]+?)(?: build|\\) applewebkit).+? mobile safari/i    // Android Phones from Unidentified Vendors\n            ], [MODEL, [TYPE, MOBILE]], [\n            /droid .+?;\\s([^;]+?)(?: build|\\) applewebkit).+?(?! mobile) safari/i  // Android Tablets from Unidentified Vendors\n            ], [MODEL, [TYPE, TABLET]], [\n            /\\s(tablet|tab)[;\\/]/i,                                             // Unidentifiable Tablet\n            /\\s(mobile)(?:[;\\/]|\\ssafari)/i                                     // Unidentifiable Mobile\n            ], [[TYPE, util.lowerize]], [\n            /(android[\\w\\.\\s\\-]{0,9});.+build/i                                 // Generic Android Device\n            ], [MODEL, [VENDOR, 'Generic']], [\n            /(phone)/i\n            ], [[TYPE, MOBILE]]\n        ],\n\n        engine : [[\n\n            /windows.+\\sedge\\/([\\w\\.]+)/i                                       // EdgeHTML\n            ], [VERSION, [NAME, 'EdgeHTML']], [\n\n            /webkit\\/537\\.36.+chrome\\/(?!27)([\\w\\.]+)/i                         // Blink\n            ], [VERSION, [NAME, 'Blink']], [\n\n            /(presto)\\/([\\w\\.]+)/i,                                             // Presto\n            /(webkit|trident|netfront|netsurf|amaya|lynx|w3m|goanna)\\/([\\w\\.]+)/i, // WebKit/Trident/NetFront/NetSurf/Amaya/Lynx/w3m/Goanna\n            /ekioh(flow)\\/([\\w\\.]+)/i,                                          // Flow\n            /(khtml|tasman|links)[\\/\\s]\\(?([\\w\\.]+)/i,                          // KHTML/Tasman/Links\n            /(icab)[\\/\\s]([23]\\.[\\d\\.]+)/i                                      // iCab\n            ], [NAME, VERSION], [\n\n            /rv\\:([\\w\\.]{1,9})\\b.+(gecko)/i                                     // Gecko\n            ], [VERSION, NAME]\n        ],\n\n        os : [[\n\n            // Windows\n            /microsoft\\s(windows)\\s(vista|xp)/i                                 // Windows (iTunes)\n            ], [NAME, VERSION], [\n            /(windows)\\snt\\s6\\.2;\\s(arm)/i,                                     // Windows RT\n            /(windows\\sphone(?:\\sos)*)[\\s\\/]?([\\d\\.\\s\\w]*)/i,                   // Windows Phone\n            /(windows\\smobile|windows)[\\s\\/]?([ntce\\d\\.\\s]+\\w)(?!.+xbox)/i\n            ], [NAME, [VERSION, mapper.str, maps.os.windows.version]], [\n            /(win(?=3|9|n)|win\\s9x\\s)([nt\\d\\.]+)/i\n            ], [[NAME, 'Windows'], [VERSION, mapper.str, maps.os.windows.version]], [\n\n            // iOS/macOS\n            /ip[honead]{2,4}\\b(?:.*os\\s([\\w]+)\\slike\\smac|;\\sopera)/i,          // iOS\n            /cfnetwork\\/.+darwin/i\n            ], [[VERSION, /_/g, '.'], [NAME, 'iOS']], [\n            /(mac\\sos\\sx)\\s?([\\w\\s\\.]*)/i,\n            /(macintosh|mac(?=_powerpc)\\s)(?!.+haiku)/i                         // Mac OS\n            ], [[NAME, 'Mac OS'], [VERSION, /_/g, '.']], [\n\n            // Mobile OSes                                                      // Android/WebOS/Palm/QNX/Bada/RIM/MeeGo/Contiki/Sailfish OS\n            /(android|webos|palm\\sos|qnx|bada|rim\\stablet\\sos|meego|sailfish|contiki)[\\/\\s-]?([\\w\\.]*)/i,\n            /(blackberry)\\w*\\/([\\w\\.]*)/i,                                      // Blackberry\n            /(tizen|kaios)[\\/\\s]([\\w\\.]+)/i,                                    // Tizen/KaiOS\n            /\\((series40);/i                                                    // Series 40\n            ], [NAME, VERSION], [\n            /\\(bb(10);/i                                                        // BlackBerry 10\n            ], [VERSION, [NAME, 'BlackBerry']], [\n            /(?:symbian\\s?os|symbos|s60(?=;)|series60)[\\/\\s-]?([\\w\\.]*)/i       // Symbian\n            ], [VERSION, [NAME, 'Symbian']], [\n            /mozilla.+\\(mobile;.+gecko.+firefox/i                               // Firefox OS\n            ], [[NAME, 'Firefox OS']], [\n            /web0s;.+rt(tv)/i,\n            /\\b(?:hp)?wos(?:browser)?\\/([\\w\\.]+)/i                              // WebOS\n            ], [VERSION, [NAME, 'webOS']], [\n\n            // Google Chromecast\n            /crkey\\/([\\d\\.]+)/i                                                 // Google Chromecast\n            ], [VERSION, [NAME, 'Chromecast']], [\n            /(cros)\\s[\\w]+\\s([\\w\\.]+\\w)/i                                       // Chromium OS\n            ], [[NAME, 'Chromium OS'], VERSION],[\n\n            // Console\n            /(nintendo|playstation)\\s([wids345portablevuch]+)/i,                // Nintendo/Playstation\n            /(xbox);\\s+xbox\\s([^\\);]+)/i,                                       // Microsoft Xbox (360, One, X, S, Series X, Series S)\n\n            // GNU/Linux based\n            /(mint)[\\/\\s\\(\\)]?(\\w*)/i,                                          // Mint\n            /(mageia|vectorlinux)[;\\s]/i,                                       // Mageia/VectorLinux\n            /(joli|[kxln]?ubuntu|debian|suse|opensuse|gentoo|arch(?=\\slinux)|slackware|fedora|mandriva|centos|pclinuxos|redhat|zenwalk|linpus|raspbian)(?:\\sgnu\\/linux)?(?:\\slinux)?[\\/\\s-]?(?!chrom|package)([\\w\\.-]*)/i,\n                                                                                // Joli/Ubuntu/Debian/SUSE/Gentoo/Arch/Slackware\n                                                                                // Fedora/Mandriva/CentOS/PCLinuxOS/RedHat/Zenwalk/Linpus\n            /(hurd|linux)\\s?([\\w\\.]*)/i,                                        // Hurd/Linux\n            /(gnu)\\s?([\\w\\.]*)/i,                                               // GNU\n\n            // BSD based\n            /\\s([frentopc-]{0,4}bsd|dragonfly)\\s?(?!amd|[ix346]{1,2}86)([\\w\\.]*)/i,  // FreeBSD/NetBSD/OpenBSD/PC-BSD/DragonFly\n            /(haiku)\\s(\\w+)/i                                                   // Haiku\n            ], [NAME, VERSION], [\n\n            // Other\n            /(sunos)\\s?([\\w\\.\\d]*)/i                                            // Solaris\n            ], [[NAME, 'Solaris'], VERSION], [\n            /((?:open)?solaris)[\\/\\s-]?([\\w\\.]*)/i,                             // Solaris\n            /(aix)\\s((\\d)(?=\\.|\\)|\\s)[\\w\\.])*/i,                                // AIX\n            /(plan\\s9|minix|beos|os\\/2|amigaos|morphos|risc\\sos|openvms|fuchsia)/i,  // Plan9/Minix/BeOS/OS2/AmigaOS/MorphOS/RISCOS/OpenVMS/Fuchsia\n            /(unix)\\s?([\\w\\.]*)/i                                               // UNIX\n            ], [NAME, VERSION]\n        ]\n    };\n\n\n    /////////////////\n    // Constructor\n    ////////////////\n    var UAParser = function (ua, extensions) {\n\n        if (typeof ua === 'object') {\n            extensions = ua;\n            ua = undefined;\n        }\n\n        if (!(this instanceof UAParser)) {\n            return new UAParser(ua, extensions).getResult();\n        }\n\n        var _ua = ua || ((typeof window !== 'undefined' && window.navigator && window.navigator.userAgent) ? window.navigator.userAgent : EMPTY);\n        var _rgxmap = extensions ? util.extend(regexes, extensions) : regexes;\n\n        this.getBrowser = function () {\n            var _browser = { name: undefined, version: undefined };\n            mapper.rgx.call(_browser, _ua, _rgxmap.browser);\n            _browser.major = util.major(_browser.version); // deprecated\n            return _browser;\n        };\n        this.getCPU = function () {\n            var _cpu = { architecture: undefined };\n            mapper.rgx.call(_cpu, _ua, _rgxmap.cpu);\n            return _cpu;\n        };\n        this.getDevice = function () {\n            var _device = { vendor: undefined, model: undefined, type: undefined };\n            mapper.rgx.call(_device, _ua, _rgxmap.device);\n            return _device;\n        };\n        this.getEngine = function () {\n            var _engine = { name: undefined, version: undefined };\n            mapper.rgx.call(_engine, _ua, _rgxmap.engine);\n            return _engine;\n        };\n        this.getOS = function () {\n            var _os = { name: undefined, version: undefined };\n            mapper.rgx.call(_os, _ua, _rgxmap.os);\n            return _os;\n        };\n        this.getResult = function () {\n            return {\n                ua      : this.getUA(),\n                browser : this.getBrowser(),\n                engine  : this.getEngine(),\n                os      : this.getOS(),\n                device  : this.getDevice(),\n                cpu     : this.getCPU()\n            };\n        };\n        this.getUA = function () {\n            return _ua;\n        };\n        this.setUA = function (ua) {\n            _ua = (typeof ua === STR_TYPE && ua.length > UA_MAX_LENGTH) ? util.trim(ua, UA_MAX_LENGTH) : ua;\n            return this;\n        };\n        this.setUA(_ua);\n        return this;\n    };\n\n    UAParser.VERSION = LIBVERSION;\n    UAParser.BROWSER = {\n        NAME    : NAME,\n        MAJOR   : MAJOR, // deprecated\n        VERSION : VERSION\n    };\n    UAParser.CPU = {\n        ARCHITECTURE : ARCHITECTURE\n    };\n    UAParser.DEVICE = {\n        MODEL   : MODEL,\n        VENDOR  : VENDOR,\n        TYPE    : TYPE,\n        CONSOLE : CONSOLE,\n        MOBILE  : MOBILE,\n        SMARTTV : SMARTTV,\n        TABLET  : TABLET,\n        WEARABLE: WEARABLE,\n        EMBEDDED: EMBEDDED\n    };\n    UAParser.ENGINE = {\n        NAME    : NAME,\n        VERSION : VERSION\n    };\n    UAParser.OS = {\n        NAME    : NAME,\n        VERSION : VERSION\n    };\n\n    ///////////\n    // Export\n    //////////\n\n\n    // check js environment\n    if (typeof(exports) !== UNDEF_TYPE) {\n        // nodejs env\n        if (typeof module !== UNDEF_TYPE && module.exports) {\n            exports = module.exports = UAParser;\n        }\n        exports.UAParser = UAParser;\n    } else {\n        // requirejs env (optional)\n        if (typeof(define) === 'function' && define.amd) {\n            define(function () {\n                return UAParser;\n            });\n        } else if (typeof window !== 'undefined') {\n            // browser env\n            window.UAParser = UAParser;\n        }\n    }\n\n    // jQuery/Zepto specific (optional)\n    // Note:\n    //   In AMD env the global scope should be kept clean, but jQuery is an exception.\n    //   jQuery always exports to global scope, unless jQuery.noConflict(true) is used,\n    //   and we should catch that.\n    var $ = typeof window !== 'undefined' && (window.jQuery || window.Zepto);\n    if ($ && !$.ua) {\n        var parser = new UAParser();\n        $.ua = parser.getResult();\n        $.ua.get = function () {\n            return parser.getUA();\n        };\n        $.ua.set = function (uastring) {\n            parser.setUA(uastring);\n            var result = parser.getResult();\n            for (var prop in result) {\n                $.ua[prop] = result[prop];\n            }\n        };\n    }\n\n})(typeof window === 'object' ? window : this);\n","// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n'use strict';\n\nvar R = typeof Reflect === 'object' ? Reflect : null\nvar ReflectApply = R && typeof R.apply === 'function'\n  ? R.apply\n  : function ReflectApply(target, receiver, args) {\n    return Function.prototype.apply.call(target, receiver, args);\n  }\n\nvar ReflectOwnKeys\nif (R && typeof R.ownKeys === 'function') {\n  ReflectOwnKeys = R.ownKeys\n} else if (Object.getOwnPropertySymbols) {\n  ReflectOwnKeys = function ReflectOwnKeys(target) {\n    return Object.getOwnPropertyNames(target)\n      .concat(Object.getOwnPropertySymbols(target));\n  };\n} else {\n  ReflectOwnKeys = function ReflectOwnKeys(target) {\n    return Object.getOwnPropertyNames(target);\n  };\n}\n\nfunction ProcessEmitWarning(warning) {\n  if (console && console.warn) console.warn(warning);\n}\n\nvar NumberIsNaN = Number.isNaN || function NumberIsNaN(value) {\n  return value !== value;\n}\n\nfunction EventEmitter() {\n  EventEmitter.init.call(this);\n}\nmodule.exports = EventEmitter;\nmodule.exports.once = once;\n\n// Backwards-compat with node 0.10.x\nEventEmitter.EventEmitter = EventEmitter;\n\nEventEmitter.prototype._events = undefined;\nEventEmitter.prototype._eventsCount = 0;\nEventEmitter.prototype._maxListeners = undefined;\n\n// By default EventEmitters will print a warning if more than 10 listeners are\n// added to it. This is a useful default which helps finding memory leaks.\nvar defaultMaxListeners = 10;\n\nfunction checkListener(listener) {\n  if (typeof listener !== 'function') {\n    throw new TypeError('The \"listener\" argument must be of type Function. Received type ' + typeof listener);\n  }\n}\n\nObject.defineProperty(EventEmitter, 'defaultMaxListeners', {\n  enumerable: true,\n  get: function() {\n    return defaultMaxListeners;\n  },\n  set: function(arg) {\n    if (typeof arg !== 'number' || arg < 0 || NumberIsNaN(arg)) {\n      throw new RangeError('The value of \"defaultMaxListeners\" is out of range. It must be a non-negative number. Received ' + arg + '.');\n    }\n    defaultMaxListeners = arg;\n  }\n});\n\nEventEmitter.init = function() {\n\n  if (this._events === undefined ||\n      this._events === Object.getPrototypeOf(this)._events) {\n    this._events = Object.create(null);\n    this._eventsCount = 0;\n  }\n\n  this._maxListeners = this._maxListeners || undefined;\n};\n\n// Obviously not all Emitters should be limited to 10. This function allows\n// that to be increased. Set to zero for unlimited.\nEventEmitter.prototype.setMaxListeners = function setMaxListeners(n) {\n  if (typeof n !== 'number' || n < 0 || NumberIsNaN(n)) {\n    throw new RangeError('The value of \"n\" is out of range. It must be a non-negative number. Received ' + n + '.');\n  }\n  this._maxListeners = n;\n  return this;\n};\n\nfunction _getMaxListeners(that) {\n  if (that._maxListeners === undefined)\n    return EventEmitter.defaultMaxListeners;\n  return that._maxListeners;\n}\n\nEventEmitter.prototype.getMaxListeners = function getMaxListeners() {\n  return _getMaxListeners(this);\n};\n\nEventEmitter.prototype.emit = function emit(type) {\n  var args = [];\n  for (var i = 1; i < arguments.length; i++) args.push(arguments[i]);\n  var doError = (type === 'error');\n\n  var events = this._events;\n  if (events !== undefined)\n    doError = (doError && events.error === undefined);\n  else if (!doError)\n    return false;\n\n  // If there is no 'error' event listener then throw.\n  if (doError) {\n    var er;\n    if (args.length > 0)\n      er = args[0];\n    if (er instanceof Error) {\n      // Note: The comments on the `throw` lines are intentional, they show\n      // up in Node's output if this results in an unhandled exception.\n      throw er; // Unhandled 'error' event\n    }\n    // At least give some kind of context to the user\n    var err = new Error('Unhandled error.' + (er ? ' (' + er.message + ')' : ''));\n    err.context = er;\n    throw err; // Unhandled 'error' event\n  }\n\n  var handler = events[type];\n\n  if (handler === undefined)\n    return false;\n\n  if (typeof handler === 'function') {\n    ReflectApply(handler, this, args);\n  } else {\n    var len = handler.length;\n    var listeners = arrayClone(handler, len);\n    for (var i = 0; i < len; ++i)\n      ReflectApply(listeners[i], this, args);\n  }\n\n  return true;\n};\n\nfunction _addListener(target, type, listener, prepend) {\n  var m;\n  var events;\n  var existing;\n\n  checkListener(listener);\n\n  events = target._events;\n  if (events === undefined) {\n    events = target._events = Object.create(null);\n    target._eventsCount = 0;\n  } else {\n    // To avoid recursion in the case that type === \"newListener\"! Before\n    // adding it to the listeners, first emit \"newListener\".\n    if (events.newListener !== undefined) {\n      target.emit('newListener', type,\n                  listener.listener ? listener.listener : listener);\n\n      // Re-assign `events` because a newListener handler could have caused the\n      // this._events to be assigned to a new object\n      events = target._events;\n    }\n    existing = events[type];\n  }\n\n  if (existing === undefined) {\n    // Optimize the case of one listener. Don't need the extra array object.\n    existing = events[type] = listener;\n    ++target._eventsCount;\n  } else {\n    if (typeof existing === 'function') {\n      // Adding the second element, need to change to array.\n      existing = events[type] =\n        prepend ? [listener, existing] : [existing, listener];\n      // If we've already got an array, just append.\n    } else if (prepend) {\n      existing.unshift(listener);\n    } else {\n      existing.push(listener);\n    }\n\n    // Check for listener leak\n    m = _getMaxListeners(target);\n    if (m > 0 && existing.length > m && !existing.warned) {\n      existing.warned = true;\n      // No error code for this since it is a Warning\n      // eslint-disable-next-line no-restricted-syntax\n      var w = new Error('Possible EventEmitter memory leak detected. ' +\n                          existing.length + ' ' + String(type) + ' listeners ' +\n                          'added. Use emitter.setMaxListeners() to ' +\n                          'increase limit');\n      w.name = 'MaxListenersExceededWarning';\n      w.emitter = target;\n      w.type = type;\n      w.count = existing.length;\n      ProcessEmitWarning(w);\n    }\n  }\n\n  return target;\n}\n\nEventEmitter.prototype.addListener = function addListener(type, listener) {\n  return _addListener(this, type, listener, false);\n};\n\nEventEmitter.prototype.on = EventEmitter.prototype.addListener;\n\nEventEmitter.prototype.prependListener =\n    function prependListener(type, listener) {\n      return _addListener(this, type, listener, true);\n    };\n\nfunction onceWrapper() {\n  if (!this.fired) {\n    this.target.removeListener(this.type, this.wrapFn);\n    this.fired = true;\n    if (arguments.length === 0)\n      return this.listener.call(this.target);\n    return this.listener.apply(this.target, arguments);\n  }\n}\n\nfunction _onceWrap(target, type, listener) {\n  var state = { fired: false, wrapFn: undefined, target: target, type: type, listener: listener };\n  var wrapped = onceWrapper.bind(state);\n  wrapped.listener = listener;\n  state.wrapFn = wrapped;\n  return wrapped;\n}\n\nEventEmitter.prototype.once = function once(type, listener) {\n  checkListener(listener);\n  this.on(type, _onceWrap(this, type, listener));\n  return this;\n};\n\nEventEmitter.prototype.prependOnceListener =\n    function prependOnceListener(type, listener) {\n      checkListener(listener);\n      this.prependListener(type, _onceWrap(this, type, listener));\n      return this;\n    };\n\n// Emits a 'removeListener' event if and only if the listener was removed.\nEventEmitter.prototype.removeListener =\n    function removeListener(type, listener) {\n      var list, events, position, i, originalListener;\n\n      checkListener(listener);\n\n      events = this._events;\n      if (events === undefined)\n        return this;\n\n      list = events[type];\n      if (list === undefined)\n        return this;\n\n      if (list === listener || list.listener === listener) {\n        if (--this._eventsCount === 0)\n          this._events = Object.create(null);\n        else {\n          delete events[type];\n          if (events.removeListener)\n            this.emit('removeListener', type, list.listener || listener);\n        }\n      } else if (typeof list !== 'function') {\n        position = -1;\n\n        for (i = list.length - 1; i >= 0; i--) {\n          if (list[i] === listener || list[i].listener === listener) {\n            originalListener = list[i].listener;\n            position = i;\n            break;\n          }\n        }\n\n        if (position < 0)\n          return this;\n\n        if (position === 0)\n          list.shift();\n        else {\n          spliceOne(list, position);\n        }\n\n        if (list.length === 1)\n          events[type] = list[0];\n\n        if (events.removeListener !== undefined)\n          this.emit('removeListener', type, originalListener || listener);\n      }\n\n      return this;\n    };\n\nEventEmitter.prototype.off = EventEmitter.prototype.removeListener;\n\nEventEmitter.prototype.removeAllListeners =\n    function removeAllListeners(type) {\n      var listeners, events, i;\n\n      events = this._events;\n      if (events === undefined)\n        return this;\n\n      // not listening for removeListener, no need to emit\n      if (events.removeListener === undefined) {\n        if (arguments.length === 0) {\n          this._events = Object.create(null);\n          this._eventsCount = 0;\n        } else if (events[type] !== undefined) {\n          if (--this._eventsCount === 0)\n            this._events = Object.create(null);\n          else\n            delete events[type];\n        }\n        return this;\n      }\n\n      // emit removeListener for all listeners on all events\n      if (arguments.length === 0) {\n        var keys = Object.keys(events);\n        var key;\n        for (i = 0; i < keys.length; ++i) {\n          key = keys[i];\n          if (key === 'removeListener') continue;\n          this.removeAllListeners(key);\n        }\n        this.removeAllListeners('removeListener');\n        this._events = Object.create(null);\n        this._eventsCount = 0;\n        return this;\n      }\n\n      listeners = events[type];\n\n      if (typeof listeners === 'function') {\n        this.removeListener(type, listeners);\n      } else if (listeners !== undefined) {\n        // LIFO order\n        for (i = listeners.length - 1; i >= 0; i--) {\n          this.removeListener(type, listeners[i]);\n        }\n      }\n\n      return this;\n    };\n\nfunction _listeners(target, type, unwrap) {\n  var events = target._events;\n\n  if (events === undefined)\n    return [];\n\n  var evlistener = events[type];\n  if (evlistener === undefined)\n    return [];\n\n  if (typeof evlistener === 'function')\n    return unwrap ? [evlistener.listener || evlistener] : [evlistener];\n\n  return unwrap ?\n    unwrapListeners(evlistener) : arrayClone(evlistener, evlistener.length);\n}\n\nEventEmitter.prototype.listeners = function listeners(type) {\n  return _listeners(this, type, true);\n};\n\nEventEmitter.prototype.rawListeners = function rawListeners(type) {\n  return _listeners(this, type, false);\n};\n\nEventEmitter.listenerCount = function(emitter, type) {\n  if (typeof emitter.listenerCount === 'function') {\n    return emitter.listenerCount(type);\n  } else {\n    return listenerCount.call(emitter, type);\n  }\n};\n\nEventEmitter.prototype.listenerCount = listenerCount;\nfunction listenerCount(type) {\n  var events = this._events;\n\n  if (events !== undefined) {\n    var evlistener = events[type];\n\n    if (typeof evlistener === 'function') {\n      return 1;\n    } else if (evlistener !== undefined) {\n      return evlistener.length;\n    }\n  }\n\n  return 0;\n}\n\nEventEmitter.prototype.eventNames = function eventNames() {\n  return this._eventsCount > 0 ? ReflectOwnKeys(this._events) : [];\n};\n\nfunction arrayClone(arr, n) {\n  var copy = new Array(n);\n  for (var i = 0; i < n; ++i)\n    copy[i] = arr[i];\n  return copy;\n}\n\nfunction spliceOne(list, index) {\n  for (; index + 1 < list.length; index++)\n    list[index] = list[index + 1];\n  list.pop();\n}\n\nfunction unwrapListeners(arr) {\n  var ret = new Array(arr.length);\n  for (var i = 0; i < ret.length; ++i) {\n    ret[i] = arr[i].listener || arr[i];\n  }\n  return ret;\n}\n\nfunction once(emitter, name) {\n  return new Promise(function (resolve, reject) {\n    function errorListener(err) {\n      emitter.removeListener(name, resolver);\n      reject(err);\n    }\n\n    function resolver() {\n      if (typeof emitter.removeListener === 'function') {\n        emitter.removeListener('error', errorListener);\n      }\n      resolve([].slice.call(arguments));\n    };\n\n    eventTargetAgnosticAddListener(emitter, name, resolver, { once: true });\n    if (name !== 'error') {\n      addErrorHandlerIfEventEmitter(emitter, errorListener, { once: true });\n    }\n  });\n}\n\nfunction addErrorHandlerIfEventEmitter(emitter, handler, flags) {\n  if (typeof emitter.on === 'function') {\n    eventTargetAgnosticAddListener(emitter, 'error', handler, flags);\n  }\n}\n\nfunction eventTargetAgnosticAddListener(emitter, name, listener, flags) {\n  if (typeof emitter.on === 'function') {\n    if (flags.once) {\n      emitter.once(name, listener);\n    } else {\n      emitter.on(name, listener);\n    }\n  } else if (typeof emitter.addEventListener === 'function') {\n    // EventTarget does not have `error` event semantics like Node\n    // EventEmitters, we do not listen for `error` events here.\n    emitter.addEventListener(name, function wrapListener(arg) {\n      // IE does not have builtin `{ once: true }` support so we\n      // have to do it manually.\n      if (flags.once) {\n        emitter.removeEventListener(name, wrapListener);\n      }\n      listener(arg);\n    });\n  } else {\n    throw new TypeError('The \"emitter\" argument must be of type EventEmitter. Received type ' + typeof emitter);\n  }\n}\n","/* globals document, ImageData */\n\nconst parseFont = require('./lib/parse-font')\n\nexports.parseFont = parseFont\n\nexports.createCanvas = function (width, height) {\n  return Object.assign(document.createElement('canvas'), { width: width, height: height })\n}\n\nexports.createImageData = function (array, width, height) {\n  // Browser implementation of ImageData looks at the number of arguments passed\n  switch (arguments.length) {\n    case 0: return new ImageData()\n    case 1: return new ImageData(array)\n    case 2: return new ImageData(array, width)\n    default: return new ImageData(array, width, height)\n  }\n}\n\nexports.loadImage = function (src, options) {\n  return new Promise(function (resolve, reject) {\n    const image = Object.assign(document.createElement('img'), options)\n\n    function cleanup () {\n      image.onload = null\n      image.onerror = null\n    }\n\n    image.onload = function () { cleanup(); resolve(image) }\n    image.onerror = function () { cleanup(); reject(new Error('Failed to load the image \"' + src + '\"')) }\n\n    image.src = src\n  })\n}\n","'use strict'\n\n/**\n * Font RegExp helpers.\n */\n\nconst weights = 'bold|bolder|lighter|[1-9]00'\n  , styles = 'italic|oblique'\n  , variants = 'small-caps'\n  , stretches = 'ultra-condensed|extra-condensed|condensed|semi-condensed|semi-expanded|expanded|extra-expanded|ultra-expanded'\n  , units = 'px|pt|pc|in|cm|mm|%|em|ex|ch|rem|q'\n  , string = '\\'([^\\']+)\\'|\"([^\"]+)\"|[\\\\w\\\\s-]+'\n\n// [ [ <‘font-style’> || <font-variant-css21> || <‘font-weight’> || <‘font-stretch’> ]?\n//    <‘font-size’> [ / <‘line-height’> ]? <‘font-family’> ]\n// https://drafts.csswg.org/css-fonts-3/#font-prop\nconst weightRe = new RegExp('(' + weights + ') +', 'i')\nconst styleRe = new RegExp('(' + styles + ') +', 'i')\nconst variantRe = new RegExp('(' + variants + ') +', 'i')\nconst stretchRe = new RegExp('(' + stretches + ') +', 'i')\nconst sizeFamilyRe = new RegExp(\n  '([\\\\d\\\\.]+)(' + units + ') *'\n  + '((?:' + string + ')( *, *(?:' + string + '))*)')\n\n/**\n * Cache font parsing.\n */\n\nconst cache = {}\n\nconst defaultHeight = 16 // pt, common browser default\n\n/**\n * Parse font `str`.\n *\n * @param {String} str\n * @return {Object} Parsed font. `size` is in device units. `unit` is the unit\n *   appearing in the input string.\n * @api private\n */\n\nmodule.exports = function (str) {\n  // Cached\n  if (cache[str]) return cache[str]\n\n  // Try for required properties first.\n  const sizeFamily = sizeFamilyRe.exec(str)\n  if (!sizeFamily) return // invalid\n\n  // Default values and required properties\n  const font = {\n    weight: 'normal',\n    style: 'normal',\n    stretch: 'normal',\n    variant: 'normal',\n    size: parseFloat(sizeFamily[1]),\n    unit: sizeFamily[2],\n    family: sizeFamily[3].replace(/[\"']/g, '').replace(/ *, */g, ',')\n  }\n\n  // Optional, unordered properties.\n  let weight, style, variant, stretch\n  // Stop search at `sizeFamily.index`\n  let substr = str.substring(0, sizeFamily.index)\n  if ((weight = weightRe.exec(substr))) font.weight = weight[1]\n  if ((style = styleRe.exec(substr))) font.style = style[1]\n  if ((variant = variantRe.exec(substr))) font.variant = variant[1]\n  if ((stretch = stretchRe.exec(substr))) font.stretch = stretch[1]\n\n  // Convert to device units. (`font.unit` is the original unit)\n  // TODO: ch, ex\n  switch (font.unit) {\n    case 'pt':\n      font.size /= 0.75\n      break\n    case 'pc':\n      font.size *= 16\n      break\n    case 'in':\n      font.size *= 96\n      break\n    case 'cm':\n      font.size *= 96.0 / 2.54\n      break\n    case 'mm':\n      font.size *= 96.0 / 25.4\n      break\n    case '%':\n      // TODO disabled because existing unit tests assume 100\n      // font.size *= defaultHeight / 100 / 0.75\n      break\n    case 'em':\n    case 'rem':\n      font.size *= defaultHeight / 0.75\n      break\n    case 'q':\n      font.size *= 96 / 25.4 / 4\n      break\n  }\n\n  return (cache[str] = font)\n}\n","/* jshint node: true */\n'use strict';\n\nvar normalice = require('normalice');\n\n/**\n  # freeice\n\n  The `freeice` module is a simple way of getting random STUN or TURN server\n  for your WebRTC application.  The list of servers (just STUN at this stage)\n  were sourced from this [gist](https://gist.github.com/zziuni/3741933).\n\n  ## Example Use\n\n  The following demonstrates how you can use `freeice` with\n  [rtc-quickconnect](https://github.com/rtc-io/rtc-quickconnect):\n\n  <<< examples/quickconnect.js\n\n  As the `freeice` module generates ice servers in a list compliant with the\n  WebRTC spec you will be able to use it with raw `RTCPeerConnection`\n  constructors and other WebRTC libraries.\n\n  ## Hey, don't use my STUN/TURN server!\n\n  If for some reason your free STUN or TURN server ends up in the\n  list of servers ([stun](https://github.com/DamonOehlman/freeice/blob/master/stun.json) or\n  [turn](https://github.com/DamonOehlman/freeice/blob/master/turn.json))\n  that is used in this module, you can feel\n  free to open an issue on this repository and those servers will be removed\n  within 24 hours (or sooner).  This is the quickest and probably the most\n  polite way to have something removed (and provides us some visibility\n  if someone opens a pull request requesting that a server is added).\n\n  ## Please add my server!\n\n  If you have a server that you wish to add to the list, that's awesome! I'm\n  sure I speak on behalf of a whole pile of WebRTC developers who say thanks.\n  To get it into the list, feel free to either open a pull request or if you\n  find that process a bit daunting then just create an issue requesting\n  the addition of the server (make sure you provide all the details, and if\n  you have a Terms of Service then including that in the PR/issue would be\n  awesome).\n\n  ## I know of a free server, can I add it?\n\n  Sure, if you do your homework and make sure it is ok to use (I'm currently\n  in the process of reviewing the terms of those STUN servers included from\n  the original list).  If it's ok to go, then please see the previous entry\n  for how to add it.\n\n  ## Current List of Servers\n\n  * current as at the time of last `README.md` file generation\n\n  ### STUN\n\n  <<< stun.json\n\n  ### TURN\n\n  <<< turn.json\n\n**/\n\nvar freeice = function(opts) {\n  // if a list of servers has been provided, then use it instead of defaults\n  var servers = {\n    stun: (opts || {}).stun || require('./stun.json'),\n    turn: (opts || {}).turn || require('./turn.json')\n  };\n\n  var stunCount = (opts || {}).stunCount || 2;\n  var turnCount = (opts || {}).turnCount || 0;\n  var selected;\n\n  function getServers(type, count) {\n    var out = [];\n    var input = [].concat(servers[type]);\n    var idx;\n\n    while (input.length && out.length < count) {\n      idx = (Math.random() * input.length) | 0;\n      out = out.concat(input.splice(idx, 1));\n    }\n\n    return out.map(function(url) {\n        //If it's a not a string, don't try to \"normalice\" it otherwise using type:url will screw it up\n        if ((typeof url !== 'string') && (! (url instanceof String))) {\n            return url;\n        } else {\n            return normalice(type + ':' + url);\n        }\n    });\n  }\n\n  // add stun servers\n  selected = [].concat(getServers('stun', stunCount));\n\n  if (turnCount) {\n    selected = selected.concat(getServers('turn', turnCount));\n  }\n\n  return selected;\n};\n\nmodule.exports = freeice;","/**\n  # normalice\n\n  Normalize an ice server configuration object (or plain old string) into a format\n  that is usable in all browsers supporting WebRTC.  Primarily this module is designed\n  to help with the transition of the `url` attribute of the configuration object to\n  the `urls` attribute.\n\n  ## Example Usage\n\n  <<< examples/simple.js\n\n**/\n\nvar protocols = [\n  'stun:',\n  'turn:'\n];\n\nmodule.exports = function(input) {\n  var url = (input || {}).url || input;\n  var protocol;\n  var parts;\n  var output = {};\n\n  // if we don't have a string url, then allow the input to passthrough\n  if (typeof url != 'string' && (! (url instanceof String))) {\n    return input;\n  }\n\n  // trim the url string, and convert to an array\n  url = url.trim();\n\n  // if the protocol is not known, then passthrough\n  protocol = protocols[protocols.indexOf(url.slice(0, 5))];\n  if (! protocol) {\n    return input;\n  }\n\n  // now let's attack the remaining url parts\n  url = url.slice(5);\n  parts = url.split('@');\n\n  output.username = input.username;\n  output.credential = input.credential;\n  // if we have an authentication part, then set the credentials\n  if (parts.length > 1) {\n    url = parts[1];\n    parts = parts[0].split(':');\n\n    // add the output credential and username\n    output.username = parts[0];\n    output.credential = (input || {}).credential || parts[1] || '';\n  }\n\n  output.url = protocol + url;\n  output.urls = [ output.url ];\n\n  return output;\n};\n","/*!\r\n * @name JavaScript/NodeJS Merge v1.2.1\r\n * @author yeikos\r\n * @repository https://github.com/yeikos/js.merge\r\n\r\n * Copyright 2014 yeikos - MIT license\r\n * https://raw.github.com/yeikos/js.merge/master/LICENSE\r\n */\r\n\r\n;(function(isNode) {\r\n\r\n\t/**\r\n\t * Merge one or more objects \r\n\t * @param bool? clone\r\n\t * @param mixed,... arguments\r\n\t * @return object\r\n\t */\r\n\r\n\tvar Public = function(clone) {\r\n\r\n\t\treturn merge(clone === true, false, arguments);\r\n\r\n\t}, publicName = 'merge';\r\n\r\n\t/**\r\n\t * Merge two or more objects recursively \r\n\t * @param bool? clone\r\n\t * @param mixed,... arguments\r\n\t * @return object\r\n\t */\r\n\r\n\tPublic.recursive = function(clone) {\r\n\r\n\t\treturn merge(clone === true, true, arguments);\r\n\r\n\t};\r\n\r\n\t/**\r\n\t * Clone the input removing any reference\r\n\t * @param mixed input\r\n\t * @return mixed\r\n\t */\r\n\r\n\tPublic.clone = function(input) {\r\n\r\n\t\tvar output = input,\r\n\t\t\ttype = typeOf(input),\r\n\t\t\tindex, size;\r\n\r\n\t\tif (type === 'array') {\r\n\r\n\t\t\toutput = [];\r\n\t\t\tsize = input.length;\r\n\r\n\t\t\tfor (index=0;index<size;++index)\r\n\r\n\t\t\t\toutput[index] = Public.clone(input[index]);\r\n\r\n\t\t} else if (type === 'object') {\r\n\r\n\t\t\toutput = {};\r\n\r\n\t\t\tfor (index in input)\r\n\r\n\t\t\t\toutput[index] = Public.clone(input[index]);\r\n\r\n\t\t}\r\n\r\n\t\treturn output;\r\n\r\n\t};\r\n\r\n\t/**\r\n\t * Merge two objects recursively\r\n\t * @param mixed input\r\n\t * @param mixed extend\r\n\t * @return mixed\r\n\t */\r\n\r\n\tfunction merge_recursive(base, extend) {\r\n\r\n\t\tif (typeOf(base) !== 'object')\r\n\r\n\t\t\treturn extend;\r\n\r\n\t\tfor (var key in extend) {\r\n\r\n\t\t\tif (typeOf(base[key]) === 'object' && typeOf(extend[key]) === 'object') {\r\n\r\n\t\t\t\tbase[key] = merge_recursive(base[key], extend[key]);\r\n\r\n\t\t\t} else {\r\n\r\n\t\t\t\tbase[key] = extend[key];\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\treturn base;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Merge two or more objects\r\n\t * @param bool clone\r\n\t * @param bool recursive\r\n\t * @param array argv\r\n\t * @return object\r\n\t */\r\n\r\n\tfunction merge(clone, recursive, argv) {\r\n\r\n\t\tvar result = argv[0],\r\n\t\t\tsize = argv.length;\r\n\r\n\t\tif (clone || typeOf(result) !== 'object')\r\n\r\n\t\t\tresult = {};\r\n\r\n\t\tfor (var index=0;index<size;++index) {\r\n\r\n\t\t\tvar item = argv[index],\r\n\r\n\t\t\t\ttype = typeOf(item);\r\n\r\n\t\t\tif (type !== 'object') continue;\r\n\r\n\t\t\tfor (var key in item) {\r\n\r\n\t\t\t\tif (key === '__proto__') continue;\r\n\r\n\t\t\t\tvar sitem = clone ? Public.clone(item[key]) : item[key];\r\n\r\n\t\t\t\tif (recursive) {\r\n\r\n\t\t\t\t\tresult[key] = merge_recursive(result[key], sitem);\r\n\r\n\t\t\t\t} else {\r\n\r\n\t\t\t\t\tresult[key] = sitem;\r\n\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\r\n\t\t}\r\n\r\n\t\treturn result;\r\n\r\n\t}\r\n\r\n\t/**\r\n\t * Get type of variable\r\n\t * @param mixed input\r\n\t * @return string\r\n\t *\r\n\t * @see http://jsperf.com/typeofvar\r\n\t */\r\n\r\n\tfunction typeOf(input) {\r\n\r\n\t\treturn ({}).toString.call(input).slice(8, -1).toLowerCase();\r\n\r\n\t}\r\n\r\n\tif (isNode) {\r\n\r\n\t\tmodule.exports = Public;\r\n\r\n\t} else {\r\n\r\n\t\twindow[publicName] = Public;\r\n\r\n\t}\r\n\r\n})(typeof module === 'object' && module && typeof module.exports === 'object' && module.exports);","module.exports = function(module) {\n\tif (!module.webpackPolyfill) {\n\t\tmodule.deprecate = function() {};\n\t\tmodule.paths = [];\n\t\t// module.parent = undefined by default\n\t\tif (!module.children) module.children = [];\n\t\tObject.defineProperty(module, \"loaded\", {\n\t\t\tenumerable: true,\n\t\t\tget: function() {\n\t\t\t\treturn module.l;\n\t\t\t}\n\t\t});\n\t\tObject.defineProperty(module, \"id\", {\n\t\t\tenumerable: true,\n\t\t\tget: function() {\n\t\t\t\treturn module.i;\n\t\t\t}\n\t\t});\n\t\tmodule.webpackPolyfill = 1;\n\t}\n\treturn module;\n};\n","/*\n *  Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n *\n *  Use of this source code is governed by a BSD-style license\n *  that can be found in the LICENSE file in the root of the source\n *  tree.\n */\n /* eslint-env node */\n'use strict';\n\nlet logDisabled_ = true;\nlet deprecationWarnings_ = true;\n\n/**\n * Extract browser version out of the provided user agent string.\n *\n * @param {!string} uastring userAgent string.\n * @param {!string} expr Regular expression used as match criteria.\n * @param {!number} pos position in the version string to be returned.\n * @return {!number} browser version.\n */\nexport function extractVersion(uastring, expr, pos) {\n  const match = uastring.match(expr);\n  return match && match.length >= pos && parseInt(match[pos], 10);\n}\n\n// Wraps the peerconnection event eventNameToWrap in a function\n// which returns the modified event object (or false to prevent\n// the event).\nexport function wrapPeerConnectionEvent(window, eventNameToWrap, wrapper) {\n  if (!window.RTCPeerConnection) {\n    return;\n  }\n  const proto = window.RTCPeerConnection.prototype;\n  const nativeAddEventListener = proto.addEventListener;\n  proto.addEventListener = function(nativeEventName, cb) {\n    if (nativeEventName !== eventNameToWrap) {\n      return nativeAddEventListener.apply(this, arguments);\n    }\n    const wrappedCallback = (e) => {\n      const modifiedEvent = wrapper(e);\n      if (modifiedEvent) {\n        if (cb.handleEvent) {\n          cb.handleEvent(modifiedEvent);\n        } else {\n          cb(modifiedEvent);\n        }\n      }\n    };\n    this._eventMap = this._eventMap || {};\n    if (!this._eventMap[eventNameToWrap]) {\n      this._eventMap[eventNameToWrap] = new Map();\n    }\n    this._eventMap[eventNameToWrap].set(cb, wrappedCallback);\n    return nativeAddEventListener.apply(this, [nativeEventName,\n      wrappedCallback]);\n  };\n\n  const nativeRemoveEventListener = proto.removeEventListener;\n  proto.removeEventListener = function(nativeEventName, cb) {\n    if (nativeEventName !== eventNameToWrap || !this._eventMap\n        || !this._eventMap[eventNameToWrap]) {\n      return nativeRemoveEventListener.apply(this, arguments);\n    }\n    if (!this._eventMap[eventNameToWrap].has(cb)) {\n      return nativeRemoveEventListener.apply(this, arguments);\n    }\n    const unwrappedCb = this._eventMap[eventNameToWrap].get(cb);\n    this._eventMap[eventNameToWrap].delete(cb);\n    if (this._eventMap[eventNameToWrap].size === 0) {\n      delete this._eventMap[eventNameToWrap];\n    }\n    if (Object.keys(this._eventMap).length === 0) {\n      delete this._eventMap;\n    }\n    return nativeRemoveEventListener.apply(this, [nativeEventName,\n      unwrappedCb]);\n  };\n\n  Object.defineProperty(proto, 'on' + eventNameToWrap, {\n    get() {\n      return this['_on' + eventNameToWrap];\n    },\n    set(cb) {\n      if (this['_on' + eventNameToWrap]) {\n        this.removeEventListener(eventNameToWrap,\n            this['_on' + eventNameToWrap]);\n        delete this['_on' + eventNameToWrap];\n      }\n      if (cb) {\n        this.addEventListener(eventNameToWrap,\n            this['_on' + eventNameToWrap] = cb);\n      }\n    },\n    enumerable: true,\n    configurable: true\n  });\n}\n\nexport function disableLog(bool) {\n  if (typeof bool !== 'boolean') {\n    return new Error('Argument type: ' + typeof bool +\n        '. Please use a boolean.');\n  }\n  logDisabled_ = bool;\n  return (bool) ? 'adapter.js logging disabled' :\n      'adapter.js logging enabled';\n}\n\n/**\n * Disable or enable deprecation warnings\n * @param {!boolean} bool set to true to disable warnings.\n */\nexport function disableWarnings(bool) {\n  if (typeof bool !== 'boolean') {\n    return new Error('Argument type: ' + typeof bool +\n        '. Please use a boolean.');\n  }\n  deprecationWarnings_ = !bool;\n  return 'adapter.js deprecation warnings ' + (bool ? 'disabled' : 'enabled');\n}\n\nexport function log() {\n  if (typeof window === 'object') {\n    if (logDisabled_) {\n      return;\n    }\n    if (typeof console !== 'undefined' && typeof console.log === 'function') {\n      console.log.apply(console, arguments);\n    }\n  }\n}\n\n/**\n * Shows a deprecation warning suggesting the modern and spec-compatible API.\n */\nexport function deprecated(oldMethod, newMethod) {\n  if (!deprecationWarnings_) {\n    return;\n  }\n  console.warn(oldMethod + ' is deprecated, please use ' + newMethod +\n      ' instead.');\n}\n\n/**\n * Browser detector.\n *\n * @return {object} result containing browser and version\n *     properties.\n */\nexport function detectBrowser(window) {\n  // Returned result object.\n  const result = {browser: null, version: null};\n\n  // Fail early if it's not a browser\n  if (typeof window === 'undefined' || !window.navigator) {\n    result.browser = 'Not a browser.';\n    return result;\n  }\n\n  const {navigator} = window;\n\n  if (navigator.mozGetUserMedia) { // Firefox.\n    result.browser = 'firefox';\n    result.version = extractVersion(navigator.userAgent,\n        /Firefox\\/(\\d+)\\./, 1);\n  } else if (navigator.webkitGetUserMedia ||\n      (window.isSecureContext === false && window.webkitRTCPeerConnection &&\n       !window.RTCIceGatherer)) {\n    // Chrome, Chromium, Webview, Opera.\n    // Version matches Chrome/WebRTC version.\n    // Chrome 74 removed webkitGetUserMedia on http as well so we need the\n    // more complicated fallback to webkitRTCPeerConnection.\n    result.browser = 'chrome';\n    result.version = extractVersion(navigator.userAgent,\n        /Chrom(e|ium)\\/(\\d+)\\./, 2);\n  } else if (navigator.mediaDevices &&\n      navigator.userAgent.match(/Edge\\/(\\d+).(\\d+)$/)) { // Edge.\n    result.browser = 'edge';\n    result.version = extractVersion(navigator.userAgent,\n        /Edge\\/(\\d+).(\\d+)$/, 2);\n  } else if (window.RTCPeerConnection &&\n      navigator.userAgent.match(/AppleWebKit\\/(\\d+)\\./)) { // Safari.\n    result.browser = 'safari';\n    result.version = extractVersion(navigator.userAgent,\n        /AppleWebKit\\/(\\d+)\\./, 1);\n    result.supportsUnifiedPlan = window.RTCRtpTransceiver &&\n        'currentDirection' in window.RTCRtpTransceiver.prototype;\n  } else { // Default fallthrough: not supported.\n    result.browser = 'Not a supported browser.';\n    return result;\n  }\n\n  return result;\n}\n\n/**\n * Checks if something is an object.\n *\n * @param {*} val The something you want to check.\n * @return true if val is an object, false otherwise.\n */\nfunction isObject(val) {\n  return Object.prototype.toString.call(val) === '[object Object]';\n}\n\n/**\n * Remove all empty objects and undefined values\n * from a nested object -- an enhanced and vanilla version\n * of Lodash's `compact`.\n */\nexport function compactObject(data) {\n  if (!isObject(data)) {\n    return data;\n  }\n\n  return Object.keys(data).reduce(function(accumulator, key) {\n    const isObj = isObject(data[key]);\n    const value = isObj ? compactObject(data[key]) : data[key];\n    const isEmptyObject = isObj && !Object.keys(value).length;\n    if (value === undefined || isEmptyObject) {\n      return accumulator;\n    }\n    return Object.assign(accumulator, {[key]: value});\n  }, {});\n}\n\n/* iterates the stats graph recursively. */\nexport function walkStats(stats, base, resultSet) {\n  if (!base || resultSet.has(base.id)) {\n    return;\n  }\n  resultSet.set(base.id, base);\n  Object.keys(base).forEach(name => {\n    if (name.endsWith('Id')) {\n      walkStats(stats, stats.get(base[name]), resultSet);\n    } else if (name.endsWith('Ids')) {\n      base[name].forEach(id => {\n        walkStats(stats, stats.get(id), resultSet);\n      });\n    }\n  });\n}\n\n/* filter getStats for a sender/receiver track. */\nexport function filterStats(result, track, outbound) {\n  const streamStatsType = outbound ? 'outbound-rtp' : 'inbound-rtp';\n  const filteredResult = new Map();\n  if (track === null) {\n    return filteredResult;\n  }\n  const trackStats = [];\n  result.forEach(value => {\n    if (value.type === 'track' &&\n        value.trackIdentifier === track.id) {\n      trackStats.push(value);\n    }\n  });\n  trackStats.forEach(trackStat => {\n    result.forEach(stats => {\n      if (stats.type === streamStatsType && stats.trackId === trackStat.id) {\n        walkStats(result, stats, filteredResult);\n      }\n    });\n  });\n  return filteredResult;\n}\n\n","/*\n *  Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n *\n *  Use of this source code is governed by a BSD-style license\n *  that can be found in the LICENSE file in the root of the source\n *  tree.\n */\n/* eslint-env node */\n'use strict';\nimport * as utils from '../utils.js';\nconst logging = utils.log;\n\nexport function shimGetUserMedia(window, browserDetails) {\n  const navigator = window && window.navigator;\n\n  if (!navigator.mediaDevices) {\n    return;\n  }\n\n  const constraintsToChrome_ = function(c) {\n    if (typeof c !== 'object' || c.mandatory || c.optional) {\n      return c;\n    }\n    const cc = {};\n    Object.keys(c).forEach(key => {\n      if (key === 'require' || key === 'advanced' || key === 'mediaSource') {\n        return;\n      }\n      const r = (typeof c[key] === 'object') ? c[key] : {ideal: c[key]};\n      if (r.exact !== undefined && typeof r.exact === 'number') {\n        r.min = r.max = r.exact;\n      }\n      const oldname_ = function(prefix, name) {\n        if (prefix) {\n          return prefix + name.charAt(0).toUpperCase() + name.slice(1);\n        }\n        return (name === 'deviceId') ? 'sourceId' : name;\n      };\n      if (r.ideal !== undefined) {\n        cc.optional = cc.optional || [];\n        let oc = {};\n        if (typeof r.ideal === 'number') {\n          oc[oldname_('min', key)] = r.ideal;\n          cc.optional.push(oc);\n          oc = {};\n          oc[oldname_('max', key)] = r.ideal;\n          cc.optional.push(oc);\n        } else {\n          oc[oldname_('', key)] = r.ideal;\n          cc.optional.push(oc);\n        }\n      }\n      if (r.exact !== undefined && typeof r.exact !== 'number') {\n        cc.mandatory = cc.mandatory || {};\n        cc.mandatory[oldname_('', key)] = r.exact;\n      } else {\n        ['min', 'max'].forEach(mix => {\n          if (r[mix] !== undefined) {\n            cc.mandatory = cc.mandatory || {};\n            cc.mandatory[oldname_(mix, key)] = r[mix];\n          }\n        });\n      }\n    });\n    if (c.advanced) {\n      cc.optional = (cc.optional || []).concat(c.advanced);\n    }\n    return cc;\n  };\n\n  const shimConstraints_ = function(constraints, func) {\n    if (browserDetails.version >= 61) {\n      return func(constraints);\n    }\n    constraints = JSON.parse(JSON.stringify(constraints));\n    if (constraints && typeof constraints.audio === 'object') {\n      const remap = function(obj, a, b) {\n        if (a in obj && !(b in obj)) {\n          obj[b] = obj[a];\n          delete obj[a];\n        }\n      };\n      constraints = JSON.parse(JSON.stringify(constraints));\n      remap(constraints.audio, 'autoGainControl', 'googAutoGainControl');\n      remap(constraints.audio, 'noiseSuppression', 'googNoiseSuppression');\n      constraints.audio = constraintsToChrome_(constraints.audio);\n    }\n    if (constraints && typeof constraints.video === 'object') {\n      // Shim facingMode for mobile & surface pro.\n      let face = constraints.video.facingMode;\n      face = face && ((typeof face === 'object') ? face : {ideal: face});\n      const getSupportedFacingModeLies = browserDetails.version < 66;\n\n      if ((face && (face.exact === 'user' || face.exact === 'environment' ||\n                    face.ideal === 'user' || face.ideal === 'environment')) &&\n          !(navigator.mediaDevices.getSupportedConstraints &&\n            navigator.mediaDevices.getSupportedConstraints().facingMode &&\n            !getSupportedFacingModeLies)) {\n        delete constraints.video.facingMode;\n        let matches;\n        if (face.exact === 'environment' || face.ideal === 'environment') {\n          matches = ['back', 'rear'];\n        } else if (face.exact === 'user' || face.ideal === 'user') {\n          matches = ['front'];\n        }\n        if (matches) {\n          // Look for matches in label, or use last cam for back (typical).\n          return navigator.mediaDevices.enumerateDevices()\n          .then(devices => {\n            devices = devices.filter(d => d.kind === 'videoinput');\n            let dev = devices.find(d => matches.some(match =>\n              d.label.toLowerCase().includes(match)));\n            if (!dev && devices.length && matches.includes('back')) {\n              dev = devices[devices.length - 1]; // more likely the back cam\n            }\n            if (dev) {\n              constraints.video.deviceId = face.exact ? {exact: dev.deviceId} :\n                                                        {ideal: dev.deviceId};\n            }\n            constraints.video = constraintsToChrome_(constraints.video);\n            logging('chrome: ' + JSON.stringify(constraints));\n            return func(constraints);\n          });\n        }\n      }\n      constraints.video = constraintsToChrome_(constraints.video);\n    }\n    logging('chrome: ' + JSON.stringify(constraints));\n    return func(constraints);\n  };\n\n  const shimError_ = function(e) {\n    if (browserDetails.version >= 64) {\n      return e;\n    }\n    return {\n      name: {\n        PermissionDeniedError: 'NotAllowedError',\n        PermissionDismissedError: 'NotAllowedError',\n        InvalidStateError: 'NotAllowedError',\n        DevicesNotFoundError: 'NotFoundError',\n        ConstraintNotSatisfiedError: 'OverconstrainedError',\n        TrackStartError: 'NotReadableError',\n        MediaDeviceFailedDueToShutdown: 'NotAllowedError',\n        MediaDeviceKillSwitchOn: 'NotAllowedError',\n        TabCaptureError: 'AbortError',\n        ScreenCaptureError: 'AbortError',\n        DeviceCaptureError: 'AbortError'\n      }[e.name] || e.name,\n      message: e.message,\n      constraint: e.constraint || e.constraintName,\n      toString() {\n        return this.name + (this.message && ': ') + this.message;\n      }\n    };\n  };\n\n  const getUserMedia_ = function(constraints, onSuccess, onError) {\n    shimConstraints_(constraints, c => {\n      navigator.webkitGetUserMedia(c, onSuccess, e => {\n        if (onError) {\n          onError(shimError_(e));\n        }\n      });\n    });\n  };\n  navigator.getUserMedia = getUserMedia_.bind(navigator);\n\n  // Even though Chrome 45 has navigator.mediaDevices and a getUserMedia\n  // function which returns a Promise, it does not accept spec-style\n  // constraints.\n  if (navigator.mediaDevices.getUserMedia) {\n    const origGetUserMedia = navigator.mediaDevices.getUserMedia.\n        bind(navigator.mediaDevices);\n    navigator.mediaDevices.getUserMedia = function(cs) {\n      return shimConstraints_(cs, c => origGetUserMedia(c).then(stream => {\n        if (c.audio && !stream.getAudioTracks().length ||\n            c.video && !stream.getVideoTracks().length) {\n          stream.getTracks().forEach(track => {\n            track.stop();\n          });\n          throw new DOMException('', 'NotFoundError');\n        }\n        return stream;\n      }, e => Promise.reject(shimError_(e))));\n    };\n  }\n}\n","/*\n *  Copyright (c) 2018 The adapter.js project authors. All Rights Reserved.\n *\n *  Use of this source code is governed by a BSD-style license\n *  that can be found in the LICENSE file in the root of the source\n *  tree.\n */\n/* eslint-env node */\n'use strict';\nexport function shimGetDisplayMedia(window, getSourceId) {\n  if (window.navigator.mediaDevices &&\n    'getDisplayMedia' in window.navigator.mediaDevices) {\n    return;\n  }\n  if (!(window.navigator.mediaDevices)) {\n    return;\n  }\n  // getSourceId is a function that returns a promise resolving with\n  // the sourceId of the screen/window/tab to be shared.\n  if (typeof getSourceId !== 'function') {\n    console.error('shimGetDisplayMedia: getSourceId argument is not ' +\n        'a function');\n    return;\n  }\n  window.navigator.mediaDevices.getDisplayMedia =\n    function getDisplayMedia(constraints) {\n      return getSourceId(constraints)\n        .then(sourceId => {\n          const widthSpecified = constraints.video && constraints.video.width;\n          const heightSpecified = constraints.video &&\n            constraints.video.height;\n          const frameRateSpecified = constraints.video &&\n            constraints.video.frameRate;\n          constraints.video = {\n            mandatory: {\n              chromeMediaSource: 'desktop',\n              chromeMediaSourceId: sourceId,\n              maxFrameRate: frameRateSpecified || 3\n            }\n          };\n          if (widthSpecified) {\n            constraints.video.mandatory.maxWidth = widthSpecified;\n          }\n          if (heightSpecified) {\n            constraints.video.mandatory.maxHeight = heightSpecified;\n          }\n          return window.navigator.mediaDevices.getUserMedia(constraints);\n        });\n    };\n}\n","/*\n *  Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n *\n *  Use of this source code is governed by a BSD-style license\n *  that can be found in the LICENSE file in the root of the source\n *  tree.\n */\n /* eslint-env node */\n'use strict';\nimport * as utils from '../utils.js';\n\nexport {shimGetUserMedia} from './getusermedia';\nexport {shimGetDisplayMedia} from './getdisplaymedia';\n\nexport function shimMediaStream(window) {\n  window.MediaStream = window.MediaStream || window.webkitMediaStream;\n}\n\nexport function shimOnTrack(window) {\n  if (typeof window === 'object' && window.RTCPeerConnection && !('ontrack' in\n      window.RTCPeerConnection.prototype)) {\n    Object.defineProperty(window.RTCPeerConnection.prototype, 'ontrack', {\n      get() {\n        return this._ontrack;\n      },\n      set(f) {\n        if (this._ontrack) {\n          this.removeEventListener('track', this._ontrack);\n        }\n        this.addEventListener('track', this._ontrack = f);\n      },\n      enumerable: true,\n      configurable: true\n    });\n    const origSetRemoteDescription =\n        window.RTCPeerConnection.prototype.setRemoteDescription;\n    window.RTCPeerConnection.prototype.setRemoteDescription =\n      function setRemoteDescription() {\n        if (!this._ontrackpoly) {\n          this._ontrackpoly = (e) => {\n            // onaddstream does not fire when a track is added to an existing\n            // stream. But stream.onaddtrack is implemented so we use that.\n            e.stream.addEventListener('addtrack', te => {\n              let receiver;\n              if (window.RTCPeerConnection.prototype.getReceivers) {\n                receiver = this.getReceivers()\n                  .find(r => r.track && r.track.id === te.track.id);\n              } else {\n                receiver = {track: te.track};\n              }\n\n              const event = new Event('track');\n              event.track = te.track;\n              event.receiver = receiver;\n              event.transceiver = {receiver};\n              event.streams = [e.stream];\n              this.dispatchEvent(event);\n            });\n            e.stream.getTracks().forEach(track => {\n              let receiver;\n              if (window.RTCPeerConnection.prototype.getReceivers) {\n                receiver = this.getReceivers()\n                  .find(r => r.track && r.track.id === track.id);\n              } else {\n                receiver = {track};\n              }\n              const event = new Event('track');\n              event.track = track;\n              event.receiver = receiver;\n              event.transceiver = {receiver};\n              event.streams = [e.stream];\n              this.dispatchEvent(event);\n            });\n          };\n          this.addEventListener('addstream', this._ontrackpoly);\n        }\n        return origSetRemoteDescription.apply(this, arguments);\n      };\n  } else {\n    // even if RTCRtpTransceiver is in window, it is only used and\n    // emitted in unified-plan. Unfortunately this means we need\n    // to unconditionally wrap the event.\n    utils.wrapPeerConnectionEvent(window, 'track', e => {\n      if (!e.transceiver) {\n        Object.defineProperty(e, 'transceiver',\n          {value: {receiver: e.receiver}});\n      }\n      return e;\n    });\n  }\n}\n\nexport function shimGetSendersWithDtmf(window) {\n  // Overrides addTrack/removeTrack, depends on shimAddTrackRemoveTrack.\n  if (typeof window === 'object' && window.RTCPeerConnection &&\n      !('getSenders' in window.RTCPeerConnection.prototype) &&\n      'createDTMFSender' in window.RTCPeerConnection.prototype) {\n    const shimSenderWithDtmf = function(pc, track) {\n      return {\n        track,\n        get dtmf() {\n          if (this._dtmf === undefined) {\n            if (track.kind === 'audio') {\n              this._dtmf = pc.createDTMFSender(track);\n            } else {\n              this._dtmf = null;\n            }\n          }\n          return this._dtmf;\n        },\n        _pc: pc\n      };\n    };\n\n    // augment addTrack when getSenders is not available.\n    if (!window.RTCPeerConnection.prototype.getSenders) {\n      window.RTCPeerConnection.prototype.getSenders = function getSenders() {\n        this._senders = this._senders || [];\n        return this._senders.slice(); // return a copy of the internal state.\n      };\n      const origAddTrack = window.RTCPeerConnection.prototype.addTrack;\n      window.RTCPeerConnection.prototype.addTrack =\n        function addTrack(track, stream) {\n          let sender = origAddTrack.apply(this, arguments);\n          if (!sender) {\n            sender = shimSenderWithDtmf(this, track);\n            this._senders.push(sender);\n          }\n          return sender;\n        };\n\n      const origRemoveTrack = window.RTCPeerConnection.prototype.removeTrack;\n      window.RTCPeerConnection.prototype.removeTrack =\n        function removeTrack(sender) {\n          origRemoveTrack.apply(this, arguments);\n          const idx = this._senders.indexOf(sender);\n          if (idx !== -1) {\n            this._senders.splice(idx, 1);\n          }\n        };\n    }\n    const origAddStream = window.RTCPeerConnection.prototype.addStream;\n    window.RTCPeerConnection.prototype.addStream = function addStream(stream) {\n      this._senders = this._senders || [];\n      origAddStream.apply(this, [stream]);\n      stream.getTracks().forEach(track => {\n        this._senders.push(shimSenderWithDtmf(this, track));\n      });\n    };\n\n    const origRemoveStream = window.RTCPeerConnection.prototype.removeStream;\n    window.RTCPeerConnection.prototype.removeStream =\n      function removeStream(stream) {\n        this._senders = this._senders || [];\n        origRemoveStream.apply(this, [stream]);\n\n        stream.getTracks().forEach(track => {\n          const sender = this._senders.find(s => s.track === track);\n          if (sender) { // remove sender\n            this._senders.splice(this._senders.indexOf(sender), 1);\n          }\n        });\n      };\n  } else if (typeof window === 'object' && window.RTCPeerConnection &&\n             'getSenders' in window.RTCPeerConnection.prototype &&\n             'createDTMFSender' in window.RTCPeerConnection.prototype &&\n             window.RTCRtpSender &&\n             !('dtmf' in window.RTCRtpSender.prototype)) {\n    const origGetSenders = window.RTCPeerConnection.prototype.getSenders;\n    window.RTCPeerConnection.prototype.getSenders = function getSenders() {\n      const senders = origGetSenders.apply(this, []);\n      senders.forEach(sender => sender._pc = this);\n      return senders;\n    };\n\n    Object.defineProperty(window.RTCRtpSender.prototype, 'dtmf', {\n      get() {\n        if (this._dtmf === undefined) {\n          if (this.track.kind === 'audio') {\n            this._dtmf = this._pc.createDTMFSender(this.track);\n          } else {\n            this._dtmf = null;\n          }\n        }\n        return this._dtmf;\n      }\n    });\n  }\n}\n\nexport function shimGetStats(window) {\n  if (!window.RTCPeerConnection) {\n    return;\n  }\n\n  const origGetStats = window.RTCPeerConnection.prototype.getStats;\n  window.RTCPeerConnection.prototype.getStats = function getStats() {\n    const [selector, onSucc, onErr] = arguments;\n\n    // If selector is a function then we are in the old style stats so just\n    // pass back the original getStats format to avoid breaking old users.\n    if (arguments.length > 0 && typeof selector === 'function') {\n      return origGetStats.apply(this, arguments);\n    }\n\n    // When spec-style getStats is supported, return those when called with\n    // either no arguments or the selector argument is null.\n    if (origGetStats.length === 0 && (arguments.length === 0 ||\n        typeof selector !== 'function')) {\n      return origGetStats.apply(this, []);\n    }\n\n    const fixChromeStats_ = function(response) {\n      const standardReport = {};\n      const reports = response.result();\n      reports.forEach(report => {\n        const standardStats = {\n          id: report.id,\n          timestamp: report.timestamp,\n          type: {\n            localcandidate: 'local-candidate',\n            remotecandidate: 'remote-candidate'\n          }[report.type] || report.type\n        };\n        report.names().forEach(name => {\n          standardStats[name] = report.stat(name);\n        });\n        standardReport[standardStats.id] = standardStats;\n      });\n\n      return standardReport;\n    };\n\n    // shim getStats with maplike support\n    const makeMapStats = function(stats) {\n      return new Map(Object.keys(stats).map(key => [key, stats[key]]));\n    };\n\n    if (arguments.length >= 2) {\n      const successCallbackWrapper_ = function(response) {\n        onSucc(makeMapStats(fixChromeStats_(response)));\n      };\n\n      return origGetStats.apply(this, [successCallbackWrapper_,\n        selector]);\n    }\n\n    // promise-support\n    return new Promise((resolve, reject) => {\n      origGetStats.apply(this, [\n        function(response) {\n          resolve(makeMapStats(fixChromeStats_(response)));\n        }, reject]);\n    }).then(onSucc, onErr);\n  };\n}\n\nexport function shimSenderReceiverGetStats(window) {\n  if (!(typeof window === 'object' && window.RTCPeerConnection &&\n      window.RTCRtpSender && window.RTCRtpReceiver)) {\n    return;\n  }\n\n  // shim sender stats.\n  if (!('getStats' in window.RTCRtpSender.prototype)) {\n    const origGetSenders = window.RTCPeerConnection.prototype.getSenders;\n    if (origGetSenders) {\n      window.RTCPeerConnection.prototype.getSenders = function getSenders() {\n        const senders = origGetSenders.apply(this, []);\n        senders.forEach(sender => sender._pc = this);\n        return senders;\n      };\n    }\n\n    const origAddTrack = window.RTCPeerConnection.prototype.addTrack;\n    if (origAddTrack) {\n      window.RTCPeerConnection.prototype.addTrack = function addTrack() {\n        const sender = origAddTrack.apply(this, arguments);\n        sender._pc = this;\n        return sender;\n      };\n    }\n    window.RTCRtpSender.prototype.getStats = function getStats() {\n      const sender = this;\n      return this._pc.getStats().then(result =>\n        /* Note: this will include stats of all senders that\n         *   send a track with the same id as sender.track as\n         *   it is not possible to identify the RTCRtpSender.\n         */\n        utils.filterStats(result, sender.track, true));\n    };\n  }\n\n  // shim receiver stats.\n  if (!('getStats' in window.RTCRtpReceiver.prototype)) {\n    const origGetReceivers = window.RTCPeerConnection.prototype.getReceivers;\n    if (origGetReceivers) {\n      window.RTCPeerConnection.prototype.getReceivers =\n        function getReceivers() {\n          const receivers = origGetReceivers.apply(this, []);\n          receivers.forEach(receiver => receiver._pc = this);\n          return receivers;\n        };\n    }\n    utils.wrapPeerConnectionEvent(window, 'track', e => {\n      e.receiver._pc = e.srcElement;\n      return e;\n    });\n    window.RTCRtpReceiver.prototype.getStats = function getStats() {\n      const receiver = this;\n      return this._pc.getStats().then(result =>\n        utils.filterStats(result, receiver.track, false));\n    };\n  }\n\n  if (!('getStats' in window.RTCRtpSender.prototype &&\n      'getStats' in window.RTCRtpReceiver.prototype)) {\n    return;\n  }\n\n  // shim RTCPeerConnection.getStats(track).\n  const origGetStats = window.RTCPeerConnection.prototype.getStats;\n  window.RTCPeerConnection.prototype.getStats = function getStats() {\n    if (arguments.length > 0 &&\n        arguments[0] instanceof window.MediaStreamTrack) {\n      const track = arguments[0];\n      let sender;\n      let receiver;\n      let err;\n      this.getSenders().forEach(s => {\n        if (s.track === track) {\n          if (sender) {\n            err = true;\n          } else {\n            sender = s;\n          }\n        }\n      });\n      this.getReceivers().forEach(r => {\n        if (r.track === track) {\n          if (receiver) {\n            err = true;\n          } else {\n            receiver = r;\n          }\n        }\n        return r.track === track;\n      });\n      if (err || (sender && receiver)) {\n        return Promise.reject(new DOMException(\n          'There are more than one sender or receiver for the track.',\n          'InvalidAccessError'));\n      } else if (sender) {\n        return sender.getStats();\n      } else if (receiver) {\n        return receiver.getStats();\n      }\n      return Promise.reject(new DOMException(\n        'There is no sender or receiver for the track.',\n        'InvalidAccessError'));\n    }\n    return origGetStats.apply(this, arguments);\n  };\n}\n\nexport function shimAddTrackRemoveTrackWithNative(window) {\n  // shim addTrack/removeTrack with native variants in order to make\n  // the interactions with legacy getLocalStreams behave as in other browsers.\n  // Keeps a mapping stream.id => [stream, rtpsenders...]\n  window.RTCPeerConnection.prototype.getLocalStreams =\n    function getLocalStreams() {\n      this._shimmedLocalStreams = this._shimmedLocalStreams || {};\n      return Object.keys(this._shimmedLocalStreams)\n        .map(streamId => this._shimmedLocalStreams[streamId][0]);\n    };\n\n  const origAddTrack = window.RTCPeerConnection.prototype.addTrack;\n  window.RTCPeerConnection.prototype.addTrack =\n    function addTrack(track, stream) {\n      if (!stream) {\n        return origAddTrack.apply(this, arguments);\n      }\n      this._shimmedLocalStreams = this._shimmedLocalStreams || {};\n\n      const sender = origAddTrack.apply(this, arguments);\n      if (!this._shimmedLocalStreams[stream.id]) {\n        this._shimmedLocalStreams[stream.id] = [stream, sender];\n      } else if (this._shimmedLocalStreams[stream.id].indexOf(sender) === -1) {\n        this._shimmedLocalStreams[stream.id].push(sender);\n      }\n      return sender;\n    };\n\n  const origAddStream = window.RTCPeerConnection.prototype.addStream;\n  window.RTCPeerConnection.prototype.addStream = function addStream(stream) {\n    this._shimmedLocalStreams = this._shimmedLocalStreams || {};\n\n    stream.getTracks().forEach(track => {\n      const alreadyExists = this.getSenders().find(s => s.track === track);\n      if (alreadyExists) {\n        throw new DOMException('Track already exists.',\n            'InvalidAccessError');\n      }\n    });\n    const existingSenders = this.getSenders();\n    origAddStream.apply(this, arguments);\n    const newSenders = this.getSenders()\n      .filter(newSender => existingSenders.indexOf(newSender) === -1);\n    this._shimmedLocalStreams[stream.id] = [stream].concat(newSenders);\n  };\n\n  const origRemoveStream = window.RTCPeerConnection.prototype.removeStream;\n  window.RTCPeerConnection.prototype.removeStream =\n    function removeStream(stream) {\n      this._shimmedLocalStreams = this._shimmedLocalStreams || {};\n      delete this._shimmedLocalStreams[stream.id];\n      return origRemoveStream.apply(this, arguments);\n    };\n\n  const origRemoveTrack = window.RTCPeerConnection.prototype.removeTrack;\n  window.RTCPeerConnection.prototype.removeTrack =\n    function removeTrack(sender) {\n      this._shimmedLocalStreams = this._shimmedLocalStreams || {};\n      if (sender) {\n        Object.keys(this._shimmedLocalStreams).forEach(streamId => {\n          const idx = this._shimmedLocalStreams[streamId].indexOf(sender);\n          if (idx !== -1) {\n            this._shimmedLocalStreams[streamId].splice(idx, 1);\n          }\n          if (this._shimmedLocalStreams[streamId].length === 1) {\n            delete this._shimmedLocalStreams[streamId];\n          }\n        });\n      }\n      return origRemoveTrack.apply(this, arguments);\n    };\n}\n\nexport function shimAddTrackRemoveTrack(window, browserDetails) {\n  if (!window.RTCPeerConnection) {\n    return;\n  }\n  // shim addTrack and removeTrack.\n  if (window.RTCPeerConnection.prototype.addTrack &&\n      browserDetails.version >= 65) {\n    return shimAddTrackRemoveTrackWithNative(window);\n  }\n\n  // also shim pc.getLocalStreams when addTrack is shimmed\n  // to return the original streams.\n  const origGetLocalStreams = window.RTCPeerConnection.prototype\n      .getLocalStreams;\n  window.RTCPeerConnection.prototype.getLocalStreams =\n    function getLocalStreams() {\n      const nativeStreams = origGetLocalStreams.apply(this);\n      this._reverseStreams = this._reverseStreams || {};\n      return nativeStreams.map(stream => this._reverseStreams[stream.id]);\n    };\n\n  const origAddStream = window.RTCPeerConnection.prototype.addStream;\n  window.RTCPeerConnection.prototype.addStream = function addStream(stream) {\n    this._streams = this._streams || {};\n    this._reverseStreams = this._reverseStreams || {};\n\n    stream.getTracks().forEach(track => {\n      const alreadyExists = this.getSenders().find(s => s.track === track);\n      if (alreadyExists) {\n        throw new DOMException('Track already exists.',\n            'InvalidAccessError');\n      }\n    });\n    // Add identity mapping for consistency with addTrack.\n    // Unless this is being used with a stream from addTrack.\n    if (!this._reverseStreams[stream.id]) {\n      const newStream = new window.MediaStream(stream.getTracks());\n      this._streams[stream.id] = newStream;\n      this._reverseStreams[newStream.id] = stream;\n      stream = newStream;\n    }\n    origAddStream.apply(this, [stream]);\n  };\n\n  const origRemoveStream = window.RTCPeerConnection.prototype.removeStream;\n  window.RTCPeerConnection.prototype.removeStream =\n    function removeStream(stream) {\n      this._streams = this._streams || {};\n      this._reverseStreams = this._reverseStreams || {};\n\n      origRemoveStream.apply(this, [(this._streams[stream.id] || stream)]);\n      delete this._reverseStreams[(this._streams[stream.id] ?\n          this._streams[stream.id].id : stream.id)];\n      delete this._streams[stream.id];\n    };\n\n  window.RTCPeerConnection.prototype.addTrack =\n    function addTrack(track, stream) {\n      if (this.signalingState === 'closed') {\n        throw new DOMException(\n          'The RTCPeerConnection\\'s signalingState is \\'closed\\'.',\n          'InvalidStateError');\n      }\n      const streams = [].slice.call(arguments, 1);\n      if (streams.length !== 1 ||\n          !streams[0].getTracks().find(t => t === track)) {\n        // this is not fully correct but all we can manage without\n        // [[associated MediaStreams]] internal slot.\n        throw new DOMException(\n          'The adapter.js addTrack polyfill only supports a single ' +\n          ' stream which is associated with the specified track.',\n          'NotSupportedError');\n      }\n\n      const alreadyExists = this.getSenders().find(s => s.track === track);\n      if (alreadyExists) {\n        throw new DOMException('Track already exists.',\n            'InvalidAccessError');\n      }\n\n      this._streams = this._streams || {};\n      this._reverseStreams = this._reverseStreams || {};\n      const oldStream = this._streams[stream.id];\n      if (oldStream) {\n        // this is using odd Chrome behaviour, use with caution:\n        // https://bugs.chromium.org/p/webrtc/issues/detail?id=7815\n        // Note: we rely on the high-level addTrack/dtmf shim to\n        // create the sender with a dtmf sender.\n        oldStream.addTrack(track);\n\n        // Trigger ONN async.\n        Promise.resolve().then(() => {\n          this.dispatchEvent(new Event('negotiationneeded'));\n        });\n      } else {\n        const newStream = new window.MediaStream([track]);\n        this._streams[stream.id] = newStream;\n        this._reverseStreams[newStream.id] = stream;\n        this.addStream(newStream);\n      }\n      return this.getSenders().find(s => s.track === track);\n    };\n\n  // replace the internal stream id with the external one and\n  // vice versa.\n  function replaceInternalStreamId(pc, description) {\n    let sdp = description.sdp;\n    Object.keys(pc._reverseStreams || []).forEach(internalId => {\n      const externalStream = pc._reverseStreams[internalId];\n      const internalStream = pc._streams[externalStream.id];\n      sdp = sdp.replace(new RegExp(internalStream.id, 'g'),\n          externalStream.id);\n    });\n    return new RTCSessionDescription({\n      type: description.type,\n      sdp\n    });\n  }\n  function replaceExternalStreamId(pc, description) {\n    let sdp = description.sdp;\n    Object.keys(pc._reverseStreams || []).forEach(internalId => {\n      const externalStream = pc._reverseStreams[internalId];\n      const internalStream = pc._streams[externalStream.id];\n      sdp = sdp.replace(new RegExp(externalStream.id, 'g'),\n          internalStream.id);\n    });\n    return new RTCSessionDescription({\n      type: description.type,\n      sdp\n    });\n  }\n  ['createOffer', 'createAnswer'].forEach(function(method) {\n    const nativeMethod = window.RTCPeerConnection.prototype[method];\n    const methodObj = {[method]() {\n      const args = arguments;\n      const isLegacyCall = arguments.length &&\n          typeof arguments[0] === 'function';\n      if (isLegacyCall) {\n        return nativeMethod.apply(this, [\n          (description) => {\n            const desc = replaceInternalStreamId(this, description);\n            args[0].apply(null, [desc]);\n          },\n          (err) => {\n            if (args[1]) {\n              args[1].apply(null, err);\n            }\n          }, arguments[2]\n        ]);\n      }\n      return nativeMethod.apply(this, arguments)\n      .then(description => replaceInternalStreamId(this, description));\n    }};\n    window.RTCPeerConnection.prototype[method] = methodObj[method];\n  });\n\n  const origSetLocalDescription =\n      window.RTCPeerConnection.prototype.setLocalDescription;\n  window.RTCPeerConnection.prototype.setLocalDescription =\n    function setLocalDescription() {\n      if (!arguments.length || !arguments[0].type) {\n        return origSetLocalDescription.apply(this, arguments);\n      }\n      arguments[0] = replaceExternalStreamId(this, arguments[0]);\n      return origSetLocalDescription.apply(this, arguments);\n    };\n\n  // TODO: mangle getStats: https://w3c.github.io/webrtc-stats/#dom-rtcmediastreamstats-streamidentifier\n\n  const origLocalDescription = Object.getOwnPropertyDescriptor(\n      window.RTCPeerConnection.prototype, 'localDescription');\n  Object.defineProperty(window.RTCPeerConnection.prototype,\n      'localDescription', {\n        get() {\n          const description = origLocalDescription.get.apply(this);\n          if (description.type === '') {\n            return description;\n          }\n          return replaceInternalStreamId(this, description);\n        }\n      });\n\n  window.RTCPeerConnection.prototype.removeTrack =\n    function removeTrack(sender) {\n      if (this.signalingState === 'closed') {\n        throw new DOMException(\n          'The RTCPeerConnection\\'s signalingState is \\'closed\\'.',\n          'InvalidStateError');\n      }\n      // We can not yet check for sender instanceof RTCRtpSender\n      // since we shim RTPSender. So we check if sender._pc is set.\n      if (!sender._pc) {\n        throw new DOMException('Argument 1 of RTCPeerConnection.removeTrack ' +\n            'does not implement interface RTCRtpSender.', 'TypeError');\n      }\n      const isLocal = sender._pc === this;\n      if (!isLocal) {\n        throw new DOMException('Sender was not created by this connection.',\n            'InvalidAccessError');\n      }\n\n      // Search for the native stream the senders track belongs to.\n      this._streams = this._streams || {};\n      let stream;\n      Object.keys(this._streams).forEach(streamid => {\n        const hasTrack = this._streams[streamid].getTracks()\n          .find(track => sender.track === track);\n        if (hasTrack) {\n          stream = this._streams[streamid];\n        }\n      });\n\n      if (stream) {\n        if (stream.getTracks().length === 1) {\n          // if this is the last track of the stream, remove the stream. This\n          // takes care of any shimmed _senders.\n          this.removeStream(this._reverseStreams[stream.id]);\n        } else {\n          // relying on the same odd chrome behaviour as above.\n          stream.removeTrack(sender.track);\n        }\n        this.dispatchEvent(new Event('negotiationneeded'));\n      }\n    };\n}\n\nexport function shimPeerConnection(window, browserDetails) {\n  if (!window.RTCPeerConnection && window.webkitRTCPeerConnection) {\n    // very basic support for old versions.\n    window.RTCPeerConnection = window.webkitRTCPeerConnection;\n  }\n  if (!window.RTCPeerConnection) {\n    return;\n  }\n\n  // shim implicit creation of RTCSessionDescription/RTCIceCandidate\n  if (browserDetails.version < 53) {\n    ['setLocalDescription', 'setRemoteDescription', 'addIceCandidate']\n        .forEach(function(method) {\n          const nativeMethod = window.RTCPeerConnection.prototype[method];\n          const methodObj = {[method]() {\n            arguments[0] = new ((method === 'addIceCandidate') ?\n                window.RTCIceCandidate :\n                window.RTCSessionDescription)(arguments[0]);\n            return nativeMethod.apply(this, arguments);\n          }};\n          window.RTCPeerConnection.prototype[method] = methodObj[method];\n        });\n  }\n}\n\n// Attempt to fix ONN in plan-b mode.\nexport function fixNegotiationNeeded(window, browserDetails) {\n  utils.wrapPeerConnectionEvent(window, 'negotiationneeded', e => {\n    const pc = e.target;\n    if (browserDetails.version < 72 || (pc.getConfiguration &&\n        pc.getConfiguration().sdpSemantics === 'plan-b')) {\n      if (pc.signalingState !== 'stable') {\n        return;\n      }\n    }\n    return e;\n  });\n}\n","/*\n *  Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n *\n *  Use of this source code is governed by a BSD-style license\n *  that can be found in the LICENSE file in the root of the source\n *  tree.\n */\n /* eslint-env node */\n'use strict';\n\nexport function shimGetUserMedia(window) {\n  const navigator = window && window.navigator;\n\n  const shimError_ = function(e) {\n    return {\n      name: {PermissionDeniedError: 'NotAllowedError'}[e.name] || e.name,\n      message: e.message,\n      constraint: e.constraint,\n      toString() {\n        return this.name;\n      }\n    };\n  };\n\n  // getUserMedia error shim.\n  const origGetUserMedia = navigator.mediaDevices.getUserMedia.\n      bind(navigator.mediaDevices);\n  navigator.mediaDevices.getUserMedia = function(c) {\n    return origGetUserMedia(c).catch(e => Promise.reject(shimError_(e)));\n  };\n}\n","/*\n *  Copyright (c) 2018 The adapter.js project authors. All Rights Reserved.\n *\n *  Use of this source code is governed by a BSD-style license\n *  that can be found in the LICENSE file in the root of the source\n *  tree.\n */\n /* eslint-env node */\n'use strict';\n\nexport function shimGetDisplayMedia(window) {\n  if (!('getDisplayMedia' in window.navigator)) {\n    return;\n  }\n  if (!(window.navigator.mediaDevices)) {\n    return;\n  }\n  if (window.navigator.mediaDevices &&\n    'getDisplayMedia' in window.navigator.mediaDevices) {\n    return;\n  }\n  window.navigator.mediaDevices.getDisplayMedia =\n    window.navigator.getDisplayMedia.bind(window.navigator);\n}\n","/*\n *  Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n *\n *  Use of this source code is governed by a BSD-style license\n *  that can be found in the LICENSE file in the root of the source\n *  tree.\n */\n/* eslint-env node */\n'use strict';\n\nimport * as utils from '../utils';\nimport {filterIceServers} from './filtericeservers';\nimport shimRTCPeerConnection from 'rtcpeerconnection-shim';\n\nexport {shimGetUserMedia} from './getusermedia';\nexport {shimGetDisplayMedia} from './getdisplaymedia';\n\nexport function shimPeerConnection(window, browserDetails) {\n  if (window.RTCIceGatherer) {\n    if (!window.RTCIceCandidate) {\n      window.RTCIceCandidate = function RTCIceCandidate(args) {\n        return args;\n      };\n    }\n    if (!window.RTCSessionDescription) {\n      window.RTCSessionDescription = function RTCSessionDescription(args) {\n        return args;\n      };\n    }\n    // this adds an additional event listener to MediaStrackTrack that signals\n    // when a tracks enabled property was changed. Workaround for a bug in\n    // addStream, see below. No longer required in 15025+\n    if (browserDetails.version < 15025) {\n      const origMSTEnabled = Object.getOwnPropertyDescriptor(\n          window.MediaStreamTrack.prototype, 'enabled');\n      Object.defineProperty(window.MediaStreamTrack.prototype, 'enabled', {\n        set(value) {\n          origMSTEnabled.set.call(this, value);\n          const ev = new Event('enabled');\n          ev.enabled = value;\n          this.dispatchEvent(ev);\n        }\n      });\n    }\n  }\n\n  // ORTC defines the DTMF sender a bit different.\n  // https://github.com/w3c/ortc/issues/714\n  if (window.RTCRtpSender && !('dtmf' in window.RTCRtpSender.prototype)) {\n    Object.defineProperty(window.RTCRtpSender.prototype, 'dtmf', {\n      get() {\n        if (this._dtmf === undefined) {\n          if (this.track.kind === 'audio') {\n            this._dtmf = new window.RTCDtmfSender(this);\n          } else if (this.track.kind === 'video') {\n            this._dtmf = null;\n          }\n        }\n        return this._dtmf;\n      }\n    });\n  }\n  // Edge currently only implements the RTCDtmfSender, not the\n  // RTCDTMFSender alias. See http://draft.ortc.org/#rtcdtmfsender2*\n  if (window.RTCDtmfSender && !window.RTCDTMFSender) {\n    window.RTCDTMFSender = window.RTCDtmfSender;\n  }\n\n  const RTCPeerConnectionShim = shimRTCPeerConnection(window,\n      browserDetails.version);\n  window.RTCPeerConnection = function RTCPeerConnection(config) {\n    if (config && config.iceServers) {\n      config.iceServers = filterIceServers(config.iceServers,\n        browserDetails.version);\n      utils.log('ICE servers after filtering:', config.iceServers);\n    }\n    return new RTCPeerConnectionShim(config);\n  };\n  window.RTCPeerConnection.prototype = RTCPeerConnectionShim.prototype;\n}\n\nexport function shimReplaceTrack(window) {\n  // ORTC has replaceTrack -- https://github.com/w3c/ortc/issues/614\n  if (window.RTCRtpSender &&\n      !('replaceTrack' in window.RTCRtpSender.prototype)) {\n    window.RTCRtpSender.prototype.replaceTrack =\n        window.RTCRtpSender.prototype.setTrack;\n  }\n}\n","/*\n *  Copyright (c) 2018 The WebRTC project authors. All Rights Reserved.\n *\n *  Use of this source code is governed by a BSD-style license\n *  that can be found in the LICENSE file in the root of the source\n *  tree.\n */\n/* eslint-env node */\n'use strict';\n\nimport * as utils from '../utils';\n// Edge does not like\n// 1) stun: filtered after 14393 unless ?transport=udp is present\n// 2) turn: that does not have all of turn:host:port?transport=udp\n// 3) turn: with ipv6 addresses\n// 4) turn: occurring muliple times\nexport function filterIceServers(iceServers, edgeVersion) {\n  let hasTurn = false;\n  iceServers = JSON.parse(JSON.stringify(iceServers));\n  return iceServers.filter(server => {\n    if (server && (server.urls || server.url)) {\n      let urls = server.urls || server.url;\n      if (server.url && !server.urls) {\n        utils.deprecated('RTCIceServer.url', 'RTCIceServer.urls');\n      }\n      const isString = typeof urls === 'string';\n      if (isString) {\n        urls = [urls];\n      }\n      urls = urls.filter(url => {\n        // filter STUN unconditionally.\n        if (url.indexOf('stun:') === 0) {\n          return false;\n        }\n\n        const validTurn = url.startsWith('turn') &&\n            !url.startsWith('turn:[') &&\n            url.includes('transport=udp');\n        if (validTurn && !hasTurn) {\n          hasTurn = true;\n          return true;\n        }\n        return validTurn && !hasTurn;\n      });\n\n      delete server.url;\n      server.urls = isString ? urls[0] : urls;\n      return !!urls.length;\n    }\n  });\n}\n","/*\n *  Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n *\n *  Use of this source code is governed by a BSD-style license\n *  that can be found in the LICENSE file in the root of the source\n *  tree.\n */\n/* eslint-env node */\n'use strict';\n\nimport * as utils from '../utils';\n\nexport function shimGetUserMedia(window, browserDetails) {\n  const navigator = window && window.navigator;\n  const MediaStreamTrack = window && window.MediaStreamTrack;\n\n  navigator.getUserMedia = function(constraints, onSuccess, onError) {\n    // Replace Firefox 44+'s deprecation warning with unprefixed version.\n    utils.deprecated('navigator.getUserMedia',\n        'navigator.mediaDevices.getUserMedia');\n    navigator.mediaDevices.getUserMedia(constraints).then(onSuccess, onError);\n  };\n\n  if (!(browserDetails.version > 55 &&\n      'autoGainControl' in navigator.mediaDevices.getSupportedConstraints())) {\n    const remap = function(obj, a, b) {\n      if (a in obj && !(b in obj)) {\n        obj[b] = obj[a];\n        delete obj[a];\n      }\n    };\n\n    const nativeGetUserMedia = navigator.mediaDevices.getUserMedia.\n        bind(navigator.mediaDevices);\n    navigator.mediaDevices.getUserMedia = function(c) {\n      if (typeof c === 'object' && typeof c.audio === 'object') {\n        c = JSON.parse(JSON.stringify(c));\n        remap(c.audio, 'autoGainControl', 'mozAutoGainControl');\n        remap(c.audio, 'noiseSuppression', 'mozNoiseSuppression');\n      }\n      return nativeGetUserMedia(c);\n    };\n\n    if (MediaStreamTrack && MediaStreamTrack.prototype.getSettings) {\n      const nativeGetSettings = MediaStreamTrack.prototype.getSettings;\n      MediaStreamTrack.prototype.getSettings = function() {\n        const obj = nativeGetSettings.apply(this, arguments);\n        remap(obj, 'mozAutoGainControl', 'autoGainControl');\n        remap(obj, 'mozNoiseSuppression', 'noiseSuppression');\n        return obj;\n      };\n    }\n\n    if (MediaStreamTrack && MediaStreamTrack.prototype.applyConstraints) {\n      const nativeApplyConstraints =\n        MediaStreamTrack.prototype.applyConstraints;\n      MediaStreamTrack.prototype.applyConstraints = function(c) {\n        if (this.kind === 'audio' && typeof c === 'object') {\n          c = JSON.parse(JSON.stringify(c));\n          remap(c, 'autoGainControl', 'mozAutoGainControl');\n          remap(c, 'noiseSuppression', 'mozNoiseSuppression');\n        }\n        return nativeApplyConstraints.apply(this, [c]);\n      };\n    }\n  }\n}\n","/*\n *  Copyright (c) 2018 The adapter.js project authors. All Rights Reserved.\n *\n *  Use of this source code is governed by a BSD-style license\n *  that can be found in the LICENSE file in the root of the source\n *  tree.\n */\n/* eslint-env node */\n'use strict';\n\nexport function shimGetDisplayMedia(window, preferredMediaSource) {\n  if (window.navigator.mediaDevices &&\n    'getDisplayMedia' in window.navigator.mediaDevices) {\n    return;\n  }\n  if (!(window.navigator.mediaDevices)) {\n    return;\n  }\n  window.navigator.mediaDevices.getDisplayMedia =\n    function getDisplayMedia(constraints) {\n      if (!(constraints && constraints.video)) {\n        const err = new DOMException('getDisplayMedia without video ' +\n            'constraints is undefined');\n        err.name = 'NotFoundError';\n        // from https://heycam.github.io/webidl/#idl-DOMException-error-names\n        err.code = 8;\n        return Promise.reject(err);\n      }\n      if (constraints.video === true) {\n        constraints.video = {mediaSource: preferredMediaSource};\n      } else {\n        constraints.video.mediaSource = preferredMediaSource;\n      }\n      return window.navigator.mediaDevices.getUserMedia(constraints);\n    };\n}\n","/*\n *  Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n *\n *  Use of this source code is governed by a BSD-style license\n *  that can be found in the LICENSE file in the root of the source\n *  tree.\n */\n/* eslint-env node */\n'use strict';\n\nimport * as utils from '../utils';\nexport {shimGetUserMedia} from './getusermedia';\nexport {shimGetDisplayMedia} from './getdisplaymedia';\n\nexport function shimOnTrack(window) {\n  if (typeof window === 'object' && window.RTCTrackEvent &&\n      ('receiver' in window.RTCTrackEvent.prototype) &&\n      !('transceiver' in window.RTCTrackEvent.prototype)) {\n    Object.defineProperty(window.RTCTrackEvent.prototype, 'transceiver', {\n      get() {\n        return {receiver: this.receiver};\n      }\n    });\n  }\n}\n\nexport function shimPeerConnection(window, browserDetails) {\n  if (typeof window !== 'object' ||\n      !(window.RTCPeerConnection || window.mozRTCPeerConnection)) {\n    return; // probably media.peerconnection.enabled=false in about:config\n  }\n  if (!window.RTCPeerConnection && window.mozRTCPeerConnection) {\n    // very basic support for old versions.\n    window.RTCPeerConnection = window.mozRTCPeerConnection;\n  }\n\n  if (browserDetails.version < 53) {\n    // shim away need for obsolete RTCIceCandidate/RTCSessionDescription.\n    ['setLocalDescription', 'setRemoteDescription', 'addIceCandidate']\n        .forEach(function(method) {\n          const nativeMethod = window.RTCPeerConnection.prototype[method];\n          const methodObj = {[method]() {\n            arguments[0] = new ((method === 'addIceCandidate') ?\n                window.RTCIceCandidate :\n                window.RTCSessionDescription)(arguments[0]);\n            return nativeMethod.apply(this, arguments);\n          }};\n          window.RTCPeerConnection.prototype[method] = methodObj[method];\n        });\n  }\n\n  const modernStatsTypes = {\n    inboundrtp: 'inbound-rtp',\n    outboundrtp: 'outbound-rtp',\n    candidatepair: 'candidate-pair',\n    localcandidate: 'local-candidate',\n    remotecandidate: 'remote-candidate'\n  };\n\n  const nativeGetStats = window.RTCPeerConnection.prototype.getStats;\n  window.RTCPeerConnection.prototype.getStats = function getStats() {\n    const [selector, onSucc, onErr] = arguments;\n    return nativeGetStats.apply(this, [selector || null])\n      .then(stats => {\n        if (browserDetails.version < 53 && !onSucc) {\n          // Shim only promise getStats with spec-hyphens in type names\n          // Leave callback version alone; misc old uses of forEach before Map\n          try {\n            stats.forEach(stat => {\n              stat.type = modernStatsTypes[stat.type] || stat.type;\n            });\n          } catch (e) {\n            if (e.name !== 'TypeError') {\n              throw e;\n            }\n            // Avoid TypeError: \"type\" is read-only, in old versions. 34-43ish\n            stats.forEach((stat, i) => {\n              stats.set(i, Object.assign({}, stat, {\n                type: modernStatsTypes[stat.type] || stat.type\n              }));\n            });\n          }\n        }\n        return stats;\n      })\n      .then(onSucc, onErr);\n  };\n}\n\nexport function shimSenderGetStats(window) {\n  if (!(typeof window === 'object' && window.RTCPeerConnection &&\n      window.RTCRtpSender)) {\n    return;\n  }\n  if (window.RTCRtpSender && 'getStats' in window.RTCRtpSender.prototype) {\n    return;\n  }\n  const origGetSenders = window.RTCPeerConnection.prototype.getSenders;\n  if (origGetSenders) {\n    window.RTCPeerConnection.prototype.getSenders = function getSenders() {\n      const senders = origGetSenders.apply(this, []);\n      senders.forEach(sender => sender._pc = this);\n      return senders;\n    };\n  }\n\n  const origAddTrack = window.RTCPeerConnection.prototype.addTrack;\n  if (origAddTrack) {\n    window.RTCPeerConnection.prototype.addTrack = function addTrack() {\n      const sender = origAddTrack.apply(this, arguments);\n      sender._pc = this;\n      return sender;\n    };\n  }\n  window.RTCRtpSender.prototype.getStats = function getStats() {\n    return this.track ? this._pc.getStats(this.track) :\n        Promise.resolve(new Map());\n  };\n}\n\nexport function shimReceiverGetStats(window) {\n  if (!(typeof window === 'object' && window.RTCPeerConnection &&\n      window.RTCRtpSender)) {\n    return;\n  }\n  if (window.RTCRtpSender && 'getStats' in window.RTCRtpReceiver.prototype) {\n    return;\n  }\n  const origGetReceivers = window.RTCPeerConnection.prototype.getReceivers;\n  if (origGetReceivers) {\n    window.RTCPeerConnection.prototype.getReceivers = function getReceivers() {\n      const receivers = origGetReceivers.apply(this, []);\n      receivers.forEach(receiver => receiver._pc = this);\n      return receivers;\n    };\n  }\n  utils.wrapPeerConnectionEvent(window, 'track', e => {\n    e.receiver._pc = e.srcElement;\n    return e;\n  });\n  window.RTCRtpReceiver.prototype.getStats = function getStats() {\n    return this._pc.getStats(this.track);\n  };\n}\n\nexport function shimRemoveStream(window) {\n  if (!window.RTCPeerConnection ||\n      'removeStream' in window.RTCPeerConnection.prototype) {\n    return;\n  }\n  window.RTCPeerConnection.prototype.removeStream =\n    function removeStream(stream) {\n      utils.deprecated('removeStream', 'removeTrack');\n      this.getSenders().forEach(sender => {\n        if (sender.track && stream.getTracks().includes(sender.track)) {\n          this.removeTrack(sender);\n        }\n      });\n    };\n}\n\nexport function shimRTCDataChannel(window) {\n  // rename DataChannel to RTCDataChannel (native fix in FF60):\n  // https://bugzilla.mozilla.org/show_bug.cgi?id=1173851\n  if (window.DataChannel && !window.RTCDataChannel) {\n    window.RTCDataChannel = window.DataChannel;\n  }\n}\n\nexport function shimAddTransceiver(window) {\n  // https://github.com/webrtcHacks/adapter/issues/998#issuecomment-516921647\n  // Firefox ignores the init sendEncodings options passed to addTransceiver\n  // https://bugzilla.mozilla.org/show_bug.cgi?id=1396918\n  if (!(typeof window === 'object' && window.RTCPeerConnection)) {\n    return;\n  }\n  const origAddTransceiver = window.RTCPeerConnection.prototype.addTransceiver;\n  if (origAddTransceiver) {\n    window.RTCPeerConnection.prototype.addTransceiver =\n      function addTransceiver() {\n        this.setParametersPromises = [];\n        const initParameters = arguments[1];\n        const shouldPerformCheck = initParameters &&\n                                  'sendEncodings' in initParameters;\n        if (shouldPerformCheck) {\n          // If sendEncodings params are provided, validate grammar\n          initParameters.sendEncodings.forEach((encodingParam) => {\n            if ('rid' in encodingParam) {\n              const ridRegex = /^[a-z0-9]{0,16}$/i;\n              if (!ridRegex.test(encodingParam.rid)) {\n                throw new TypeError('Invalid RID value provided.');\n              }\n            }\n            if ('scaleResolutionDownBy' in encodingParam) {\n              if (!(parseFloat(encodingParam.scaleResolutionDownBy) >= 1.0)) {\n                throw new RangeError('scale_resolution_down_by must be >= 1.0');\n              }\n            }\n            if ('maxFramerate' in encodingParam) {\n              if (!(parseFloat(encodingParam.maxFramerate) >= 0)) {\n                throw new RangeError('max_framerate must be >= 0.0');\n              }\n            }\n          });\n        }\n        const transceiver = origAddTransceiver.apply(this, arguments);\n        if (shouldPerformCheck) {\n          // Check if the init options were applied. If not we do this in an\n          // asynchronous way and save the promise reference in a global object.\n          // This is an ugly hack, but at the same time is way more robust than\n          // checking the sender parameters before and after the createOffer\n          // Also note that after the createoffer we are not 100% sure that\n          // the params were asynchronously applied so we might miss the\n          // opportunity to recreate offer.\n          const {sender} = transceiver;\n          const params = sender.getParameters();\n          if (!('encodings' in params) ||\n              // Avoid being fooled by patched getParameters() below.\n              (params.encodings.length === 1 &&\n               Object.keys(params.encodings[0]).length === 0)) {\n            params.encodings = initParameters.sendEncodings;\n            sender.sendEncodings = initParameters.sendEncodings;\n            this.setParametersPromises.push(sender.setParameters(params)\n              .then(() => {\n                delete sender.sendEncodings;\n              }).catch(() => {\n                delete sender.sendEncodings;\n              })\n            );\n          }\n        }\n        return transceiver;\n      };\n  }\n}\n\nexport function shimGetParameters(window) {\n  if (!(typeof window === 'object' && window.RTCRtpSender)) {\n    return;\n  }\n  const origGetParameters = window.RTCRtpSender.prototype.getParameters;\n  if (origGetParameters) {\n    window.RTCRtpSender.prototype.getParameters =\n      function getParameters() {\n        const params = origGetParameters.apply(this, arguments);\n        if (!('encodings' in params)) {\n          params.encodings = [].concat(this.sendEncodings || [{}]);\n        }\n        return params;\n      };\n  }\n}\n\nexport function shimCreateOffer(window) {\n  // https://github.com/webrtcHacks/adapter/issues/998#issuecomment-516921647\n  // Firefox ignores the init sendEncodings options passed to addTransceiver\n  // https://bugzilla.mozilla.org/show_bug.cgi?id=1396918\n  if (!(typeof window === 'object' && window.RTCPeerConnection)) {\n    return;\n  }\n  const origCreateOffer = window.RTCPeerConnection.prototype.createOffer;\n  window.RTCPeerConnection.prototype.createOffer = function createOffer() {\n    if (this.setParametersPromises && this.setParametersPromises.length) {\n      return Promise.all(this.setParametersPromises)\n      .then(() => {\n        return origCreateOffer.apply(this, arguments);\n      })\n      .finally(() => {\n        this.setParametersPromises = [];\n      });\n    }\n    return origCreateOffer.apply(this, arguments);\n  };\n}\n\nexport function shimCreateAnswer(window) {\n  // https://github.com/webrtcHacks/adapter/issues/998#issuecomment-516921647\n  // Firefox ignores the init sendEncodings options passed to addTransceiver\n  // https://bugzilla.mozilla.org/show_bug.cgi?id=1396918\n  if (!(typeof window === 'object' && window.RTCPeerConnection)) {\n    return;\n  }\n  const origCreateAnswer = window.RTCPeerConnection.prototype.createAnswer;\n  window.RTCPeerConnection.prototype.createAnswer = function createAnswer() {\n    if (this.setParametersPromises && this.setParametersPromises.length) {\n      return Promise.all(this.setParametersPromises)\n      .then(() => {\n        return origCreateAnswer.apply(this, arguments);\n      })\n      .finally(() => {\n        this.setParametersPromises = [];\n      });\n    }\n    return origCreateAnswer.apply(this, arguments);\n  };\n}\n","/*\n *  Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n *\n *  Use of this source code is governed by a BSD-style license\n *  that can be found in the LICENSE file in the root of the source\n *  tree.\n */\n'use strict';\nimport * as utils from '../utils';\n\nexport function shimLocalStreamsAPI(window) {\n  if (typeof window !== 'object' || !window.RTCPeerConnection) {\n    return;\n  }\n  if (!('getLocalStreams' in window.RTCPeerConnection.prototype)) {\n    window.RTCPeerConnection.prototype.getLocalStreams =\n      function getLocalStreams() {\n        if (!this._localStreams) {\n          this._localStreams = [];\n        }\n        return this._localStreams;\n      };\n  }\n  if (!('addStream' in window.RTCPeerConnection.prototype)) {\n    const _addTrack = window.RTCPeerConnection.prototype.addTrack;\n    window.RTCPeerConnection.prototype.addStream = function addStream(stream) {\n      if (!this._localStreams) {\n        this._localStreams = [];\n      }\n      if (!this._localStreams.includes(stream)) {\n        this._localStreams.push(stream);\n      }\n      // Try to emulate Chrome's behaviour of adding in audio-video order.\n      // Safari orders by track id.\n      stream.getAudioTracks().forEach(track => _addTrack.call(this, track,\n        stream));\n      stream.getVideoTracks().forEach(track => _addTrack.call(this, track,\n        stream));\n    };\n\n    window.RTCPeerConnection.prototype.addTrack =\n      function addTrack(track, ...streams) {\n        if (streams) {\n          streams.forEach((stream) => {\n            if (!this._localStreams) {\n              this._localStreams = [stream];\n            } else if (!this._localStreams.includes(stream)) {\n              this._localStreams.push(stream);\n            }\n          });\n        }\n        return _addTrack.apply(this, arguments);\n      };\n  }\n  if (!('removeStream' in window.RTCPeerConnection.prototype)) {\n    window.RTCPeerConnection.prototype.removeStream =\n      function removeStream(stream) {\n        if (!this._localStreams) {\n          this._localStreams = [];\n        }\n        const index = this._localStreams.indexOf(stream);\n        if (index === -1) {\n          return;\n        }\n        this._localStreams.splice(index, 1);\n        const tracks = stream.getTracks();\n        this.getSenders().forEach(sender => {\n          if (tracks.includes(sender.track)) {\n            this.removeTrack(sender);\n          }\n        });\n      };\n  }\n}\n\nexport function shimRemoteStreamsAPI(window) {\n  if (typeof window !== 'object' || !window.RTCPeerConnection) {\n    return;\n  }\n  if (!('getRemoteStreams' in window.RTCPeerConnection.prototype)) {\n    window.RTCPeerConnection.prototype.getRemoteStreams =\n      function getRemoteStreams() {\n        return this._remoteStreams ? this._remoteStreams : [];\n      };\n  }\n  if (!('onaddstream' in window.RTCPeerConnection.prototype)) {\n    Object.defineProperty(window.RTCPeerConnection.prototype, 'onaddstream', {\n      get() {\n        return this._onaddstream;\n      },\n      set(f) {\n        if (this._onaddstream) {\n          this.removeEventListener('addstream', this._onaddstream);\n          this.removeEventListener('track', this._onaddstreampoly);\n        }\n        this.addEventListener('addstream', this._onaddstream = f);\n        this.addEventListener('track', this._onaddstreampoly = (e) => {\n          e.streams.forEach(stream => {\n            if (!this._remoteStreams) {\n              this._remoteStreams = [];\n            }\n            if (this._remoteStreams.includes(stream)) {\n              return;\n            }\n            this._remoteStreams.push(stream);\n            const event = new Event('addstream');\n            event.stream = stream;\n            this.dispatchEvent(event);\n          });\n        });\n      }\n    });\n    const origSetRemoteDescription =\n      window.RTCPeerConnection.prototype.setRemoteDescription;\n    window.RTCPeerConnection.prototype.setRemoteDescription =\n      function setRemoteDescription() {\n        const pc = this;\n        if (!this._onaddstreampoly) {\n          this.addEventListener('track', this._onaddstreampoly = function(e) {\n            e.streams.forEach(stream => {\n              if (!pc._remoteStreams) {\n                pc._remoteStreams = [];\n              }\n              if (pc._remoteStreams.indexOf(stream) >= 0) {\n                return;\n              }\n              pc._remoteStreams.push(stream);\n              const event = new Event('addstream');\n              event.stream = stream;\n              pc.dispatchEvent(event);\n            });\n          });\n        }\n        return origSetRemoteDescription.apply(pc, arguments);\n      };\n  }\n}\n\nexport function shimCallbacksAPI(window) {\n  if (typeof window !== 'object' || !window.RTCPeerConnection) {\n    return;\n  }\n  const prototype = window.RTCPeerConnection.prototype;\n  const origCreateOffer = prototype.createOffer;\n  const origCreateAnswer = prototype.createAnswer;\n  const setLocalDescription = prototype.setLocalDescription;\n  const setRemoteDescription = prototype.setRemoteDescription;\n  const addIceCandidate = prototype.addIceCandidate;\n\n  prototype.createOffer =\n    function createOffer(successCallback, failureCallback) {\n      const options = (arguments.length >= 2) ? arguments[2] : arguments[0];\n      const promise = origCreateOffer.apply(this, [options]);\n      if (!failureCallback) {\n        return promise;\n      }\n      promise.then(successCallback, failureCallback);\n      return Promise.resolve();\n    };\n\n  prototype.createAnswer =\n    function createAnswer(successCallback, failureCallback) {\n      const options = (arguments.length >= 2) ? arguments[2] : arguments[0];\n      const promise = origCreateAnswer.apply(this, [options]);\n      if (!failureCallback) {\n        return promise;\n      }\n      promise.then(successCallback, failureCallback);\n      return Promise.resolve();\n    };\n\n  let withCallback = function(description, successCallback, failureCallback) {\n    const promise = setLocalDescription.apply(this, [description]);\n    if (!failureCallback) {\n      return promise;\n    }\n    promise.then(successCallback, failureCallback);\n    return Promise.resolve();\n  };\n  prototype.setLocalDescription = withCallback;\n\n  withCallback = function(description, successCallback, failureCallback) {\n    const promise = setRemoteDescription.apply(this, [description]);\n    if (!failureCallback) {\n      return promise;\n    }\n    promise.then(successCallback, failureCallback);\n    return Promise.resolve();\n  };\n  prototype.setRemoteDescription = withCallback;\n\n  withCallback = function(candidate, successCallback, failureCallback) {\n    const promise = addIceCandidate.apply(this, [candidate]);\n    if (!failureCallback) {\n      return promise;\n    }\n    promise.then(successCallback, failureCallback);\n    return Promise.resolve();\n  };\n  prototype.addIceCandidate = withCallback;\n}\n\nexport function shimGetUserMedia(window) {\n  const navigator = window && window.navigator;\n\n  if (navigator.mediaDevices && navigator.mediaDevices.getUserMedia) {\n    // shim not needed in Safari 12.1\n    const mediaDevices = navigator.mediaDevices;\n    const _getUserMedia = mediaDevices.getUserMedia.bind(mediaDevices);\n    navigator.mediaDevices.getUserMedia = (constraints) => {\n      return _getUserMedia(shimConstraints(constraints));\n    };\n  }\n\n  if (!navigator.getUserMedia && navigator.mediaDevices &&\n    navigator.mediaDevices.getUserMedia) {\n    navigator.getUserMedia = function getUserMedia(constraints, cb, errcb) {\n      navigator.mediaDevices.getUserMedia(constraints)\n      .then(cb, errcb);\n    }.bind(navigator);\n  }\n}\n\nexport function shimConstraints(constraints) {\n  if (constraints && constraints.video !== undefined) {\n    return Object.assign({},\n      constraints,\n      {video: utils.compactObject(constraints.video)}\n    );\n  }\n\n  return constraints;\n}\n\nexport function shimRTCIceServerUrls(window) {\n  if (!window.RTCPeerConnection) {\n    return;\n  }\n  // migrate from non-spec RTCIceServer.url to RTCIceServer.urls\n  const OrigPeerConnection = window.RTCPeerConnection;\n  window.RTCPeerConnection =\n    function RTCPeerConnection(pcConfig, pcConstraints) {\n      if (pcConfig && pcConfig.iceServers) {\n        const newIceServers = [];\n        for (let i = 0; i < pcConfig.iceServers.length; i++) {\n          let server = pcConfig.iceServers[i];\n          if (!server.hasOwnProperty('urls') &&\n              server.hasOwnProperty('url')) {\n            utils.deprecated('RTCIceServer.url', 'RTCIceServer.urls');\n            server = JSON.parse(JSON.stringify(server));\n            server.urls = server.url;\n            delete server.url;\n            newIceServers.push(server);\n          } else {\n            newIceServers.push(pcConfig.iceServers[i]);\n          }\n        }\n        pcConfig.iceServers = newIceServers;\n      }\n      return new OrigPeerConnection(pcConfig, pcConstraints);\n    };\n  window.RTCPeerConnection.prototype = OrigPeerConnection.prototype;\n  // wrap static methods. Currently just generateCertificate.\n  if ('generateCertificate' in OrigPeerConnection) {\n    Object.defineProperty(window.RTCPeerConnection, 'generateCertificate', {\n      get() {\n        return OrigPeerConnection.generateCertificate;\n      }\n    });\n  }\n}\n\nexport function shimTrackEventTransceiver(window) {\n  // Add event.transceiver member over deprecated event.receiver\n  if (typeof window === 'object' && window.RTCTrackEvent &&\n      'receiver' in window.RTCTrackEvent.prototype &&\n      !('transceiver' in window.RTCTrackEvent.prototype)) {\n    Object.defineProperty(window.RTCTrackEvent.prototype, 'transceiver', {\n      get() {\n        return {receiver: this.receiver};\n      }\n    });\n  }\n}\n\nexport function shimCreateOfferLegacy(window) {\n  const origCreateOffer = window.RTCPeerConnection.prototype.createOffer;\n  window.RTCPeerConnection.prototype.createOffer =\n    function createOffer(offerOptions) {\n      if (offerOptions) {\n        if (typeof offerOptions.offerToReceiveAudio !== 'undefined') {\n          // support bit values\n          offerOptions.offerToReceiveAudio =\n            !!offerOptions.offerToReceiveAudio;\n        }\n        const audioTransceiver = this.getTransceivers().find(transceiver =>\n          transceiver.receiver.track.kind === 'audio');\n        if (offerOptions.offerToReceiveAudio === false && audioTransceiver) {\n          if (audioTransceiver.direction === 'sendrecv') {\n            if (audioTransceiver.setDirection) {\n              audioTransceiver.setDirection('sendonly');\n            } else {\n              audioTransceiver.direction = 'sendonly';\n            }\n          } else if (audioTransceiver.direction === 'recvonly') {\n            if (audioTransceiver.setDirection) {\n              audioTransceiver.setDirection('inactive');\n            } else {\n              audioTransceiver.direction = 'inactive';\n            }\n          }\n        } else if (offerOptions.offerToReceiveAudio === true &&\n            !audioTransceiver) {\n          this.addTransceiver('audio');\n        }\n\n        if (typeof offerOptions.offerToReceiveVideo !== 'undefined') {\n          // support bit values\n          offerOptions.offerToReceiveVideo =\n            !!offerOptions.offerToReceiveVideo;\n        }\n        const videoTransceiver = this.getTransceivers().find(transceiver =>\n          transceiver.receiver.track.kind === 'video');\n        if (offerOptions.offerToReceiveVideo === false && videoTransceiver) {\n          if (videoTransceiver.direction === 'sendrecv') {\n            if (videoTransceiver.setDirection) {\n              videoTransceiver.setDirection('sendonly');\n            } else {\n              videoTransceiver.direction = 'sendonly';\n            }\n          } else if (videoTransceiver.direction === 'recvonly') {\n            if (videoTransceiver.setDirection) {\n              videoTransceiver.setDirection('inactive');\n            } else {\n              videoTransceiver.direction = 'inactive';\n            }\n          }\n        } else if (offerOptions.offerToReceiveVideo === true &&\n            !videoTransceiver) {\n          this.addTransceiver('video');\n        }\n      }\n      return origCreateOffer.apply(this, arguments);\n    };\n}\n\nexport function shimAudioContext(window) {\n  if (typeof window !== 'object' || window.AudioContext) {\n    return;\n  }\n  window.AudioContext = window.webkitAudioContext;\n}\n","/*\n *  Copyright (c) 2017 The WebRTC project authors. All Rights Reserved.\n *\n *  Use of this source code is governed by a BSD-style license\n *  that can be found in the LICENSE file in the root of the source\n *  tree.\n */\n/* eslint-env node */\n'use strict';\n\nimport SDPUtils from 'sdp';\nimport * as utils from './utils';\n\nexport function shimRTCIceCandidate(window) {\n  // foundation is arbitrarily chosen as an indicator for full support for\n  // https://w3c.github.io/webrtc-pc/#rtcicecandidate-interface\n  if (!window.RTCIceCandidate || (window.RTCIceCandidate && 'foundation' in\n      window.RTCIceCandidate.prototype)) {\n    return;\n  }\n\n  const NativeRTCIceCandidate = window.RTCIceCandidate;\n  window.RTCIceCandidate = function RTCIceCandidate(args) {\n    // Remove the a= which shouldn't be part of the candidate string.\n    if (typeof args === 'object' && args.candidate &&\n        args.candidate.indexOf('a=') === 0) {\n      args = JSON.parse(JSON.stringify(args));\n      args.candidate = args.candidate.substr(2);\n    }\n\n    if (args.candidate && args.candidate.length) {\n      // Augment the native candidate with the parsed fields.\n      const nativeCandidate = new NativeRTCIceCandidate(args);\n      const parsedCandidate = SDPUtils.parseCandidate(args.candidate);\n      const augmentedCandidate = Object.assign(nativeCandidate,\n          parsedCandidate);\n\n      // Add a serializer that does not serialize the extra attributes.\n      augmentedCandidate.toJSON = function toJSON() {\n        return {\n          candidate: augmentedCandidate.candidate,\n          sdpMid: augmentedCandidate.sdpMid,\n          sdpMLineIndex: augmentedCandidate.sdpMLineIndex,\n          usernameFragment: augmentedCandidate.usernameFragment,\n        };\n      };\n      return augmentedCandidate;\n    }\n    return new NativeRTCIceCandidate(args);\n  };\n  window.RTCIceCandidate.prototype = NativeRTCIceCandidate.prototype;\n\n  // Hook up the augmented candidate in onicecandidate and\n  // addEventListener('icecandidate', ...)\n  utils.wrapPeerConnectionEvent(window, 'icecandidate', e => {\n    if (e.candidate) {\n      Object.defineProperty(e, 'candidate', {\n        value: new window.RTCIceCandidate(e.candidate),\n        writable: 'false'\n      });\n    }\n    return e;\n  });\n}\n\nexport function shimMaxMessageSize(window, browserDetails) {\n  if (!window.RTCPeerConnection) {\n    return;\n  }\n\n  if (!('sctp' in window.RTCPeerConnection.prototype)) {\n    Object.defineProperty(window.RTCPeerConnection.prototype, 'sctp', {\n      get() {\n        return typeof this._sctp === 'undefined' ? null : this._sctp;\n      }\n    });\n  }\n\n  const sctpInDescription = function(description) {\n    if (!description || !description.sdp) {\n      return false;\n    }\n    const sections = SDPUtils.splitSections(description.sdp);\n    sections.shift();\n    return sections.some(mediaSection => {\n      const mLine = SDPUtils.parseMLine(mediaSection);\n      return mLine && mLine.kind === 'application'\n          && mLine.protocol.indexOf('SCTP') !== -1;\n    });\n  };\n\n  const getRemoteFirefoxVersion = function(description) {\n    // TODO: Is there a better solution for detecting Firefox?\n    const match = description.sdp.match(/mozilla...THIS_IS_SDPARTA-(\\d+)/);\n    if (match === null || match.length < 2) {\n      return -1;\n    }\n    const version = parseInt(match[1], 10);\n    // Test for NaN (yes, this is ugly)\n    return version !== version ? -1 : version;\n  };\n\n  const getCanSendMaxMessageSize = function(remoteIsFirefox) {\n    // Every implementation we know can send at least 64 KiB.\n    // Note: Although Chrome is technically able to send up to 256 KiB, the\n    //       data does not reach the other peer reliably.\n    //       See: https://bugs.chromium.org/p/webrtc/issues/detail?id=8419\n    let canSendMaxMessageSize = 65536;\n    if (browserDetails.browser === 'firefox') {\n      if (browserDetails.version < 57) {\n        if (remoteIsFirefox === -1) {\n          // FF < 57 will send in 16 KiB chunks using the deprecated PPID\n          // fragmentation.\n          canSendMaxMessageSize = 16384;\n        } else {\n          // However, other FF (and RAWRTC) can reassemble PPID-fragmented\n          // messages. Thus, supporting ~2 GiB when sending.\n          canSendMaxMessageSize = 2147483637;\n        }\n      } else if (browserDetails.version < 60) {\n        // Currently, all FF >= 57 will reset the remote maximum message size\n        // to the default value when a data channel is created at a later\n        // stage. :(\n        // See: https://bugzilla.mozilla.org/show_bug.cgi?id=1426831\n        canSendMaxMessageSize =\n          browserDetails.version === 57 ? 65535 : 65536;\n      } else {\n        // FF >= 60 supports sending ~2 GiB\n        canSendMaxMessageSize = 2147483637;\n      }\n    }\n    return canSendMaxMessageSize;\n  };\n\n  const getMaxMessageSize = function(description, remoteIsFirefox) {\n    // Note: 65536 bytes is the default value from the SDP spec. Also,\n    //       every implementation we know supports receiving 65536 bytes.\n    let maxMessageSize = 65536;\n\n    // FF 57 has a slightly incorrect default remote max message size, so\n    // we need to adjust it here to avoid a failure when sending.\n    // See: https://bugzilla.mozilla.org/show_bug.cgi?id=1425697\n    if (browserDetails.browser === 'firefox'\n         && browserDetails.version === 57) {\n      maxMessageSize = 65535;\n    }\n\n    const match = SDPUtils.matchPrefix(description.sdp,\n      'a=max-message-size:');\n    if (match.length > 0) {\n      maxMessageSize = parseInt(match[0].substr(19), 10);\n    } else if (browserDetails.browser === 'firefox' &&\n                remoteIsFirefox !== -1) {\n      // If the maximum message size is not present in the remote SDP and\n      // both local and remote are Firefox, the remote peer can receive\n      // ~2 GiB.\n      maxMessageSize = 2147483637;\n    }\n    return maxMessageSize;\n  };\n\n  const origSetRemoteDescription =\n      window.RTCPeerConnection.prototype.setRemoteDescription;\n  window.RTCPeerConnection.prototype.setRemoteDescription =\n    function setRemoteDescription() {\n      this._sctp = null;\n      // Chrome decided to not expose .sctp in plan-b mode.\n      // As usual, adapter.js has to do an 'ugly worakaround'\n      // to cover up the mess.\n      if (browserDetails.browser === 'chrome' && browserDetails.version >= 76) {\n        const {sdpSemantics} = this.getConfiguration();\n        if (sdpSemantics === 'plan-b') {\n          Object.defineProperty(this, 'sctp', {\n            get() {\n              return typeof this._sctp === 'undefined' ? null : this._sctp;\n            },\n            enumerable: true,\n            configurable: true,\n          });\n        }\n      }\n\n      if (sctpInDescription(arguments[0])) {\n        // Check if the remote is FF.\n        const isFirefox = getRemoteFirefoxVersion(arguments[0]);\n\n        // Get the maximum message size the local peer is capable of sending\n        const canSendMMS = getCanSendMaxMessageSize(isFirefox);\n\n        // Get the maximum message size of the remote peer.\n        const remoteMMS = getMaxMessageSize(arguments[0], isFirefox);\n\n        // Determine final maximum message size\n        let maxMessageSize;\n        if (canSendMMS === 0 && remoteMMS === 0) {\n          maxMessageSize = Number.POSITIVE_INFINITY;\n        } else if (canSendMMS === 0 || remoteMMS === 0) {\n          maxMessageSize = Math.max(canSendMMS, remoteMMS);\n        } else {\n          maxMessageSize = Math.min(canSendMMS, remoteMMS);\n        }\n\n        // Create a dummy RTCSctpTransport object and the 'maxMessageSize'\n        // attribute.\n        const sctp = {};\n        Object.defineProperty(sctp, 'maxMessageSize', {\n          get() {\n            return maxMessageSize;\n          }\n        });\n        this._sctp = sctp;\n      }\n\n      return origSetRemoteDescription.apply(this, arguments);\n    };\n}\n\nexport function shimSendThrowTypeError(window) {\n  if (!(window.RTCPeerConnection &&\n      'createDataChannel' in window.RTCPeerConnection.prototype)) {\n    return;\n  }\n\n  // Note: Although Firefox >= 57 has a native implementation, the maximum\n  //       message size can be reset for all data channels at a later stage.\n  //       See: https://bugzilla.mozilla.org/show_bug.cgi?id=1426831\n\n  function wrapDcSend(dc, pc) {\n    const origDataChannelSend = dc.send;\n    dc.send = function send() {\n      const data = arguments[0];\n      const length = data.length || data.size || data.byteLength;\n      if (dc.readyState === 'open' &&\n          pc.sctp && length > pc.sctp.maxMessageSize) {\n        throw new TypeError('Message too large (can send a maximum of ' +\n          pc.sctp.maxMessageSize + ' bytes)');\n      }\n      return origDataChannelSend.apply(dc, arguments);\n    };\n  }\n  const origCreateDataChannel =\n    window.RTCPeerConnection.prototype.createDataChannel;\n  window.RTCPeerConnection.prototype.createDataChannel =\n    function createDataChannel() {\n      const dataChannel = origCreateDataChannel.apply(this, arguments);\n      wrapDcSend(dataChannel, this);\n      return dataChannel;\n    };\n  utils.wrapPeerConnectionEvent(window, 'datachannel', e => {\n    wrapDcSend(e.channel, e.target);\n    return e;\n  });\n}\n\n\n/* shims RTCConnectionState by pretending it is the same as iceConnectionState.\n * See https://bugs.chromium.org/p/webrtc/issues/detail?id=6145#c12\n * for why this is a valid hack in Chrome. In Firefox it is slightly incorrect\n * since DTLS failures would be hidden. See\n * https://bugzilla.mozilla.org/show_bug.cgi?id=1265827\n * for the Firefox tracking bug.\n */\nexport function shimConnectionState(window) {\n  if (!window.RTCPeerConnection ||\n      'connectionState' in window.RTCPeerConnection.prototype) {\n    return;\n  }\n  const proto = window.RTCPeerConnection.prototype;\n  Object.defineProperty(proto, 'connectionState', {\n    get() {\n      return {\n        completed: 'connected',\n        checking: 'connecting'\n      }[this.iceConnectionState] || this.iceConnectionState;\n    },\n    enumerable: true,\n    configurable: true\n  });\n  Object.defineProperty(proto, 'onconnectionstatechange', {\n    get() {\n      return this._onconnectionstatechange || null;\n    },\n    set(cb) {\n      if (this._onconnectionstatechange) {\n        this.removeEventListener('connectionstatechange',\n            this._onconnectionstatechange);\n        delete this._onconnectionstatechange;\n      }\n      if (cb) {\n        this.addEventListener('connectionstatechange',\n            this._onconnectionstatechange = cb);\n      }\n    },\n    enumerable: true,\n    configurable: true\n  });\n\n  ['setLocalDescription', 'setRemoteDescription'].forEach((method) => {\n    const origMethod = proto[method];\n    proto[method] = function() {\n      if (!this._connectionstatechangepoly) {\n        this._connectionstatechangepoly = e => {\n          const pc = e.target;\n          if (pc._lastConnectionState !== pc.connectionState) {\n            pc._lastConnectionState = pc.connectionState;\n            const newEvent = new Event('connectionstatechange', e);\n            pc.dispatchEvent(newEvent);\n          }\n          return e;\n        };\n        this.addEventListener('iceconnectionstatechange',\n          this._connectionstatechangepoly);\n      }\n      return origMethod.apply(this, arguments);\n    };\n  });\n}\n\nexport function removeExtmapAllowMixed(window, browserDetails) {\n  /* remove a=extmap-allow-mixed for webrtc.org < M71 */\n  if (!window.RTCPeerConnection) {\n    return;\n  }\n  if (browserDetails.browser === 'chrome' && browserDetails.version >= 71) {\n    return;\n  }\n  if (browserDetails.browser === 'safari' && browserDetails.version >= 605) {\n    return;\n  }\n  const nativeSRD = window.RTCPeerConnection.prototype.setRemoteDescription;\n  window.RTCPeerConnection.prototype.setRemoteDescription =\n  function setRemoteDescription(desc) {\n    if (desc && desc.sdp && desc.sdp.indexOf('\\na=extmap-allow-mixed') !== -1) {\n      const sdp = desc.sdp.split('\\n').filter((line) => {\n        return line.trim() !== 'a=extmap-allow-mixed';\n      }).join('\\n');\n      // Safari enforces read-only-ness of RTCSessionDescription fields.\n      if (window.RTCSessionDescription &&\n          desc instanceof window.RTCSessionDescription) {\n        arguments[0] = new window.RTCSessionDescription({\n          type: desc.type,\n          sdp,\n        });\n      } else {\n        desc.sdp = sdp;\n      }\n    }\n    return nativeSRD.apply(this, arguments);\n  };\n}\n\nexport function shimAddIceCandidateNullOrEmpty(window, browserDetails) {\n  // Support for addIceCandidate(null or undefined)\n  // as well as addIceCandidate({candidate: \"\", ...})\n  // https://bugs.chromium.org/p/chromium/issues/detail?id=978582\n  // Note: must be called before other polyfills which change the signature.\n  if (!(window.RTCPeerConnection && window.RTCPeerConnection.prototype)) {\n    return;\n  }\n  const nativeAddIceCandidate =\n      window.RTCPeerConnection.prototype.addIceCandidate;\n  if (!nativeAddIceCandidate || nativeAddIceCandidate.length === 0) {\n    return;\n  }\n  window.RTCPeerConnection.prototype.addIceCandidate =\n    function addIceCandidate() {\n      if (!arguments[0]) {\n        if (arguments[1]) {\n          arguments[1].apply(null);\n        }\n        return Promise.resolve();\n      }\n      // Firefox 68+ emits and processes {candidate: \"\", ...}, ignore\n      // in older versions.\n      // Native support for ignoring exists for Chrome M77+.\n      // Safari ignores as well, exact version unknown but works in the same\n      // version that also ignores addIceCandidate(null).\n      if (((browserDetails.browser === 'chrome' && browserDetails.version < 78)\n           || (browserDetails.browser === 'firefox'\n               && browserDetails.version < 68)\n           || (browserDetails.browser === 'safari'))\n          && arguments[0] && arguments[0].candidate === '') {\n        return Promise.resolve();\n      }\n      return nativeAddIceCandidate.apply(this, arguments);\n    };\n}\n","/*\n *  Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n *\n *  Use of this source code is governed by a BSD-style license\n *  that can be found in the LICENSE file in the root of the source\n *  tree.\n */\n/* eslint-env node */\n\n'use strict';\n\nimport {adapterFactory} from './adapter_factory.js';\n\nconst adapter =\n  adapterFactory({window: typeof window === 'undefined' ? undefined : window});\nexport default adapter;\n","/*\n *  Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n *\n *  Use of this source code is governed by a BSD-style license\n *  that can be found in the LICENSE file in the root of the source\n *  tree.\n */\nimport * as utils from './utils';\n\n  // Browser shims.\nimport * as chromeShim from './chrome/chrome_shim';\nimport * as edgeShim from './edge/edge_shim';\nimport * as firefoxShim from './firefox/firefox_shim';\nimport * as safariShim from './safari/safari_shim';\nimport * as commonShim from './common_shim';\n\n// Shimming starts here.\nexport function adapterFactory({window} = {}, options = {\n  shimChrome: true,\n  shimFirefox: true,\n  shimEdge: true,\n  shimSafari: true,\n}) {\n  // Utils.\n  const logging = utils.log;\n  const browserDetails = utils.detectBrowser(window);\n\n  const adapter = {\n    browserDetails,\n    commonShim,\n    extractVersion: utils.extractVersion,\n    disableLog: utils.disableLog,\n    disableWarnings: utils.disableWarnings\n  };\n\n  // Shim browser if found.\n  switch (browserDetails.browser) {\n    case 'chrome':\n      if (!chromeShim || !chromeShim.shimPeerConnection ||\n          !options.shimChrome) {\n        logging('Chrome shim is not included in this adapter release.');\n        return adapter;\n      }\n      if (browserDetails.version === null) {\n        logging('Chrome shim can not determine version, not shimming.');\n        return adapter;\n      }\n      logging('adapter.js shimming chrome.');\n      // Export to the adapter global object visible in the browser.\n      adapter.browserShim = chromeShim;\n\n      // Must be called before shimPeerConnection.\n      commonShim.shimAddIceCandidateNullOrEmpty(window, browserDetails);\n\n      chromeShim.shimGetUserMedia(window, browserDetails);\n      chromeShim.shimMediaStream(window, browserDetails);\n      chromeShim.shimPeerConnection(window, browserDetails);\n      chromeShim.shimOnTrack(window, browserDetails);\n      chromeShim.shimAddTrackRemoveTrack(window, browserDetails);\n      chromeShim.shimGetSendersWithDtmf(window, browserDetails);\n      chromeShim.shimGetStats(window, browserDetails);\n      chromeShim.shimSenderReceiverGetStats(window, browserDetails);\n      chromeShim.fixNegotiationNeeded(window, browserDetails);\n\n      commonShim.shimRTCIceCandidate(window, browserDetails);\n      commonShim.shimConnectionState(window, browserDetails);\n      commonShim.shimMaxMessageSize(window, browserDetails);\n      commonShim.shimSendThrowTypeError(window, browserDetails);\n      commonShim.removeExtmapAllowMixed(window, browserDetails);\n      break;\n    case 'firefox':\n      if (!firefoxShim || !firefoxShim.shimPeerConnection ||\n          !options.shimFirefox) {\n        logging('Firefox shim is not included in this adapter release.');\n        return adapter;\n      }\n      logging('adapter.js shimming firefox.');\n      // Export to the adapter global object visible in the browser.\n      adapter.browserShim = firefoxShim;\n\n      // Must be called before shimPeerConnection.\n      commonShim.shimAddIceCandidateNullOrEmpty(window, browserDetails);\n\n      firefoxShim.shimGetUserMedia(window, browserDetails);\n      firefoxShim.shimPeerConnection(window, browserDetails);\n      firefoxShim.shimOnTrack(window, browserDetails);\n      firefoxShim.shimRemoveStream(window, browserDetails);\n      firefoxShim.shimSenderGetStats(window, browserDetails);\n      firefoxShim.shimReceiverGetStats(window, browserDetails);\n      firefoxShim.shimRTCDataChannel(window, browserDetails);\n      firefoxShim.shimAddTransceiver(window, browserDetails);\n      firefoxShim.shimGetParameters(window, browserDetails);\n      firefoxShim.shimCreateOffer(window, browserDetails);\n      firefoxShim.shimCreateAnswer(window, browserDetails);\n\n      commonShim.shimRTCIceCandidate(window, browserDetails);\n      commonShim.shimConnectionState(window, browserDetails);\n      commonShim.shimMaxMessageSize(window, browserDetails);\n      commonShim.shimSendThrowTypeError(window, browserDetails);\n      break;\n    case 'edge':\n      if (!edgeShim || !edgeShim.shimPeerConnection || !options.shimEdge) {\n        logging('MS edge shim is not included in this adapter release.');\n        return adapter;\n      }\n      logging('adapter.js shimming edge.');\n      // Export to the adapter global object visible in the browser.\n      adapter.browserShim = edgeShim;\n\n      edgeShim.shimGetUserMedia(window, browserDetails);\n      edgeShim.shimGetDisplayMedia(window, browserDetails);\n      edgeShim.shimPeerConnection(window, browserDetails);\n      edgeShim.shimReplaceTrack(window, browserDetails);\n\n      // the edge shim implements the full RTCIceCandidate object.\n\n      commonShim.shimMaxMessageSize(window, browserDetails);\n      commonShim.shimSendThrowTypeError(window, browserDetails);\n      break;\n    case 'safari':\n      if (!safariShim || !options.shimSafari) {\n        logging('Safari shim is not included in this adapter release.');\n        return adapter;\n      }\n      logging('adapter.js shimming safari.');\n      // Export to the adapter global object visible in the browser.\n      adapter.browserShim = safariShim;\n\n      // Must be called before shimCallbackAPI.\n      commonShim.shimAddIceCandidateNullOrEmpty(window, browserDetails);\n\n      safariShim.shimRTCIceServerUrls(window, browserDetails);\n      safariShim.shimCreateOfferLegacy(window, browserDetails);\n      safariShim.shimCallbacksAPI(window, browserDetails);\n      safariShim.shimLocalStreamsAPI(window, browserDetails);\n      safariShim.shimRemoteStreamsAPI(window, browserDetails);\n      safariShim.shimTrackEventTransceiver(window, browserDetails);\n      safariShim.shimGetUserMedia(window, browserDetails);\n      safariShim.shimAudioContext(window, browserDetails);\n\n      commonShim.shimRTCIceCandidate(window, browserDetails);\n      commonShim.shimMaxMessageSize(window, browserDetails);\n      commonShim.shimSendThrowTypeError(window, browserDetails);\n      commonShim.removeExtmapAllowMixed(window, browserDetails);\n      break;\n    default:\n      logging('Unsupported browser!');\n      break;\n  }\n\n  return adapter;\n}\n","// Unique ID creation requires a high quality random # generator. In the browser we therefore\n// require the crypto API and do not support built-in fallback to lower quality random number\n// generators (like Math.random()).\nvar getRandomValues;\nvar rnds8 = new Uint8Array(16);\nexport default function rng() {\n  // lazy load so that environments that need to polyfill have a chance to do so\n  if (!getRandomValues) {\n    // getRandomValues needs to be invoked in a context where \"this\" is a Crypto implementation. Also,\n    // find the complete implementation of crypto (msCrypto) on IE11.\n    getRandomValues = typeof crypto !== 'undefined' && crypto.getRandomValues && crypto.getRandomValues.bind(crypto) || typeof msCrypto !== 'undefined' && typeof msCrypto.getRandomValues === 'function' && msCrypto.getRandomValues.bind(msCrypto);\n\n    if (!getRandomValues) {\n      throw new Error('crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported');\n    }\n  }\n\n  return getRandomValues(rnds8);\n}","export default /^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i;","import validate from './validate.js';\n/**\n * Convert array of 16 byte values to UUID string format of the form:\n * XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX\n */\n\nvar byteToHex = [];\n\nfor (var i = 0; i < 256; ++i) {\n  byteToHex.push((i + 0x100).toString(16).substr(1));\n}\n\nfunction stringify(arr) {\n  var offset = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n  // Note: Be careful editing this code!  It's been tuned for performance\n  // and works in ways you may not expect. See https://github.com/uuidjs/uuid/pull/434\n  var uuid = (byteToHex[arr[offset + 0]] + byteToHex[arr[offset + 1]] + byteToHex[arr[offset + 2]] + byteToHex[arr[offset + 3]] + '-' + byteToHex[arr[offset + 4]] + byteToHex[arr[offset + 5]] + '-' + byteToHex[arr[offset + 6]] + byteToHex[arr[offset + 7]] + '-' + byteToHex[arr[offset + 8]] + byteToHex[arr[offset + 9]] + '-' + byteToHex[arr[offset + 10]] + byteToHex[arr[offset + 11]] + byteToHex[arr[offset + 12]] + byteToHex[arr[offset + 13]] + byteToHex[arr[offset + 14]] + byteToHex[arr[offset + 15]]).toLowerCase(); // Consistency check for valid UUID.  If this throws, it's likely due to one\n  // of the following:\n  // - One or more input array values don't map to a hex octet (leading to\n  // \"undefined\" in the uuid)\n  // - Invalid input values for the RFC `version` or `variant` fields\n\n  if (!validate(uuid)) {\n    throw TypeError('Stringified UUID is invalid');\n  }\n\n  return uuid;\n}\n\nexport default stringify;","import REGEX from './regex.js';\n\nfunction validate(uuid) {\n  return typeof uuid === 'string' && REGEX.test(uuid);\n}\n\nexport default validate;","import rng from './rng.js';\nimport stringify from './stringify.js'; // **`v1()` - Generate time-based UUID**\n//\n// Inspired by https://github.com/LiosK/UUID.js\n// and http://docs.python.org/library/uuid.html\n\nvar _nodeId;\n\nvar _clockseq; // Previous uuid creation time\n\n\nvar _lastMSecs = 0;\nvar _lastNSecs = 0; // See https://github.com/uuidjs/uuid for API details\n\nfunction v1(options, buf, offset) {\n  var i = buf && offset || 0;\n  var b = buf || new Array(16);\n  options = options || {};\n  var node = options.node || _nodeId;\n  var clockseq = options.clockseq !== undefined ? options.clockseq : _clockseq; // node and clockseq need to be initialized to random values if they're not\n  // specified.  We do this lazily to minimize issues related to insufficient\n  // system entropy.  See #189\n\n  if (node == null || clockseq == null) {\n    var seedBytes = options.random || (options.rng || rng)();\n\n    if (node == null) {\n      // Per 4.5, create and 48-bit node id, (47 random bits + multicast bit = 1)\n      node = _nodeId = [seedBytes[0] | 0x01, seedBytes[1], seedBytes[2], seedBytes[3], seedBytes[4], seedBytes[5]];\n    }\n\n    if (clockseq == null) {\n      // Per 4.2.2, randomize (14 bit) clockseq\n      clockseq = _clockseq = (seedBytes[6] << 8 | seedBytes[7]) & 0x3fff;\n    }\n  } // UUID timestamps are 100 nano-second units since the Gregorian epoch,\n  // (1582-10-15 00:00).  JSNumbers aren't precise enough for this, so\n  // time is handled internally as 'msecs' (integer milliseconds) and 'nsecs'\n  // (100-nanoseconds offset from msecs) since unix epoch, 1970-01-01 00:00.\n\n\n  var msecs = options.msecs !== undefined ? options.msecs : Date.now(); // Per 4.2.1.2, use count of uuid's generated during the current clock\n  // cycle to simulate higher resolution clock\n\n  var nsecs = options.nsecs !== undefined ? options.nsecs : _lastNSecs + 1; // Time since last uuid creation (in msecs)\n\n  var dt = msecs - _lastMSecs + (nsecs - _lastNSecs) / 10000; // Per 4.2.1.2, Bump clockseq on clock regression\n\n  if (dt < 0 && options.clockseq === undefined) {\n    clockseq = clockseq + 1 & 0x3fff;\n  } // Reset nsecs if clock regresses (new clockseq) or we've moved onto a new\n  // time interval\n\n\n  if ((dt < 0 || msecs > _lastMSecs) && options.nsecs === undefined) {\n    nsecs = 0;\n  } // Per 4.2.1.2 Throw error if too many uuids are requested\n\n\n  if (nsecs >= 10000) {\n    throw new Error(\"uuid.v1(): Can't create more than 10M uuids/sec\");\n  }\n\n  _lastMSecs = msecs;\n  _lastNSecs = nsecs;\n  _clockseq = clockseq; // Per 4.1.4 - Convert from unix epoch to Gregorian epoch\n\n  msecs += 12219292800000; // `time_low`\n\n  var tl = ((msecs & 0xfffffff) * 10000 + nsecs) % 0x100000000;\n  b[i++] = tl >>> 24 & 0xff;\n  b[i++] = tl >>> 16 & 0xff;\n  b[i++] = tl >>> 8 & 0xff;\n  b[i++] = tl & 0xff; // `time_mid`\n\n  var tmh = msecs / 0x100000000 * 10000 & 0xfffffff;\n  b[i++] = tmh >>> 8 & 0xff;\n  b[i++] = tmh & 0xff; // `time_high_and_version`\n\n  b[i++] = tmh >>> 24 & 0xf | 0x10; // include version\n\n  b[i++] = tmh >>> 16 & 0xff; // `clock_seq_hi_and_reserved` (Per 4.2.2 - include variant)\n\n  b[i++] = clockseq >>> 8 | 0x80; // `clock_seq_low`\n\n  b[i++] = clockseq & 0xff; // `node`\n\n  for (var n = 0; n < 6; ++n) {\n    b[i + n] = node[n];\n  }\n\n  return buf || stringify(b);\n}\n\nexport default v1;","import validate from './validate.js';\n\nfunction parse(uuid) {\n  if (!validate(uuid)) {\n    throw TypeError('Invalid UUID');\n  }\n\n  var v;\n  var arr = new Uint8Array(16); // Parse ########-....-....-....-............\n\n  arr[0] = (v = parseInt(uuid.slice(0, 8), 16)) >>> 24;\n  arr[1] = v >>> 16 & 0xff;\n  arr[2] = v >>> 8 & 0xff;\n  arr[3] = v & 0xff; // Parse ........-####-....-....-............\n\n  arr[4] = (v = parseInt(uuid.slice(9, 13), 16)) >>> 8;\n  arr[5] = v & 0xff; // Parse ........-....-####-....-............\n\n  arr[6] = (v = parseInt(uuid.slice(14, 18), 16)) >>> 8;\n  arr[7] = v & 0xff; // Parse ........-....-....-####-............\n\n  arr[8] = (v = parseInt(uuid.slice(19, 23), 16)) >>> 8;\n  arr[9] = v & 0xff; // Parse ........-....-....-....-############\n  // (Use \"/\" to avoid 32-bit truncation when bit-shifting high-order bytes)\n\n  arr[10] = (v = parseInt(uuid.slice(24, 36), 16)) / 0x10000000000 & 0xff;\n  arr[11] = v / 0x100000000 & 0xff;\n  arr[12] = v >>> 24 & 0xff;\n  arr[13] = v >>> 16 & 0xff;\n  arr[14] = v >>> 8 & 0xff;\n  arr[15] = v & 0xff;\n  return arr;\n}\n\nexport default parse;","import stringify from './stringify.js';\nimport parse from './parse.js';\n\nfunction stringToBytes(str) {\n  str = unescape(encodeURIComponent(str)); // UTF8 escape\n\n  var bytes = [];\n\n  for (var i = 0; i < str.length; ++i) {\n    bytes.push(str.charCodeAt(i));\n  }\n\n  return bytes;\n}\n\nexport var DNS = '6ba7b810-9dad-11d1-80b4-00c04fd430c8';\nexport var URL = '6ba7b811-9dad-11d1-80b4-00c04fd430c8';\nexport default function (name, version, hashfunc) {\n  function generateUUID(value, namespace, buf, offset) {\n    if (typeof value === 'string') {\n      value = stringToBytes(value);\n    }\n\n    if (typeof namespace === 'string') {\n      namespace = parse(namespace);\n    }\n\n    if (namespace.length !== 16) {\n      throw TypeError('Namespace must be array-like (16 iterable integer values, 0-255)');\n    } // Compute hash of namespace and value, Per 4.3\n    // Future: Use spread syntax when supported on all platforms, e.g. `bytes =\n    // hashfunc([...namespace, ... value])`\n\n\n    var bytes = new Uint8Array(16 + value.length);\n    bytes.set(namespace);\n    bytes.set(value, namespace.length);\n    bytes = hashfunc(bytes);\n    bytes[6] = bytes[6] & 0x0f | version;\n    bytes[8] = bytes[8] & 0x3f | 0x80;\n\n    if (buf) {\n      offset = offset || 0;\n\n      for (var i = 0; i < 16; ++i) {\n        buf[offset + i] = bytes[i];\n      }\n\n      return buf;\n    }\n\n    return stringify(bytes);\n  } // Function#name is not settable on some platforms (#270)\n\n\n  try {\n    generateUUID.name = name; // eslint-disable-next-line no-empty\n  } catch (err) {} // For CommonJS default export support\n\n\n  generateUUID.DNS = DNS;\n  generateUUID.URL = URL;\n  return generateUUID;\n}","/*\n * Browser-compatible JavaScript MD5\n *\n * Modification of JavaScript MD5\n * https://github.com/blueimp/JavaScript-MD5\n *\n * Copyright 2011, Sebastian Tschan\n * https://blueimp.net\n *\n * Licensed under the MIT license:\n * https://opensource.org/licenses/MIT\n *\n * Based on\n * A JavaScript implementation of the RSA Data Security, Inc. MD5 Message\n * Digest Algorithm, as defined in RFC 1321.\n * Version 2.2 Copyright (C) Paul Johnston 1999 - 2009\n * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet\n * Distributed under the BSD License\n * See http://pajhome.org.uk/crypt/md5 for more info.\n */\nfunction md5(bytes) {\n  if (typeof bytes === 'string') {\n    var msg = unescape(encodeURIComponent(bytes)); // UTF8 escape\n\n    bytes = new Uint8Array(msg.length);\n\n    for (var i = 0; i < msg.length; ++i) {\n      bytes[i] = msg.charCodeAt(i);\n    }\n  }\n\n  return md5ToHexEncodedArray(wordsToMd5(bytesToWords(bytes), bytes.length * 8));\n}\n/*\n * Convert an array of little-endian words to an array of bytes\n */\n\n\nfunction md5ToHexEncodedArray(input) {\n  var output = [];\n  var length32 = input.length * 32;\n  var hexTab = '0123456789abcdef';\n\n  for (var i = 0; i < length32; i += 8) {\n    var x = input[i >> 5] >>> i % 32 & 0xff;\n    var hex = parseInt(hexTab.charAt(x >>> 4 & 0x0f) + hexTab.charAt(x & 0x0f), 16);\n    output.push(hex);\n  }\n\n  return output;\n}\n/**\n * Calculate output length with padding and bit length\n */\n\n\nfunction getOutputLength(inputLength8) {\n  return (inputLength8 + 64 >>> 9 << 4) + 14 + 1;\n}\n/*\n * Calculate the MD5 of an array of little-endian words, and a bit length.\n */\n\n\nfunction wordsToMd5(x, len) {\n  /* append padding */\n  x[len >> 5] |= 0x80 << len % 32;\n  x[getOutputLength(len) - 1] = len;\n  var a = 1732584193;\n  var b = -271733879;\n  var c = -1732584194;\n  var d = 271733878;\n\n  for (var i = 0; i < x.length; i += 16) {\n    var olda = a;\n    var oldb = b;\n    var oldc = c;\n    var oldd = d;\n    a = md5ff(a, b, c, d, x[i], 7, -680876936);\n    d = md5ff(d, a, b, c, x[i + 1], 12, -389564586);\n    c = md5ff(c, d, a, b, x[i + 2], 17, 606105819);\n    b = md5ff(b, c, d, a, x[i + 3], 22, -1044525330);\n    a = md5ff(a, b, c, d, x[i + 4], 7, -176418897);\n    d = md5ff(d, a, b, c, x[i + 5], 12, 1200080426);\n    c = md5ff(c, d, a, b, x[i + 6], 17, -1473231341);\n    b = md5ff(b, c, d, a, x[i + 7], 22, -45705983);\n    a = md5ff(a, b, c, d, x[i + 8], 7, 1770035416);\n    d = md5ff(d, a, b, c, x[i + 9], 12, -1958414417);\n    c = md5ff(c, d, a, b, x[i + 10], 17, -42063);\n    b = md5ff(b, c, d, a, x[i + 11], 22, -1990404162);\n    a = md5ff(a, b, c, d, x[i + 12], 7, 1804603682);\n    d = md5ff(d, a, b, c, x[i + 13], 12, -40341101);\n    c = md5ff(c, d, a, b, x[i + 14], 17, -1502002290);\n    b = md5ff(b, c, d, a, x[i + 15], 22, 1236535329);\n    a = md5gg(a, b, c, d, x[i + 1], 5, -165796510);\n    d = md5gg(d, a, b, c, x[i + 6], 9, -1069501632);\n    c = md5gg(c, d, a, b, x[i + 11], 14, 643717713);\n    b = md5gg(b, c, d, a, x[i], 20, -373897302);\n    a = md5gg(a, b, c, d, x[i + 5], 5, -701558691);\n    d = md5gg(d, a, b, c, x[i + 10], 9, 38016083);\n    c = md5gg(c, d, a, b, x[i + 15], 14, -660478335);\n    b = md5gg(b, c, d, a, x[i + 4], 20, -405537848);\n    a = md5gg(a, b, c, d, x[i + 9], 5, 568446438);\n    d = md5gg(d, a, b, c, x[i + 14], 9, -1019803690);\n    c = md5gg(c, d, a, b, x[i + 3], 14, -187363961);\n    b = md5gg(b, c, d, a, x[i + 8], 20, 1163531501);\n    a = md5gg(a, b, c, d, x[i + 13], 5, -1444681467);\n    d = md5gg(d, a, b, c, x[i + 2], 9, -51403784);\n    c = md5gg(c, d, a, b, x[i + 7], 14, 1735328473);\n    b = md5gg(b, c, d, a, x[i + 12], 20, -1926607734);\n    a = md5hh(a, b, c, d, x[i + 5], 4, -378558);\n    d = md5hh(d, a, b, c, x[i + 8], 11, -2022574463);\n    c = md5hh(c, d, a, b, x[i + 11], 16, 1839030562);\n    b = md5hh(b, c, d, a, x[i + 14], 23, -35309556);\n    a = md5hh(a, b, c, d, x[i + 1], 4, -1530992060);\n    d = md5hh(d, a, b, c, x[i + 4], 11, 1272893353);\n    c = md5hh(c, d, a, b, x[i + 7], 16, -155497632);\n    b = md5hh(b, c, d, a, x[i + 10], 23, -1094730640);\n    a = md5hh(a, b, c, d, x[i + 13], 4, 681279174);\n    d = md5hh(d, a, b, c, x[i], 11, -358537222);\n    c = md5hh(c, d, a, b, x[i + 3], 16, -722521979);\n    b = md5hh(b, c, d, a, x[i + 6], 23, 76029189);\n    a = md5hh(a, b, c, d, x[i + 9], 4, -640364487);\n    d = md5hh(d, a, b, c, x[i + 12], 11, -421815835);\n    c = md5hh(c, d, a, b, x[i + 15], 16, 530742520);\n    b = md5hh(b, c, d, a, x[i + 2], 23, -995338651);\n    a = md5ii(a, b, c, d, x[i], 6, -198630844);\n    d = md5ii(d, a, b, c, x[i + 7], 10, 1126891415);\n    c = md5ii(c, d, a, b, x[i + 14], 15, -1416354905);\n    b = md5ii(b, c, d, a, x[i + 5], 21, -57434055);\n    a = md5ii(a, b, c, d, x[i + 12], 6, 1700485571);\n    d = md5ii(d, a, b, c, x[i + 3], 10, -1894986606);\n    c = md5ii(c, d, a, b, x[i + 10], 15, -1051523);\n    b = md5ii(b, c, d, a, x[i + 1], 21, -2054922799);\n    a = md5ii(a, b, c, d, x[i + 8], 6, 1873313359);\n    d = md5ii(d, a, b, c, x[i + 15], 10, -30611744);\n    c = md5ii(c, d, a, b, x[i + 6], 15, -1560198380);\n    b = md5ii(b, c, d, a, x[i + 13], 21, 1309151649);\n    a = md5ii(a, b, c, d, x[i + 4], 6, -145523070);\n    d = md5ii(d, a, b, c, x[i + 11], 10, -1120210379);\n    c = md5ii(c, d, a, b, x[i + 2], 15, 718787259);\n    b = md5ii(b, c, d, a, x[i + 9], 21, -343485551);\n    a = safeAdd(a, olda);\n    b = safeAdd(b, oldb);\n    c = safeAdd(c, oldc);\n    d = safeAdd(d, oldd);\n  }\n\n  return [a, b, c, d];\n}\n/*\n * Convert an array bytes to an array of little-endian words\n * Characters >255 have their high-byte silently ignored.\n */\n\n\nfunction bytesToWords(input) {\n  if (input.length === 0) {\n    return [];\n  }\n\n  var length8 = input.length * 8;\n  var output = new Uint32Array(getOutputLength(length8));\n\n  for (var i = 0; i < length8; i += 8) {\n    output[i >> 5] |= (input[i / 8] & 0xff) << i % 32;\n  }\n\n  return output;\n}\n/*\n * Add integers, wrapping at 2^32. This uses 16-bit operations internally\n * to work around bugs in some JS interpreters.\n */\n\n\nfunction safeAdd(x, y) {\n  var lsw = (x & 0xffff) + (y & 0xffff);\n  var msw = (x >> 16) + (y >> 16) + (lsw >> 16);\n  return msw << 16 | lsw & 0xffff;\n}\n/*\n * Bitwise rotate a 32-bit number to the left.\n */\n\n\nfunction bitRotateLeft(num, cnt) {\n  return num << cnt | num >>> 32 - cnt;\n}\n/*\n * These functions implement the four basic operations the algorithm uses.\n */\n\n\nfunction md5cmn(q, a, b, x, s, t) {\n  return safeAdd(bitRotateLeft(safeAdd(safeAdd(a, q), safeAdd(x, t)), s), b);\n}\n\nfunction md5ff(a, b, c, d, x, s, t) {\n  return md5cmn(b & c | ~b & d, a, b, x, s, t);\n}\n\nfunction md5gg(a, b, c, d, x, s, t) {\n  return md5cmn(b & d | c & ~d, a, b, x, s, t);\n}\n\nfunction md5hh(a, b, c, d, x, s, t) {\n  return md5cmn(b ^ c ^ d, a, b, x, s, t);\n}\n\nfunction md5ii(a, b, c, d, x, s, t) {\n  return md5cmn(c ^ (b | ~d), a, b, x, s, t);\n}\n\nexport default md5;","import v35 from './v35.js';\nimport md5 from './md5.js';\nvar v3 = v35('v3', 0x30, md5);\nexport default v3;","import rng from './rng.js';\nimport stringify from './stringify.js';\n\nfunction v4(options, buf, offset) {\n  options = options || {};\n  var rnds = options.random || (options.rng || rng)(); // Per 4.4, set bits for version and `clock_seq_hi_and_reserved`\n\n  rnds[6] = rnds[6] & 0x0f | 0x40;\n  rnds[8] = rnds[8] & 0x3f | 0x80; // Copy bytes to buffer, if provided\n\n  if (buf) {\n    offset = offset || 0;\n\n    for (var i = 0; i < 16; ++i) {\n      buf[offset + i] = rnds[i];\n    }\n\n    return buf;\n  }\n\n  return stringify(rnds);\n}\n\nexport default v4;","// Adapted from Chris Veness' SHA1 code at\n// http://www.movable-type.co.uk/scripts/sha1.html\nfunction f(s, x, y, z) {\n  switch (s) {\n    case 0:\n      return x & y ^ ~x & z;\n\n    case 1:\n      return x ^ y ^ z;\n\n    case 2:\n      return x & y ^ x & z ^ y & z;\n\n    case 3:\n      return x ^ y ^ z;\n  }\n}\n\nfunction ROTL(x, n) {\n  return x << n | x >>> 32 - n;\n}\n\nfunction sha1(bytes) {\n  var K = [0x5a827999, 0x6ed9eba1, 0x8f1bbcdc, 0xca62c1d6];\n  var H = [0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476, 0xc3d2e1f0];\n\n  if (typeof bytes === 'string') {\n    var msg = unescape(encodeURIComponent(bytes)); // UTF8 escape\n\n    bytes = [];\n\n    for (var i = 0; i < msg.length; ++i) {\n      bytes.push(msg.charCodeAt(i));\n    }\n  } else if (!Array.isArray(bytes)) {\n    // Convert Array-like to Array\n    bytes = Array.prototype.slice.call(bytes);\n  }\n\n  bytes.push(0x80);\n  var l = bytes.length / 4 + 2;\n  var N = Math.ceil(l / 16);\n  var M = new Array(N);\n\n  for (var _i = 0; _i < N; ++_i) {\n    var arr = new Uint32Array(16);\n\n    for (var j = 0; j < 16; ++j) {\n      arr[j] = bytes[_i * 64 + j * 4] << 24 | bytes[_i * 64 + j * 4 + 1] << 16 | bytes[_i * 64 + j * 4 + 2] << 8 | bytes[_i * 64 + j * 4 + 3];\n    }\n\n    M[_i] = arr;\n  }\n\n  M[N - 1][14] = (bytes.length - 1) * 8 / Math.pow(2, 32);\n  M[N - 1][14] = Math.floor(M[N - 1][14]);\n  M[N - 1][15] = (bytes.length - 1) * 8 & 0xffffffff;\n\n  for (var _i2 = 0; _i2 < N; ++_i2) {\n    var W = new Uint32Array(80);\n\n    for (var t = 0; t < 16; ++t) {\n      W[t] = M[_i2][t];\n    }\n\n    for (var _t = 16; _t < 80; ++_t) {\n      W[_t] = ROTL(W[_t - 3] ^ W[_t - 8] ^ W[_t - 14] ^ W[_t - 16], 1);\n    }\n\n    var a = H[0];\n    var b = H[1];\n    var c = H[2];\n    var d = H[3];\n    var e = H[4];\n\n    for (var _t2 = 0; _t2 < 80; ++_t2) {\n      var s = Math.floor(_t2 / 20);\n      var T = ROTL(a, 5) + f(s, b, c, d) + e + K[s] + W[_t2] >>> 0;\n      e = d;\n      d = c;\n      c = ROTL(b, 30) >>> 0;\n      b = a;\n      a = T;\n    }\n\n    H[0] = H[0] + a >>> 0;\n    H[1] = H[1] + b >>> 0;\n    H[2] = H[2] + c >>> 0;\n    H[3] = H[3] + d >>> 0;\n    H[4] = H[4] + e >>> 0;\n  }\n\n  return [H[0] >> 24 & 0xff, H[0] >> 16 & 0xff, H[0] >> 8 & 0xff, H[0] & 0xff, H[1] >> 24 & 0xff, H[1] >> 16 & 0xff, H[1] >> 8 & 0xff, H[1] & 0xff, H[2] >> 24 & 0xff, H[2] >> 16 & 0xff, H[2] >> 8 & 0xff, H[2] & 0xff, H[3] >> 24 & 0xff, H[3] >> 16 & 0xff, H[3] >> 8 & 0xff, H[3] & 0xff, H[4] >> 24 & 0xff, H[4] >> 16 & 0xff, H[4] >> 8 & 0xff, H[4] & 0xff];\n}\n\nexport default sha1;","import v35 from './v35.js';\nimport sha1 from './sha1.js';\nvar v5 = v35('v5', 0x50, sha1);\nexport default v5;","export default '00000000-0000-0000-0000-000000000000';","import validate from './validate.js';\n\nfunction version(uuid) {\n  if (!validate(uuid)) {\n    throw TypeError('Invalid UUID');\n  }\n\n  return parseInt(uuid.substr(14, 1), 16);\n}\n\nexport default version;"],"sourceRoot":""}