{"version":3,"sources":["webpack://ConnectyCube/webpack/universalModuleDefinition","webpack://ConnectyCube/webpack/bootstrap","webpack://ConnectyCube/./node_modules/@babel/runtime/helpers/interopRequireDefault.js","webpack://ConnectyCube/./node_modules/@babel/runtime/helpers/classCallCheck.js","webpack://ConnectyCube/./node_modules/@babel/runtime/helpers/createClass.js","webpack://ConnectyCube/./lib/cubeInternalUtils.js","webpack://ConnectyCube/./lib/cubeConfig.js","webpack://ConnectyCube/./lib/cubeDependencies.js","webpack://ConnectyCube/./node_modules/@babel/runtime/helpers/typeof.js","webpack://ConnectyCube/./node_modules/@xmpp/xml/index.js","webpack://ConnectyCube/./lib/videocalling/cubeWebRTCConstants.js","webpack://ConnectyCube/./lib/messaging/cubeChatInternalUtils.js","webpack://ConnectyCube/(webpack)/buildin/module.js","webpack://ConnectyCube/(webpack)/buildin/global.js","webpack://ConnectyCube/./node_modules/crypto-js/core.js","webpack://ConnectyCube/./node_modules/@xmpp/events/index.js","webpack://ConnectyCube/./node_modules/events/events.js","webpack://ConnectyCube/./node_modules/@xmpp/jid/index.js","webpack://ConnectyCube/./lib/videocalling/cubeWebRTCHelpers.js","webpack://ConnectyCube/./node_modules/@xmpp/events/lib/TimeoutError.js","webpack://ConnectyCube/./node_modules/@xmpp/xml/lib/Element.js","webpack://ConnectyCube/./node_modules/ltx/lib/escape.js","webpack://ConnectyCube/./node_modules/@xmpp/error/index.js","webpack://ConnectyCube/./node_modules/@babel/runtime/helpers/defineProperty.js","webpack://ConnectyCube/./node_modules/crypto-js/hmac.js","webpack://ConnectyCube/./node_modules/@xmpp/connection/index.js","webpack://ConnectyCube/./node_modules/@xmpp/events/lib/delay.js","webpack://ConnectyCube/./node_modules/@xmpp/jid/lib/JID.js","webpack://ConnectyCube/./node_modules/@xmpp/jid/lib/escaping.js","webpack://ConnectyCube/./node_modules/@xmpp/xml/lib/Parser.js","webpack://ConnectyCube/./node_modules/@xmpp/xml/lib/XMLError.js","webpack://ConnectyCube/./node_modules/@xmpp/middleware/lib/Context.js","webpack://ConnectyCube/external \"node-fetch\"","webpack://ConnectyCube/./lib/videocalling/cubeRTCPeerConnection.js","webpack://ConnectyCube/./node_modules/@babel/runtime/regenerator/index.js","webpack://ConnectyCube/./node_modules/@babel/runtime/helpers/asyncToGenerator.js","webpack://ConnectyCube/./node_modules/fbemitter/lib/EmitterSubscription.js","webpack://ConnectyCube/./node_modules/fbjs/lib/invariant.js","webpack://ConnectyCube/./lib/videocalling_conference/cubeConferenceConstansts.js","webpack://ConnectyCube/./lib/cubeMain.js","webpack://ConnectyCube/./node_modules/buffer/index.js","webpack://ConnectyCube/./node_modules/base64-js/index.js","webpack://ConnectyCube/./node_modules/ieee754/index.js","webpack://ConnectyCube/./node_modules/isarray/index.js","webpack://ConnectyCube/./node_modules/crypto-js/hmac-sha1.js","webpack://ConnectyCube/./node_modules/crypto-js/sha1.js","webpack://ConnectyCube/./node_modules/crypto-js/hmac-sha256.js","webpack://ConnectyCube/./node_modules/crypto-js/sha256.js","webpack://ConnectyCube/./node_modules/@xmpp/client/react-native.js","webpack://ConnectyCube/./node_modules/@xmpp/client-core/index.js","webpack://ConnectyCube/./node_modules/@xmpp/client-core/lib/Client.js","webpack://ConnectyCube/./node_modules/@xmpp/events/lib/timeout.js","webpack://ConnectyCube/./node_modules/@xmpp/events/lib/promise.js","webpack://ConnectyCube/./node_modules/@xmpp/events/lib/Deferred.js","webpack://ConnectyCube/./node_modules/@xmpp/jid/lib/parse.js","webpack://ConnectyCube/./node_modules/@xmpp/xml/lib/x.js","webpack://ConnectyCube/./node_modules/ltx/lib/Element.js","webpack://ConnectyCube/./node_modules/ltx/lib/equal.js","webpack://ConnectyCube/./node_modules/ltx/lib/clone.js","webpack://ConnectyCube/./node_modules/ltx/lib/parsers/ltx.js","webpack://ConnectyCube/./node_modules/inherits/inherits_browser.js","webpack://ConnectyCube/./node_modules/@xmpp/connection/lib/StreamError.js","webpack://ConnectyCube/./node_modules/@xmpp/connection/lib/util.js","webpack://ConnectyCube/./node_modules/@xmpp/client/lib/getDomain.js","webpack://ConnectyCube/./node_modules/@xmpp/reconnect/index.js","webpack://ConnectyCube/./node_modules/@xmpp/websocket/index.js","webpack://ConnectyCube/./node_modules/@xmpp/websocket/lib/Connection.js","webpack://ConnectyCube/./node_modules/@xmpp/websocket/lib/Socket.js","webpack://ConnectyCube/./node_modules/@xmpp/websocket/lib/FramedParser.js","webpack://ConnectyCube/./node_modules/@xmpp/middleware/index.js","webpack://ConnectyCube/./node_modules/koa-compose/index.js","webpack://ConnectyCube/./node_modules/@xmpp/middleware/lib/IncomingContext.js","webpack://ConnectyCube/./node_modules/@xmpp/middleware/lib/OutgoingContext.js","webpack://ConnectyCube/./node_modules/@xmpp/stream-features/index.js","webpack://ConnectyCube/./node_modules/@xmpp/stream-features/route.js","webpack://ConnectyCube/./node_modules/@xmpp/iq/caller.js","webpack://ConnectyCube/./node_modules/@xmpp/id/index.js","webpack://ConnectyCube/./node_modules/@xmpp/middleware/lib/StanzaError.js","webpack://ConnectyCube/./node_modules/@xmpp/iq/callee.js","webpack://ConnectyCube/./node_modules/@xmpp/resolve/index.js","webpack://ConnectyCube/./node_modules/@xmpp/resolve/resolve.js","webpack://ConnectyCube/./node_modules/@xmpp/resolve/lib/http.js","webpack://ConnectyCube/./node_modules/@xmpp/xml/lib/parse.js","webpack://ConnectyCube/./node_modules/@xmpp/resolve/lib/alt-connections.js","webpack://ConnectyCube/./node_modules/@xmpp/sasl/index.js","webpack://ConnectyCube/./node_modules/@xmpp/base64/browser.js","webpack://ConnectyCube/./node_modules/@xmpp/sasl/lib/SASLError.js","webpack://ConnectyCube/./node_modules/saslmechanisms/main.js","webpack://ConnectyCube/./node_modules/saslmechanisms/lib/factory.js","webpack://ConnectyCube/./node_modules/@xmpp/resource-binding/index.js","webpack://ConnectyCube/./node_modules/@xmpp/session-establishment/index.js","webpack://ConnectyCube/./node_modules/@xmpp/sasl-anonymous/index.js","webpack://ConnectyCube/./node_modules/sasl-anonymous/main.js","webpack://ConnectyCube/./node_modules/sasl-anonymous/lib/mechanism.js","webpack://ConnectyCube/./node_modules/@xmpp/sasl-plain/index.js","webpack://ConnectyCube/./node_modules/sasl-plain/main.js","webpack://ConnectyCube/./node_modules/sasl-plain/lib/mechanism.js","webpack://ConnectyCube/external \"form-data\"","webpack://ConnectyCube/./lib/cubeProxy.js","webpack://ConnectyCube/./lib/cubeAuth.js","webpack://ConnectyCube/./lib/cubeUsers.js","webpack://ConnectyCube/./lib/cubeStorage.js","webpack://ConnectyCube/./lib/cubePushNotifications.js","webpack://ConnectyCube/./lib/cubeData.js","webpack://ConnectyCube/./lib/cubeAddressBook.js","webpack://ConnectyCube/./lib/messaging/cubeChat.js","webpack://ConnectyCube/./lib/messaging/cubeChatHelpers.js","webpack://ConnectyCube/./lib/messaging/cubeStreamManagement.js","webpack://ConnectyCube/./lib/messaging/cubeContactList.js","webpack://ConnectyCube/./lib/messaging/cubePrivacyList.js","webpack://ConnectyCube/./lib/messaging/cubeMultiUserChat.js","webpack://ConnectyCube/./lib/messaging/cubeDialog.js","webpack://ConnectyCube/./lib/messaging/cubeMessage.js","webpack://ConnectyCube/./lib/videocalling/cubeWebRTCClient.js","webpack://ConnectyCube/./lib/videocalling/cubeWebRTCSession.js","webpack://ConnectyCube/./lib/videocalling/cubeWebRTCSignalingProcessor.js","webpack://ConnectyCube/./lib/videocalling/cubeWebRTCSignalingProvider.js","webpack://ConnectyCube/./lib/videocalling_conference/cubeConferenceClient.js","webpack://ConnectyCube/./node_modules/regenerator-runtime/runtime.js","webpack://ConnectyCube/./lib/videocalling_conference/cubeConferenceSession.js","webpack://ConnectyCube/./lib/videocalling_conference/cubeVideoCallingConference.js","webpack://ConnectyCube/./lib/videocalling_conference/janus.umd.js","webpack://ConnectyCube/./node_modules/fbemitter/index.js","webpack://ConnectyCube/./node_modules/fbemitter/lib/BaseEventEmitter.js","webpack://ConnectyCube/./node_modules/fbemitter/lib/EventSubscription.js","webpack://ConnectyCube/./node_modules/fbemitter/lib/EventSubscriptionVendor.js","webpack://ConnectyCube/./node_modules/fbjs/lib/emptyFunction.js"],"names":["root","factory","exports","module","require","define","amd","window","__WEBPACK_EXTERNAL_MODULE__30__","__WEBPACK_EXTERNAL_MODULE__98__","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","obj","instance","Constructor","TypeError","_defineProperties","target","props","length","descriptor","configurable","writable","protoProps","staticProps","config","IS_BROWSER_ENV","document","IS_RN_ENV","navigator","product","IS_NS_ENV","global","android","NSObject","InternalUtils","nativescript","reactnative","browser","node","RTCPeerConnection","RTCIceCandidate","RTCSessionDescription","callback","arguments","listenerCall","callbackString","toString","callbackName","split","argumentsCopy","push","shift","apply","err","console","error","Math","floor","random","Date","now","base","id","extension","resource","endpoints","api","urls","type","arr","timestamp","this","unixTime","increment","ObjectId","substr","machine","pid","loggers","logger","consoleLoggerFunction","args","log","Array","slice","debug","forEach","j","code","message","errors","ex","arrayTo","arrayFrom","merged","JSON","parse","stringify","firstLevel","newItem","user_id","str","getEnv","btoa","encodeURIComponent","replace","match","p1","String","fromCharCode","encodeToBase64","Buffer","params","application_id","creds","appId","auth_key","authKey","nonce","randomNonce","login","password","user","email","provider","scope","keys","token","secret","cryptoSessionMsg","sessionMsg","map","val","val1","sort","join","hash","sha1","Error","sha256","Blob","size","data","body","getSizeOfString","headers","on","getDateSize","version","authSecret","chat","muc","chatProtocol","bosh","websocket","active","webSession","getSessionTimeInterval","getSessionTimeout","contactList","subscriptionMode","mutual","reconnectionTimeInterval","streamManagement","enable","ping","timeInterval","videochat","answerTimeInterval","dialingTimeInterval","disconnectTimeInterval","statsReportTimeInterval","iceServers","username","credential","conference","server","session","users","blobs","subscriptions","events","addressbook","addressbookRegistered","sessionExpired","xmppDataWrite","xmppDataRead","timeout","options","nextkey","fetchImpl","formDataImpl","MediaStream","mediaDevices","Utils","XMPPClient","fetch","FormData","_typeof","iterator","constructor","x","Element","Parser","escapeXML","unescapeXML","escapeXMLText","unescapeXMLText","XMLError","assign","SignalingConstants","MODULE_ID","SignalingType","CALL","ACCEPT","REJECT","STOP","CANDIDATE","SessionConnectionState","UNDEFINED","CONNECTING","CONNECTED","FAILED","DISCONNECTED","CLOSED","COMPLETED","SessionState","NEW","ACTIVE","HUNGUP","REJECTED","PeerConnectionState","CHECKING","CallType","VIDEO","AUDIO","Config","XMPP","ChatInternalUtils","jid","userId","xml","elementName","el","attrName","getAttribute","attr","attrs","stanza","elName","querySelector","getChild","querySelectorAll","txt","textContent","getChildText","elementsPath","reduce","prevStanza","elem","getElement","title","msg","field","_JStoXML","up","objChildNodes","childNodes","children","subNode","subNodeChildNodes","subNodeTagName","tagName","subNodeTextContent","_XMLtoJS","attach","extraParams","dialogId","attributes","attachments","lenght","attrKeys","parseInt","dialog_id","child","moduleIdentifier","errorStanza","errorElement","getAttr","info","getElementText","suffix","uuid","webpackPolyfill","deprecate","paths","g","Function","e","CryptoJS","undefined","F","subtype","C","C_lib","lib","Base","extend","overrides","mixIn","init","$super","properties","propertyName","clone","WordArray","words","sigBytes","encoder","Hex","concat","wordArray","thisWords","thatWords","thisSigBytes","thatSigBytes","clamp","thatByte","ceil","nBytes","rcache","m_w","m_z","mask","result","_r","C_enc","enc","hexChars","bite","hexStr","hexStrLength","Latin1","latin1Chars","latin1Str","latin1StrLength","charCodeAt","Utf8","decodeURIComponent","escape","utf8Str","unescape","BufferedBlockAlgorithm","reset","_data","_nDataBytes","_append","_process","doFlush","dataWords","dataSigBytes","blockSize","nBlocksReady","nWordsReady","max","_minBufferSize","nBytesReady","min","offset","_doProcessBlock","processedWords","splice","C_algo","Hasher","cfg","_doReset","update","messageUpdate","finalize","_doFinalize","_createHelper","hasher","_createHmacHelper","HMAC","algo","delay","TimeoutError","promise","EventEmitter","Deferred","ReflectOwnKeys","R","Reflect","ReflectApply","receiver","ownKeys","getOwnPropertySymbols","getOwnPropertyNames","NumberIsNaN","Number","isNaN","_events","_eventsCount","_maxListeners","defaultMaxListeners","$getMaxListeners","that","_addListener","listener","prepend","existing","warning","newListener","emit","unshift","warned","w","emitter","count","warn","onceWrapper","fired","removeListener","wrapFn","_onceWrap","state","wrapped","_listeners","unwrap","evlistener","ret","unwrapListeners","arrayClone","listenerCount","copy","set","arg","RangeError","getPrototypeOf","setMaxListeners","getMaxListeners","doError","er","context","handler","len","listeners","addListener","prependListener","once","prependOnceListener","list","position","originalListener","index","pop","spliceOne","off","removeAllListeners","rawListeners","eventNames","JID","escaping","equal","a","b","equals","detectEscape","detect","escapeLocal","unescapeLocal","WebRTCHelpers","indexOf","client","_local","_domain","_resource","text","ua","userAgent","ffInfo","sVer","super","_Element","xmlns","nodes","isArray","parent","escapeXMLTable","'","escapeXMLReplace","unescapeXMLTable","unescapeXMLReplace","num","fromCodePoint","start","end","previous","substring","XMPPError","condition","application","element","second","third","is","_hasher","hasherBlockSize","hasherBlockSizeBytes","oKey","_oKey","iKey","_iKey","oKeyWords","iKeyWords","innerHash","StreamError","parseHost","parseService","Connection","socketListeners","parserListeners","status","socket","parser","_detachSocket","_detachParser","send","_end","write","_streamError","sock","_onData","close","dirty","event","_reset","_status","clean","connect","k","isStanza","_onStreamError","fromElement","_onSeeOtherHost","protocol","service","host","port","domain","lang","open","_onElement","_onParserError","disconnect","promiseOnline","Socket","_attachSocket","socketParameters","headerElement","to","_attachParser","header","Promise","all","footer","footerElement","then","resolve","reject","NS","ms","setTimeout","local","setDomain","setLocal","setResource","toPrimitive","hint","NaN","getLocal","other","toLowerCase","getDomain","getResource","search","LtxParser","cursor","onStartElement","onEndElement","onText","append","entity","from","Helpers","setMediaBitrate","sdp","media","bitrate","lines","line","modifier","getVersionFirefox","amount","newLines","_init","delegate","userID","sessionID","trace","remoteSDP","onicecandidate","onIceCandidateCallback","onsignalingstatechange","onSignalingStateCallback","oniceconnectionstatechange","onIceConnectionStateCallback","getVersionSafari","remoteStream","ontrack","onAddRemoteMediaCallback","onStatusClosedChecker","onaddstream","dialingTimer","statsReportTimer","iceCandidates","released","release","_clearDialingTimer","_clearStatsReportTimer","updateRemoteSDP","newSDP","getRemoteSDP","setRemoteSessionDescription","remoteSessionDescription","desc","bandwidth","setRemoteDescription","addLocalStream","localStream","addStream","getAndSetLocalSessionDescription","callType","createOffer","offer","setLocalDescription","createAnswer","answer","addCandidates","candidate","sdpMLineIndex","sdpMid","addIceCandidate","traceError","signalingState","_processIceCandidates","iceCandidateData","_onRemoteStreamListener","stream","addTrack","track","getVideoTracks","getAudioTracks","_getStatsWrap","iceConnectionState","_onSessionConnectionStateChangedListener","conState","clearTimeout","_clearWaitingReconnectTimer","_startWaitingReconnectTimer","clearInterval","statsReportInterval","lastResult","setInterval","peer","lastResults","successCallback","errorCallback","statistic","getLocalStreams","localVideoSettings","getSettings","video","frameHeight","height","frameWidth","width","getStats","results","item","bytesReceived","remote","mediaType","_getBitratePerSecond","packetsReceived","framerateMean","framesPerSecond","round","bytesSent","packetsSent","candidateType","mozLocalTransport","transport","ip","ipAddress","portNumber","kind","remoteSource","_getFramesPerSecond","isLocal","seconds","framesSent","framesReceived","_getStats","_onCallStatsReport","waitingReconnectTimeoutCallback","_closeSessionIfAllConnectionsClosed","_startDialingTimer","withOnNotAnswerCallback","_dialingCallback","skipIncrement","_processOnNotAnswer","_processCall","asyncGeneratorStep","gen","_next","_throw","done","fn","self","EmitterSubscription","_EventSubscription","subscriber","_classCallCheck","subClass","superClass","setPrototypeOf","__proto__","_inherits","format","f","argIndex","framesToPop","CALL_TYPES","DEVICE_INPUT_TYPES","ConnectyCube","RTCView","credentials","configMap","Proxy","Auth","Users","Storage","PushNotifications","Data","AddressBook","Chat","DialogProxy","MessageProxy","auth","storage","pushnotifications","dialog","utils","isWebRTCAvailble","WebRTCClient","xmppClient","webrtcSignalingProcessor","signalingProcessor","ConferenceClient","videochatconference","setSession","getSession","createSession","destroySession","createWebSession","checkWebSessionUntilUpgrade","webToken","upgradeWebSession","logout","CB","base64","ieee754","kMaxLength","TYPED_ARRAY_SUPPORT","createBuffer","Uint8Array","encodingOrOffset","allocUnsafe","ArrayBuffer","array","byteOffset","byteLength","fromArrayLike","fromArrayBuffer","string","encoding","isEncoding","actual","fromString","isBuffer","checked","buffer","fromObject","assertSize","isView","loweredCase","utf8ToBytes","base64ToBytes","slowToString","hexSlice","utf8Slice","asciiSlice","latin1Slice","base64Slice","utf16leSlice","swap","bidirectionalIndexOf","dir","arrayIndexOf","lastIndexOf","indexSize","arrLength","valLength","read","buf","readUInt16BE","foundIndex","found","hexWrite","remaining","strLen","parsed","utf8Write","blitBuffer","asciiWrite","byteArray","asciiToBytes","latin1Write","base64Write","ucs2Write","units","hi","lo","utf16leToBytes","fromByteArray","res","secondByte","thirdByte","fourthByte","tempCodePoint","firstByte","codePoint","bytesPerSequence","codePoints","decodeCodePointsArray","SlowBuffer","alloc","INSPECT_MAX_BYTES","foo","subarray","typedArraySupport","poolSize","_augment","species","fill","allocUnsafeSlow","_isBuffer","compare","y","pos","swap16","swap32","swap64","inspect","thisStart","thisEnd","thisCopy","targetCopy","includes","isFinite","toJSON","_arr","out","toHex","bytes","checkOffset","ext","checkInt","objectWriteUInt16","littleEndian","objectWriteUInt32","checkIEEE754","writeFloat","noAssert","writeDouble","newBuf","sliceLen","readUIntLE","mul","readUIntBE","readUInt8","readUInt16LE","readUInt32LE","readUInt32BE","readIntLE","pow","readIntBE","readInt8","readInt16LE","readInt16BE","readInt32LE","readInt32BE","readFloatLE","readFloatBE","readDoubleLE","readDoubleBE","writeUIntLE","writeUIntBE","writeUInt8","writeUInt16LE","writeUInt16BE","writeUInt32LE","writeUInt32BE","writeIntLE","limit","sub","writeIntBE","writeInt8","writeInt16LE","writeInt16BE","writeInt32LE","writeInt32BE","writeFloatLE","writeFloatBE","writeDoubleLE","writeDoubleBE","targetStart","INVALID_BASE64_RE","Infinity","leadSurrogate","toByteArray","trim","stringtrim","base64clean","src","dst","b64","lens","getLens","validLen","placeHoldersLen","tmp","Arr","_byteLength","curByte","revLookup","uint8","extraBytes","parts","len2","encodeChunk","lookup","output","isLE","mLen","eLen","eMax","eBias","nBits","rt","abs","LN2","HmacSHA1","W","SHA1","_hash","M","H","nBitsTotal","nBitsLeft","HmacSHA256","K","isPrime","sqrtN","sqrt","factor","getFractionalBits","nPrime","SHA256","h","gamma0x","gamma0","gamma1x","gamma1","maj","sigma0","t1","Client","_reconnect","_websocket","_middleware","_streamFeatures","_iqCaller","_iqCallee","_resolve","_sasl","_resourceBinding","_sessionEstablishment","anonymous","plain","reconnect","middleware","streamFeatures","iqCaller","iqCallee","sasl","resourceBinding","sessionEstablishment","mechanisms","entries","v","transports","Transport","find","_findTransport","promiseDelay","race","finally","EE","rejectEvent","timeoutId","cleanup","onEvent","onError","reason","resourceStart","atStart","equality","nameEqual","attrsEqual","childrenEqual","setAttrs","getName","getNS","prefix","findNS","getXmlns","namespaces","getChildren","getChildByAttr","recursive","getChildrenByAttr","getChildrenByFilter","filter","getText","getChildElements","tree","cnode","remove","_addChildren","writer","nameEquals","attrsEquals","childrenEquals","inherits","SaxLtx","remainder","endTag","selfClosing","attrQuote","attrQuoteChar","recordStart","_handleTagOpening","endRecording","recorded","lt","quot","endcomment","endCDATA","cData","prevFirst","prevSecond","ctor","superCtor","super_","TempCtor","parseURI","URI","hostname","URL","Reconnect","_timeout","async","scheduleReconnect","ConnectionWebSocket","FramedParser","NS_FRAMING","WS","WebSocket","CODE","url","errno","wasClean","addEventListener","removeEventListener","compose","IncomingContext","OutgoingContext","Context","ctx","errorHandler","next","reply","catch","incoming","outgoing","incomingListener","outgoingListener","hookOutgoing","use","dispatch","route","feature","xid","StanzaError","timeoutPromise","IQCaller","handlers","Map","_route","isReply","deferred","delete","request","_childRequest","buildReply","buildReplyError","buildError","iqHandler","isQuery","isValidQuery","buildReplyResult","_connect","uris","uri","filterSupportedURIs","Set","srv","record","fetchURIs","fallbackConnect","dns","http","records","compareAltConnections","link","rel","href","method","isSecure","startsWith","secure","encode","decode","SASLError","SASLFactory","authenticate","SASL","mechname","mech","realm","serviceType","serviceName","challenge","resp","response","mechanism","clientFirst","offered","_mechs","restart","atob","Factory","mechs","jlen","entry","makeBindElement","_jid","Mechanism","cred","chal","authzid","HTTPProxy","sdkInstance","currentUserId","requestsNumber","DLog","requestBody","isGetOrHeadType","isPostOrPutType","isInternalRequest","isMultipartFormData","contentType","requestURL","requestObject","buildRequestBody","dataObject","fileToCustomObject","isObject","logRequest","requestAndURL","buildRequestAndURL","dataType","json","ok","processAjaxResponse","processAjaxError","responseBody","logResponse","statusCode","errorObject","isExpiredSessionError","handleExpiredSessionResponse","ajax","AuthService","proxy","webSessionCheckInterval","ajaxParams","getUrl","sessionParams","generateCreateSessionParams","signature","signParams","qr_code","setCurrentUserId","long","interval","timeoutError","timeleft","_clearWebSessionCheckTimer","web_token","UsersService","filters","order","DATE_FIELDS","NUMBER_FIELDS","generateFilter","full_name","facebook_id","twitter_id","phone","tags","external","getCurrentUserId","param","StorageService","blob","file","fileId","createParams","content_type","parseUri","blob_object_access","authority","path","queryKey","upload","uploadResult","markUploaded","uid","fileUID","strictMode","exec","q","$0","$1","$2","strict","loose","SubscriptionsService","EventsService","base64Encode","toBase64","DataService","className","_id","requestedData","requestedTypeOf","typesData","AddressBookService","opts","contacts","force","udid","isCompact","compact","ChatUtils","ChatHelpers","StreamManagement","ContactListProxy","PrivacyListProxy","MucProxy","ChatService","stanzasCallbacks","earlyIncomingMessagesQueue","isConnected","_isConnecting","_isLogout","_checkConnectionTimer","_checkPingTimer","helpers","xmppClientListeners","privacylist","_sentMessageCallback","messageLost","messageSent","onSentMessageCallback","buildUserJid","isInitialConnect","callbackConnect","callbackOnline","startPingTimer","_postConnectActions","callbackOffline","callbackDisconnect","onDisconnectedListener","safeCallbackCall","stopPingTimer","_establishConnection","callbackStatus","callbackStanza","_onPresence","_onIQ","_onSystemMessageListener","_onMessageErrorListener","_onMessage","callbackError","callbackOutput","callTrafficUsageCallback","callbackInput","buildUserJidLocalPart","iqParams","getUniqueId","iqStanza","createIqStanza","buildErrorFromXMPPErrorStanza","validTime","pingTimeInterval","jidOrUserId","stanzaParams","getUserCurrentJid","getBsonObjectId","messageStanza","createMessageStanza","markable","filledExtraParams","typeChat","messageId","getUserIdFromJID","query","onLastUserActivityListener","joinedRooms","setUserCurrentJid","stop","start_date","toISOString","end_date","chat_dialog_ids","rawStanza","extraParamsParsed","recipientId","recipient","getElementTreePath","delivered","composing","paused","invite","bodyContent","forwarded","forwardedMessage","getDialogIdFromJID","getIdFromResource","marker","parseExtraParams","onMessageTypingListener","onDeliveredStatusListener","onReadStatusListener","userCurrentJid","autoSendReceiveStatusParams","sendDeliveredStatus","recipient_id","onMessageListener","xXMLNS","endsWith","getUserIdFromRoomJid","onKickOccupant","actorElement","initiatorUserJid","getRoomJidFromRoomFullJid","onLeaveOccupant","onJoinOccupant","contact","subscription","ask","_sendSubscriptionPresence","onSubscribeListener","onConfirmSubscribeListener","onRejectSubscribeListener","onContactListListener","createPresenceStanza","stanzaId","onSystemMessageListener","onMessageErrorListener","presence","sentMessageCallback","_enableCarbons","onReconnectListener","stanzasCallback","carbonParams","_isEnable","user_jid","_setSubscriptionToUserLastActivity","_userCurrentJid","chatType","arrayElements","identifier","getRoomJidFromDialogId","StreamManagementService","_NS","_isStreamManagementEnabled","_clientProcessedStanzasCounter","_clientSentStanzasCounter","_lastAck","_xmppClient","_originalSend","_unackedQueue","connection","enableParams","_addEnableHandlers","createNonza","nodeTree","_increaseReceivedStanzasCounter","answerStanza","_checkCounterOnIncomeStanza","getAllElements","_sendStanzasRequest","expect","numAcked","ContactListService","items","isUniqName","userJid","add","presenceParams","presenceStanza","PrivacyListService","userMuc","userAction","mutualBlock","listUserId","listPrivacy","action","iq","createPrivacyItem","jidOrMuc","createPrivacyItemMutal","getUserNickWithMucDomain","isErrorStanza","usersList","stanzaQuery","listWithUpdates","getList","existentList","updatedList","mergeArrays","defaultList","activeList","allLists","defaultName","activeName","allNames","default","names","GroupChatService","dialogIdOrJid","dialogJid","getDialogJid","getRoomJid","maxstanzas","errorEl","errorMessage","DIALOGS_API_URL","ChatDialogsService","occupants_ids","idOrIds","admins_ids","push_all","pull_all","enabled","settings","MESSAGES_API_URL","ChatMessagesService","WebRTCSession","WebRTCSignalingProcessor","WebRTCSignalingProvider","cubeWebRTCConstants","signalingProvider","sessions","ondevicechange","_onDevicesChangeListener","spec","specDevices","enumerateDevices","devices","device","opponentsIDs","callerID","_createAndStoreSession","initiatorID","opIDs","newSession","currentUserID","onUserNotAnswerListener","onRemoteStreamListener","onSessionConnectionStateChangedListener","onSessionCloseListener","onCallStatsReport","ID","sessionId","userInfo","_processOnCall","onCallListener","traceWarning","onAcceptCallListener","_processOnAccept","onRejectCallListener","_processOnReject","onInvalidEventsListener","_processOnStop","onStopCallListener","_processOnIceCandidates","onDevicesChangeListener","MediaDevicesImpl","getTime","peerConnections","mediaParams","answerTimer","startCallTime","acceptCallTime","getUserMedia","audio","elementId","attachMediaStream","peerConnection","getElementById","srcObject","createObjectURL","muted","mirror","style","webkitTransform","transform","onloadedmetadata","play","pause","deviceIds","deviceId","getTracks","_replaceTracks","peers","ops","newStreamTracks","detachMediaStream","getSenders","sender","replaceTrack","_prepareExtension","_callInternal","_createPeer","safariVersion","_clearAnswerTimer","_acceptInternal","oppIDs","_uniqueOpponentsIDsWithoutInitiator","offerTime","_startWaitingOfferOrAnswerTimer","opID","localDescription","sendMessage","_close","_muteStream","_uniqueOpponentsIDs","pConn","_startAnswerTimer","_clearWaitingOfferOrAnswerTimer","pcKeys","pc","sendCandidate","stats","connectionState","peerConnectionType","pcConfig","_prepareIceServers","_closeLocalMediaStream","isAllConnectionsClosed","peerState","peerCon","audioTrack","videoTrack","waitingOfferOrAnswerTimer","time","opponents","iceServersCopy","_getExtension","signalType","_onCallListener","_onAcceptListener","_onRejectListener","_onStopListener","_onIceCandidatesListener","opponent","childrenNodes","extraParamsChildNodes","itemTagName","len3","childName","childValue","len2v","wholeNodeContent","signalingConnection","signalingType","platform","getUserJid","opponentId","coreConfig","ConferenceSession","getCurrentSessionToken","onParticipantJoinedListener","onParticipantLeftListener","onSlowLinkListener","onRemoteConnectionStateChangedListener","sessionsStore","deviceInputType","_listDevices","session_id","runtime","Op","hasOwn","$Symbol","iteratorSymbol","asyncIteratorSymbol","asyncIterator","toStringTagSymbol","wrap","innerFn","outerFn","tryLocsList","protoGenerator","Generator","generator","_invoke","doneResult","delegateResult","maybeInvokeDelegate","ContinueSentinel","sent","_sent","dispatchException","abrupt","tryCatch","makeInvokeMethod","GeneratorFunction","GeneratorFunctionPrototype","IteratorPrototype","getProto","NativeIteratorPrototype","values","Gp","defineIteratorMethods","AsyncIterator","PromiseImpl","previousPromise","callInvokeWithMethodAndArg","invoke","__await","unwrapped","resultName","nextLoc","pushTryEntry","locs","tryLoc","catchLoc","finallyLoc","afterLoc","tryEntries","resetTryEntry","completion","iterable","iteratorMethod","displayName","isGeneratorFunction","genFun","mark","awrap","iter","reverse","skipTempReset","prev","charAt","rootRecord","rval","exception","handle","loc","caught","hasCatch","hasFinally","finallyEntry","complete","finish","thrown","delegateYield","regeneratorRuntime","accidentalStrictMode","ClientJanusConf","janusConfig","userDisplayName","_createListener","iceState","uplink","nacks","_clientConf","_setOnParticipantJoinListener","_setOnParticipantLeftListener","_setOnRemoveStreamListener","success","roomId","currentUserDisplayName","_createSession","currentRoomId","_createPublisher","_createHandler","_join","isRemote","attachVideoConferencingPlugin","_onRemoteIceStateChanged","_onLocalIceStateChanged","slowLink","_onSlowLink","_onParticipantJoined","_onParticipantLeft","_onRemoteStream","listOnlineParticipants","_leaveGroup","_destroy","leave","updateCurrentStream","prevAudioMuteState","prevVideoMuteState","attachStreamOptions","isAudioMuted","isVideoMuted","removeTrack","activeAudioDeviceId","activeVideoDeviceId","trackSetting","constraints","_switchVideo","_switchAudio","mediaDeviceId","_switchMediaTracks","newLocalStream","pcSenders","currentPublisherPC","toggleVideoMute","toggleAudioMute","currentDialogId","videoRoomPlugin","webrtcStuff","Janus","VideoConferencingClient","configParams","adapter","configs","engine","isOnlyAudio","remoteFeeds","remoteJseps","remoteFeedsAttachingInProgress","currentMidiaDeviceId","bitrateTimers","listDevices","listVideoinputDevices","videoSelect","deviceInfo","videoinputDescription","label","videoinputId","callbacks","isWebrtcSupported","destroyed","timeoutSessionCallback","getSessionId","destroy","remoteFeed","plugin","pluginHandle","listen","consentDialog","mediaState","medium","webrtcState","onmessage","jsep","feedId","useAudio","useVideo","publishers","detachRemoteFeed","handleRemoteJsep","onlocalstream","onremotestream","oncleanup","detached","getPluginId","getId","detachVideoConferencingPlugin","detach","chatDialogId","joinEvent","leaveEvent","listRequest","participants","unmuteAudio","muteAudio","toggleRemoteAudioMute","audioTracks","isRemoteAudioMuted","unmuteVideo","muteVideo","toggleRemoteVideoMute","videoTracks","isRemoteVideoMuted","switchVideoinput","replaceVideo","switchAudioinput","replaceAudio","iceRestart","userIdOrCallbacks","inputParams","videoQuality","quality","videoFrameRate","frameRate","audioRecv","videoRecv","audioSend","videoSend","ideal","publish","showBitrate","browserDetails","getBitrate","hideBitrate","eventType","gatewayCallbacks","initDone","noop","websockets","ws","wsHandlers","wsKeepaliveTimeoutId","servers","serversIndex","iceTransportPolicy","bundlePolicy","ipv6Support","ipv6","withCredentials","maxev","max_poll_events","apisecret","destroyOnUnload","connected","pluginHandles","retries","transactions","eventHandler","longpoll","httpAPICall","verb","handleEvent","textStatus","errorThrown","skipTimeout","hangup","ondetached","transaction","reportSuccess","plugindata","vdebug","keepAlive","randomString","handleId","sendTrickleCandidate","sendData","dataChannel","sendDtmf","dtmfSender","myStream","tracks","local_audio_track","createDTMFSender","ontonechange","tone","dtmf","tones","duration","gap","insertDTMF","destroyHandle","asyncRequest","cleanupWebrtc","streamsDone","streamExternal","removeAudio","removeVideo","addTracks","isAudioSendEnabled","addAudio","isVideoSendEnabled","addVideo","pc_config","pc_constraints","optional","rtcConstraints","webRTCAdapter","volume","trickle","iceDone","mySdp","sdpSent","sendSDP","streams","onended","ev","isDataEnabled","onDataChannelStateChange","dcState","readyState","ondataopen","createDataChannel","ordered","ondata","onopen","onclose","onerror","simulcast","mediaConstraints","isAudioRecvEnabled","isVideoRecvEnabled","sendVideo","parameters","getParameters","setParameters","encodings","rid","priority","maxBitrate","ssrc","ssrc_fid","cname","msid","mslabel","insertAt","mline","fid","mungeSdpForSimulcasting","prepareWebrtc","webrtcError","addData","mst","mandatory","audioSupport","videoSupport","callbackUserMedia","getScreenMedia","gsmCallback","audioStream","screenshareFrameRate","location","cache","chromever","maxver","googLeakyBucket","maxWidth","screen","maxHeight","minFrameRate","maxFrameRate","chromeMediaSource","pending","postMessage","mozMediaSource","mediaSource","lastTime","currentTime","polly","origin","sourceId","googTemporalLayeredScreencast","chromeMediaSourceId","audioExist","some","videoExist","needAudioDevice","failIfNoAudio","isAudioSendRequired","needVideoDevice","failIfNoVideo","isVideoSendRequired","haveAudioDevice","haveVideoDevice","prepareWebrtcPeer","getVolume","timer","stat","isMuted","mute","inStats","googCodecName","bsnow","tsnow","bsbefore","tsbefore","timePassed","bitRate","hangupRequest","eventName","newWebSocket","getServer","unbindWebSocket","onUnbindMessage","onUnbindError","opaqueId","started","getPlugin","sendRequest","createHandle","extensionId","isExtensionEnabled","checkJanusExtension","useDefaultDependencies","deps","socketCls","proto","fetchOptions","fetching","timerId","useOldDependencies","jq","jQuery","payload","xhrFields","xhr","usedDependencies","dependencies","reattachMediaStream","oldOBF","onbeforeunload","charSet","randomPoz","fbemitter","EventSubscriptionVendor","emptyFunction","invariant","BaseEventEmitter","_subscriber","_currentSubscription","addSubscription","removeCurrentListener","removeAllSubscriptions","removeSubscription","getSubscriptionsForType","thatReturnsTrue","ii","__emitToSubscription","EventSubscription","_subscriptionsForType","subscriptionsForType","makeEmptyFunction","thatReturns","thatReturnsFalse","thatReturnsNull","thatReturnsThis","thatReturnsArgument"],"mappings":"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","file":"connectycube.min.js","sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory(require(\"node-fetch\"), require(\"form-data\"));\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([\"node-fetch\", \"form-data\"], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"ConnectyCube\"] = factory(require(\"node-fetch\"), require(\"form-data\"));\n\telse\n\t\troot[\"ConnectyCube\"] = factory(root[\"node-fetch\"], root[\"form-data\"]);\n})(window, function(__WEBPACK_EXTERNAL_MODULE__30__, __WEBPACK_EXTERNAL_MODULE__98__) {\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 = 37);\n","function _interopRequireDefault(obj) {\n  return obj && obj.__esModule ? obj : {\n    \"default\": obj\n  };\n}\n\nmodule.exports = _interopRequireDefault;","function _classCallCheck(instance, Constructor) {\n  if (!(instance instanceof Constructor)) {\n    throw new TypeError(\"Cannot call a class as a function\");\n  }\n}\n\nmodule.exports = _classCallCheck;","function _defineProperties(target, props) {\n  for (var i = 0; i < props.length; i++) {\n    var descriptor = props[i];\n    descriptor.enumerable = descriptor.enumerable || false;\n    descriptor.configurable = true;\n    if (\"value\" in descriptor) descriptor.writable = true;\n    Object.defineProperty(target, descriptor.key, descriptor);\n  }\n}\n\nfunction _createClass(Constructor, protoProps, staticProps) {\n  if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n  if (staticProps) _defineProperties(Constructor, staticProps);\n  return Constructor;\n}\n\nmodule.exports = _createClass;","const config = require('./cubeConfig')\n\nconst IS_BROWSER_ENV = typeof document !== 'undefined';\nconst IS_RN_ENV = typeof navigator !== 'undefined' &&\n  navigator.product == 'ReactNative';\nconst IS_NS_ENV = typeof global === 'object' &&\n  (typeof global.android !== 'undefined' ||\n    typeof global.NSObject !== 'undefined');\n\nclass InternalUtils {\n\n  static getEnv() {\n    return {\n      nativescript: IS_NS_ENV,\n      reactnative: IS_RN_ENV,\n      browser: IS_BROWSER_ENV,\n      node: !IS_BROWSER_ENV && !IS_NS_ENV && !IS_RN_ENV\n    }\n  }\n\n  static isWebRTCAvailble() {\n    return (\n      IS_RN_ENV ||\n      (IS_BROWSER_ENV &&\n        window.RTCPeerConnection &&\n        window.RTCIceCandidate &&\n        window.RTCSessionDescription)\n    )\n  }\n\n  static safeCallbackCall() {\n    const callback = arguments[0];\n    if (typeof callback !== 'function') {\n      return;\n    }\n\n    const callbackString = callback.toString()\n    const callbackName = callbackString.split('(')[0].split(' ')[1]\n\n    const argumentsCopy = []\n    let listenerCall\n\n    for (let i = 0; i < arguments.length; i++) {\n      argumentsCopy.push(arguments[i])\n    }\n\n    listenerCall = argumentsCopy.shift()\n\n    try {\n      listenerCall.apply(null, argumentsCopy)\n    } catch (err) {\n      if (callbackName === '') {\n        console.error('Error: ' + err)\n      } else {\n        console.error('Error in listener ' + callbackName + ': ' + err)\n      }\n    }\n  }\n\n  static randomNonce() {\n    return Math.floor(Math.random() * 10000)\n  }\n\n  static unixTime() {\n    return Math.floor(Date.now() / 1000)\n  }\n\n  static getUrl(base, id, extension) {\n    let resource = `${id ? '/' + id : ''}`\n    extension = `${extension ? '/' + extension : ''}`\n    return `https://${config.endpoints.api}/${base}${resource}${extension}${config.urls.type}`\n  }\n\n  static isArray(arr) {\n    return Object.prototype.toString.call(arr) === '[object Array]'\n  }\n\n  static isObject(obj) {\n    return Object.prototype.toString.call(obj) === '[object Object]'\n  }\n\n  static getBsonObjectId() {\n    const timestamp = this.unixTime().toString(16)\n    const increment = (ObjectId.increment++).toString(16)\n\n    if (increment > 0xffffff) ObjectId.increment = 0\n\n    return (\n      '00000000'.substr(0, 8 - timestamp.length) +\n      timestamp +\n      '000000'.substr(0, 6 - ObjectId.machine.length) +\n      ObjectId.machine +\n      '0000'.substr(0, 4 - ObjectId.pid.length) +\n      ObjectId.pid +\n      '000000'.substr(0, 6 - increment.length) +\n      increment\n    )\n  }\n\n  static DLog() {\n    if (this.loggers) {\n      for (let i = 0; i < this.loggers.length; ++i) {\n        this.loggers[i](arguments)\n      }\n\n      return\n    }\n\n    let logger\n\n    this.loggers = []\n\n    const consoleLoggerFunction = function () {\n      const logger = function (args) {\n        console.log.apply(console, Array.prototype.slice.call(args))\n      }\n\n      return logger\n    }\n\n    if (typeof config.debug === 'object') {\n      if (typeof config.debug.mode === 'number') {\n        if (config.debug.mode == 1) {\n          logger = consoleLoggerFunction()\n          this.loggers.push(logger)\n        }\n      } else if (typeof config.debug.mode === 'object') {\n        config.debug.mode.forEach(function (mode) {\n          if (mode === 1) {\n            logger = consoleLoggerFunction()\n            this.loggers.push(logger)\n          }\n        })\n      }\n    }\n\n    if (this.loggers) {\n      for (let j = 0; j < this.loggers.length; ++j) {\n        this.loggers[j](arguments)\n      }\n    }\n  }\n\n  static isExpiredSessionError(error) {\n    try {\n      return (\n        error &&\n        error.code === 401 &&\n        error.message.errors.base[0] === 'Required session does not exist'\n      )\n    } catch (ex) {\n      return false\n    }\n  }\n\n  static mergeArrays(arrayTo, arrayFrom) {\n    const merged = JSON.parse(JSON.stringify(arrayTo))\n\n    firstLevel: for (let i = 0; i < arrayFrom.length; i++) {\n      const newItem = arrayFrom[i]\n\n      for (let j = 0; j < merged.length; j++) {\n        if (newItem.user_id === merged[j].user_id) {\n          merged[j] = newItem\n          continue firstLevel\n        }\n      }\n      merged.push(newItem)\n    }\n    return merged\n  }\n\n  static toBase64(str) {\n    if (this.getEnv().browser) {\n      return btoa(\n        encodeURIComponent(str).replace(/%([0-9A-F]{2})/g, function (match, p1) {\n          return String.fromCharCode('0x' + p1)\n        })\n      )\n    } else if (this.getEnv().reactnative) {\n      return global.encodeToBase64(str)\n    } else {\n      // Node.js & Native Script\n      return new Buffer(str).toString('base64')\n    }\n  }\n\n  static generateCreateSessionParams(params) {\n    const message = {\n      application_id: config.creds.appId,\n      auth_key: config.creds.authKey,\n      nonce: this.randomNonce(),\n      timestamp: this.unixTime()\n    }\n\n    if (params) {\n      if (params.login && params.password) {\n        message.user = { login: params.login, password: params.password }\n      } else if (params.email && params.password) {\n        message.user = { email: params.email, password: params.password }\n      } else if (params.provider) {\n        // Via social networking provider (e.g. facebook, twitter etc.)\n        message.provider = params.provider\n        if (params.scope) {\n          message.scope = params.scope\n        }\n        if (params.keys && params.keys.token) {\n          message.keys = { token: params.keys.token }\n        }\n        if (params.keys && params.keys.secret) {\n          message.keys.secret = params.keys.secret\n        }\n      } else if (params.hasOwnProperty('long')) {\n        message.long = params.long\n      }\n    }\n\n    return message;\n  }\n\n  static signParams(message, secret) {\n    const sessionMsg = Object.keys(message)\n      .map(function (val) {\n        if (typeof message[val] === 'object') {\n          return Object.keys(message[val])\n            .map(function (val1) {\n              return val + '[' + val1 + ']=' + message[val][val1]\n            })\n            .sort()\n            .join('&')\n        } else {\n          return val + '=' + message[val]\n        }\n      })\n      .sort()\n      .join('&')\n\n    let cryptoSessionMsg\n\n    if (config.hash === 'sha1') {\n      const sha1 = require('crypto-js/hmac-sha1')\n      cryptoSessionMsg = sha1(sessionMsg, secret).toString()\n    } else if (config.hash === 'sha256') {\n      const sha256 = require('crypto-js/hmac-sha256')\n      cryptoSessionMsg = sha256(sessionMsg, secret).toString()\n    } else {\n      throw new Error('Unknown crypto standards, available sha1 or sha256')\n    }\n\n    return cryptoSessionMsg\n  }\n\n  static getSizeOfString(str) {\n    return (new Blob([str])).size\n  }\n\n  static getDateSize(data) {\n    let size = 0;\n    if (data.body) {\n      let body = data.body\n      if (typeof body != 'string') {\n        body = JSON.stringify(body)\n      }\n      size += this.getSizeOfString(body)\n    }\n    if (data.headers) {\n      size += this.getSizeOfString(JSON.stringify(data.headers))\n    }\n    return size;\n  }\n\n  static callTrafficUsageCallback(callbackName, data) {\n    if (typeof config.on[callbackName] === 'function') {\n      config.on[callbackName](this.getDateSize(data))\n    }\n  }\n}\n\n// The object for type MongoDB.Bson.ObjectId\n// http://docs.mongodb.org/manual/reference/object-id/\nconst ObjectId = {\n  machine: Math.floor(Math.random() * 16777216).toString(16),\n  pid: Math.floor(Math.random() * 32767).toString(16),\n  increment: 0\n}\n\nmodule.exports = InternalUtils;\n","const config = {\n    version: require('../package.json').version,\n    creds: {\n        appId: '',\n        authKey: '',\n        authSecret: ''\n    },\n    endpoints: {\n        api: 'api.connectycube.com',\n        chat: 'chat.connectycube.com',\n        muc: 'muc.chat.connectycube.com'\n    },\n    hash: 'sha1',\n    chatProtocol: {\n        bosh: 'https://chat.connectycube.com:5281',\n        websocket: 'wss://chat.connectycube.com:5291',\n        active: 2\n    },\n    webSession: {\n        getSessionTimeInterval: 3,\n        getSessionTimeout: 120\n    },\n    chat: {\n        contactList: {\n            subscriptionMode: {\n                mutual: true\n            }\n        },\n        reconnectionTimeInterval: 5,\n        streamManagement: {\n            enable: false\n        },\n        ping: {\n            enable: false,\n            timeInterval: 60\n        }\n\n    },\n    videochat: {\n        answerTimeInterval: 60,\n        dialingTimeInterval: 5,\n        disconnectTimeInterval: 30,\n        statsReportTimeInterval: false,\n        iceServers: [\n            {\n                urls: 'stun:stun.l.google.com:19302'\n            },\n            {\n                urls: 'stun:turn.connectycube.com'\n            },\n            {\n                urls: 'turn:turn.connectycube.com:5349?transport=udp',\n                username: 'connectycube',\n                credential: '4c29501ca9207b7fb9c4b4b6b04faeb1'\n            },\n            {\n                urls: 'turn:turn.connectycube.com:5349?transport=tcp',\n                username: 'connectycube',\n                credential: '4c29501ca9207b7fb9c4b4b6b04faeb1'\n            }\n        ]\n    },\n    conference: { server: 'wss://janus.connectycube.com:8989' },\n    urls: {\n        session: 'session',\n        webSession: 'session/web',\n        login: 'login',\n        users: 'users',\n        chat: 'chat',\n        blobs: 'blobs',\n        subscriptions: 'subscriptions',\n        events: 'events',\n        data: 'data',\n        addressbook: 'address_book',\n        addressbookRegistered: 'address_book/registered_users',\n        type: '.json'\n    },\n    on: {\n        sessionExpired: null,\n        xmppDataWrite: null,\n        xmppDataRead: null\n    },\n    timeout: null,\n    debug: {\n        mode: 0\n    }\n}\n\nconfig.set = function (options) {\n    if (typeof options.endpoints === 'object' && options.endpoints.chat) {\n        config.endpoints.muc = 'muc.' + options.endpoints.chat\n        config.chatProtocol.bosh = 'https://' + options.endpoints.chat + ':5281'\n        config.chatProtocol.websocket = 'wss://' + options.endpoints.chat + ':5291'\n    }\n\n    Object.keys(options).forEach(function (key) {\n        if (key !== 'set' && config.hasOwnProperty(key)) {\n            if (typeof options[key] !== 'object') {\n                config[key] = options[key]\n            } else {\n                Object.keys(options[key]).forEach(function (nextkey) {\n                    if (config[key].hasOwnProperty(nextkey)) {\n                        config[key][nextkey] = options[key][nextkey]\n                    }\n                })\n            }\n        }\n    })\n}\n\nmodule.exports = config\n","const Utils = require('./cubeInternalUtils')\n\nlet fetchImpl, formDataImpl\n\nlet RTCPeerConnection,\n  RTCSessionDescription,\n  RTCIceCandidate,\n  MediaStream,\n  mediaDevices;\n\nlet XMPPClient = require('@xmpp/client/react-native'); // https://github.com/xmppjs/xmpp.js/issues/807\n\nif (Utils.getEnv().browser) {\n  fetchImpl = fetch\n  formDataImpl = FormData\n\n  RTCPeerConnection = window.RTCPeerConnection\n  RTCSessionDescription = window.RTCSessionDescription\n  RTCIceCandidate = window.RTCIceCandidate\n  MediaStream = window.MediaStream\n  mediaDevices = navigator.mediaDevices\n} else if (Utils.getEnv().nativescript) {\n  fetchImpl = fetch\n  formDataImpl = FormData\n} else if (Utils.getEnv().node) {\n  fetchImpl = require('node-fetch')\n  formDataImpl = require('form-data')\n} else if (Utils.getEnv().reactnative) {\n  fetchImpl = fetch\n  formDataImpl = FormData\n}\n\nmodule.exports = {\n  fetchImpl: fetchImpl,\n  formDataImpl: formDataImpl,\n  XMPPClient: XMPPClient,\n  RTCPeerConnection: RTCPeerConnection,\n  RTCSessionDescription: RTCSessionDescription,\n  RTCIceCandidate: RTCIceCandidate,\n  MediaStream: MediaStream,\n  mediaDevices: mediaDevices\n}\n","function _typeof(obj) {\n  \"@babel/helpers - typeof\";\n\n  if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") {\n    module.exports = _typeof = function _typeof(obj) {\n      return typeof obj;\n    };\n  } else {\n    module.exports = _typeof = function _typeof(obj) {\n      return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n    };\n  }\n\n  return _typeof(obj);\n}\n\nmodule.exports = _typeof;","'use strict'\n\nconst x = require('./lib/x')\nconst Element = require('./lib/Element')\nconst Parser = require('./lib/Parser')\nconst {\n  escapeXML,\n  unescapeXML,\n  escapeXMLText,\n  unescapeXMLText,\n} = require('ltx/lib/escape')\nconst XMLError = require('./lib/XMLError')\n\nfunction xml(...args) {\n  return x(...args)\n}\n\nexports = module.exports = xml\n\nObject.assign(exports, {\n  x,\n  Element,\n  Parser,\n  escapeXML,\n  unescapeXML,\n  escapeXMLText,\n  unescapeXMLText,\n  XMLError,\n})\n","module.exports = {\n    SignalingConstants: {\n        MODULE_ID: \"WebRTCVideoChat\",\n        SignalingType: {\n            CALL: 'call',\n            ACCEPT: 'accept',\n            REJECT: 'reject',\n            STOP: 'hangUp',\n            CANDIDATE: 'iceCandidates'\n        }\n    },\n    SessionConnectionState: {\n        UNDEFINED: 0,\n        CONNECTING: 1,\n        CONNECTED: 2,\n        FAILED: 3,\n        DISCONNECTED: 4,\n        CLOSED: 5,\n        COMPLETED: 6\n    },\n    SessionState: {\n        NEW: 1,\n        ACTIVE: 2,\n        HUNGUP: 3,\n        REJECTED: 4,\n        CLOSED: 5\n    },\n    PeerConnectionState: {\n        NEW: 1,\n        CONNECTING: 2,\n        CHECKING: 3,\n        CONNECTED: 4,\n        DISCONNECTED: 5,\n        FAILED: 6,\n        CLOSED: 7,\n        COMPLETED: 8\n    },\n    CallType: {\n        VIDEO: 1,\n        AUDIO: 2\n    }\n};\n","const Utils = require('../cubeInternalUtils'),\n  Config = require('../cubeConfig'),\n  XMPP = require('../cubeDependencies').XMPPClient;\n\nclass ChatInternalUtils {\n  static buildUserJid(params) {\n    let jid;\n\n    if ('userId' in params) {\n      jid = params.userId + '-' + Config.creds.appId + '@' + Config.endpoints.chat;\n\n      if ('resource' in params) {\n        jid = jid + '/' + params.resource;\n      }\n    } else if ('jid' in params) {\n      jid = params.jid;\n    }\n\n    return jid;\n  }\n\n  static buildUserJidLocalPart(userId) {\n    return userId + '-' + Config.creds.appId;\n  }\n\n  static createMessageStanza(params) {\n    return XMPP.xml('message', params);\n  }\n\n  static createIqStanza(params) {\n    return XMPP.xml('iq', params);\n  }\n\n  static createPresenceStanza(params) {\n    return XMPP.xml('presence', params);\n  }\n\n  static createNonza(elementName, params) {\n    return XMPP.xml(elementName, params);\n  }\n\n  static getAttr(el, attrName) {\n    if (!el) {\n      return null;\n    }\n\n    let attr;\n    if (typeof el.getAttribute === 'function') {\n      attr = el.getAttribute(attrName);\n    } else if (el.attrs) {\n      attr = el.attrs[attrName];\n    }\n\n    return attr;\n  }\n\n  static getElement(stanza, elName) {\n    let el;\n\n    if (typeof stanza.querySelector === 'function') {\n      el = stanza.querySelector(elName);\n    } else if (typeof stanza.getChild === 'function') {\n      el = stanza.getChild(elName);\n    }\n\n    return el;\n  }\n\n  static isErrorStanza(stanza) {\n    return !!stanza.getChild('error');\n  }\n\n  static getAllElements(stanza, elName) {\n    let el;\n    if (typeof stanza.querySelectorAll === 'function') {\n      el = stanza.querySelectorAll(elName);\n    } else if (typeof stanza.getChild === 'function') {\n      el = stanza.getChild(elName);\n    }\n\n    return el;\n  }\n\n  static getElementText(stanza, elName) {\n    let el, txt;\n\n    if (typeof stanza.querySelector === 'function') {\n      el = stanza.querySelector(elName);\n      txt = el ? el.textContent : null;\n    } else if (typeof stanza.getChildText === 'function') {\n      txt = stanza.getChildText(elName);\n    }\n\n    return txt;\n  }\n\n  static getElementTreePath(stanza, elementsPath) {\n    return elementsPath.reduce((prevStanza, elem) => prevStanza ? this.getElement(prevStanza, elem) : prevStanza, stanza)\n  }\n\n\n  static _JStoXML(title, obj, msg) {\n    msg = msg.c(title);\n\n    Object.keys(obj).forEach(field => {\n      if (typeof obj[field] === 'object') {\n        this._JStoXML(field, obj[field], msg);\n      } else {\n        msg = msg.c(field).t(obj[field]).up();\n      }\n    });\n\n    msg = msg.up();\n  }\n\n  static _XMLtoJS(extension, title, obj) {\n    extension[title] = {};\n\n    let objChildNodes = obj.childNodes || obj.children;\n\n    for (let i = 0; i < objChildNodes.length; i++) {\n      let subNode = objChildNodes[i];\n      let subNodeChildNodes = subNode.childNodes || subNode.children;\n      let subNodeTagName = subNode.tagName || subNode.name;\n      let subNodeTextContent = subNode.textContent || subNode.children[0];\n\n      if (subNodeChildNodes.length > 1) {\n        extension[title] = this._XMLtoJS(extension[title], subNodeTagName, subNode);\n      } else {\n        extension[title][subNodeTagName] = subNodeTextContent;\n      }\n    }\n    return extension;\n  }\n\n  static filledExtraParams(stanza, extension) {\n    Object.keys(extension).forEach(field => {\n      if (field === 'attachments') {\n        extension[field].forEach(attach => {\n          stanza\n            .getChild('extraParams')\n            .c('attachment', attach)\n            .up();\n\n        });\n      } else if (typeof extension[field] === 'object') {\n        this._JStoXML(field, extension[field], stanza);\n      } else {\n        stanza\n          .getChild('extraParams')\n          .c(field)\n          .t(extension[field])\n          .up();\n\n      }\n    });\n\n    stanza.up();\n\n    return stanza;\n  }\n\n  static parseExtraParams(extraParams) {\n    if (!extraParams) {\n      return null;\n    }\n\n    let extension = {};\n\n    let dialogId, attach, attributes;\n\n    let attachments = [];\n\n    for (let c = 0, lenght = extraParams.children.length; c < lenght; c++) {\n      if (extraParams.children[c].name === 'attachment') {\n        attach = {};\n        attributes = extraParams.children[c].attrs;\n\n        let attrKeys = Object.keys(attributes);\n\n        for (let l = 0; l < attrKeys.length; l++) {\n          if (attrKeys[l] === 'size') {\n            attach.size = parseInt(attributes.size);\n          } else {\n            attach[attrKeys[l]] = attributes[attrKeys[l]];\n          }\n        }\n\n        attachments.push(attach);\n      } else if (extraParams.children[c].name === 'dialog_id') {\n        dialogId = extraParams.getChildText('dialog_id');\n        extension.dialog_id = dialogId;\n      }\n\n      if (extraParams.children[c].children.length === 1) {\n        let child = extraParams.children[c];\n\n        extension[child.name] = child.children[0];\n      }\n    }\n\n    if (attachments.length > 0) {\n      extension.attachments = attachments;\n    }\n\n    if (extension.moduleIdentifier) {\n      delete extension.moduleIdentifier;\n    }\n\n    return {\n      extension: extension,\n      dialogId: dialogId\n    };\n  }\n\n  static buildErrorFromXMPPErrorStanza(errorStanza) {\n    const errorElement = this.getElement(errorStanza, 'error');\n    const code = parseInt(this.getAttr(errorElement, 'code'));\n    const info = this.getElementText(errorElement, 'text');\n    return { code: code, info: info };\n  }\n\n  static getUniqueId(suffix) {\n    const uuid = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, c => {\n      const r = (Math.random() * 16) | 0,\n        v = c == 'x' ? r : (r & 0x3) | 0x8;\n      return v.toString(16);\n    });\n    if (typeof suffix == 'string' || typeof suffix == 'number') {\n      return uuid + ':' + suffix;\n    } else {\n      return uuid + '';\n    }\n  }\n}\n\nmodule.exports = ChatInternalUtils;\n","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","var g;\n\n// This works in non-strict mode\ng = (function() {\n\treturn this;\n})();\n\ntry {\n\t// This works if eval is allowed (see CSP)\n\tg = g || new Function(\"return this\")();\n} catch (e) {\n\t// This works if the window reference is available\n\tif (typeof window === \"object\") g = window;\n}\n\n// g can still be undefined, but nothing to do about it...\n// We return undefined, instead of nothing here, so it's\n// easier to handle this case. if(!global) { ...}\n\nmodule.exports = g;\n",";(function (root, factory) {\n\tif (typeof exports === \"object\") {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory();\n\t}\n\telse if (typeof define === \"function\" && define.amd) {\n\t\t// AMD\n\t\tdefine([], factory);\n\t}\n\telse {\n\t\t// Global (browser)\n\t\troot.CryptoJS = factory();\n\t}\n}(this, function () {\n\n\t/**\n\t * CryptoJS core components.\n\t */\n\tvar CryptoJS = CryptoJS || (function (Math, undefined) {\n\t    /*\n\t     * Local polyfil of Object.create\n\t     */\n\t    var create = Object.create || (function () {\n\t        function F() {};\n\n\t        return function (obj) {\n\t            var subtype;\n\n\t            F.prototype = obj;\n\n\t            subtype = new F();\n\n\t            F.prototype = null;\n\n\t            return subtype;\n\t        };\n\t    }())\n\n\t    /**\n\t     * CryptoJS namespace.\n\t     */\n\t    var C = {};\n\n\t    /**\n\t     * Library namespace.\n\t     */\n\t    var C_lib = C.lib = {};\n\n\t    /**\n\t     * Base object for prototypal inheritance.\n\t     */\n\t    var Base = C_lib.Base = (function () {\n\n\n\t        return {\n\t            /**\n\t             * Creates a new object that inherits from this object.\n\t             *\n\t             * @param {Object} overrides Properties to copy into the new object.\n\t             *\n\t             * @return {Object} The new object.\n\t             *\n\t             * @static\n\t             *\n\t             * @example\n\t             *\n\t             *     var MyType = CryptoJS.lib.Base.extend({\n\t             *         field: 'value',\n\t             *\n\t             *         method: function () {\n\t             *         }\n\t             *     });\n\t             */\n\t            extend: function (overrides) {\n\t                // Spawn\n\t                var subtype = create(this);\n\n\t                // Augment\n\t                if (overrides) {\n\t                    subtype.mixIn(overrides);\n\t                }\n\n\t                // Create default initializer\n\t                if (!subtype.hasOwnProperty('init') || this.init === subtype.init) {\n\t                    subtype.init = function () {\n\t                        subtype.$super.init.apply(this, arguments);\n\t                    };\n\t                }\n\n\t                // Initializer's prototype is the subtype object\n\t                subtype.init.prototype = subtype;\n\n\t                // Reference supertype\n\t                subtype.$super = this;\n\n\t                return subtype;\n\t            },\n\n\t            /**\n\t             * Extends this object and runs the init method.\n\t             * Arguments to create() will be passed to init().\n\t             *\n\t             * @return {Object} The new object.\n\t             *\n\t             * @static\n\t             *\n\t             * @example\n\t             *\n\t             *     var instance = MyType.create();\n\t             */\n\t            create: function () {\n\t                var instance = this.extend();\n\t                instance.init.apply(instance, arguments);\n\n\t                return instance;\n\t            },\n\n\t            /**\n\t             * Initializes a newly created object.\n\t             * Override this method to add some logic when your objects are created.\n\t             *\n\t             * @example\n\t             *\n\t             *     var MyType = CryptoJS.lib.Base.extend({\n\t             *         init: function () {\n\t             *             // ...\n\t             *         }\n\t             *     });\n\t             */\n\t            init: function () {\n\t            },\n\n\t            /**\n\t             * Copies properties into this object.\n\t             *\n\t             * @param {Object} properties The properties to mix in.\n\t             *\n\t             * @example\n\t             *\n\t             *     MyType.mixIn({\n\t             *         field: 'value'\n\t             *     });\n\t             */\n\t            mixIn: function (properties) {\n\t                for (var propertyName in properties) {\n\t                    if (properties.hasOwnProperty(propertyName)) {\n\t                        this[propertyName] = properties[propertyName];\n\t                    }\n\t                }\n\n\t                // IE won't copy toString using the loop above\n\t                if (properties.hasOwnProperty('toString')) {\n\t                    this.toString = properties.toString;\n\t                }\n\t            },\n\n\t            /**\n\t             * Creates a copy of this object.\n\t             *\n\t             * @return {Object} The clone.\n\t             *\n\t             * @example\n\t             *\n\t             *     var clone = instance.clone();\n\t             */\n\t            clone: function () {\n\t                return this.init.prototype.extend(this);\n\t            }\n\t        };\n\t    }());\n\n\t    /**\n\t     * An array of 32-bit words.\n\t     *\n\t     * @property {Array} words The array of 32-bit words.\n\t     * @property {number} sigBytes The number of significant bytes in this word array.\n\t     */\n\t    var WordArray = C_lib.WordArray = Base.extend({\n\t        /**\n\t         * Initializes a newly created word array.\n\t         *\n\t         * @param {Array} words (Optional) An array of 32-bit words.\n\t         * @param {number} sigBytes (Optional) The number of significant bytes in the words.\n\t         *\n\t         * @example\n\t         *\n\t         *     var wordArray = CryptoJS.lib.WordArray.create();\n\t         *     var wordArray = CryptoJS.lib.WordArray.create([0x00010203, 0x04050607]);\n\t         *     var wordArray = CryptoJS.lib.WordArray.create([0x00010203, 0x04050607], 6);\n\t         */\n\t        init: function (words, sigBytes) {\n\t            words = this.words = words || [];\n\n\t            if (sigBytes != undefined) {\n\t                this.sigBytes = sigBytes;\n\t            } else {\n\t                this.sigBytes = words.length * 4;\n\t            }\n\t        },\n\n\t        /**\n\t         * Converts this word array to a string.\n\t         *\n\t         * @param {Encoder} encoder (Optional) The encoding strategy to use. Default: CryptoJS.enc.Hex\n\t         *\n\t         * @return {string} The stringified word array.\n\t         *\n\t         * @example\n\t         *\n\t         *     var string = wordArray + '';\n\t         *     var string = wordArray.toString();\n\t         *     var string = wordArray.toString(CryptoJS.enc.Utf8);\n\t         */\n\t        toString: function (encoder) {\n\t            return (encoder || Hex).stringify(this);\n\t        },\n\n\t        /**\n\t         * Concatenates a word array to this word array.\n\t         *\n\t         * @param {WordArray} wordArray The word array to append.\n\t         *\n\t         * @return {WordArray} This word array.\n\t         *\n\t         * @example\n\t         *\n\t         *     wordArray1.concat(wordArray2);\n\t         */\n\t        concat: function (wordArray) {\n\t            // Shortcuts\n\t            var thisWords = this.words;\n\t            var thatWords = wordArray.words;\n\t            var thisSigBytes = this.sigBytes;\n\t            var thatSigBytes = wordArray.sigBytes;\n\n\t            // Clamp excess bits\n\t            this.clamp();\n\n\t            // Concat\n\t            if (thisSigBytes % 4) {\n\t                // Copy one byte at a time\n\t                for (var i = 0; i < thatSigBytes; i++) {\n\t                    var thatByte = (thatWords[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;\n\t                    thisWords[(thisSigBytes + i) >>> 2] |= thatByte << (24 - ((thisSigBytes + i) % 4) * 8);\n\t                }\n\t            } else {\n\t                // Copy one word at a time\n\t                for (var i = 0; i < thatSigBytes; i += 4) {\n\t                    thisWords[(thisSigBytes + i) >>> 2] = thatWords[i >>> 2];\n\t                }\n\t            }\n\t            this.sigBytes += thatSigBytes;\n\n\t            // Chainable\n\t            return this;\n\t        },\n\n\t        /**\n\t         * Removes insignificant bits.\n\t         *\n\t         * @example\n\t         *\n\t         *     wordArray.clamp();\n\t         */\n\t        clamp: function () {\n\t            // Shortcuts\n\t            var words = this.words;\n\t            var sigBytes = this.sigBytes;\n\n\t            // Clamp\n\t            words[sigBytes >>> 2] &= 0xffffffff << (32 - (sigBytes % 4) * 8);\n\t            words.length = Math.ceil(sigBytes / 4);\n\t        },\n\n\t        /**\n\t         * Creates a copy of this word array.\n\t         *\n\t         * @return {WordArray} The clone.\n\t         *\n\t         * @example\n\t         *\n\t         *     var clone = wordArray.clone();\n\t         */\n\t        clone: function () {\n\t            var clone = Base.clone.call(this);\n\t            clone.words = this.words.slice(0);\n\n\t            return clone;\n\t        },\n\n\t        /**\n\t         * Creates a word array filled with random bytes.\n\t         *\n\t         * @param {number} nBytes The number of random bytes to generate.\n\t         *\n\t         * @return {WordArray} The random word array.\n\t         *\n\t         * @static\n\t         *\n\t         * @example\n\t         *\n\t         *     var wordArray = CryptoJS.lib.WordArray.random(16);\n\t         */\n\t        random: function (nBytes) {\n\t            var words = [];\n\n\t            var r = (function (m_w) {\n\t                var m_w = m_w;\n\t                var m_z = 0x3ade68b1;\n\t                var mask = 0xffffffff;\n\n\t                return function () {\n\t                    m_z = (0x9069 * (m_z & 0xFFFF) + (m_z >> 0x10)) & mask;\n\t                    m_w = (0x4650 * (m_w & 0xFFFF) + (m_w >> 0x10)) & mask;\n\t                    var result = ((m_z << 0x10) + m_w) & mask;\n\t                    result /= 0x100000000;\n\t                    result += 0.5;\n\t                    return result * (Math.random() > .5 ? 1 : -1);\n\t                }\n\t            });\n\n\t            for (var i = 0, rcache; i < nBytes; i += 4) {\n\t                var _r = r((rcache || Math.random()) * 0x100000000);\n\n\t                rcache = _r() * 0x3ade67b7;\n\t                words.push((_r() * 0x100000000) | 0);\n\t            }\n\n\t            return new WordArray.init(words, nBytes);\n\t        }\n\t    });\n\n\t    /**\n\t     * Encoder namespace.\n\t     */\n\t    var C_enc = C.enc = {};\n\n\t    /**\n\t     * Hex encoding strategy.\n\t     */\n\t    var Hex = C_enc.Hex = {\n\t        /**\n\t         * Converts a word array to a hex string.\n\t         *\n\t         * @param {WordArray} wordArray The word array.\n\t         *\n\t         * @return {string} The hex string.\n\t         *\n\t         * @static\n\t         *\n\t         * @example\n\t         *\n\t         *     var hexString = CryptoJS.enc.Hex.stringify(wordArray);\n\t         */\n\t        stringify: function (wordArray) {\n\t            // Shortcuts\n\t            var words = wordArray.words;\n\t            var sigBytes = wordArray.sigBytes;\n\n\t            // Convert\n\t            var hexChars = [];\n\t            for (var i = 0; i < sigBytes; i++) {\n\t                var bite = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;\n\t                hexChars.push((bite >>> 4).toString(16));\n\t                hexChars.push((bite & 0x0f).toString(16));\n\t            }\n\n\t            return hexChars.join('');\n\t        },\n\n\t        /**\n\t         * Converts a hex string to a word array.\n\t         *\n\t         * @param {string} hexStr The hex string.\n\t         *\n\t         * @return {WordArray} The word array.\n\t         *\n\t         * @static\n\t         *\n\t         * @example\n\t         *\n\t         *     var wordArray = CryptoJS.enc.Hex.parse(hexString);\n\t         */\n\t        parse: function (hexStr) {\n\t            // Shortcut\n\t            var hexStrLength = hexStr.length;\n\n\t            // Convert\n\t            var words = [];\n\t            for (var i = 0; i < hexStrLength; i += 2) {\n\t                words[i >>> 3] |= parseInt(hexStr.substr(i, 2), 16) << (24 - (i % 8) * 4);\n\t            }\n\n\t            return new WordArray.init(words, hexStrLength / 2);\n\t        }\n\t    };\n\n\t    /**\n\t     * Latin1 encoding strategy.\n\t     */\n\t    var Latin1 = C_enc.Latin1 = {\n\t        /**\n\t         * Converts a word array to a Latin1 string.\n\t         *\n\t         * @param {WordArray} wordArray The word array.\n\t         *\n\t         * @return {string} The Latin1 string.\n\t         *\n\t         * @static\n\t         *\n\t         * @example\n\t         *\n\t         *     var latin1String = CryptoJS.enc.Latin1.stringify(wordArray);\n\t         */\n\t        stringify: function (wordArray) {\n\t            // Shortcuts\n\t            var words = wordArray.words;\n\t            var sigBytes = wordArray.sigBytes;\n\n\t            // Convert\n\t            var latin1Chars = [];\n\t            for (var i = 0; i < sigBytes; i++) {\n\t                var bite = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;\n\t                latin1Chars.push(String.fromCharCode(bite));\n\t            }\n\n\t            return latin1Chars.join('');\n\t        },\n\n\t        /**\n\t         * Converts a Latin1 string to a word array.\n\t         *\n\t         * @param {string} latin1Str The Latin1 string.\n\t         *\n\t         * @return {WordArray} The word array.\n\t         *\n\t         * @static\n\t         *\n\t         * @example\n\t         *\n\t         *     var wordArray = CryptoJS.enc.Latin1.parse(latin1String);\n\t         */\n\t        parse: function (latin1Str) {\n\t            // Shortcut\n\t            var latin1StrLength = latin1Str.length;\n\n\t            // Convert\n\t            var words = [];\n\t            for (var i = 0; i < latin1StrLength; i++) {\n\t                words[i >>> 2] |= (latin1Str.charCodeAt(i) & 0xff) << (24 - (i % 4) * 8);\n\t            }\n\n\t            return new WordArray.init(words, latin1StrLength);\n\t        }\n\t    };\n\n\t    /**\n\t     * UTF-8 encoding strategy.\n\t     */\n\t    var Utf8 = C_enc.Utf8 = {\n\t        /**\n\t         * Converts a word array to a UTF-8 string.\n\t         *\n\t         * @param {WordArray} wordArray The word array.\n\t         *\n\t         * @return {string} The UTF-8 string.\n\t         *\n\t         * @static\n\t         *\n\t         * @example\n\t         *\n\t         *     var utf8String = CryptoJS.enc.Utf8.stringify(wordArray);\n\t         */\n\t        stringify: function (wordArray) {\n\t            try {\n\t                return decodeURIComponent(escape(Latin1.stringify(wordArray)));\n\t            } catch (e) {\n\t                throw new Error('Malformed UTF-8 data');\n\t            }\n\t        },\n\n\t        /**\n\t         * Converts a UTF-8 string to a word array.\n\t         *\n\t         * @param {string} utf8Str The UTF-8 string.\n\t         *\n\t         * @return {WordArray} The word array.\n\t         *\n\t         * @static\n\t         *\n\t         * @example\n\t         *\n\t         *     var wordArray = CryptoJS.enc.Utf8.parse(utf8String);\n\t         */\n\t        parse: function (utf8Str) {\n\t            return Latin1.parse(unescape(encodeURIComponent(utf8Str)));\n\t        }\n\t    };\n\n\t    /**\n\t     * Abstract buffered block algorithm template.\n\t     *\n\t     * The property blockSize must be implemented in a concrete subtype.\n\t     *\n\t     * @property {number} _minBufferSize The number of blocks that should be kept unprocessed in the buffer. Default: 0\n\t     */\n\t    var BufferedBlockAlgorithm = C_lib.BufferedBlockAlgorithm = Base.extend({\n\t        /**\n\t         * Resets this block algorithm's data buffer to its initial state.\n\t         *\n\t         * @example\n\t         *\n\t         *     bufferedBlockAlgorithm.reset();\n\t         */\n\t        reset: function () {\n\t            // Initial values\n\t            this._data = new WordArray.init();\n\t            this._nDataBytes = 0;\n\t        },\n\n\t        /**\n\t         * Adds new data to this block algorithm's buffer.\n\t         *\n\t         * @param {WordArray|string} data The data to append. Strings are converted to a WordArray using UTF-8.\n\t         *\n\t         * @example\n\t         *\n\t         *     bufferedBlockAlgorithm._append('data');\n\t         *     bufferedBlockAlgorithm._append(wordArray);\n\t         */\n\t        _append: function (data) {\n\t            // Convert string to WordArray, else assume WordArray already\n\t            if (typeof data == 'string') {\n\t                data = Utf8.parse(data);\n\t            }\n\n\t            // Append\n\t            this._data.concat(data);\n\t            this._nDataBytes += data.sigBytes;\n\t        },\n\n\t        /**\n\t         * Processes available data blocks.\n\t         *\n\t         * This method invokes _doProcessBlock(offset), which must be implemented by a concrete subtype.\n\t         *\n\t         * @param {boolean} doFlush Whether all blocks and partial blocks should be processed.\n\t         *\n\t         * @return {WordArray} The processed data.\n\t         *\n\t         * @example\n\t         *\n\t         *     var processedData = bufferedBlockAlgorithm._process();\n\t         *     var processedData = bufferedBlockAlgorithm._process(!!'flush');\n\t         */\n\t        _process: function (doFlush) {\n\t            // Shortcuts\n\t            var data = this._data;\n\t            var dataWords = data.words;\n\t            var dataSigBytes = data.sigBytes;\n\t            var blockSize = this.blockSize;\n\t            var blockSizeBytes = blockSize * 4;\n\n\t            // Count blocks ready\n\t            var nBlocksReady = dataSigBytes / blockSizeBytes;\n\t            if (doFlush) {\n\t                // Round up to include partial blocks\n\t                nBlocksReady = Math.ceil(nBlocksReady);\n\t            } else {\n\t                // Round down to include only full blocks,\n\t                // less the number of blocks that must remain in the buffer\n\t                nBlocksReady = Math.max((nBlocksReady | 0) - this._minBufferSize, 0);\n\t            }\n\n\t            // Count words ready\n\t            var nWordsReady = nBlocksReady * blockSize;\n\n\t            // Count bytes ready\n\t            var nBytesReady = Math.min(nWordsReady * 4, dataSigBytes);\n\n\t            // Process blocks\n\t            if (nWordsReady) {\n\t                for (var offset = 0; offset < nWordsReady; offset += blockSize) {\n\t                    // Perform concrete-algorithm logic\n\t                    this._doProcessBlock(dataWords, offset);\n\t                }\n\n\t                // Remove processed words\n\t                var processedWords = dataWords.splice(0, nWordsReady);\n\t                data.sigBytes -= nBytesReady;\n\t            }\n\n\t            // Return processed words\n\t            return new WordArray.init(processedWords, nBytesReady);\n\t        },\n\n\t        /**\n\t         * Creates a copy of this object.\n\t         *\n\t         * @return {Object} The clone.\n\t         *\n\t         * @example\n\t         *\n\t         *     var clone = bufferedBlockAlgorithm.clone();\n\t         */\n\t        clone: function () {\n\t            var clone = Base.clone.call(this);\n\t            clone._data = this._data.clone();\n\n\t            return clone;\n\t        },\n\n\t        _minBufferSize: 0\n\t    });\n\n\t    /**\n\t     * Abstract hasher template.\n\t     *\n\t     * @property {number} blockSize The number of 32-bit words this hasher operates on. Default: 16 (512 bits)\n\t     */\n\t    var Hasher = C_lib.Hasher = BufferedBlockAlgorithm.extend({\n\t        /**\n\t         * Configuration options.\n\t         */\n\t        cfg: Base.extend(),\n\n\t        /**\n\t         * Initializes a newly created hasher.\n\t         *\n\t         * @param {Object} cfg (Optional) The configuration options to use for this hash computation.\n\t         *\n\t         * @example\n\t         *\n\t         *     var hasher = CryptoJS.algo.SHA256.create();\n\t         */\n\t        init: function (cfg) {\n\t            // Apply config defaults\n\t            this.cfg = this.cfg.extend(cfg);\n\n\t            // Set initial values\n\t            this.reset();\n\t        },\n\n\t        /**\n\t         * Resets this hasher to its initial state.\n\t         *\n\t         * @example\n\t         *\n\t         *     hasher.reset();\n\t         */\n\t        reset: function () {\n\t            // Reset data buffer\n\t            BufferedBlockAlgorithm.reset.call(this);\n\n\t            // Perform concrete-hasher logic\n\t            this._doReset();\n\t        },\n\n\t        /**\n\t         * Updates this hasher with a message.\n\t         *\n\t         * @param {WordArray|string} messageUpdate The message to append.\n\t         *\n\t         * @return {Hasher} This hasher.\n\t         *\n\t         * @example\n\t         *\n\t         *     hasher.update('message');\n\t         *     hasher.update(wordArray);\n\t         */\n\t        update: function (messageUpdate) {\n\t            // Append\n\t            this._append(messageUpdate);\n\n\t            // Update the hash\n\t            this._process();\n\n\t            // Chainable\n\t            return this;\n\t        },\n\n\t        /**\n\t         * Finalizes the hash computation.\n\t         * Note that the finalize operation is effectively a destructive, read-once operation.\n\t         *\n\t         * @param {WordArray|string} messageUpdate (Optional) A final message update.\n\t         *\n\t         * @return {WordArray} The hash.\n\t         *\n\t         * @example\n\t         *\n\t         *     var hash = hasher.finalize();\n\t         *     var hash = hasher.finalize('message');\n\t         *     var hash = hasher.finalize(wordArray);\n\t         */\n\t        finalize: function (messageUpdate) {\n\t            // Final message update\n\t            if (messageUpdate) {\n\t                this._append(messageUpdate);\n\t            }\n\n\t            // Perform concrete-hasher logic\n\t            var hash = this._doFinalize();\n\n\t            return hash;\n\t        },\n\n\t        blockSize: 512/32,\n\n\t        /**\n\t         * Creates a shortcut function to a hasher's object interface.\n\t         *\n\t         * @param {Hasher} hasher The hasher to create a helper for.\n\t         *\n\t         * @return {Function} The shortcut function.\n\t         *\n\t         * @static\n\t         *\n\t         * @example\n\t         *\n\t         *     var SHA256 = CryptoJS.lib.Hasher._createHelper(CryptoJS.algo.SHA256);\n\t         */\n\t        _createHelper: function (hasher) {\n\t            return function (message, cfg) {\n\t                return new hasher.init(cfg).finalize(message);\n\t            };\n\t        },\n\n\t        /**\n\t         * Creates a shortcut function to the HMAC's object interface.\n\t         *\n\t         * @param {Hasher} hasher The hasher to use in this HMAC helper.\n\t         *\n\t         * @return {Function} The shortcut function.\n\t         *\n\t         * @static\n\t         *\n\t         * @example\n\t         *\n\t         *     var HmacSHA256 = CryptoJS.lib.Hasher._createHmacHelper(CryptoJS.algo.SHA256);\n\t         */\n\t        _createHmacHelper: function (hasher) {\n\t            return function (message, key) {\n\t                return new C_algo.HMAC.init(hasher, key).finalize(message);\n\t            };\n\t        }\n\t    });\n\n\t    /**\n\t     * Algorithm namespace.\n\t     */\n\t    var C_algo = C.algo = {};\n\n\t    return C;\n\t}(Math));\n\n\n\treturn CryptoJS;\n\n}));","'use strict'\n\nconst timeout = require('./lib/timeout')\nconst delay = require('./lib/delay')\nconst TimeoutError = require('./lib/TimeoutError')\nconst promise = require('./lib/promise')\nconst EventEmitter = require('events')\nconst Deferred = require('./lib/Deferred')\n\nexports.EventEmitter = EventEmitter\nexports.timeout = timeout\nexports.delay = delay\nexports.TimeoutError = TimeoutError\nexports.promise = promise\nexports.Deferred = Deferred\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;\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\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  if (typeof listener !== 'function') {\n    throw new TypeError('The \"listener\" argument must be of type Function. Received type ' + typeof listener);\n  }\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  var args = [];\n  for (var i = 0; i < arguments.length; i++) args.push(arguments[i]);\n  if (!this.fired) {\n    this.target.removeListener(this.type, this.wrapFn);\n    this.fired = true;\n    ReflectApply(this.listener, this.target, args);\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  if (typeof listener !== 'function') {\n    throw new TypeError('The \"listener\" argument must be of type Function. Received type ' + typeof listener);\n  }\n  this.on(type, _onceWrap(this, type, listener));\n  return this;\n};\n\nEventEmitter.prototype.prependOnceListener =\n    function prependOnceListener(type, listener) {\n      if (typeof listener !== 'function') {\n        throw new TypeError('The \"listener\" argument must be of type Function. Received type ' + typeof listener);\n      }\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      if (typeof listener !== 'function') {\n        throw new TypeError('The \"listener\" argument must be of type Function. Received type ' + typeof listener);\n      }\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","'use strict'\n\nconst JID = require('./lib/JID')\nconst escaping = require('./lib/escaping')\nconst parse = require('./lib/parse')\n\nfunction jid(...args) {\n  if (!args[1] && !args[2]) {\n    return parse(...args)\n  }\n\n  return new JID(...args)\n}\n\nexports = module.exports = jid.bind()\nexports.jid = jid\nexports.JID = JID\nexports.equal = function(a, b) {\n  return a.equals(b)\n}\n\nexports.detectEscape = escaping.detect\nexports.escapeLocal = escaping.escape\nexports.unescapeLocal = escaping.unescape\nexports.parse = parse\n","const config = require('../cubeConfig');\n\nclass WebRTCHelpers {\n    static getUserJid(id, appId) {\n        return id + '-' + appId + '@' + config.endpoints.chat;\n    }\n\n    static getUserIdFromJID(jid) {\n        if (jid.indexOf('@') < 0) return null;\n        return parseInt(jid.split('@')[0].split('-')[0]);\n    }\n\n    static userCurrentJid(client) {\n        return client.jid._local + '@' + client.jid._domain + '/' + client.jid._resource;\n    }\n\n    static trace(text) {\n        if (config.debug) {\n            console.log('[VideoChat]:', text);\n        }\n    }\n\n    static traceWarning(text) {\n        if (config.debug) {\n            console.warn('[VideoChat]:', text);\n        }\n    }\n\n    static traceError(text) {\n        if (config.debug) {\n            console.error('[VideoChat]:', text);\n        }\n    }\n\n    static getVersionFirefox() {\n        const ua = navigator ? navigator.userAgent : false;\n        let version;\n        if (ua) {\n            const ffInfo = ua.match(/(?:firefox)[ \\/](\\d+)/i) || [];\n            version = ffInfo[1] ? + ffInfo[1] : null;\n        }\n        return version;\n    }\n\n    static getVersionSafari() {\n        const ua = navigator ? navigator.userAgent : false;\n        let version;\n        if (ua) {\n            const sInfo = ua.match(/(?:safari)[ \\/](\\d+)/i) || [];\n            if (sInfo.length) {\n                const sVer = ua.match(/(?:version)[ \\/](\\d+)/i) || [];\n                if (sVer) {\n                    version = sVer[1] ? + sVer[1] : null;\n                } else {\n                    version = null;\n                }\n            } else {\n                version = null;\n            }\n        }\n\n        return version;\n    }\n};\n\nmodule.exports = WebRTCHelpers;\n","'use strict'\n\nmodule.exports = class TimeoutError extends Error {\n  constructor(message) {\n    super(message)\n    this.name = 'TimeoutError'\n  }\n}\n","'use strict'\n\nconst _Element = require('ltx/lib/Element')\n\nclass Element extends _Element {\n  setAttrs(attrs) {\n    if (typeof attrs === 'string') {\n      this.attrs.xmlns = attrs\n    } else if (attrs) {\n      Object.keys(attrs).forEach(function(key) {\n        // https://github.com/facebook/react/pull/4596\n        // https://www.npmjs.com/package/babel-plugin-transform-react-jsx-source\n        if (key === '__source' || key === '__self') return\n        const val = attrs[key]\n        if (val !== undefined && val !== null)\n          this.attrs[key.toString()] = val.toString()\n      }, this)\n    }\n  }\n\n  append(nodes) {\n    nodes = Array.isArray(nodes) ? nodes : [nodes]\n    nodes.forEach(node => {\n      this.children.push(node)\n      if (typeof node === 'object') {\n        node.parent = this\n      }\n    })\n    return this\n  }\n\n  prepend(nodes) {\n    nodes = Array.isArray(nodes) ? nodes : [nodes]\n    nodes.forEach(node => {\n      this.children.unshift(node)\n      if (typeof node === 'object') {\n        node.parent = this\n      }\n    })\n    return this\n  }\n}\n\nmodule.exports = Element\n","'use strict'\n\nvar escapeXMLTable = {\n  '&': '&amp;',\n  '<': '&lt;',\n  '>': '&gt;',\n  '\"': '&quot;',\n  '\\'': '&apos;'\n}\n\nfunction escapeXMLReplace (match) {\n  return escapeXMLTable[match]\n}\n\nvar unescapeXMLTable = {\n  '&amp;': '&',\n  '&lt;': '<',\n  '&gt;': '>',\n  '&quot;': '\"',\n  '&apos;': \"'\"\n}\n\nfunction unescapeXMLReplace (match) {\n  if (match[1] === '#') {\n    var num\n    if (match[2] === 'x') {\n      num = parseInt(match.slice(3), 16)\n    } else {\n      num = parseInt(match.slice(2), 10)\n    }\n    // https://www.w3.org/TR/xml/#NT-Char defines legal XML characters:\n    // #x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF]\n    if (num === 0x9 || num === 0xA || num === 0xD ||\n        (num >= 0x20 && num <= 0xD7FF) ||\n        (num >= 0xE000 && num <= 0xFFFD) ||\n        (num >= 0x10000 && num <= 0x10FFFF)) {\n      return String.fromCodePoint(num)\n    }\n    throw new Error('Illegal XML character 0x' + num.toString(16))\n  }\n  if (unescapeXMLTable[match]) {\n    return unescapeXMLTable[match] || match\n  }\n  throw new Error('Illegal XML entity ' + match)\n}\n\nexports.escapeXML = function escapeXML (s) {\n  return s.replace(/&|<|>|\"|'/g, escapeXMLReplace)\n}\n\nexports.unescapeXML = function unescapeXML (s) {\n  var result = ''\n  var start = -1\n  var end = -1\n  var previous = 0\n  while ((start = s.indexOf('&', previous)) !== -1 && (end = s.indexOf(';', start + 1)) !== -1) {\n    result = result +\n      s.substring(previous, start) +\n      unescapeXMLReplace(s.substring(start, end + 1))\n    previous = end + 1\n  }\n\n  // shortcut if loop never entered:\n  // return the original string without creating new objects\n  if (previous === 0) return s\n\n  // push the remaining characters\n  result = result + s.substring(previous)\n\n  return result\n}\n\nexports.escapeXMLText = function escapeXMLText (s) {\n  return s.replace(/&|<|>/g, escapeXMLReplace)\n}\n\nexports.unescapeXMLText = function unescapeXMLText (s) {\n  return s.replace(/&(amp|#38|lt|#60|gt|#62);/g, unescapeXMLReplace)\n}\n","'use strict'\n\nclass XMPPError extends Error {\n  constructor(condition, text, application) {\n    super(condition + (text ? ` - ${text}` : ''))\n    this.name = 'XMPPError'\n    this.condition = condition\n    this.text = text\n    this.application = application\n  }\n\n  static fromElement(element) {\n    const [condition, second, third] = element.children\n    let text\n    let application\n\n    if (second) {\n      if (second.is('text')) {\n        text = second\n      } else if (second) {\n        application = second\n      }\n\n      if (third) application = third\n    }\n\n    const error = new this(condition.name, text ? text.text() : '', application)\n    error.element = element\n    return error\n  }\n}\n\nmodule.exports = XMPPError\n","function _defineProperty(obj, key, value) {\n  if (key in obj) {\n    Object.defineProperty(obj, key, {\n      value: value,\n      enumerable: true,\n      configurable: true,\n      writable: true\n    });\n  } else {\n    obj[key] = value;\n  }\n\n  return obj;\n}\n\nmodule.exports = _defineProperty;",";(function (root, factory) {\n\tif (typeof exports === \"object\") {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(require(\"./core\"));\n\t}\n\telse if (typeof define === \"function\" && define.amd) {\n\t\t// AMD\n\t\tdefine([\"./core\"], factory);\n\t}\n\telse {\n\t\t// Global (browser)\n\t\tfactory(root.CryptoJS);\n\t}\n}(this, function (CryptoJS) {\n\n\t(function () {\n\t    // Shortcuts\n\t    var C = CryptoJS;\n\t    var C_lib = C.lib;\n\t    var Base = C_lib.Base;\n\t    var C_enc = C.enc;\n\t    var Utf8 = C_enc.Utf8;\n\t    var C_algo = C.algo;\n\n\t    /**\n\t     * HMAC algorithm.\n\t     */\n\t    var HMAC = C_algo.HMAC = Base.extend({\n\t        /**\n\t         * Initializes a newly created HMAC.\n\t         *\n\t         * @param {Hasher} hasher The hash algorithm to use.\n\t         * @param {WordArray|string} key The secret key.\n\t         *\n\t         * @example\n\t         *\n\t         *     var hmacHasher = CryptoJS.algo.HMAC.create(CryptoJS.algo.SHA256, key);\n\t         */\n\t        init: function (hasher, key) {\n\t            // Init hasher\n\t            hasher = this._hasher = new hasher.init();\n\n\t            // Convert string to WordArray, else assume WordArray already\n\t            if (typeof key == 'string') {\n\t                key = Utf8.parse(key);\n\t            }\n\n\t            // Shortcuts\n\t            var hasherBlockSize = hasher.blockSize;\n\t            var hasherBlockSizeBytes = hasherBlockSize * 4;\n\n\t            // Allow arbitrary length keys\n\t            if (key.sigBytes > hasherBlockSizeBytes) {\n\t                key = hasher.finalize(key);\n\t            }\n\n\t            // Clamp excess bits\n\t            key.clamp();\n\n\t            // Clone key for inner and outer pads\n\t            var oKey = this._oKey = key.clone();\n\t            var iKey = this._iKey = key.clone();\n\n\t            // Shortcuts\n\t            var oKeyWords = oKey.words;\n\t            var iKeyWords = iKey.words;\n\n\t            // XOR keys with pad constants\n\t            for (var i = 0; i < hasherBlockSize; i++) {\n\t                oKeyWords[i] ^= 0x5c5c5c5c;\n\t                iKeyWords[i] ^= 0x36363636;\n\t            }\n\t            oKey.sigBytes = iKey.sigBytes = hasherBlockSizeBytes;\n\n\t            // Set initial values\n\t            this.reset();\n\t        },\n\n\t        /**\n\t         * Resets this HMAC to its initial state.\n\t         *\n\t         * @example\n\t         *\n\t         *     hmacHasher.reset();\n\t         */\n\t        reset: function () {\n\t            // Shortcut\n\t            var hasher = this._hasher;\n\n\t            // Reset\n\t            hasher.reset();\n\t            hasher.update(this._iKey);\n\t        },\n\n\t        /**\n\t         * Updates this HMAC with a message.\n\t         *\n\t         * @param {WordArray|string} messageUpdate The message to append.\n\t         *\n\t         * @return {HMAC} This HMAC instance.\n\t         *\n\t         * @example\n\t         *\n\t         *     hmacHasher.update('message');\n\t         *     hmacHasher.update(wordArray);\n\t         */\n\t        update: function (messageUpdate) {\n\t            this._hasher.update(messageUpdate);\n\n\t            // Chainable\n\t            return this;\n\t        },\n\n\t        /**\n\t         * Finalizes the HMAC computation.\n\t         * Note that the finalize operation is effectively a destructive, read-once operation.\n\t         *\n\t         * @param {WordArray|string} messageUpdate (Optional) A final message update.\n\t         *\n\t         * @return {WordArray} The HMAC.\n\t         *\n\t         * @example\n\t         *\n\t         *     var hmac = hmacHasher.finalize();\n\t         *     var hmac = hmacHasher.finalize('message');\n\t         *     var hmac = hmacHasher.finalize(wordArray);\n\t         */\n\t        finalize: function (messageUpdate) {\n\t            // Shortcut\n\t            var hasher = this._hasher;\n\n\t            // Compute HMAC\n\t            var innerHash = hasher.finalize(messageUpdate);\n\t            hasher.reset();\n\t            var hmac = hasher.finalize(this._oKey.clone().concat(innerHash));\n\n\t            return hmac;\n\t        }\n\t    });\n\t}());\n\n\n}));","'use strict'\n\nconst {EventEmitter, promise} = require('@xmpp/events')\nconst jid = require('@xmpp/jid')\nconst xml = require('@xmpp/xml')\nconst StreamError = require('./lib/StreamError')\nconst {parseHost, parseService} = require('./lib/util')\n\nconst NS_STREAM = 'urn:ietf:params:xml:ns:xmpp-streams'\n\nclass Connection extends EventEmitter {\n  constructor(options = {}) {\n    super()\n    this.jid = null\n    this.timeout = 2000\n    this.options = options\n    this.socketListeners = Object.create(null)\n    this.parserListeners = Object.create(null)\n    this.status = 'offline'\n    this.socket = null\n    this.parser = null\n    this.root = null\n  }\n\n  _reset() {\n    this.jid = null\n    this.status = 'offline'\n    this._detachSocket()\n    this._detachParser()\n  }\n\n  async _streamError(condition, children) {\n    try {\n      await this.send(\n        // prettier-ignore\n        xml('stream:error', {}, [\n          xml(condition, {xmlns: NS_STREAM}, children),\n        ])\n      )\n      // eslint-disable-next-line no-unused-vars\n    } catch (err) {}\n\n    return this._end()\n  }\n\n  _onData(data) {\n    const str = data.toString('utf8')\n    this.emit('input', str)\n    this.parser.write(str)\n  }\n\n  _onParserError(error) {\n    // https://xmpp.org/rfcs/rfc6120.html#streams-error-conditions-bad-format\n    // \"This error can be used instead of the more specific XML-related errors,\n    // such as <bad-namespace-prefix/>, <invalid-xml/>, <not-well-formed/>, <restricted-xml/>,\n    // and <unsupported-encoding/>. However, the more specific errors are RECOMMENDED.\"\n    this._streamError('bad-format')\n    this._detachParser()\n    this.emit('error', error)\n  }\n\n  _attachSocket(socket) {\n    const sock = (this.socket = socket)\n    const listeners = this.socketListeners\n\n    listeners.data = this._onData.bind(this)\n\n    listeners.close = (dirty, event) => {\n      this._reset()\n      this._status('disconnect', {clean: !dirty, event})\n    }\n\n    listeners.connect = () => {\n      this._status('connect')\n    }\n\n    listeners.error = error => {\n      this.emit('error', error)\n    }\n\n    sock.on('close', listeners.close)\n    sock.on('data', listeners.data)\n    sock.on('error', listeners.error)\n    sock.on('connect', listeners.connect)\n  }\n\n  _detachSocket() {\n    const {socketListeners, socket} = this\n    Object.getOwnPropertyNames(socketListeners).forEach(k => {\n      socket.removeListener(k, socketListeners[k])\n      delete socketListeners[k]\n    })\n    this.socket = null\n    return socket\n  }\n\n  _onElement(element) {\n    this.emit('element', element)\n    this.emit(this.isStanza(element) ? 'stanza' : 'nonza', element)\n\n    if (element.name === 'stream:error') {\n      this._onStreamError(element)\n    }\n  }\n\n  // https://xmpp.org/rfcs/rfc6120.html#streams-error\n  _onStreamError(element) {\n    const error = StreamError.fromElement(element)\n\n    if (error.condition === 'see-other-host') {\n      this._onSeeOtherHost(error)\n    } else {\n      this.emit('error', error)\n    }\n\n    // \"Stream Errors Are Unrecoverable\"\n    // \"The entity that receives the stream error then SHALL close the stream\"\n    this._end()\n  }\n\n  // https://xmpp.org/rfcs/rfc6120.html#streams-error-conditions-see-other-host\n  async _onSeeOtherHost(error) {\n    const {protocol} = parseService(this.options.service)\n\n    const host = error.element.getChildText('see-other-host')\n    const {port} = parseHost(host)\n\n    let service\n    if (port) {\n      service = `${protocol || 'xmpp:'}//${host}`\n    } else {\n      service = (protocol ? `${protocol}//` : '') + host\n    }\n\n    try {\n      await promise(this, 'disconnect')\n      const {domain, lang} = this.options\n      await this.connect(service)\n      await this.open({domain, lang})\n    } catch (err) {\n      this.emit('error', err)\n    }\n  }\n\n  _attachParser(p) {\n    const parser = (this.parser = p)\n    const listeners = this.parserListeners\n\n    listeners.element = this._onElement.bind(this)\n    listeners.error = this._onParserError.bind(this)\n\n    listeners.end = element => {\n      this._detachParser()\n      this._status('close', element)\n    }\n\n    listeners.start = element => {\n      this._status('open', element)\n    }\n\n    parser.on('error', listeners.error)\n    parser.on('element', listeners.element)\n    parser.on('end', listeners.end)\n    parser.on('start', listeners.start)\n  }\n\n  _detachParser() {\n    const listeners = this.parserListeners\n    Object.getOwnPropertyNames(listeners).forEach(k => {\n      this.parser.removeListener(k, listeners[k])\n      delete listeners[k]\n    })\n    this.parser = null\n  }\n\n  _jid(id) {\n    this.jid = jid(id)\n    return this.jid\n  }\n\n  _status(status, ...args) {\n    this.status = status\n    this.emit('status', status, ...args)\n    this.emit(status, ...args)\n  }\n\n  async _end() {\n    let el\n    try {\n      el = await this.close()\n      // eslint-disable-next-line no-unused-vars\n    } catch (err) {}\n\n    try {\n      await this.disconnect()\n      // eslint-disable-next-line no-unused-vars\n    } catch (err) {}\n\n    return el\n  }\n\n  /**\n   * Opens the socket then opens the stream\n   */\n  async start() {\n    if (this.status !== 'offline') {\n      throw new Error('Connection is not offline')\n    }\n\n    const {service, domain, lang} = this.options\n\n    await this.connect(service)\n\n    const promiseOnline = promise(this, 'online')\n\n    await this.open({domain, lang})\n\n    return promiseOnline\n  }\n\n  /**\n   * Connects the socket\n   */\n  async connect(service) {\n    this._status('connecting', service)\n    const socket = new this.Socket()\n    this._attachSocket(socket)\n    // The 'connect' status is set by the socket 'connect' listener\n    socket.connect(this.socketParameters(service))\n    return promise(socket, 'connect')\n  }\n\n  /**\n   * Disconnects the socket\n   * https://xmpp.org/rfcs/rfc6120.html#streams-close\n   * https://tools.ietf.org/html/rfc7395#section-3.6\n   */\n  async disconnect(timeout = this.timeout) {\n    if (this.socket) this._status('disconnecting')\n\n    this.socket.end()\n\n    // The 'disconnect' status is set by the socket 'close' listener\n    await promise(this.socket, 'close', 'error', timeout)\n  }\n\n  /**\n   * Opens the stream\n   */\n  async open(options) {\n    this._status('opening')\n\n    if (typeof options === 'string') {\n      options = {domain: options}\n    }\n\n    const {domain, lang, timeout = this.timeout} = options\n\n    const headerElement = this.headerElement()\n    headerElement.attrs.to = domain\n    headerElement.attrs['xml:lang'] = lang\n    this.root = headerElement\n\n    this._attachParser(new this.Parser())\n\n    await this.write(this.header(headerElement))\n    return promise(this, 'open', 'error', timeout)\n  }\n\n  /**\n   * Closes the stream then closes the socket\n   * https://xmpp.org/rfcs/rfc6120.html#streams-close\n   * https://tools.ietf.org/html/rfc7395#section-3.6\n   */\n  async stop() {\n    const el = await this._end()\n    if (this.status !== 'offline') this._status('offline', el)\n    return el\n  }\n\n  /**\n   * Closes the stream and wait for the server to close it\n   * https://xmpp.org/rfcs/rfc6120.html#streams-close\n   * https://tools.ietf.org/html/rfc7395#section-3.6\n   */\n  async close(timeout = this.timeout) {\n    const p = Promise.all([\n      promise(this.parser, 'end', 'error', timeout),\n      this.write(this.footer(this.footerElement())),\n    ])\n\n    if (this.parser && this.socket) this._status('closing')\n    const [el] = await p\n    this.root = null\n    return el\n    // The 'close' status is set by the parser 'end' listener\n  }\n\n  /**\n   * Restart the stream\n   * https://xmpp.org/rfcs/rfc6120.html#streams-negotiation-restart\n   */\n  async restart() {\n    this._detachParser()\n    const {domain, lang} = this.options\n    return this.open({domain, lang})\n  }\n\n  async send(element) {\n    element.parent = this.root\n    this.emit('outgoing', element)\n    await this.write(element)\n    this.emit('send', element)\n  }\n\n  sendReceive(element, timeout = this.timeout) {\n    return Promise.all([\n      this.send(element),\n      promise(this, 'element', 'error', timeout),\n    ]).then(([, el]) => el)\n  }\n\n  write(data) {\n    return new Promise((resolve, reject) => {\n      // https://xmpp.org/rfcs/rfc6120.html#streams-close\n      // \"Refrain from sending any further data over its outbound stream to the other entity\"\n      if (this.status === 'closing') {\n        reject(new Error('Connection is closing'))\n        return\n      }\n\n      const str = data.toString('utf8')\n      this.socket.write(str, err => {\n        if (err) {\n          return reject(err)\n        }\n\n        this.emit('output', str)\n        resolve()\n      })\n    })\n  }\n\n  isStanza(element) {\n    const {name} = element\n    return name === 'iq' || name === 'message' || name === 'presence'\n  }\n\n  isNonza(element) {\n    return !this.isStanza(element)\n  }\n\n  // Override\n  header(el) {\n    return el.toString()\n  }\n\n  // Override\n  headerElement() {\n    return new xml.Element('', {\n      version: '1.0',\n      xmlns: this.NS,\n    })\n  }\n\n  // Override\n  footer(el) {\n    return el.toString()\n  }\n\n  // Override\n  footerElement() {}\n\n  // Override\n  socketParameters() {}\n}\n\n// Overrirde\nConnection.prototype.NS = ''\nConnection.prototype.Socket = null\nConnection.prototype.Parser = null\n\nmodule.exports = Connection\n","'use strict'\n\nmodule.exports = function delay(ms) {\n  let timeout\n  const promise = new Promise(resolve => {\n    timeout = setTimeout(resolve, ms)\n  })\n  promise.timeout = timeout\n  return promise\n}\n","'use strict'\n\nconst escaping = require('./escaping')\n\n/**\n * JID implements\n * - XMPP addresses according to RFC6122\n * - XEP-0106: JID Escaping\n *\n * @see http://tools.ietf.org/html/rfc6122#section-2\n * @see http://xmpp.org/extensions/xep-0106.html\n */\nclass JID {\n  constructor(local, domain, resource) {\n    if (typeof domain !== 'string' || !domain) {\n      throw new TypeError(`Invalid domain.`)\n    }\n\n    this.setDomain(domain)\n    this.setLocal(typeof local === 'string' ? local : '')\n    this.setResource(typeof resource === 'string' ? resource : '')\n  }\n\n  [Symbol.toPrimitive](hint) {\n    if (hint === 'number') {\n      return NaN\n    }\n\n    return this.toString()\n  }\n\n  toString(unescape) {\n    let s = this._domain\n    if (this._local) {\n      s = this.getLocal(unescape) + '@' + s\n    }\n\n    if (this._resource) {\n      s = s + '/' + this._resource\n    }\n\n    return s\n  }\n\n  /**\n   * Convenience method to distinguish users\n   * */\n  bare() {\n    if (this._resource) {\n      return new JID(this._local, this._domain, null)\n    }\n\n    return this\n  }\n\n  /**\n   * Comparison function\n   * */\n  equals(other) {\n    return (\n      this._local === other._local &&\n      this._domain === other._domain &&\n      this._resource === other._resource\n    )\n  }\n\n  /**\n   * http://xmpp.org/rfcs/rfc6122.html#addressing-localpart\n   * */\n  setLocal(local, escape) {\n    escape = escape || escaping.detect(local)\n\n    if (escape) {\n      local = escaping.escape(local)\n    }\n\n    this._local = local && local.toLowerCase()\n    return this\n  }\n\n  getLocal(unescape) {\n    unescape = unescape || false\n    let local = null\n\n    if (unescape) {\n      local = escaping.unescape(this._local)\n    } else {\n      local = this._local\n    }\n\n    return local\n  }\n\n  /**\n   * http://xmpp.org/rfcs/rfc6122.html#addressing-domain\n   */\n  setDomain(domain) {\n    this._domain = domain.toLowerCase()\n    return this\n  }\n\n  getDomain() {\n    return this._domain\n  }\n\n  /**\n   * http://xmpp.org/rfcs/rfc6122.html#addressing-resourcepart\n   */\n  setResource(resource) {\n    this._resource = resource\n    return this\n  }\n\n  getResource() {\n    return this._resource\n  }\n}\n\nObject.defineProperty(JID.prototype, 'local', {\n  get: JID.prototype.getLocal,\n  set: JID.prototype.setLocal,\n})\n\nObject.defineProperty(JID.prototype, 'domain', {\n  get: JID.prototype.getDomain,\n  set: JID.prototype.setDomain,\n})\n\nObject.defineProperty(JID.prototype, 'resource', {\n  get: JID.prototype.getResource,\n  set: JID.prototype.setResource,\n})\n\nmodule.exports = JID\n","'use strict'\n\nmodule.exports.detect = function(local) {\n  if (!local) {\n    return false\n  }\n\n  // Remove all escaped sequences\n  const tmp = local\n    .replace(/\\\\20/g, '')\n    .replace(/\\\\22/g, '')\n    .replace(/\\\\26/g, '')\n    .replace(/\\\\27/g, '')\n    .replace(/\\\\2f/g, '')\n    .replace(/\\\\3a/g, '')\n    .replace(/\\\\3c/g, '')\n    .replace(/\\\\3e/g, '')\n    .replace(/\\\\40/g, '')\n    .replace(/\\\\5c/g, '')\n\n  // Detect if we have unescaped sequences\n  // eslint-disable-next-line unicorn/regex-shorthand\n  const search = tmp.search(/\\\\| |\"|&|'|\\/|:|<|>|@/g)\n  if (search === -1) {\n    return false\n  }\n\n  return true\n}\n\n/**\n * Escape the local part of a JID.\n *\n * @see http://xmpp.org/extensions/xep-0106.html\n * @param String local local part of a jid\n * @return An escaped local part\n */\nmodule.exports.escape = function(local) {\n  if (local === null) {\n    return null\n  }\n\n  return local\n    .replace(/^\\s+|\\s+$/g, '')\n    .replace(/\\\\/g, '\\\\5c')\n    .replace(/ /g, '\\\\20')\n    .replace(/\"/g, '\\\\22')\n    .replace(/&/g, '\\\\26')\n    .replace(/'/g, '\\\\27')\n    .replace(/\\//g, '\\\\2f')\n    .replace(/:/g, '\\\\3a')\n    .replace(/</g, '\\\\3c')\n    .replace(/>/g, '\\\\3e')\n    .replace(/@/g, '\\\\40')\n    .replace(/\\3a/g, '\\u0005c3a')\n}\n\n/**\n * Unescape a local part of a JID.\n *\n * @see http://xmpp.org/extensions/xep-0106.html\n * @param String local local part of a jid\n * @return unescaped local part\n */\nmodule.exports.unescape = function(local) {\n  if (local === null) {\n    return null\n  }\n\n  return local\n    .replace(/\\\\20/g, ' ')\n    .replace(/\\\\22/g, '\"')\n    .replace(/\\\\26/g, '&')\n    .replace(/\\\\27/g, \"'\")\n    .replace(/\\\\2f/g, '/')\n    .replace(/\\\\3a/g, ':')\n    .replace(/\\\\3c/g, '<')\n    .replace(/\\\\3e/g, '>')\n    .replace(/\\\\40/g, '@')\n    .replace(/\\\\5c/g, '\\\\')\n}\n","'use strict'\n\nconst LtxParser = require('ltx/lib/parsers/ltx')\nconst Element = require('./Element')\nconst EventEmitter = require('events')\nconst XMLError = require('./XMLError')\n\nclass Parser extends EventEmitter {\n  constructor() {\n    super()\n    const parser = new LtxParser()\n    this.root = null\n    this.cursor = null\n\n    parser.on('startElement', this.onStartElement.bind(this))\n    parser.on('endElement', this.onEndElement.bind(this))\n    parser.on('text', this.onText.bind(this))\n\n    this.parser = parser\n  }\n\n  onStartElement(name, attrs) {\n    const element = new Element(name, attrs)\n\n    const {root, cursor} = this\n\n    if (!root) {\n      this.root = element\n      this.emit('start', element)\n    } else if (cursor !== root) {\n      cursor.append(element)\n    }\n\n    this.cursor = element\n  }\n\n  onEndElement(name) {\n    const {root, cursor} = this\n    if (name !== cursor.name) {\n      // <foo></bar>\n      this.emit('error', new XMLError(`${cursor.name} must be closed.`))\n      return\n    }\n\n    if (cursor === root) {\n      this.emit('end', root)\n      return\n    }\n\n    if (!cursor.parent) {\n      cursor.parent = root\n      this.emit('element', cursor)\n      this.cursor = root\n      return\n    }\n\n    this.cursor = cursor.parent\n  }\n\n  onText(str) {\n    const {cursor} = this\n    if (!cursor) {\n      this.emit('error', new XMLError(`${str} must be a child.`))\n      return\n    }\n\n    cursor.t(str)\n  }\n\n  write(data) {\n    this.parser.write(data)\n  }\n\n  end(data) {\n    if (data) {\n      this.parser.write(data)\n    }\n  }\n}\n\nParser.XMLError = XMLError\n\nmodule.exports = Parser\n","'use strict'\n\nmodule.exports = class XMLError extends Error {\n  constructor(...args) {\n    super(...args)\n    this.name = 'XMLError'\n  }\n}\n","'use strict'\n\nmodule.exports = class Context {\n  constructor(entity, stanza) {\n    this.stanza = stanza\n    this.entity = entity\n\n    const {name, attrs} = stanza\n    const {type, id} = attrs\n\n    this.name = name\n    this.id = id || ''\n\n    if (name === 'message') {\n      this.type = type || 'normal'\n    } else if (name === 'presence') {\n      this.type = type || 'available'\n    } else {\n      this.type = type || ''\n    }\n\n    this.from = null\n    this.to = null\n    this.local = ''\n    this.domain = ''\n    this.resource = ''\n  }\n}\n","module.exports = __WEBPACK_EXTERNAL_MODULE__30__;","const config = require('../cubeConfig');\nconst Helpers = require('./cubeWebRTCHelpers');\nconst SessionConnectionState = require('./cubeWebRTCConstants').SessionConnectionState\nconst RTCPeerConnection = require('../cubeDependencies').RTCPeerConnection;\nconst RTCSessionDescription = require('../cubeDependencies').RTCSessionDescription;\nconst RTCIceCandidate = require('../cubeDependencies').RTCIceCandidate;\nconst MediaStream = require('../cubeDependencies').MediaStream;\nconst PeerConnectionState = require('./cubeWebRTCConstants').PeerConnectionState;\n\nRTCPeerConnection.prototype._init = function (delegate, userID, sessionID, type) {\n    Helpers.trace('RTCPeerConnection init. userID: ' + userID + ', sessionID: ' + sessionID + ', type: ' + type);\n\n    this.delegate = delegate;\n\n    this.sessionID = sessionID;\n    this.userID = userID;\n    this.type = type;\n    this.remoteSDP = null;\n\n    this.state = PeerConnectionState.NEW;\n\n    this.onicecandidate = this.onIceCandidateCallback.bind(this);\n    this.onsignalingstatechange = this.onSignalingStateCallback.bind(this);\n    this.oniceconnectionstatechange = this.onIceConnectionStateCallback.bind(this);\n\n    if (Helpers.getVersionSafari() >= 11) {\n        this.remoteStream = new MediaStream();\n        this.ontrack = this.onAddRemoteMediaCallback.bind(this);\n        this.onStatusClosedChecker = undefined;\n    } else {\n        this.remoteStream = null;\n        this.onaddstream = this.onAddRemoteMediaCallback.bind(this);\n    }\n\n    /** We use this timer interval to dial a user - produce the call requests each N seconds. */\n    this.dialingTimer = null;\n    this.answerTimeInterval = 0;\n    this.statsReportTimer = null;\n\n    this.iceCandidates = [];\n\n    this.released = false;\n};\n\nRTCPeerConnection.prototype.release = function () {\n    this._clearDialingTimer();\n    this._clearStatsReportTimer();\n\n    this.close();\n\n    // TODO: 'closed' state doesn't fires on Safari 11 (do it manually)\n    if (Helpers.getVersionSafari() >= 11) {\n        this.onIceConnectionStateCallback();\n    }\n\n    this.released = true;\n};\n\nRTCPeerConnection.prototype.updateRemoteSDP = function (newSDP) {\n    if (!newSDP) {\n        throw new Error(\"sdp string can't be empty.\");\n    } else {\n        this.remoteSDP = newSDP;\n    }\n};\n\nRTCPeerConnection.prototype.getRemoteSDP = function () {\n    return this.remoteSDP;\n};\n\nRTCPeerConnection.prototype.setRemoteSessionDescription = function (type, remoteSessionDescription) {\n    const desc = new RTCSessionDescription({ sdp: remoteSessionDescription, type: type });\n\n    desc.sdp = setMediaBitrate(desc.sdp, 'video', this.delegate.bandwidth);\n\n    return this.setRemoteDescription(desc);\n};\n\nRTCPeerConnection.prototype.addLocalStream = function (localStream) {\n    if (localStream) {\n        this.addStream(localStream);\n    } else {\n        throw new Error(\"'RTCPeerConnection.addStream' error: stream is 'null'.\");\n    }\n};\n\nRTCPeerConnection.prototype.getAndSetLocalSessionDescription = function (callType) {\n    return new Promise((resolve, reject) => {\n        this.state = PeerConnectionState.CONNECTING;\n\n        if (this.type === 'offer') {\n            this.createOffer()\n                .then(offer => {\n                    offer.sdp = setMediaBitrate(offer.sdp, 'video', this.delegate.bandwidth);\n                    this.setLocalDescription(offer).then(resolve).catch(reject);\n                }).catch(reject);\n        } else {\n            this.createAnswer()\n                .then(answer => {\n                    answer.sdp = setMediaBitrate(answer.sdp, 'video', this.delegate.bandwidth);\n                    this.setLocalDescription(answer).then(resolve).catch(reject);\n                }).catch(reject);\n        }\n    });\n};\n\nRTCPeerConnection.prototype.addCandidates = function (iceCandidates) {\n    for (let i = 0, len = iceCandidates.length; i < len; i++) {\n        const candidate = {\n            sdpMLineIndex: iceCandidates[i].sdpMLineIndex,\n            sdpMid: iceCandidates[i].sdpMid,\n            candidate: iceCandidates[i].candidate\n        };\n        this.addIceCandidate(\n            new RTCIceCandidate(candidate),\n            () => { },\n            error => {\n                Helpers.traceError(\"Error on 'addIceCandidate': \" + error);\n            }\n        );\n    }\n};\n\nRTCPeerConnection.prototype.toString = function () {\n    return 'sessionID: ' + this.sessionID + ', userID:  ' + this.userID + ', type: ' + this.type + ', state: ' + this.state;\n};\n\n/// CALLBACKS\n\nRTCPeerConnection.prototype.onSignalingStateCallback = function () {\n    Helpers.trace(\"onSignalingStateCallback: \" + this.signalingState);\n\n    if (this.signalingState === 'stable' && this.iceCandidates.length > 0) {\n        this.delegate._processIceCandidates(this, this.iceCandidates);\n        this.iceCandidates.length = 0;\n    }\n};\n\nRTCPeerConnection.prototype.onIceCandidateCallback = function (event) {\n    const candidate = event.candidate;\n\n    if (candidate) {\n        const iceCandidateData = {\n            sdpMLineIndex: candidate.sdpMLineIndex,\n            sdpMid: candidate.sdpMid,\n            candidate: candidate.candidate\n        };\n\n        if (this.signalingState === 'stable') {\n            this.delegate._processIceCandidates(this, [iceCandidateData]);\n        } else {\n            this.iceCandidates.push(iceCandidateData);\n        }\n    }\n};\n\n/** handler of remote media stream */\nRTCPeerConnection.prototype.onAddRemoteMediaCallback = function (event) {\n    if (typeof this.delegate._onRemoteStreamListener === 'function') {\n        if (event.type === 'addstream') {\n            this.remoteStream = event.stream;\n        } else {\n            this.remoteStream.addTrack(event.track);\n        }\n\n        if (((this.delegate.callType == 1) && this.remoteStream.getVideoTracks().length) ||\n            ((this.delegate.callType == 2) && this.remoteStream.getAudioTracks().length)) {\n            this.delegate._onRemoteStreamListener(this.userID, this.remoteStream);\n        }\n\n        this._getStatsWrap();\n    }\n};\n\nRTCPeerConnection.prototype.onIceConnectionStateCallback = function () {\n    Helpers.trace(\"onIceConnectionStateCallback: \" + this.iceConnectionState);\n\n    if (typeof this.delegate._onSessionConnectionStateChangedListener === 'function') {\n        let conState = null;\n\n        if (Helpers.getVersionSafari() >= 11) {\n            clearTimeout(this.onStatusClosedChecker);\n        }\n\n        switch (this.iceConnectionState) {\n            case 'checking':\n                this.state = PeerConnectionState.CHECKING;\n                conState = SessionConnectionState.CONNECTING;\n                break;\n\n            case 'connected':\n                this._clearWaitingReconnectTimer();\n                this.state = PeerConnectionState.CONNECTED;\n                conState = SessionConnectionState.CONNECTED;\n                break;\n\n            case 'completed':\n                this._clearWaitingReconnectTimer();\n                this.state = PeerConnectionState.COMPLETED;\n                conState = SessionConnectionState.COMPLETED;\n                break;\n\n            case 'failed':\n                this.state = PeerConnectionState.FAILED;\n                conState = SessionConnectionState.FAILED;\n                break;\n\n            case 'disconnected':\n                this._startWaitingReconnectTimer();\n                this.state = PeerConnectionState.DISCONNECTED;\n                conState = SessionConnectionState.DISCONNECTED;\n\n                // repeat to call onIceConnectionStateCallback to get status \"closed\"\n                if (Helpers.getVersionSafari() >= 11) {\n                    this.onStatusClosedChecker = setTimeout(() => {\n                        this.onIceConnectionStateCallback();\n                    }, 500);\n                }\n                break;\n\n            // TODO: this state doesn't fires on Safari 11\n            case 'closed':\n                this._clearWaitingReconnectTimer();\n                this.state = PeerConnectionState.CLOSED;\n                conState = SessionConnectionState.CLOSED;\n                break;\n\n            default:\n                break;\n        }\n\n        if (conState) {\n            this.delegate._onSessionConnectionStateChangedListener(this.userID, conState);\n        }\n    }\n};\n\n\n/// PRIVATE\n\nRTCPeerConnection.prototype._clearStatsReportTimer = function () {\n    if (this.statsReportTimer) {\n        clearInterval(this.statsReportTimer);\n        this.statsReportTimer = null;\n    }\n};\n\nRTCPeerConnection.prototype._getStatsWrap = function () {\n    let statsReportInterval;\n    let lastResult;\n\n    if (config.videochat && config.videochat.statsReportTimeInterval) {\n        if (isNaN(+config.videochat.statsReportTimeInterval)) {\n            Helpers.traceError('statsReportTimeInterval (' + config.videochat.statsReportTimeInterval + ') must be integer.');\n            return;\n        }\n        statsReportInterval = config.videochat.statsReportTimeInterval * 1000;\n\n        const _statsReportCallback = () => {\n            _getStats(this, lastResult, (results, lastResults) => {\n                lastResult = lastResults;\n                this.delegate._onCallStatsReport(this.userID, results, null);\n            }, err => {\n                Helpers.traceError('_getStats error. ' + err.name + ': ' + err.message);\n                this.delegate._onCallStatsReport(this.userID, null, err);\n            });\n        };\n\n        Helpers.trace('Stats tracker has been started.');\n        this.statsReportTimer = setInterval(_statsReportCallback, statsReportInterval);\n    }\n};\n\nRTCPeerConnection.prototype._clearWaitingReconnectTimer = function () {\n    if (this.waitingReconnectTimeoutCallback) {\n        Helpers.trace('_clearWaitingReconnectTimer');\n        clearTimeout(this.waitingReconnectTimeoutCallback);\n        this.waitingReconnectTimeoutCallback = null;\n    }\n};\n\nRTCPeerConnection.prototype._startWaitingReconnectTimer = function () {\n    const timeout = config.videochat.disconnectTimeInterval * 1000;\n    const waitingReconnectTimeoutCallback = () => {\n        Helpers.trace('waitingReconnectTimeoutCallback');\n\n        clearTimeout(this.waitingReconnectTimeoutCallback);\n\n        this.release();\n\n        this.delegate._closeSessionIfAllConnectionsClosed();\n    };\n\n    Helpers.trace('_startWaitingReconnectTimer, timeout: ' + timeout);\n\n    this.waitingReconnectTimeoutCallback = setTimeout(waitingReconnectTimeoutCallback, timeout);\n};\n\nRTCPeerConnection.prototype._clearDialingTimer = function () {\n    if (this.dialingTimer) {\n        Helpers.trace('_clearDialingTimer');\n\n        clearInterval(this.dialingTimer);\n        this.dialingTimer = null;\n        this.answerTimeInterval = 0;\n    }\n};\n\nRTCPeerConnection.prototype._startDialingTimer = function (extension, withOnNotAnswerCallback) {\n    const dialingTimeInterval = config.videochat.dialingTimeInterval * 1000;\n\n    Helpers.trace('_startDialingTimer, dialingTimeInterval: ' + dialingTimeInterval);\n\n    const _dialingCallback = (extension, withOnNotAnswerCallback, skipIncrement) => {\n        if (!skipIncrement) {\n            this.answerTimeInterval += config.videochat.dialingTimeInterval * 1000;\n        }\n\n        Helpers.trace('_dialingCallback, answerTimeInterval: ' + this.answerTimeInterval);\n\n        if (this.answerTimeInterval >= config.videochat.answerTimeInterval * 1000) {\n            this._clearDialingTimer();\n\n            if (withOnNotAnswerCallback) {\n                this.delegate._processOnNotAnswer(this);\n            }\n        } else {\n            this.delegate._processCall(this, extension);\n        }\n    };\n\n    this.dialingTimer = setInterval(_dialingCallback, dialingTimeInterval, extension, withOnNotAnswerCallback, false);\n\n    // call for the 1st time\n    _dialingCallback(extension, withOnNotAnswerCallback, true);\n};\n\n/**\n * PRIVATE\n */\nfunction _getStats(peer, lastResults, successCallback, errorCallback) {\n    let statistic = {\n        'local': {\n            'audio': {},\n            'video': {},\n            'candidate': {}\n        },\n        'remote': {\n            'audio': {},\n            'video': {},\n            'candidate': {}\n        }\n    };\n\n    if (Helpers.getVersionFirefox()) {\n        let localStream = peer.getLocalStreams().length ? peer.getLocalStreams()[0] : peer.delegate.localStream,\n            localVideoSettings = localStream.getVideoTracks().length ? localStream.getVideoTracks()[0].getSettings() : null;\n\n        statistic.local.video.frameHeight = localVideoSettings && localVideoSettings.height;\n        statistic.local.video.frameWidth = localVideoSettings && localVideoSettings.width;\n    }\n\n    peer.getStats(null).then(results => {\n        results.forEach(result => {\n            let item;\n\n            if (result.bytesReceived && result.type === 'inbound-rtp') {\n                item = statistic.remote[result.mediaType];\n                item.bitrate = _getBitratePerSecond(result, lastResults, false);\n                item.bytesReceived = result.bytesReceived;\n                item.packetsReceived = result.packetsReceived;\n                item.timestamp = result.timestamp;\n                if (result.mediaType === 'video' && result.framerateMean) {\n                    item.framesPerSecond = Math.round(result.framerateMean * 10) / 10;\n                }\n            } else if (result.bytesSent && result.type === 'outbound-rtp') {\n                item = statistic.local[result.mediaType];\n                item.bitrate = _getBitratePerSecond(result, lastResults, true);\n                item.bytesSent = result.bytesSent;\n                item.packetsSent = result.packetsSent;\n                item.timestamp = result.timestamp;\n                if (result.mediaType === 'video' && result.framerateMean) {\n                    item.framesPerSecond = Math.round(result.framerateMean * 10) / 10;\n                }\n            } else if (result.type === 'local-candidate') {\n                item = statistic.local.candidate;\n                if (result.candidateType === 'host' && result.mozLocalTransport === 'udp' && result.transport === 'udp') {\n                    item.protocol = result.transport;\n                    item.ip = result.ipAddress;\n                    item.port = result.portNumber;\n                } else if (!Helpers.getVersionFirefox()) {\n                    item.protocol = result.protocol;\n                    item.ip = result.ip;\n                    item.port = result.port;\n                }\n            } else if (result.type === 'remote-candidate') {\n                item = statistic.remote.candidate;\n                item.protocol = result.protocol || result.transport;\n                item.ip = result.ip || result.ipAddress;\n                item.port = result.port || result.portNumber;\n            } else if (result.type === 'track' && result.kind === 'video' && !Helpers.getVersionFirefox()) {\n                if (result.remoteSource) {\n                    item = statistic.remote.video;\n                    item.frameHeight = result.frameHeight;\n                    item.frameWidth = result.frameWidth;\n                    item.framesPerSecond = _getFramesPerSecond(result, lastResults, false);\n                } else {\n                    item = statistic.local.video;\n                    item.frameHeight = result.frameHeight;\n                    item.frameWidth = result.frameWidth;\n                    item.framesPerSecond = _getFramesPerSecond(result, lastResults, true);\n                }\n            }\n        });\n        successCallback(statistic, results);\n    }, errorCallback);\n\n    const _getBitratePerSecond = (result, lastResults, isLocal) => {\n        let lastResult = lastResults && lastResults.get(result.id),\n            seconds = lastResult ? ((result.timestamp - lastResult.timestamp) / 1000) : 5,\n            kilo = 1024,\n            bit = 8,\n            bitrate;\n\n        if (!lastResult) {\n            bitrate = 0;\n        } else if (isLocal) {\n            bitrate = bit * (result.bytesSent - lastResult.bytesSent) / (kilo * seconds);\n        } else {\n            bitrate = bit * (result.bytesReceived - lastResult.bytesReceived) / (kilo * seconds);\n        }\n\n        return Math.round(bitrate);\n    }\n\n    const _getFramesPerSecond = (result, lastResults, isLocal) => {\n        let lastResult = lastResults && lastResults.get(result.id),\n            seconds = lastResult ? ((result.timestamp - lastResult.timestamp) / 1000) : 5,\n            framesPerSecond;\n\n        if (!lastResult) {\n            framesPerSecond = 0;\n        } else if (isLocal) {\n            framesPerSecond = (result.framesSent - lastResult.framesSent) / seconds;\n        } else {\n            framesPerSecond = (result.framesReceived - lastResult.framesReceived) / seconds;\n        }\n\n        return Math.round(framesPerSecond * 10) / 10;\n    }\n}\n\nfunction setMediaBitrate(sdp, media, bitrate) {\n    if (!bitrate) {\n        return sdp.replace(/b=AS:.*\\r\\n/, '').replace(/b=TIAS:.*\\r\\n/, '');\n    }\n\n    var lines = sdp.split('\\n'),\n        line = -1,\n        modifier = Helpers.getVersionFirefox() ? 'TIAS' : 'AS',\n        amount = Helpers.getVersionFirefox() ? bitrate * 1024 : bitrate;\n\n    for (let i = 0; i < lines.length; i++) {\n        if (lines[i].indexOf(\"m=\" + media) === 0) {\n            line = i;\n            break;\n        }\n    }\n\n    if (line === -1) {\n        return sdp;\n    }\n\n    line++;\n\n    while (lines[line].indexOf('i=') === 0 || lines[line].indexOf('c=') === 0) {\n        line++;\n    }\n\n    if (lines[line].indexOf('b') === 0) {\n        lines[line] = 'b=' + modifier + ':' + amount;\n        return lines.join('\\n');\n    }\n\n    let newLines = lines.slice(0, line);\n    newLines.push('b=' + modifier + ':' + amount);\n    newLines = newLines.concat(lines.slice(line, lines.length));\n\n    return newLines.join('\\n');\n}\n\nmodule.exports = RTCPeerConnection;\n","module.exports = require(\"regenerator-runtime\");\n","function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {\n  try {\n    var info = gen[key](arg);\n    var value = info.value;\n  } catch (error) {\n    reject(error);\n    return;\n  }\n\n  if (info.done) {\n    resolve(value);\n  } else {\n    Promise.resolve(value).then(_next, _throw);\n  }\n}\n\nfunction _asyncToGenerator(fn) {\n  return function () {\n    var self = this,\n        args = arguments;\n    return new Promise(function (resolve, reject) {\n      var gen = fn.apply(self, args);\n\n      function _next(value) {\n        asyncGeneratorStep(gen, resolve, reject, _next, _throw, \"next\", value);\n      }\n\n      function _throw(err) {\n        asyncGeneratorStep(gen, resolve, reject, _next, _throw, \"throw\", err);\n      }\n\n      _next(undefined);\n    });\n  };\n}\n\nmodule.exports = _asyncToGenerator;","/**\n * Copyright (c) 2014-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n * \n * @providesModule EmitterSubscription\n * @typechecks\n */\n\n'use strict';\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar EventSubscription = require('./EventSubscription');\n\n/**\n * EmitterSubscription represents a subscription with listener and context data.\n */\n\nvar EmitterSubscription = (function (_EventSubscription) {\n  _inherits(EmitterSubscription, _EventSubscription);\n\n  /**\n   * @param {EventSubscriptionVendor} subscriber - The subscriber that controls\n   *   this subscription\n   * @param {function} listener - Function to invoke when the specified event is\n   *   emitted\n   * @param {*} context - Optional context object to use when invoking the\n   *   listener\n   */\n\n  function EmitterSubscription(subscriber, listener, context) {\n    _classCallCheck(this, EmitterSubscription);\n\n    _EventSubscription.call(this, subscriber);\n    this.listener = listener;\n    this.context = context;\n  }\n\n  return EmitterSubscription;\n})(EventSubscription);\n\nmodule.exports = EmitterSubscription;","/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n */\n\n'use strict';\n\n/**\n * Use invariant() to assert state which your program assumes to be true.\n *\n * Provide sprintf-style format (only %s is supported) and arguments\n * to provide information about what broke and what you were\n * expecting.\n *\n * The invariant message will be stripped in production, but the invariant\n * will remain to ensure logic does not differ in production.\n */\n\nvar validateFormat = function validateFormat(format) {};\n\nif (process.env.NODE_ENV !== 'production') {\n  validateFormat = function validateFormat(format) {\n    if (format === undefined) {\n      throw new Error('invariant requires an error message argument');\n    }\n  };\n}\n\nfunction invariant(condition, format, a, b, c, d, e, f) {\n  validateFormat(format);\n\n  if (!condition) {\n    var error;\n    if (format === undefined) {\n      error = new Error('Minified exception occurred; use the non-minified dev environment ' + 'for the full error message and additional helpful warnings.');\n    } else {\n      var args = [a, b, c, d, e, f];\n      var argIndex = 0;\n      error = new Error(format.replace(/%s/g, function () {\n        return args[argIndex++];\n      }));\n      error.name = 'Invariant Violation';\n    }\n\n    error.framesToPop = 1; // we don't care about invariant's own frame\n    throw error;\n  }\n}\n\nmodule.exports = invariant;","const CALL_TYPES = {\n    VIDEO: 'video',\n    AUDIO: 'audio'\n}\n\nconst DEVICE_INPUT_TYPES = {\n    VIDEO: 'videoinput',\n    AUDIO: 'audioinput'\n}\n\nmodule.exports = {\n    CALL_TYPES,\n    DEVICE_INPUT_TYPES\n}","const config = require('./cubeConfig')\nconst Utils = require('./cubeInternalUtils')\n\nclass ConnectyCube {\n\n  constructor() {\n    // React Native RTCView\n    if (Utils.getEnv().reactnative) {\n      this.RTCView = require('./cubeDependencies').RTCView\n    }\n  }\n\n  init(credentials, configMap) {\n    if (configMap && typeof configMap === 'object') {\n      config.set(configMap)\n    }\n\n    const Proxy = require('./cubeProxy')\n    const Auth = require('./cubeAuth')\n    const Users = require('./cubeUsers')\n    const Storage = require('./cubeStorage')\n    const PushNotifications = require('./cubePushNotifications')\n    const Data = require('./cubeData')\n    const AddressBook = require('./cubeAddressBook')\n    const Chat = require('./messaging/cubeChat')\n    const DialogProxy = require('./messaging/cubeDialog')\n    const MessageProxy = require('./messaging/cubeMessage')\n\n    this.service = new Proxy()\n    this.auth = new Auth(this.service)\n    this.users = new Users(this.service)\n    this.storage = new Storage(this.service)\n    this.pushnotifications = new PushNotifications(this.service)\n    this.data = new Data(this.service)\n    this.addressbook = new AddressBook(this.service)\n    this.chat = new Chat(this.service)\n    this.chat.dialog = new DialogProxy(this.service)\n    this.chat.message = new MessageProxy(this.service)\n    this.utils = Utils\n\n    // add WebRTC API if API is avaible\n    if (Utils.isWebRTCAvailble()) {\n      // p2p calls client\n      const WebRTCClient = require('./videocalling/cubeWebRTCClient')\n\n      this.videochat = new WebRTCClient(this.chat.xmppClient)\n      this.chat.webrtcSignalingProcessor = this.videochat.signalingProcessor\n      // conf calls client\n      const ConferenceClient = require('./videocalling_conference/cubeConferenceClient')\n      this.videochatconference = new ConferenceClient(this.service)\n    } else {\n      this.videochat = null\n      this.videochatconference = null\n    }\n\n    // Initialization by outside token\n    if (credentials.token) {\n      config.creds.appId = credentials.appId\n      this.service.setSession({ token: credentials.token })\n    } else {\n      config.creds.appId = credentials.appId\n      config.creds.authKey = credentials.authKey\n      config.creds.authSecret = credentials.authSecret\n    }\n  }\n\n  getSession() {\n    return this.auth.getSession()\n  }\n\n  createSession(params) {\n    return this.auth.createSession(params)\n  }\n\n  destroySession() {\n    return this.auth.destroySession()\n  }\n\n  createWebSession(params) {\n    return this.auth.createWebSession(params)\n  }\n\n  checkWebSessionUntilUpgrade(callback) {\n    return this.auth.checkWebSessionUntilUpgrade(callback)\n  }\n\n  upgradeWebSession(webToken) {\n    return this.auth.upgradeWebSession(webToken)\n  }\n\n  login(params) {\n    return this.auth.login(params)\n  }\n\n  logout() {\n    return this.auth.logout()\n  }\n}\n\nconst CB = new ConnectyCube()\nCB.ConnectyCube = ConnectyCube\nmodule.exports = CB\n","/*!\n * The buffer module from node.js, for the browser.\n *\n * @author   Feross Aboukhadijeh <http://feross.org>\n * @license  MIT\n */\n/* eslint-disable no-proto */\n\n'use strict'\n\nvar base64 = require('base64-js')\nvar ieee754 = require('ieee754')\nvar isArray = require('isarray')\n\nexports.Buffer = Buffer\nexports.SlowBuffer = SlowBuffer\nexports.INSPECT_MAX_BYTES = 50\n\n/**\n * If `Buffer.TYPED_ARRAY_SUPPORT`:\n *   === true    Use Uint8Array implementation (fastest)\n *   === false   Use Object implementation (most compatible, even IE6)\n *\n * Browsers that support typed arrays are IE 10+, Firefox 4+, Chrome 7+, Safari 5.1+,\n * Opera 11.6+, iOS 4.2+.\n *\n * Due to various browser bugs, sometimes the Object implementation will be used even\n * when the browser supports typed arrays.\n *\n * Note:\n *\n *   - Firefox 4-29 lacks support for adding new properties to `Uint8Array` instances,\n *     See: https://bugzilla.mozilla.org/show_bug.cgi?id=695438.\n *\n *   - Chrome 9-10 is missing the `TypedArray.prototype.subarray` function.\n *\n *   - IE10 has a broken `TypedArray.prototype.subarray` function which returns arrays of\n *     incorrect length in some situations.\n\n * We detect these buggy browsers and set `Buffer.TYPED_ARRAY_SUPPORT` to `false` so they\n * get the Object implementation, which is slower but behaves correctly.\n */\nBuffer.TYPED_ARRAY_SUPPORT = global.TYPED_ARRAY_SUPPORT !== undefined\n  ? global.TYPED_ARRAY_SUPPORT\n  : typedArraySupport()\n\n/*\n * Export kMaxLength after typed array support is determined.\n */\nexports.kMaxLength = kMaxLength()\n\nfunction typedArraySupport () {\n  try {\n    var arr = new Uint8Array(1)\n    arr.__proto__ = {__proto__: Uint8Array.prototype, foo: function () { return 42 }}\n    return arr.foo() === 42 && // typed array instances can be augmented\n        typeof arr.subarray === 'function' && // chrome 9-10 lack `subarray`\n        arr.subarray(1, 1).byteLength === 0 // ie10 has broken `subarray`\n  } catch (e) {\n    return false\n  }\n}\n\nfunction kMaxLength () {\n  return Buffer.TYPED_ARRAY_SUPPORT\n    ? 0x7fffffff\n    : 0x3fffffff\n}\n\nfunction createBuffer (that, length) {\n  if (kMaxLength() < length) {\n    throw new RangeError('Invalid typed array length')\n  }\n  if (Buffer.TYPED_ARRAY_SUPPORT) {\n    // Return an augmented `Uint8Array` instance, for best performance\n    that = new Uint8Array(length)\n    that.__proto__ = Buffer.prototype\n  } else {\n    // Fallback: Return an object instance of the Buffer class\n    if (that === null) {\n      that = new Buffer(length)\n    }\n    that.length = length\n  }\n\n  return that\n}\n\n/**\n * The Buffer constructor returns instances of `Uint8Array` that have their\n * prototype changed to `Buffer.prototype`. Furthermore, `Buffer` is a subclass of\n * `Uint8Array`, so the returned instances will have all the node `Buffer` methods\n * and the `Uint8Array` methods. Square bracket notation works as expected -- it\n * returns a single octet.\n *\n * The `Uint8Array` prototype remains unmodified.\n */\n\nfunction Buffer (arg, encodingOrOffset, length) {\n  if (!Buffer.TYPED_ARRAY_SUPPORT && !(this instanceof Buffer)) {\n    return new Buffer(arg, encodingOrOffset, length)\n  }\n\n  // Common case.\n  if (typeof arg === 'number') {\n    if (typeof encodingOrOffset === 'string') {\n      throw new Error(\n        'If encoding is specified then the first argument must be a string'\n      )\n    }\n    return allocUnsafe(this, arg)\n  }\n  return from(this, arg, encodingOrOffset, length)\n}\n\nBuffer.poolSize = 8192 // not used by this implementation\n\n// TODO: Legacy, not needed anymore. Remove in next major version.\nBuffer._augment = function (arr) {\n  arr.__proto__ = Buffer.prototype\n  return arr\n}\n\nfunction from (that, value, encodingOrOffset, length) {\n  if (typeof value === 'number') {\n    throw new TypeError('\"value\" argument must not be a number')\n  }\n\n  if (typeof ArrayBuffer !== 'undefined' && value instanceof ArrayBuffer) {\n    return fromArrayBuffer(that, value, encodingOrOffset, length)\n  }\n\n  if (typeof value === 'string') {\n    return fromString(that, value, encodingOrOffset)\n  }\n\n  return fromObject(that, value)\n}\n\n/**\n * Functionally equivalent to Buffer(arg, encoding) but throws a TypeError\n * if value is a number.\n * Buffer.from(str[, encoding])\n * Buffer.from(array)\n * Buffer.from(buffer)\n * Buffer.from(arrayBuffer[, byteOffset[, length]])\n **/\nBuffer.from = function (value, encodingOrOffset, length) {\n  return from(null, value, encodingOrOffset, length)\n}\n\nif (Buffer.TYPED_ARRAY_SUPPORT) {\n  Buffer.prototype.__proto__ = Uint8Array.prototype\n  Buffer.__proto__ = Uint8Array\n  if (typeof Symbol !== 'undefined' && Symbol.species &&\n      Buffer[Symbol.species] === Buffer) {\n    // Fix subarray() in ES2016. See: https://github.com/feross/buffer/pull/97\n    Object.defineProperty(Buffer, Symbol.species, {\n      value: null,\n      configurable: true\n    })\n  }\n}\n\nfunction assertSize (size) {\n  if (typeof size !== 'number') {\n    throw new TypeError('\"size\" argument must be a number')\n  } else if (size < 0) {\n    throw new RangeError('\"size\" argument must not be negative')\n  }\n}\n\nfunction alloc (that, size, fill, encoding) {\n  assertSize(size)\n  if (size <= 0) {\n    return createBuffer(that, size)\n  }\n  if (fill !== undefined) {\n    // Only pay attention to encoding if it's a string. This\n    // prevents accidentally sending in a number that would\n    // be interpretted as a start offset.\n    return typeof encoding === 'string'\n      ? createBuffer(that, size).fill(fill, encoding)\n      : createBuffer(that, size).fill(fill)\n  }\n  return createBuffer(that, size)\n}\n\n/**\n * Creates a new filled Buffer instance.\n * alloc(size[, fill[, encoding]])\n **/\nBuffer.alloc = function (size, fill, encoding) {\n  return alloc(null, size, fill, encoding)\n}\n\nfunction allocUnsafe (that, size) {\n  assertSize(size)\n  that = createBuffer(that, size < 0 ? 0 : checked(size) | 0)\n  if (!Buffer.TYPED_ARRAY_SUPPORT) {\n    for (var i = 0; i < size; ++i) {\n      that[i] = 0\n    }\n  }\n  return that\n}\n\n/**\n * Equivalent to Buffer(num), by default creates a non-zero-filled Buffer instance.\n * */\nBuffer.allocUnsafe = function (size) {\n  return allocUnsafe(null, size)\n}\n/**\n * Equivalent to SlowBuffer(num), by default creates a non-zero-filled Buffer instance.\n */\nBuffer.allocUnsafeSlow = function (size) {\n  return allocUnsafe(null, size)\n}\n\nfunction fromString (that, string, encoding) {\n  if (typeof encoding !== 'string' || encoding === '') {\n    encoding = 'utf8'\n  }\n\n  if (!Buffer.isEncoding(encoding)) {\n    throw new TypeError('\"encoding\" must be a valid string encoding')\n  }\n\n  var length = byteLength(string, encoding) | 0\n  that = createBuffer(that, length)\n\n  var actual = that.write(string, encoding)\n\n  if (actual !== length) {\n    // Writing a hex string, for example, that contains invalid characters will\n    // cause everything after the first invalid character to be ignored. (e.g.\n    // 'abxxcd' will be treated as 'ab')\n    that = that.slice(0, actual)\n  }\n\n  return that\n}\n\nfunction fromArrayLike (that, array) {\n  var length = array.length < 0 ? 0 : checked(array.length) | 0\n  that = createBuffer(that, length)\n  for (var i = 0; i < length; i += 1) {\n    that[i] = array[i] & 255\n  }\n  return that\n}\n\nfunction fromArrayBuffer (that, array, byteOffset, length) {\n  array.byteLength // this throws if `array` is not a valid ArrayBuffer\n\n  if (byteOffset < 0 || array.byteLength < byteOffset) {\n    throw new RangeError('\\'offset\\' is out of bounds')\n  }\n\n  if (array.byteLength < byteOffset + (length || 0)) {\n    throw new RangeError('\\'length\\' is out of bounds')\n  }\n\n  if (byteOffset === undefined && length === undefined) {\n    array = new Uint8Array(array)\n  } else if (length === undefined) {\n    array = new Uint8Array(array, byteOffset)\n  } else {\n    array = new Uint8Array(array, byteOffset, length)\n  }\n\n  if (Buffer.TYPED_ARRAY_SUPPORT) {\n    // Return an augmented `Uint8Array` instance, for best performance\n    that = array\n    that.__proto__ = Buffer.prototype\n  } else {\n    // Fallback: Return an object instance of the Buffer class\n    that = fromArrayLike(that, array)\n  }\n  return that\n}\n\nfunction fromObject (that, obj) {\n  if (Buffer.isBuffer(obj)) {\n    var len = checked(obj.length) | 0\n    that = createBuffer(that, len)\n\n    if (that.length === 0) {\n      return that\n    }\n\n    obj.copy(that, 0, 0, len)\n    return that\n  }\n\n  if (obj) {\n    if ((typeof ArrayBuffer !== 'undefined' &&\n        obj.buffer instanceof ArrayBuffer) || 'length' in obj) {\n      if (typeof obj.length !== 'number' || isnan(obj.length)) {\n        return createBuffer(that, 0)\n      }\n      return fromArrayLike(that, obj)\n    }\n\n    if (obj.type === 'Buffer' && isArray(obj.data)) {\n      return fromArrayLike(that, obj.data)\n    }\n  }\n\n  throw new TypeError('First argument must be a string, Buffer, ArrayBuffer, Array, or array-like object.')\n}\n\nfunction checked (length) {\n  // Note: cannot use `length < kMaxLength()` here because that fails when\n  // length is NaN (which is otherwise coerced to zero.)\n  if (length >= kMaxLength()) {\n    throw new RangeError('Attempt to allocate Buffer larger than maximum ' +\n                         'size: 0x' + kMaxLength().toString(16) + ' bytes')\n  }\n  return length | 0\n}\n\nfunction SlowBuffer (length) {\n  if (+length != length) { // eslint-disable-line eqeqeq\n    length = 0\n  }\n  return Buffer.alloc(+length)\n}\n\nBuffer.isBuffer = function isBuffer (b) {\n  return !!(b != null && b._isBuffer)\n}\n\nBuffer.compare = function compare (a, b) {\n  if (!Buffer.isBuffer(a) || !Buffer.isBuffer(b)) {\n    throw new TypeError('Arguments must be Buffers')\n  }\n\n  if (a === b) return 0\n\n  var x = a.length\n  var y = b.length\n\n  for (var i = 0, len = Math.min(x, y); i < len; ++i) {\n    if (a[i] !== b[i]) {\n      x = a[i]\n      y = b[i]\n      break\n    }\n  }\n\n  if (x < y) return -1\n  if (y < x) return 1\n  return 0\n}\n\nBuffer.isEncoding = function isEncoding (encoding) {\n  switch (String(encoding).toLowerCase()) {\n    case 'hex':\n    case 'utf8':\n    case 'utf-8':\n    case 'ascii':\n    case 'latin1':\n    case 'binary':\n    case 'base64':\n    case 'ucs2':\n    case 'ucs-2':\n    case 'utf16le':\n    case 'utf-16le':\n      return true\n    default:\n      return false\n  }\n}\n\nBuffer.concat = function concat (list, length) {\n  if (!isArray(list)) {\n    throw new TypeError('\"list\" argument must be an Array of Buffers')\n  }\n\n  if (list.length === 0) {\n    return Buffer.alloc(0)\n  }\n\n  var i\n  if (length === undefined) {\n    length = 0\n    for (i = 0; i < list.length; ++i) {\n      length += list[i].length\n    }\n  }\n\n  var buffer = Buffer.allocUnsafe(length)\n  var pos = 0\n  for (i = 0; i < list.length; ++i) {\n    var buf = list[i]\n    if (!Buffer.isBuffer(buf)) {\n      throw new TypeError('\"list\" argument must be an Array of Buffers')\n    }\n    buf.copy(buffer, pos)\n    pos += buf.length\n  }\n  return buffer\n}\n\nfunction byteLength (string, encoding) {\n  if (Buffer.isBuffer(string)) {\n    return string.length\n  }\n  if (typeof ArrayBuffer !== 'undefined' && typeof ArrayBuffer.isView === 'function' &&\n      (ArrayBuffer.isView(string) || string instanceof ArrayBuffer)) {\n    return string.byteLength\n  }\n  if (typeof string !== 'string') {\n    string = '' + string\n  }\n\n  var len = string.length\n  if (len === 0) return 0\n\n  // Use a for loop to avoid recursion\n  var loweredCase = false\n  for (;;) {\n    switch (encoding) {\n      case 'ascii':\n      case 'latin1':\n      case 'binary':\n        return len\n      case 'utf8':\n      case 'utf-8':\n      case undefined:\n        return utf8ToBytes(string).length\n      case 'ucs2':\n      case 'ucs-2':\n      case 'utf16le':\n      case 'utf-16le':\n        return len * 2\n      case 'hex':\n        return len >>> 1\n      case 'base64':\n        return base64ToBytes(string).length\n      default:\n        if (loweredCase) return utf8ToBytes(string).length // assume utf8\n        encoding = ('' + encoding).toLowerCase()\n        loweredCase = true\n    }\n  }\n}\nBuffer.byteLength = byteLength\n\nfunction slowToString (encoding, start, end) {\n  var loweredCase = false\n\n  // No need to verify that \"this.length <= MAX_UINT32\" since it's a read-only\n  // property of a typed array.\n\n  // This behaves neither like String nor Uint8Array in that we set start/end\n  // to their upper/lower bounds if the value passed is out of range.\n  // undefined is handled specially as per ECMA-262 6th Edition,\n  // Section 13.3.3.7 Runtime Semantics: KeyedBindingInitialization.\n  if (start === undefined || start < 0) {\n    start = 0\n  }\n  // Return early if start > this.length. Done here to prevent potential uint32\n  // coercion fail below.\n  if (start > this.length) {\n    return ''\n  }\n\n  if (end === undefined || end > this.length) {\n    end = this.length\n  }\n\n  if (end <= 0) {\n    return ''\n  }\n\n  // Force coersion to uint32. This will also coerce falsey/NaN values to 0.\n  end >>>= 0\n  start >>>= 0\n\n  if (end <= start) {\n    return ''\n  }\n\n  if (!encoding) encoding = 'utf8'\n\n  while (true) {\n    switch (encoding) {\n      case 'hex':\n        return hexSlice(this, start, end)\n\n      case 'utf8':\n      case 'utf-8':\n        return utf8Slice(this, start, end)\n\n      case 'ascii':\n        return asciiSlice(this, start, end)\n\n      case 'latin1':\n      case 'binary':\n        return latin1Slice(this, start, end)\n\n      case 'base64':\n        return base64Slice(this, start, end)\n\n      case 'ucs2':\n      case 'ucs-2':\n      case 'utf16le':\n      case 'utf-16le':\n        return utf16leSlice(this, start, end)\n\n      default:\n        if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)\n        encoding = (encoding + '').toLowerCase()\n        loweredCase = true\n    }\n  }\n}\n\n// The property is used by `Buffer.isBuffer` and `is-buffer` (in Safari 5-7) to detect\n// Buffer instances.\nBuffer.prototype._isBuffer = true\n\nfunction swap (b, n, m) {\n  var i = b[n]\n  b[n] = b[m]\n  b[m] = i\n}\n\nBuffer.prototype.swap16 = function swap16 () {\n  var len = this.length\n  if (len % 2 !== 0) {\n    throw new RangeError('Buffer size must be a multiple of 16-bits')\n  }\n  for (var i = 0; i < len; i += 2) {\n    swap(this, i, i + 1)\n  }\n  return this\n}\n\nBuffer.prototype.swap32 = function swap32 () {\n  var len = this.length\n  if (len % 4 !== 0) {\n    throw new RangeError('Buffer size must be a multiple of 32-bits')\n  }\n  for (var i = 0; i < len; i += 4) {\n    swap(this, i, i + 3)\n    swap(this, i + 1, i + 2)\n  }\n  return this\n}\n\nBuffer.prototype.swap64 = function swap64 () {\n  var len = this.length\n  if (len % 8 !== 0) {\n    throw new RangeError('Buffer size must be a multiple of 64-bits')\n  }\n  for (var i = 0; i < len; i += 8) {\n    swap(this, i, i + 7)\n    swap(this, i + 1, i + 6)\n    swap(this, i + 2, i + 5)\n    swap(this, i + 3, i + 4)\n  }\n  return this\n}\n\nBuffer.prototype.toString = function toString () {\n  var length = this.length | 0\n  if (length === 0) return ''\n  if (arguments.length === 0) return utf8Slice(this, 0, length)\n  return slowToString.apply(this, arguments)\n}\n\nBuffer.prototype.equals = function equals (b) {\n  if (!Buffer.isBuffer(b)) throw new TypeError('Argument must be a Buffer')\n  if (this === b) return true\n  return Buffer.compare(this, b) === 0\n}\n\nBuffer.prototype.inspect = function inspect () {\n  var str = ''\n  var max = exports.INSPECT_MAX_BYTES\n  if (this.length > 0) {\n    str = this.toString('hex', 0, max).match(/.{2}/g).join(' ')\n    if (this.length > max) str += ' ... '\n  }\n  return '<Buffer ' + str + '>'\n}\n\nBuffer.prototype.compare = function compare (target, start, end, thisStart, thisEnd) {\n  if (!Buffer.isBuffer(target)) {\n    throw new TypeError('Argument must be a Buffer')\n  }\n\n  if (start === undefined) {\n    start = 0\n  }\n  if (end === undefined) {\n    end = target ? target.length : 0\n  }\n  if (thisStart === undefined) {\n    thisStart = 0\n  }\n  if (thisEnd === undefined) {\n    thisEnd = this.length\n  }\n\n  if (start < 0 || end > target.length || thisStart < 0 || thisEnd > this.length) {\n    throw new RangeError('out of range index')\n  }\n\n  if (thisStart >= thisEnd && start >= end) {\n    return 0\n  }\n  if (thisStart >= thisEnd) {\n    return -1\n  }\n  if (start >= end) {\n    return 1\n  }\n\n  start >>>= 0\n  end >>>= 0\n  thisStart >>>= 0\n  thisEnd >>>= 0\n\n  if (this === target) return 0\n\n  var x = thisEnd - thisStart\n  var y = end - start\n  var len = Math.min(x, y)\n\n  var thisCopy = this.slice(thisStart, thisEnd)\n  var targetCopy = target.slice(start, end)\n\n  for (var i = 0; i < len; ++i) {\n    if (thisCopy[i] !== targetCopy[i]) {\n      x = thisCopy[i]\n      y = targetCopy[i]\n      break\n    }\n  }\n\n  if (x < y) return -1\n  if (y < x) return 1\n  return 0\n}\n\n// Finds either the first index of `val` in `buffer` at offset >= `byteOffset`,\n// OR the last index of `val` in `buffer` at offset <= `byteOffset`.\n//\n// Arguments:\n// - buffer - a Buffer to search\n// - val - a string, Buffer, or number\n// - byteOffset - an index into `buffer`; will be clamped to an int32\n// - encoding - an optional encoding, relevant is val is a string\n// - dir - true for indexOf, false for lastIndexOf\nfunction bidirectionalIndexOf (buffer, val, byteOffset, encoding, dir) {\n  // Empty buffer means no match\n  if (buffer.length === 0) return -1\n\n  // Normalize byteOffset\n  if (typeof byteOffset === 'string') {\n    encoding = byteOffset\n    byteOffset = 0\n  } else if (byteOffset > 0x7fffffff) {\n    byteOffset = 0x7fffffff\n  } else if (byteOffset < -0x80000000) {\n    byteOffset = -0x80000000\n  }\n  byteOffset = +byteOffset  // Coerce to Number.\n  if (isNaN(byteOffset)) {\n    // byteOffset: it it's undefined, null, NaN, \"foo\", etc, search whole buffer\n    byteOffset = dir ? 0 : (buffer.length - 1)\n  }\n\n  // Normalize byteOffset: negative offsets start from the end of the buffer\n  if (byteOffset < 0) byteOffset = buffer.length + byteOffset\n  if (byteOffset >= buffer.length) {\n    if (dir) return -1\n    else byteOffset = buffer.length - 1\n  } else if (byteOffset < 0) {\n    if (dir) byteOffset = 0\n    else return -1\n  }\n\n  // Normalize val\n  if (typeof val === 'string') {\n    val = Buffer.from(val, encoding)\n  }\n\n  // Finally, search either indexOf (if dir is true) or lastIndexOf\n  if (Buffer.isBuffer(val)) {\n    // Special case: looking for empty string/buffer always fails\n    if (val.length === 0) {\n      return -1\n    }\n    return arrayIndexOf(buffer, val, byteOffset, encoding, dir)\n  } else if (typeof val === 'number') {\n    val = val & 0xFF // Search for a byte value [0-255]\n    if (Buffer.TYPED_ARRAY_SUPPORT &&\n        typeof Uint8Array.prototype.indexOf === 'function') {\n      if (dir) {\n        return Uint8Array.prototype.indexOf.call(buffer, val, byteOffset)\n      } else {\n        return Uint8Array.prototype.lastIndexOf.call(buffer, val, byteOffset)\n      }\n    }\n    return arrayIndexOf(buffer, [ val ], byteOffset, encoding, dir)\n  }\n\n  throw new TypeError('val must be string, number or Buffer')\n}\n\nfunction arrayIndexOf (arr, val, byteOffset, encoding, dir) {\n  var indexSize = 1\n  var arrLength = arr.length\n  var valLength = val.length\n\n  if (encoding !== undefined) {\n    encoding = String(encoding).toLowerCase()\n    if (encoding === 'ucs2' || encoding === 'ucs-2' ||\n        encoding === 'utf16le' || encoding === 'utf-16le') {\n      if (arr.length < 2 || val.length < 2) {\n        return -1\n      }\n      indexSize = 2\n      arrLength /= 2\n      valLength /= 2\n      byteOffset /= 2\n    }\n  }\n\n  function read (buf, i) {\n    if (indexSize === 1) {\n      return buf[i]\n    } else {\n      return buf.readUInt16BE(i * indexSize)\n    }\n  }\n\n  var i\n  if (dir) {\n    var foundIndex = -1\n    for (i = byteOffset; i < arrLength; i++) {\n      if (read(arr, i) === read(val, foundIndex === -1 ? 0 : i - foundIndex)) {\n        if (foundIndex === -1) foundIndex = i\n        if (i - foundIndex + 1 === valLength) return foundIndex * indexSize\n      } else {\n        if (foundIndex !== -1) i -= i - foundIndex\n        foundIndex = -1\n      }\n    }\n  } else {\n    if (byteOffset + valLength > arrLength) byteOffset = arrLength - valLength\n    for (i = byteOffset; i >= 0; i--) {\n      var found = true\n      for (var j = 0; j < valLength; j++) {\n        if (read(arr, i + j) !== read(val, j)) {\n          found = false\n          break\n        }\n      }\n      if (found) return i\n    }\n  }\n\n  return -1\n}\n\nBuffer.prototype.includes = function includes (val, byteOffset, encoding) {\n  return this.indexOf(val, byteOffset, encoding) !== -1\n}\n\nBuffer.prototype.indexOf = function indexOf (val, byteOffset, encoding) {\n  return bidirectionalIndexOf(this, val, byteOffset, encoding, true)\n}\n\nBuffer.prototype.lastIndexOf = function lastIndexOf (val, byteOffset, encoding) {\n  return bidirectionalIndexOf(this, val, byteOffset, encoding, false)\n}\n\nfunction hexWrite (buf, string, offset, length) {\n  offset = Number(offset) || 0\n  var remaining = buf.length - offset\n  if (!length) {\n    length = remaining\n  } else {\n    length = Number(length)\n    if (length > remaining) {\n      length = remaining\n    }\n  }\n\n  // must be an even number of digits\n  var strLen = string.length\n  if (strLen % 2 !== 0) throw new TypeError('Invalid hex string')\n\n  if (length > strLen / 2) {\n    length = strLen / 2\n  }\n  for (var i = 0; i < length; ++i) {\n    var parsed = parseInt(string.substr(i * 2, 2), 16)\n    if (isNaN(parsed)) return i\n    buf[offset + i] = parsed\n  }\n  return i\n}\n\nfunction utf8Write (buf, string, offset, length) {\n  return blitBuffer(utf8ToBytes(string, buf.length - offset), buf, offset, length)\n}\n\nfunction asciiWrite (buf, string, offset, length) {\n  return blitBuffer(asciiToBytes(string), buf, offset, length)\n}\n\nfunction latin1Write (buf, string, offset, length) {\n  return asciiWrite(buf, string, offset, length)\n}\n\nfunction base64Write (buf, string, offset, length) {\n  return blitBuffer(base64ToBytes(string), buf, offset, length)\n}\n\nfunction ucs2Write (buf, string, offset, length) {\n  return blitBuffer(utf16leToBytes(string, buf.length - offset), buf, offset, length)\n}\n\nBuffer.prototype.write = function write (string, offset, length, encoding) {\n  // Buffer#write(string)\n  if (offset === undefined) {\n    encoding = 'utf8'\n    length = this.length\n    offset = 0\n  // Buffer#write(string, encoding)\n  } else if (length === undefined && typeof offset === 'string') {\n    encoding = offset\n    length = this.length\n    offset = 0\n  // Buffer#write(string, offset[, length][, encoding])\n  } else if (isFinite(offset)) {\n    offset = offset | 0\n    if (isFinite(length)) {\n      length = length | 0\n      if (encoding === undefined) encoding = 'utf8'\n    } else {\n      encoding = length\n      length = undefined\n    }\n  // legacy write(string, encoding, offset, length) - remove in v0.13\n  } else {\n    throw new Error(\n      'Buffer.write(string, encoding, offset[, length]) is no longer supported'\n    )\n  }\n\n  var remaining = this.length - offset\n  if (length === undefined || length > remaining) length = remaining\n\n  if ((string.length > 0 && (length < 0 || offset < 0)) || offset > this.length) {\n    throw new RangeError('Attempt to write outside buffer bounds')\n  }\n\n  if (!encoding) encoding = 'utf8'\n\n  var loweredCase = false\n  for (;;) {\n    switch (encoding) {\n      case 'hex':\n        return hexWrite(this, string, offset, length)\n\n      case 'utf8':\n      case 'utf-8':\n        return utf8Write(this, string, offset, length)\n\n      case 'ascii':\n        return asciiWrite(this, string, offset, length)\n\n      case 'latin1':\n      case 'binary':\n        return latin1Write(this, string, offset, length)\n\n      case 'base64':\n        // Warning: maxLength not taken into account in base64Write\n        return base64Write(this, string, offset, length)\n\n      case 'ucs2':\n      case 'ucs-2':\n      case 'utf16le':\n      case 'utf-16le':\n        return ucs2Write(this, string, offset, length)\n\n      default:\n        if (loweredCase) throw new TypeError('Unknown encoding: ' + encoding)\n        encoding = ('' + encoding).toLowerCase()\n        loweredCase = true\n    }\n  }\n}\n\nBuffer.prototype.toJSON = function toJSON () {\n  return {\n    type: 'Buffer',\n    data: Array.prototype.slice.call(this._arr || this, 0)\n  }\n}\n\nfunction base64Slice (buf, start, end) {\n  if (start === 0 && end === buf.length) {\n    return base64.fromByteArray(buf)\n  } else {\n    return base64.fromByteArray(buf.slice(start, end))\n  }\n}\n\nfunction utf8Slice (buf, start, end) {\n  end = Math.min(buf.length, end)\n  var res = []\n\n  var i = start\n  while (i < end) {\n    var firstByte = buf[i]\n    var codePoint = null\n    var bytesPerSequence = (firstByte > 0xEF) ? 4\n      : (firstByte > 0xDF) ? 3\n      : (firstByte > 0xBF) ? 2\n      : 1\n\n    if (i + bytesPerSequence <= end) {\n      var secondByte, thirdByte, fourthByte, tempCodePoint\n\n      switch (bytesPerSequence) {\n        case 1:\n          if (firstByte < 0x80) {\n            codePoint = firstByte\n          }\n          break\n        case 2:\n          secondByte = buf[i + 1]\n          if ((secondByte & 0xC0) === 0x80) {\n            tempCodePoint = (firstByte & 0x1F) << 0x6 | (secondByte & 0x3F)\n            if (tempCodePoint > 0x7F) {\n              codePoint = tempCodePoint\n            }\n          }\n          break\n        case 3:\n          secondByte = buf[i + 1]\n          thirdByte = buf[i + 2]\n          if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80) {\n            tempCodePoint = (firstByte & 0xF) << 0xC | (secondByte & 0x3F) << 0x6 | (thirdByte & 0x3F)\n            if (tempCodePoint > 0x7FF && (tempCodePoint < 0xD800 || tempCodePoint > 0xDFFF)) {\n              codePoint = tempCodePoint\n            }\n          }\n          break\n        case 4:\n          secondByte = buf[i + 1]\n          thirdByte = buf[i + 2]\n          fourthByte = buf[i + 3]\n          if ((secondByte & 0xC0) === 0x80 && (thirdByte & 0xC0) === 0x80 && (fourthByte & 0xC0) === 0x80) {\n            tempCodePoint = (firstByte & 0xF) << 0x12 | (secondByte & 0x3F) << 0xC | (thirdByte & 0x3F) << 0x6 | (fourthByte & 0x3F)\n            if (tempCodePoint > 0xFFFF && tempCodePoint < 0x110000) {\n              codePoint = tempCodePoint\n            }\n          }\n      }\n    }\n\n    if (codePoint === null) {\n      // we did not generate a valid codePoint so insert a\n      // replacement char (U+FFFD) and advance only 1 byte\n      codePoint = 0xFFFD\n      bytesPerSequence = 1\n    } else if (codePoint > 0xFFFF) {\n      // encode to utf16 (surrogate pair dance)\n      codePoint -= 0x10000\n      res.push(codePoint >>> 10 & 0x3FF | 0xD800)\n      codePoint = 0xDC00 | codePoint & 0x3FF\n    }\n\n    res.push(codePoint)\n    i += bytesPerSequence\n  }\n\n  return decodeCodePointsArray(res)\n}\n\n// Based on http://stackoverflow.com/a/22747272/680742, the browser with\n// the lowest limit is Chrome, with 0x10000 args.\n// We go 1 magnitude less, for safety\nvar MAX_ARGUMENTS_LENGTH = 0x1000\n\nfunction decodeCodePointsArray (codePoints) {\n  var len = codePoints.length\n  if (len <= MAX_ARGUMENTS_LENGTH) {\n    return String.fromCharCode.apply(String, codePoints) // avoid extra slice()\n  }\n\n  // Decode in chunks to avoid \"call stack size exceeded\".\n  var res = ''\n  var i = 0\n  while (i < len) {\n    res += String.fromCharCode.apply(\n      String,\n      codePoints.slice(i, i += MAX_ARGUMENTS_LENGTH)\n    )\n  }\n  return res\n}\n\nfunction asciiSlice (buf, start, end) {\n  var ret = ''\n  end = Math.min(buf.length, end)\n\n  for (var i = start; i < end; ++i) {\n    ret += String.fromCharCode(buf[i] & 0x7F)\n  }\n  return ret\n}\n\nfunction latin1Slice (buf, start, end) {\n  var ret = ''\n  end = Math.min(buf.length, end)\n\n  for (var i = start; i < end; ++i) {\n    ret += String.fromCharCode(buf[i])\n  }\n  return ret\n}\n\nfunction hexSlice (buf, start, end) {\n  var len = buf.length\n\n  if (!start || start < 0) start = 0\n  if (!end || end < 0 || end > len) end = len\n\n  var out = ''\n  for (var i = start; i < end; ++i) {\n    out += toHex(buf[i])\n  }\n  return out\n}\n\nfunction utf16leSlice (buf, start, end) {\n  var bytes = buf.slice(start, end)\n  var res = ''\n  for (var i = 0; i < bytes.length; i += 2) {\n    res += String.fromCharCode(bytes[i] + bytes[i + 1] * 256)\n  }\n  return res\n}\n\nBuffer.prototype.slice = function slice (start, end) {\n  var len = this.length\n  start = ~~start\n  end = end === undefined ? len : ~~end\n\n  if (start < 0) {\n    start += len\n    if (start < 0) start = 0\n  } else if (start > len) {\n    start = len\n  }\n\n  if (end < 0) {\n    end += len\n    if (end < 0) end = 0\n  } else if (end > len) {\n    end = len\n  }\n\n  if (end < start) end = start\n\n  var newBuf\n  if (Buffer.TYPED_ARRAY_SUPPORT) {\n    newBuf = this.subarray(start, end)\n    newBuf.__proto__ = Buffer.prototype\n  } else {\n    var sliceLen = end - start\n    newBuf = new Buffer(sliceLen, undefined)\n    for (var i = 0; i < sliceLen; ++i) {\n      newBuf[i] = this[i + start]\n    }\n  }\n\n  return newBuf\n}\n\n/*\n * Need to make sure that buffer isn't trying to write out of bounds.\n */\nfunction checkOffset (offset, ext, length) {\n  if ((offset % 1) !== 0 || offset < 0) throw new RangeError('offset is not uint')\n  if (offset + ext > length) throw new RangeError('Trying to access beyond buffer length')\n}\n\nBuffer.prototype.readUIntLE = function readUIntLE (offset, byteLength, noAssert) {\n  offset = offset | 0\n  byteLength = byteLength | 0\n  if (!noAssert) checkOffset(offset, byteLength, this.length)\n\n  var val = this[offset]\n  var mul = 1\n  var i = 0\n  while (++i < byteLength && (mul *= 0x100)) {\n    val += this[offset + i] * mul\n  }\n\n  return val\n}\n\nBuffer.prototype.readUIntBE = function readUIntBE (offset, byteLength, noAssert) {\n  offset = offset | 0\n  byteLength = byteLength | 0\n  if (!noAssert) {\n    checkOffset(offset, byteLength, this.length)\n  }\n\n  var val = this[offset + --byteLength]\n  var mul = 1\n  while (byteLength > 0 && (mul *= 0x100)) {\n    val += this[offset + --byteLength] * mul\n  }\n\n  return val\n}\n\nBuffer.prototype.readUInt8 = function readUInt8 (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 1, this.length)\n  return this[offset]\n}\n\nBuffer.prototype.readUInt16LE = function readUInt16LE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 2, this.length)\n  return this[offset] | (this[offset + 1] << 8)\n}\n\nBuffer.prototype.readUInt16BE = function readUInt16BE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 2, this.length)\n  return (this[offset] << 8) | this[offset + 1]\n}\n\nBuffer.prototype.readUInt32LE = function readUInt32LE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 4, this.length)\n\n  return ((this[offset]) |\n      (this[offset + 1] << 8) |\n      (this[offset + 2] << 16)) +\n      (this[offset + 3] * 0x1000000)\n}\n\nBuffer.prototype.readUInt32BE = function readUInt32BE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 4, this.length)\n\n  return (this[offset] * 0x1000000) +\n    ((this[offset + 1] << 16) |\n    (this[offset + 2] << 8) |\n    this[offset + 3])\n}\n\nBuffer.prototype.readIntLE = function readIntLE (offset, byteLength, noAssert) {\n  offset = offset | 0\n  byteLength = byteLength | 0\n  if (!noAssert) checkOffset(offset, byteLength, this.length)\n\n  var val = this[offset]\n  var mul = 1\n  var i = 0\n  while (++i < byteLength && (mul *= 0x100)) {\n    val += this[offset + i] * mul\n  }\n  mul *= 0x80\n\n  if (val >= mul) val -= Math.pow(2, 8 * byteLength)\n\n  return val\n}\n\nBuffer.prototype.readIntBE = function readIntBE (offset, byteLength, noAssert) {\n  offset = offset | 0\n  byteLength = byteLength | 0\n  if (!noAssert) checkOffset(offset, byteLength, this.length)\n\n  var i = byteLength\n  var mul = 1\n  var val = this[offset + --i]\n  while (i > 0 && (mul *= 0x100)) {\n    val += this[offset + --i] * mul\n  }\n  mul *= 0x80\n\n  if (val >= mul) val -= Math.pow(2, 8 * byteLength)\n\n  return val\n}\n\nBuffer.prototype.readInt8 = function readInt8 (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 1, this.length)\n  if (!(this[offset] & 0x80)) return (this[offset])\n  return ((0xff - this[offset] + 1) * -1)\n}\n\nBuffer.prototype.readInt16LE = function readInt16LE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 2, this.length)\n  var val = this[offset] | (this[offset + 1] << 8)\n  return (val & 0x8000) ? val | 0xFFFF0000 : val\n}\n\nBuffer.prototype.readInt16BE = function readInt16BE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 2, this.length)\n  var val = this[offset + 1] | (this[offset] << 8)\n  return (val & 0x8000) ? val | 0xFFFF0000 : val\n}\n\nBuffer.prototype.readInt32LE = function readInt32LE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 4, this.length)\n\n  return (this[offset]) |\n    (this[offset + 1] << 8) |\n    (this[offset + 2] << 16) |\n    (this[offset + 3] << 24)\n}\n\nBuffer.prototype.readInt32BE = function readInt32BE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 4, this.length)\n\n  return (this[offset] << 24) |\n    (this[offset + 1] << 16) |\n    (this[offset + 2] << 8) |\n    (this[offset + 3])\n}\n\nBuffer.prototype.readFloatLE = function readFloatLE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 4, this.length)\n  return ieee754.read(this, offset, true, 23, 4)\n}\n\nBuffer.prototype.readFloatBE = function readFloatBE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 4, this.length)\n  return ieee754.read(this, offset, false, 23, 4)\n}\n\nBuffer.prototype.readDoubleLE = function readDoubleLE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 8, this.length)\n  return ieee754.read(this, offset, true, 52, 8)\n}\n\nBuffer.prototype.readDoubleBE = function readDoubleBE (offset, noAssert) {\n  if (!noAssert) checkOffset(offset, 8, this.length)\n  return ieee754.read(this, offset, false, 52, 8)\n}\n\nfunction checkInt (buf, value, offset, ext, max, min) {\n  if (!Buffer.isBuffer(buf)) throw new TypeError('\"buffer\" argument must be a Buffer instance')\n  if (value > max || value < min) throw new RangeError('\"value\" argument is out of bounds')\n  if (offset + ext > buf.length) throw new RangeError('Index out of range')\n}\n\nBuffer.prototype.writeUIntLE = function writeUIntLE (value, offset, byteLength, noAssert) {\n  value = +value\n  offset = offset | 0\n  byteLength = byteLength | 0\n  if (!noAssert) {\n    var maxBytes = Math.pow(2, 8 * byteLength) - 1\n    checkInt(this, value, offset, byteLength, maxBytes, 0)\n  }\n\n  var mul = 1\n  var i = 0\n  this[offset] = value & 0xFF\n  while (++i < byteLength && (mul *= 0x100)) {\n    this[offset + i] = (value / mul) & 0xFF\n  }\n\n  return offset + byteLength\n}\n\nBuffer.prototype.writeUIntBE = function writeUIntBE (value, offset, byteLength, noAssert) {\n  value = +value\n  offset = offset | 0\n  byteLength = byteLength | 0\n  if (!noAssert) {\n    var maxBytes = Math.pow(2, 8 * byteLength) - 1\n    checkInt(this, value, offset, byteLength, maxBytes, 0)\n  }\n\n  var i = byteLength - 1\n  var mul = 1\n  this[offset + i] = value & 0xFF\n  while (--i >= 0 && (mul *= 0x100)) {\n    this[offset + i] = (value / mul) & 0xFF\n  }\n\n  return offset + byteLength\n}\n\nBuffer.prototype.writeUInt8 = function writeUInt8 (value, offset, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) checkInt(this, value, offset, 1, 0xff, 0)\n  if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value)\n  this[offset] = (value & 0xff)\n  return offset + 1\n}\n\nfunction objectWriteUInt16 (buf, value, offset, littleEndian) {\n  if (value < 0) value = 0xffff + value + 1\n  for (var i = 0, j = Math.min(buf.length - offset, 2); i < j; ++i) {\n    buf[offset + i] = (value & (0xff << (8 * (littleEndian ? i : 1 - i)))) >>>\n      (littleEndian ? i : 1 - i) * 8\n  }\n}\n\nBuffer.prototype.writeUInt16LE = function writeUInt16LE (value, offset, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)\n  if (Buffer.TYPED_ARRAY_SUPPORT) {\n    this[offset] = (value & 0xff)\n    this[offset + 1] = (value >>> 8)\n  } else {\n    objectWriteUInt16(this, value, offset, true)\n  }\n  return offset + 2\n}\n\nBuffer.prototype.writeUInt16BE = function writeUInt16BE (value, offset, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) checkInt(this, value, offset, 2, 0xffff, 0)\n  if (Buffer.TYPED_ARRAY_SUPPORT) {\n    this[offset] = (value >>> 8)\n    this[offset + 1] = (value & 0xff)\n  } else {\n    objectWriteUInt16(this, value, offset, false)\n  }\n  return offset + 2\n}\n\nfunction objectWriteUInt32 (buf, value, offset, littleEndian) {\n  if (value < 0) value = 0xffffffff + value + 1\n  for (var i = 0, j = Math.min(buf.length - offset, 4); i < j; ++i) {\n    buf[offset + i] = (value >>> (littleEndian ? i : 3 - i) * 8) & 0xff\n  }\n}\n\nBuffer.prototype.writeUInt32LE = function writeUInt32LE (value, offset, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)\n  if (Buffer.TYPED_ARRAY_SUPPORT) {\n    this[offset + 3] = (value >>> 24)\n    this[offset + 2] = (value >>> 16)\n    this[offset + 1] = (value >>> 8)\n    this[offset] = (value & 0xff)\n  } else {\n    objectWriteUInt32(this, value, offset, true)\n  }\n  return offset + 4\n}\n\nBuffer.prototype.writeUInt32BE = function writeUInt32BE (value, offset, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) checkInt(this, value, offset, 4, 0xffffffff, 0)\n  if (Buffer.TYPED_ARRAY_SUPPORT) {\n    this[offset] = (value >>> 24)\n    this[offset + 1] = (value >>> 16)\n    this[offset + 2] = (value >>> 8)\n    this[offset + 3] = (value & 0xff)\n  } else {\n    objectWriteUInt32(this, value, offset, false)\n  }\n  return offset + 4\n}\n\nBuffer.prototype.writeIntLE = function writeIntLE (value, offset, byteLength, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) {\n    var limit = Math.pow(2, 8 * byteLength - 1)\n\n    checkInt(this, value, offset, byteLength, limit - 1, -limit)\n  }\n\n  var i = 0\n  var mul = 1\n  var sub = 0\n  this[offset] = value & 0xFF\n  while (++i < byteLength && (mul *= 0x100)) {\n    if (value < 0 && sub === 0 && this[offset + i - 1] !== 0) {\n      sub = 1\n    }\n    this[offset + i] = ((value / mul) >> 0) - sub & 0xFF\n  }\n\n  return offset + byteLength\n}\n\nBuffer.prototype.writeIntBE = function writeIntBE (value, offset, byteLength, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) {\n    var limit = Math.pow(2, 8 * byteLength - 1)\n\n    checkInt(this, value, offset, byteLength, limit - 1, -limit)\n  }\n\n  var i = byteLength - 1\n  var mul = 1\n  var sub = 0\n  this[offset + i] = value & 0xFF\n  while (--i >= 0 && (mul *= 0x100)) {\n    if (value < 0 && sub === 0 && this[offset + i + 1] !== 0) {\n      sub = 1\n    }\n    this[offset + i] = ((value / mul) >> 0) - sub & 0xFF\n  }\n\n  return offset + byteLength\n}\n\nBuffer.prototype.writeInt8 = function writeInt8 (value, offset, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) checkInt(this, value, offset, 1, 0x7f, -0x80)\n  if (!Buffer.TYPED_ARRAY_SUPPORT) value = Math.floor(value)\n  if (value < 0) value = 0xff + value + 1\n  this[offset] = (value & 0xff)\n  return offset + 1\n}\n\nBuffer.prototype.writeInt16LE = function writeInt16LE (value, offset, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)\n  if (Buffer.TYPED_ARRAY_SUPPORT) {\n    this[offset] = (value & 0xff)\n    this[offset + 1] = (value >>> 8)\n  } else {\n    objectWriteUInt16(this, value, offset, true)\n  }\n  return offset + 2\n}\n\nBuffer.prototype.writeInt16BE = function writeInt16BE (value, offset, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) checkInt(this, value, offset, 2, 0x7fff, -0x8000)\n  if (Buffer.TYPED_ARRAY_SUPPORT) {\n    this[offset] = (value >>> 8)\n    this[offset + 1] = (value & 0xff)\n  } else {\n    objectWriteUInt16(this, value, offset, false)\n  }\n  return offset + 2\n}\n\nBuffer.prototype.writeInt32LE = function writeInt32LE (value, offset, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)\n  if (Buffer.TYPED_ARRAY_SUPPORT) {\n    this[offset] = (value & 0xff)\n    this[offset + 1] = (value >>> 8)\n    this[offset + 2] = (value >>> 16)\n    this[offset + 3] = (value >>> 24)\n  } else {\n    objectWriteUInt32(this, value, offset, true)\n  }\n  return offset + 4\n}\n\nBuffer.prototype.writeInt32BE = function writeInt32BE (value, offset, noAssert) {\n  value = +value\n  offset = offset | 0\n  if (!noAssert) checkInt(this, value, offset, 4, 0x7fffffff, -0x80000000)\n  if (value < 0) value = 0xffffffff + value + 1\n  if (Buffer.TYPED_ARRAY_SUPPORT) {\n    this[offset] = (value >>> 24)\n    this[offset + 1] = (value >>> 16)\n    this[offset + 2] = (value >>> 8)\n    this[offset + 3] = (value & 0xff)\n  } else {\n    objectWriteUInt32(this, value, offset, false)\n  }\n  return offset + 4\n}\n\nfunction checkIEEE754 (buf, value, offset, ext, max, min) {\n  if (offset + ext > buf.length) throw new RangeError('Index out of range')\n  if (offset < 0) throw new RangeError('Index out of range')\n}\n\nfunction writeFloat (buf, value, offset, littleEndian, noAssert) {\n  if (!noAssert) {\n    checkIEEE754(buf, value, offset, 4, 3.4028234663852886e+38, -3.4028234663852886e+38)\n  }\n  ieee754.write(buf, value, offset, littleEndian, 23, 4)\n  return offset + 4\n}\n\nBuffer.prototype.writeFloatLE = function writeFloatLE (value, offset, noAssert) {\n  return writeFloat(this, value, offset, true, noAssert)\n}\n\nBuffer.prototype.writeFloatBE = function writeFloatBE (value, offset, noAssert) {\n  return writeFloat(this, value, offset, false, noAssert)\n}\n\nfunction writeDouble (buf, value, offset, littleEndian, noAssert) {\n  if (!noAssert) {\n    checkIEEE754(buf, value, offset, 8, 1.7976931348623157E+308, -1.7976931348623157E+308)\n  }\n  ieee754.write(buf, value, offset, littleEndian, 52, 8)\n  return offset + 8\n}\n\nBuffer.prototype.writeDoubleLE = function writeDoubleLE (value, offset, noAssert) {\n  return writeDouble(this, value, offset, true, noAssert)\n}\n\nBuffer.prototype.writeDoubleBE = function writeDoubleBE (value, offset, noAssert) {\n  return writeDouble(this, value, offset, false, noAssert)\n}\n\n// copy(targetBuffer, targetStart=0, sourceStart=0, sourceEnd=buffer.length)\nBuffer.prototype.copy = function copy (target, targetStart, start, end) {\n  if (!start) start = 0\n  if (!end && end !== 0) end = this.length\n  if (targetStart >= target.length) targetStart = target.length\n  if (!targetStart) targetStart = 0\n  if (end > 0 && end < start) end = start\n\n  // Copy 0 bytes; we're done\n  if (end === start) return 0\n  if (target.length === 0 || this.length === 0) return 0\n\n  // Fatal error conditions\n  if (targetStart < 0) {\n    throw new RangeError('targetStart out of bounds')\n  }\n  if (start < 0 || start >= this.length) throw new RangeError('sourceStart out of bounds')\n  if (end < 0) throw new RangeError('sourceEnd out of bounds')\n\n  // Are we oob?\n  if (end > this.length) end = this.length\n  if (target.length - targetStart < end - start) {\n    end = target.length - targetStart + start\n  }\n\n  var len = end - start\n  var i\n\n  if (this === target && start < targetStart && targetStart < end) {\n    // descending copy from end\n    for (i = len - 1; i >= 0; --i) {\n      target[i + targetStart] = this[i + start]\n    }\n  } else if (len < 1000 || !Buffer.TYPED_ARRAY_SUPPORT) {\n    // ascending copy from start\n    for (i = 0; i < len; ++i) {\n      target[i + targetStart] = this[i + start]\n    }\n  } else {\n    Uint8Array.prototype.set.call(\n      target,\n      this.subarray(start, start + len),\n      targetStart\n    )\n  }\n\n  return len\n}\n\n// Usage:\n//    buffer.fill(number[, offset[, end]])\n//    buffer.fill(buffer[, offset[, end]])\n//    buffer.fill(string[, offset[, end]][, encoding])\nBuffer.prototype.fill = function fill (val, start, end, encoding) {\n  // Handle string cases:\n  if (typeof val === 'string') {\n    if (typeof start === 'string') {\n      encoding = start\n      start = 0\n      end = this.length\n    } else if (typeof end === 'string') {\n      encoding = end\n      end = this.length\n    }\n    if (val.length === 1) {\n      var code = val.charCodeAt(0)\n      if (code < 256) {\n        val = code\n      }\n    }\n    if (encoding !== undefined && typeof encoding !== 'string') {\n      throw new TypeError('encoding must be a string')\n    }\n    if (typeof encoding === 'string' && !Buffer.isEncoding(encoding)) {\n      throw new TypeError('Unknown encoding: ' + encoding)\n    }\n  } else if (typeof val === 'number') {\n    val = val & 255\n  }\n\n  // Invalid ranges are not set to a default, so can range check early.\n  if (start < 0 || this.length < start || this.length < end) {\n    throw new RangeError('Out of range index')\n  }\n\n  if (end <= start) {\n    return this\n  }\n\n  start = start >>> 0\n  end = end === undefined ? this.length : end >>> 0\n\n  if (!val) val = 0\n\n  var i\n  if (typeof val === 'number') {\n    for (i = start; i < end; ++i) {\n      this[i] = val\n    }\n  } else {\n    var bytes = Buffer.isBuffer(val)\n      ? val\n      : utf8ToBytes(new Buffer(val, encoding).toString())\n    var len = bytes.length\n    for (i = 0; i < end - start; ++i) {\n      this[i + start] = bytes[i % len]\n    }\n  }\n\n  return this\n}\n\n// HELPER FUNCTIONS\n// ================\n\nvar INVALID_BASE64_RE = /[^+\\/0-9A-Za-z-_]/g\n\nfunction base64clean (str) {\n  // Node strips out invalid characters like \\n and \\t from the string, base64-js does not\n  str = stringtrim(str).replace(INVALID_BASE64_RE, '')\n  // Node converts strings with length < 2 to ''\n  if (str.length < 2) return ''\n  // Node allows for non-padded base64 strings (missing trailing ===), base64-js does not\n  while (str.length % 4 !== 0) {\n    str = str + '='\n  }\n  return str\n}\n\nfunction stringtrim (str) {\n  if (str.trim) return str.trim()\n  return str.replace(/^\\s+|\\s+$/g, '')\n}\n\nfunction toHex (n) {\n  if (n < 16) return '0' + n.toString(16)\n  return n.toString(16)\n}\n\nfunction utf8ToBytes (string, units) {\n  units = units || Infinity\n  var codePoint\n  var length = string.length\n  var leadSurrogate = null\n  var bytes = []\n\n  for (var i = 0; i < length; ++i) {\n    codePoint = string.charCodeAt(i)\n\n    // is surrogate component\n    if (codePoint > 0xD7FF && codePoint < 0xE000) {\n      // last char was a lead\n      if (!leadSurrogate) {\n        // no lead yet\n        if (codePoint > 0xDBFF) {\n          // unexpected trail\n          if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n          continue\n        } else if (i + 1 === length) {\n          // unpaired lead\n          if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n          continue\n        }\n\n        // valid lead\n        leadSurrogate = codePoint\n\n        continue\n      }\n\n      // 2 leads in a row\n      if (codePoint < 0xDC00) {\n        if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n        leadSurrogate = codePoint\n        continue\n      }\n\n      // valid surrogate pair\n      codePoint = (leadSurrogate - 0xD800 << 10 | codePoint - 0xDC00) + 0x10000\n    } else if (leadSurrogate) {\n      // valid bmp char, but last char was a lead\n      if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)\n    }\n\n    leadSurrogate = null\n\n    // encode utf8\n    if (codePoint < 0x80) {\n      if ((units -= 1) < 0) break\n      bytes.push(codePoint)\n    } else if (codePoint < 0x800) {\n      if ((units -= 2) < 0) break\n      bytes.push(\n        codePoint >> 0x6 | 0xC0,\n        codePoint & 0x3F | 0x80\n      )\n    } else if (codePoint < 0x10000) {\n      if ((units -= 3) < 0) break\n      bytes.push(\n        codePoint >> 0xC | 0xE0,\n        codePoint >> 0x6 & 0x3F | 0x80,\n        codePoint & 0x3F | 0x80\n      )\n    } else if (codePoint < 0x110000) {\n      if ((units -= 4) < 0) break\n      bytes.push(\n        codePoint >> 0x12 | 0xF0,\n        codePoint >> 0xC & 0x3F | 0x80,\n        codePoint >> 0x6 & 0x3F | 0x80,\n        codePoint & 0x3F | 0x80\n      )\n    } else {\n      throw new Error('Invalid code point')\n    }\n  }\n\n  return bytes\n}\n\nfunction asciiToBytes (str) {\n  var byteArray = []\n  for (var i = 0; i < str.length; ++i) {\n    // Node's code seems to be doing this and not & 0x7F..\n    byteArray.push(str.charCodeAt(i) & 0xFF)\n  }\n  return byteArray\n}\n\nfunction utf16leToBytes (str, units) {\n  var c, hi, lo\n  var byteArray = []\n  for (var i = 0; i < str.length; ++i) {\n    if ((units -= 2) < 0) break\n\n    c = str.charCodeAt(i)\n    hi = c >> 8\n    lo = c % 256\n    byteArray.push(lo)\n    byteArray.push(hi)\n  }\n\n  return byteArray\n}\n\nfunction base64ToBytes (str) {\n  return base64.toByteArray(base64clean(str))\n}\n\nfunction blitBuffer (src, dst, offset, length) {\n  for (var i = 0; i < length; ++i) {\n    if ((i + offset >= dst.length) || (i >= src.length)) break\n    dst[i + offset] = src[i]\n  }\n  return i\n}\n\nfunction isnan (val) {\n  return val !== val // eslint-disable-line no-self-compare\n}\n","'use strict'\n\nexports.byteLength = byteLength\nexports.toByteArray = toByteArray\nexports.fromByteArray = fromByteArray\n\nvar lookup = []\nvar revLookup = []\nvar Arr = typeof Uint8Array !== 'undefined' ? Uint8Array : Array\n\nvar code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'\nfor (var i = 0, len = code.length; i < len; ++i) {\n  lookup[i] = code[i]\n  revLookup[code.charCodeAt(i)] = i\n}\n\n// Support decoding URL-safe base64 strings, as Node.js does.\n// See: https://en.wikipedia.org/wiki/Base64#URL_applications\nrevLookup['-'.charCodeAt(0)] = 62\nrevLookup['_'.charCodeAt(0)] = 63\n\nfunction getLens (b64) {\n  var len = b64.length\n\n  if (len % 4 > 0) {\n    throw new Error('Invalid string. Length must be a multiple of 4')\n  }\n\n  // Trim off extra bytes after placeholder bytes are found\n  // See: https://github.com/beatgammit/base64-js/issues/42\n  var validLen = b64.indexOf('=')\n  if (validLen === -1) validLen = len\n\n  var placeHoldersLen = validLen === len\n    ? 0\n    : 4 - (validLen % 4)\n\n  return [validLen, placeHoldersLen]\n}\n\n// base64 is 4/3 + up to two characters of the original data\nfunction byteLength (b64) {\n  var lens = getLens(b64)\n  var validLen = lens[0]\n  var placeHoldersLen = lens[1]\n  return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen\n}\n\nfunction _byteLength (b64, validLen, placeHoldersLen) {\n  return ((validLen + placeHoldersLen) * 3 / 4) - placeHoldersLen\n}\n\nfunction toByteArray (b64) {\n  var tmp\n  var lens = getLens(b64)\n  var validLen = lens[0]\n  var placeHoldersLen = lens[1]\n\n  var arr = new Arr(_byteLength(b64, validLen, placeHoldersLen))\n\n  var curByte = 0\n\n  // if there are placeholders, only get up to the last complete 4 chars\n  var len = placeHoldersLen > 0\n    ? validLen - 4\n    : validLen\n\n  var i\n  for (i = 0; i < len; i += 4) {\n    tmp =\n      (revLookup[b64.charCodeAt(i)] << 18) |\n      (revLookup[b64.charCodeAt(i + 1)] << 12) |\n      (revLookup[b64.charCodeAt(i + 2)] << 6) |\n      revLookup[b64.charCodeAt(i + 3)]\n    arr[curByte++] = (tmp >> 16) & 0xFF\n    arr[curByte++] = (tmp >> 8) & 0xFF\n    arr[curByte++] = tmp & 0xFF\n  }\n\n  if (placeHoldersLen === 2) {\n    tmp =\n      (revLookup[b64.charCodeAt(i)] << 2) |\n      (revLookup[b64.charCodeAt(i + 1)] >> 4)\n    arr[curByte++] = tmp & 0xFF\n  }\n\n  if (placeHoldersLen === 1) {\n    tmp =\n      (revLookup[b64.charCodeAt(i)] << 10) |\n      (revLookup[b64.charCodeAt(i + 1)] << 4) |\n      (revLookup[b64.charCodeAt(i + 2)] >> 2)\n    arr[curByte++] = (tmp >> 8) & 0xFF\n    arr[curByte++] = tmp & 0xFF\n  }\n\n  return arr\n}\n\nfunction tripletToBase64 (num) {\n  return lookup[num >> 18 & 0x3F] +\n    lookup[num >> 12 & 0x3F] +\n    lookup[num >> 6 & 0x3F] +\n    lookup[num & 0x3F]\n}\n\nfunction encodeChunk (uint8, start, end) {\n  var tmp\n  var output = []\n  for (var i = start; i < end; i += 3) {\n    tmp =\n      ((uint8[i] << 16) & 0xFF0000) +\n      ((uint8[i + 1] << 8) & 0xFF00) +\n      (uint8[i + 2] & 0xFF)\n    output.push(tripletToBase64(tmp))\n  }\n  return output.join('')\n}\n\nfunction fromByteArray (uint8) {\n  var tmp\n  var len = uint8.length\n  var extraBytes = len % 3 // if we have 1 byte left, pad 2 bytes\n  var parts = []\n  var maxChunkLength = 16383 // must be multiple of 3\n\n  // go through the array every three bytes, we'll deal with trailing stuff later\n  for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) {\n    parts.push(encodeChunk(\n      uint8, i, (i + maxChunkLength) > len2 ? len2 : (i + maxChunkLength)\n    ))\n  }\n\n  // pad the end with zeros, but make sure to not forget the extra bytes\n  if (extraBytes === 1) {\n    tmp = uint8[len - 1]\n    parts.push(\n      lookup[tmp >> 2] +\n      lookup[(tmp << 4) & 0x3F] +\n      '=='\n    )\n  } else if (extraBytes === 2) {\n    tmp = (uint8[len - 2] << 8) + uint8[len - 1]\n    parts.push(\n      lookup[tmp >> 10] +\n      lookup[(tmp >> 4) & 0x3F] +\n      lookup[(tmp << 2) & 0x3F] +\n      '='\n    )\n  }\n\n  return parts.join('')\n}\n","exports.read = function (buffer, offset, isLE, mLen, nBytes) {\n  var e, m\n  var eLen = (nBytes * 8) - mLen - 1\n  var eMax = (1 << eLen) - 1\n  var eBias = eMax >> 1\n  var nBits = -7\n  var i = isLE ? (nBytes - 1) : 0\n  var d = isLE ? -1 : 1\n  var s = buffer[offset + i]\n\n  i += d\n\n  e = s & ((1 << (-nBits)) - 1)\n  s >>= (-nBits)\n  nBits += eLen\n  for (; nBits > 0; e = (e * 256) + buffer[offset + i], i += d, nBits -= 8) {}\n\n  m = e & ((1 << (-nBits)) - 1)\n  e >>= (-nBits)\n  nBits += mLen\n  for (; nBits > 0; m = (m * 256) + buffer[offset + i], i += d, nBits -= 8) {}\n\n  if (e === 0) {\n    e = 1 - eBias\n  } else if (e === eMax) {\n    return m ? NaN : ((s ? -1 : 1) * Infinity)\n  } else {\n    m = m + Math.pow(2, mLen)\n    e = e - eBias\n  }\n  return (s ? -1 : 1) * m * Math.pow(2, e - mLen)\n}\n\nexports.write = function (buffer, value, offset, isLE, mLen, nBytes) {\n  var e, m, c\n  var eLen = (nBytes * 8) - mLen - 1\n  var eMax = (1 << eLen) - 1\n  var eBias = eMax >> 1\n  var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0)\n  var i = isLE ? 0 : (nBytes - 1)\n  var d = isLE ? 1 : -1\n  var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0\n\n  value = Math.abs(value)\n\n  if (isNaN(value) || value === Infinity) {\n    m = isNaN(value) ? 1 : 0\n    e = eMax\n  } else {\n    e = Math.floor(Math.log(value) / Math.LN2)\n    if (value * (c = Math.pow(2, -e)) < 1) {\n      e--\n      c *= 2\n    }\n    if (e + eBias >= 1) {\n      value += rt / c\n    } else {\n      value += rt * Math.pow(2, 1 - eBias)\n    }\n    if (value * c >= 2) {\n      e++\n      c /= 2\n    }\n\n    if (e + eBias >= eMax) {\n      m = 0\n      e = eMax\n    } else if (e + eBias >= 1) {\n      m = ((value * c) - 1) * Math.pow(2, mLen)\n      e = e + eBias\n    } else {\n      m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen)\n      e = 0\n    }\n  }\n\n  for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {}\n\n  e = (e << mLen) | m\n  eLen += mLen\n  for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {}\n\n  buffer[offset + i - d] |= s * 128\n}\n","var toString = {}.toString;\n\nmodule.exports = Array.isArray || function (arr) {\n  return toString.call(arr) == '[object Array]';\n};\n",";(function (root, factory, undef) {\n\tif (typeof exports === \"object\") {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(require(\"./core\"), require(\"./sha1\"), require(\"./hmac\"));\n\t}\n\telse if (typeof define === \"function\" && define.amd) {\n\t\t// AMD\n\t\tdefine([\"./core\", \"./sha1\", \"./hmac\"], factory);\n\t}\n\telse {\n\t\t// Global (browser)\n\t\tfactory(root.CryptoJS);\n\t}\n}(this, function (CryptoJS) {\n\n\treturn CryptoJS.HmacSHA1;\n\n}));",";(function (root, factory) {\n\tif (typeof exports === \"object\") {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(require(\"./core\"));\n\t}\n\telse if (typeof define === \"function\" && define.amd) {\n\t\t// AMD\n\t\tdefine([\"./core\"], factory);\n\t}\n\telse {\n\t\t// Global (browser)\n\t\tfactory(root.CryptoJS);\n\t}\n}(this, function (CryptoJS) {\n\n\t(function () {\n\t    // Shortcuts\n\t    var C = CryptoJS;\n\t    var C_lib = C.lib;\n\t    var WordArray = C_lib.WordArray;\n\t    var Hasher = C_lib.Hasher;\n\t    var C_algo = C.algo;\n\n\t    // Reusable object\n\t    var W = [];\n\n\t    /**\n\t     * SHA-1 hash algorithm.\n\t     */\n\t    var SHA1 = C_algo.SHA1 = Hasher.extend({\n\t        _doReset: function () {\n\t            this._hash = new WordArray.init([\n\t                0x67452301, 0xefcdab89,\n\t                0x98badcfe, 0x10325476,\n\t                0xc3d2e1f0\n\t            ]);\n\t        },\n\n\t        _doProcessBlock: function (M, offset) {\n\t            // Shortcut\n\t            var H = this._hash.words;\n\n\t            // Working variables\n\t            var a = H[0];\n\t            var b = H[1];\n\t            var c = H[2];\n\t            var d = H[3];\n\t            var e = H[4];\n\n\t            // Computation\n\t            for (var i = 0; i < 80; i++) {\n\t                if (i < 16) {\n\t                    W[i] = M[offset + i] | 0;\n\t                } else {\n\t                    var n = W[i - 3] ^ W[i - 8] ^ W[i - 14] ^ W[i - 16];\n\t                    W[i] = (n << 1) | (n >>> 31);\n\t                }\n\n\t                var t = ((a << 5) | (a >>> 27)) + e + W[i];\n\t                if (i < 20) {\n\t                    t += ((b & c) | (~b & d)) + 0x5a827999;\n\t                } else if (i < 40) {\n\t                    t += (b ^ c ^ d) + 0x6ed9eba1;\n\t                } else if (i < 60) {\n\t                    t += ((b & c) | (b & d) | (c & d)) - 0x70e44324;\n\t                } else /* if (i < 80) */ {\n\t                    t += (b ^ c ^ d) - 0x359d3e2a;\n\t                }\n\n\t                e = d;\n\t                d = c;\n\t                c = (b << 30) | (b >>> 2);\n\t                b = a;\n\t                a = t;\n\t            }\n\n\t            // Intermediate hash value\n\t            H[0] = (H[0] + a) | 0;\n\t            H[1] = (H[1] + b) | 0;\n\t            H[2] = (H[2] + c) | 0;\n\t            H[3] = (H[3] + d) | 0;\n\t            H[4] = (H[4] + e) | 0;\n\t        },\n\n\t        _doFinalize: function () {\n\t            // Shortcuts\n\t            var data = this._data;\n\t            var dataWords = data.words;\n\n\t            var nBitsTotal = this._nDataBytes * 8;\n\t            var nBitsLeft = data.sigBytes * 8;\n\n\t            // Add padding\n\t            dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32);\n\t            dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = Math.floor(nBitsTotal / 0x100000000);\n\t            dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 15] = nBitsTotal;\n\t            data.sigBytes = dataWords.length * 4;\n\n\t            // Hash final blocks\n\t            this._process();\n\n\t            // Return final computed hash\n\t            return this._hash;\n\t        },\n\n\t        clone: function () {\n\t            var clone = Hasher.clone.call(this);\n\t            clone._hash = this._hash.clone();\n\n\t            return clone;\n\t        }\n\t    });\n\n\t    /**\n\t     * Shortcut function to the hasher's object interface.\n\t     *\n\t     * @param {WordArray|string} message The message to hash.\n\t     *\n\t     * @return {WordArray} The hash.\n\t     *\n\t     * @static\n\t     *\n\t     * @example\n\t     *\n\t     *     var hash = CryptoJS.SHA1('message');\n\t     *     var hash = CryptoJS.SHA1(wordArray);\n\t     */\n\t    C.SHA1 = Hasher._createHelper(SHA1);\n\n\t    /**\n\t     * Shortcut function to the HMAC's object interface.\n\t     *\n\t     * @param {WordArray|string} message The message to hash.\n\t     * @param {WordArray|string} key The secret key.\n\t     *\n\t     * @return {WordArray} The HMAC.\n\t     *\n\t     * @static\n\t     *\n\t     * @example\n\t     *\n\t     *     var hmac = CryptoJS.HmacSHA1(message, key);\n\t     */\n\t    C.HmacSHA1 = Hasher._createHmacHelper(SHA1);\n\t}());\n\n\n\treturn CryptoJS.SHA1;\n\n}));",";(function (root, factory, undef) {\n\tif (typeof exports === \"object\") {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(require(\"./core\"), require(\"./sha256\"), require(\"./hmac\"));\n\t}\n\telse if (typeof define === \"function\" && define.amd) {\n\t\t// AMD\n\t\tdefine([\"./core\", \"./sha256\", \"./hmac\"], factory);\n\t}\n\telse {\n\t\t// Global (browser)\n\t\tfactory(root.CryptoJS);\n\t}\n}(this, function (CryptoJS) {\n\n\treturn CryptoJS.HmacSHA256;\n\n}));",";(function (root, factory) {\n\tif (typeof exports === \"object\") {\n\t\t// CommonJS\n\t\tmodule.exports = exports = factory(require(\"./core\"));\n\t}\n\telse if (typeof define === \"function\" && define.amd) {\n\t\t// AMD\n\t\tdefine([\"./core\"], factory);\n\t}\n\telse {\n\t\t// Global (browser)\n\t\tfactory(root.CryptoJS);\n\t}\n}(this, function (CryptoJS) {\n\n\t(function (Math) {\n\t    // Shortcuts\n\t    var C = CryptoJS;\n\t    var C_lib = C.lib;\n\t    var WordArray = C_lib.WordArray;\n\t    var Hasher = C_lib.Hasher;\n\t    var C_algo = C.algo;\n\n\t    // Initialization and round constants tables\n\t    var H = [];\n\t    var K = [];\n\n\t    // Compute constants\n\t    (function () {\n\t        function isPrime(n) {\n\t            var sqrtN = Math.sqrt(n);\n\t            for (var factor = 2; factor <= sqrtN; factor++) {\n\t                if (!(n % factor)) {\n\t                    return false;\n\t                }\n\t            }\n\n\t            return true;\n\t        }\n\n\t        function getFractionalBits(n) {\n\t            return ((n - (n | 0)) * 0x100000000) | 0;\n\t        }\n\n\t        var n = 2;\n\t        var nPrime = 0;\n\t        while (nPrime < 64) {\n\t            if (isPrime(n)) {\n\t                if (nPrime < 8) {\n\t                    H[nPrime] = getFractionalBits(Math.pow(n, 1 / 2));\n\t                }\n\t                K[nPrime] = getFractionalBits(Math.pow(n, 1 / 3));\n\n\t                nPrime++;\n\t            }\n\n\t            n++;\n\t        }\n\t    }());\n\n\t    // Reusable object\n\t    var W = [];\n\n\t    /**\n\t     * SHA-256 hash algorithm.\n\t     */\n\t    var SHA256 = C_algo.SHA256 = Hasher.extend({\n\t        _doReset: function () {\n\t            this._hash = new WordArray.init(H.slice(0));\n\t        },\n\n\t        _doProcessBlock: function (M, offset) {\n\t            // Shortcut\n\t            var H = this._hash.words;\n\n\t            // Working variables\n\t            var a = H[0];\n\t            var b = H[1];\n\t            var c = H[2];\n\t            var d = H[3];\n\t            var e = H[4];\n\t            var f = H[5];\n\t            var g = H[6];\n\t            var h = H[7];\n\n\t            // Computation\n\t            for (var i = 0; i < 64; i++) {\n\t                if (i < 16) {\n\t                    W[i] = M[offset + i] | 0;\n\t                } else {\n\t                    var gamma0x = W[i - 15];\n\t                    var gamma0  = ((gamma0x << 25) | (gamma0x >>> 7))  ^\n\t                                  ((gamma0x << 14) | (gamma0x >>> 18)) ^\n\t                                   (gamma0x >>> 3);\n\n\t                    var gamma1x = W[i - 2];\n\t                    var gamma1  = ((gamma1x << 15) | (gamma1x >>> 17)) ^\n\t                                  ((gamma1x << 13) | (gamma1x >>> 19)) ^\n\t                                   (gamma1x >>> 10);\n\n\t                    W[i] = gamma0 + W[i - 7] + gamma1 + W[i - 16];\n\t                }\n\n\t                var ch  = (e & f) ^ (~e & g);\n\t                var maj = (a & b) ^ (a & c) ^ (b & c);\n\n\t                var sigma0 = ((a << 30) | (a >>> 2)) ^ ((a << 19) | (a >>> 13)) ^ ((a << 10) | (a >>> 22));\n\t                var sigma1 = ((e << 26) | (e >>> 6)) ^ ((e << 21) | (e >>> 11)) ^ ((e << 7)  | (e >>> 25));\n\n\t                var t1 = h + sigma1 + ch + K[i] + W[i];\n\t                var t2 = sigma0 + maj;\n\n\t                h = g;\n\t                g = f;\n\t                f = e;\n\t                e = (d + t1) | 0;\n\t                d = c;\n\t                c = b;\n\t                b = a;\n\t                a = (t1 + t2) | 0;\n\t            }\n\n\t            // Intermediate hash value\n\t            H[0] = (H[0] + a) | 0;\n\t            H[1] = (H[1] + b) | 0;\n\t            H[2] = (H[2] + c) | 0;\n\t            H[3] = (H[3] + d) | 0;\n\t            H[4] = (H[4] + e) | 0;\n\t            H[5] = (H[5] + f) | 0;\n\t            H[6] = (H[6] + g) | 0;\n\t            H[7] = (H[7] + h) | 0;\n\t        },\n\n\t        _doFinalize: function () {\n\t            // Shortcuts\n\t            var data = this._data;\n\t            var dataWords = data.words;\n\n\t            var nBitsTotal = this._nDataBytes * 8;\n\t            var nBitsLeft = data.sigBytes * 8;\n\n\t            // Add padding\n\t            dataWords[nBitsLeft >>> 5] |= 0x80 << (24 - nBitsLeft % 32);\n\t            dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 14] = Math.floor(nBitsTotal / 0x100000000);\n\t            dataWords[(((nBitsLeft + 64) >>> 9) << 4) + 15] = nBitsTotal;\n\t            data.sigBytes = dataWords.length * 4;\n\n\t            // Hash final blocks\n\t            this._process();\n\n\t            // Return final computed hash\n\t            return this._hash;\n\t        },\n\n\t        clone: function () {\n\t            var clone = Hasher.clone.call(this);\n\t            clone._hash = this._hash.clone();\n\n\t            return clone;\n\t        }\n\t    });\n\n\t    /**\n\t     * Shortcut function to the hasher's object interface.\n\t     *\n\t     * @param {WordArray|string} message The message to hash.\n\t     *\n\t     * @return {WordArray} The hash.\n\t     *\n\t     * @static\n\t     *\n\t     * @example\n\t     *\n\t     *     var hash = CryptoJS.SHA256('message');\n\t     *     var hash = CryptoJS.SHA256(wordArray);\n\t     */\n\t    C.SHA256 = Hasher._createHelper(SHA256);\n\n\t    /**\n\t     * Shortcut function to the HMAC's object interface.\n\t     *\n\t     * @param {WordArray|string} message The message to hash.\n\t     * @param {WordArray|string} key The secret key.\n\t     *\n\t     * @return {WordArray} The HMAC.\n\t     *\n\t     * @static\n\t     *\n\t     * @example\n\t     *\n\t     *     var hmac = CryptoJS.HmacSHA256(message, key);\n\t     */\n\t    C.HmacSHA256 = Hasher._createHmacHelper(SHA256);\n\t}(Math));\n\n\n\treturn CryptoJS.SHA256;\n\n}));","'use strict'\n\nconst {xml, jid, Client} = require('@xmpp/client-core')\nconst getDomain = require('./lib/getDomain')\n\nconst _reconnect = require('@xmpp/reconnect')\nconst _websocket = require('@xmpp/websocket')\nconst _middleware = require('@xmpp/middleware')\nconst _streamFeatures = require('@xmpp/stream-features')\nconst _iqCaller = require('@xmpp/iq/caller')\nconst _iqCallee = require('@xmpp/iq/callee')\nconst _resolve = require('@xmpp/resolve')\n\n// Stream features - order matters and define priority\nconst _sasl = require('@xmpp/sasl')\nconst _resourceBinding = require('@xmpp/resource-binding')\nconst _sessionEstablishment = require('@xmpp/session-establishment')\n\n// SASL mechanisms - order matters and define priority\nconst anonymous = require('@xmpp/sasl-anonymous')\nconst plain = require('@xmpp/sasl-plain')\n\nfunction client(options = {}) {\n  const {resource, credentials, username, password, ...params} = options\n\n  const {domain, service} = params\n  if (!domain && service) {\n    params.domain = getDomain(service)\n  }\n\n  const entity = new Client(params)\n\n  const reconnect = _reconnect({entity})\n  const websocket = _websocket({entity})\n\n  const middleware = _middleware({entity})\n  const streamFeatures = _streamFeatures({middleware})\n  const iqCaller = _iqCaller({middleware, entity})\n  const iqCallee = _iqCallee({middleware, entity})\n  const resolve = _resolve({entity})\n  // Stream features - order matters and define priority\n  const sasl = _sasl({streamFeatures}, credentials || {username, password})\n  const resourceBinding = _resourceBinding({iqCaller, streamFeatures}, resource)\n  const sessionEstablishment = _sessionEstablishment({iqCaller, streamFeatures})\n  // SASL mechanisms - order matters and define priority\n  const mechanisms = Object.entries({plain, anonymous}).map(([k, v]) => ({\n    [k]: v(sasl),\n  }))\n\n  return Object.assign(entity, {\n    entity,\n    reconnect,\n    websocket,\n    middleware,\n    streamFeatures,\n    iqCaller,\n    iqCallee,\n    resolve,\n    sasl,\n    resourceBinding,\n    sessionEstablishment,\n    mechanisms,\n  })\n}\n\nmodule.exports.xml = xml\nmodule.exports.jid = jid\nmodule.exports.client = client\n","'use strict'\n\nconst Client = require('./lib/Client')\nconst xml = require('@xmpp/xml')\nconst jid = require('@xmpp/jid')\n\nmodule.exports.Client = Client\nmodule.exports.xml = xml\nmodule.exports.jid = jid\n","'use strict'\n\nconst Connection = require('@xmpp/connection')\n\nclass Client extends Connection {\n  constructor(options) {\n    super(options)\n    this.transports = []\n  }\n\n  send(element, ...args) {\n    return this.Transport.prototype.send.call(this, element, ...args)\n  }\n\n  _findTransport(service) {\n    return this.transports.find(Transport => {\n      try {\n        return Transport.prototype.socketParameters(service) !== undefined\n        // eslint-disable-next-line no-unused-vars\n      } catch (err) {\n        return false\n      }\n    })\n  }\n\n  connect(service) {\n    const Transport = this._findTransport(service)\n\n    if (!Transport) {\n      throw new Error('No compatible connection method found.')\n    }\n\n    this.Transport = Transport\n    this.Socket = Transport.prototype.Socket\n    this.Parser = Transport.prototype.Parser\n\n    return super.connect(service)\n  }\n\n  socketParameters(...args) {\n    return this.Transport.prototype.socketParameters(...args)\n  }\n\n  header(...args) {\n    return this.Transport.prototype.header(...args)\n  }\n\n  headerElement(...args) {\n    return this.Transport.prototype.headerElement(...args)\n  }\n\n  footer(...args) {\n    return this.Transport.prototype.footer(...args)\n  }\n\n  footerElement(...args) {\n    return this.Transport.prototype.footerElement(...args)\n  }\n}\n\nClient.prototype.NS = 'jabber:client'\n\nmodule.exports = Client\n","'use strict'\n\nconst TimeoutError = require('./TimeoutError')\nconst delay = require('./delay')\n\nmodule.exports = function timeout(promise, ms) {\n  const promiseDelay = delay(ms)\n\n  // eslint-disable-next-line unicorn/consistent-function-scoping\n  function cancelDelay() {\n    clearTimeout(promiseDelay.timeout)\n  }\n\n  return Promise.race([\n    promise.finally(cancelDelay),\n    promiseDelay.then(() => {\n      throw new TimeoutError()\n    }),\n  ])\n}\n","'use strict'\n\nconst TimeoutError = require('./TimeoutError')\n\n// eslint-disable-next-line default-param-last\nmodule.exports = function promise(EE, event, rejectEvent = 'error', timeout) {\n  return new Promise((resolve, reject) => {\n    let timeoutId\n\n    const cleanup = () => {\n      clearTimeout(timeoutId)\n      EE.removeListener(event, onEvent)\n      EE.removeListener(rejectEvent, onError)\n    }\n\n    function onError(reason) {\n      reject(reason)\n      cleanup()\n    }\n\n    function onEvent(value) {\n      resolve(value)\n      cleanup()\n    }\n\n    EE.once(event, onEvent)\n    if (rejectEvent) {\n      EE.once(rejectEvent, onError)\n    }\n\n    if (timeout) {\n      timeoutId = setTimeout(() => {\n        cleanup()\n        reject(new TimeoutError())\n      }, timeout)\n    }\n  })\n}\n","'use strict'\n\nmodule.exports = function Deferred() {\n  this.promise = new Promise((resolve, reject) => {\n    this.resolve = resolve\n    this.reject = reject\n  })\n}\n","'use strict'\n\nconst JID = require('../lib/JID')\n\nmodule.exports = function parse(s) {\n  let local\n  let resource\n\n  const resourceStart = s.indexOf('/')\n  if (resourceStart !== -1) {\n    resource = s.slice(resourceStart + 1)\n    s = s.slice(0, resourceStart)\n  }\n\n  const atStart = s.indexOf('@')\n  if (atStart !== -1) {\n    local = s.slice(0, atStart)\n    s = s.slice(atStart + 1)\n  }\n\n  return new JID(local, s, resource)\n}\n","'use strict'\n\nconst Element = require('./Element')\n\nfunction append(el, child) {\n  if (child === false || child === null || child === undefined) return\n  if (child instanceof Element) {\n    el.append(child)\n  } else if (Array.isArray(child)) {\n    child.forEach(c => append(el, c))\n  } else {\n    el.append(String(child))\n  }\n}\n\nfunction x(name, attrs, ...children) {\n  const el = new Element(name, attrs)\n  // eslint-disable-next-line unicorn/no-for-loop\n  for (let i = 0; i < children.length; i++) {\n    append(el, children[i])\n  }\n\n  return el\n}\n\nmodule.exports = x\n","'use strict'\n\nvar escape = require('./escape')\nvar escapeXML = escape.escapeXML\nvar escapeXMLText = escape.escapeXMLText\n\nvar equality = require('./equal')\nvar equal = equality.equal\nvar nameEqual = equality.name\nvar attrsEqual = equality.attrs\nvar childrenEqual = equality.children\n\nvar clone = require('./clone')\n\n/**\n * Element\n *\n * Attributes are in the element.attrs object. Children is a list of\n * either other Elements or Strings for text content.\n **/\nfunction Element (name, attrs) {\n  this.name = name\n  this.parent = null\n  this.children = []\n  this.attrs = {}\n  this.setAttrs(attrs)\n}\n\n/* Accessors */\n\n/**\n * if (element.is('message', 'jabber:client')) ...\n **/\nElement.prototype.is = function (name, xmlns) {\n  return (this.getName() === name) &&\n  (!xmlns || (this.getNS() === xmlns))\n}\n\n/* without prefix */\nElement.prototype.getName = function () {\n  if (this.name.indexOf(':') >= 0) {\n    return this.name.substr(this.name.indexOf(':') + 1)\n  } else {\n    return this.name\n  }\n}\n\n/**\n * retrieves the namespace of the current element, upwards recursively\n **/\nElement.prototype.getNS = function () {\n  if (this.name.indexOf(':') >= 0) {\n    var prefix = this.name.substr(0, this.name.indexOf(':'))\n    return this.findNS(prefix)\n  }\n  return this.findNS()\n}\n\n/**\n * find the namespace to the given prefix, upwards recursively\n **/\nElement.prototype.findNS = function (prefix) {\n  if (!prefix) {\n    /* default namespace */\n    if (this.attrs.xmlns) {\n      return this.attrs.xmlns\n    } else if (this.parent) {\n      return this.parent.findNS()\n    }\n  } else {\n    /* prefixed namespace */\n    var attr = 'xmlns:' + prefix\n    if (this.attrs[attr]) {\n      return this.attrs[attr]\n    } else if (this.parent) {\n      return this.parent.findNS(prefix)\n    }\n  }\n}\n\n/**\n * Recursiverly gets all xmlns defined, in the form of {url:prefix}\n **/\nElement.prototype.getXmlns = function () {\n  var namespaces = {}\n\n  if (this.parent) {\n    namespaces = this.parent.getXmlns()\n  }\n\n  for (var attr in this.attrs) {\n    var m = attr.match('xmlns:?(.*)')\n    // eslint-disable-next-line  no-prototype-builtins\n    if (this.attrs.hasOwnProperty(attr) && m) {\n      namespaces[this.attrs[attr]] = m[1]\n    }\n  }\n  return namespaces\n}\n\nElement.prototype.setAttrs = function (attrs) {\n  if (typeof attrs === 'string') {\n    this.attrs.xmlns = attrs\n  } else if (attrs) {\n    Object.keys(attrs).forEach(function (key) {\n      this.attrs[key] = attrs[key]\n    }, this)\n  }\n}\n\n/**\n * xmlns can be null, returns the matching attribute.\n **/\nElement.prototype.getAttr = function (name, xmlns) {\n  if (!xmlns) {\n    return this.attrs[name]\n  }\n\n  var namespaces = this.getXmlns()\n\n  if (!namespaces[xmlns]) {\n    return null\n  }\n\n  return this.attrs[[namespaces[xmlns], name].join(':')]\n}\n\n/**\n * xmlns can be null\n **/\nElement.prototype.getChild = function (name, xmlns) {\n  return this.getChildren(name, xmlns)[0]\n}\n\n/**\n * xmlns can be null\n **/\nElement.prototype.getChildren = function (name, xmlns) {\n  var result = []\n  for (var i = 0; i < this.children.length; i++) {\n    var child = this.children[i]\n    if (child.getName &&\n      (child.getName() === name) &&\n      (!xmlns || (child.getNS() === xmlns))) {\n      result.push(child)\n    }\n  }\n  return result\n}\n\n/**\n * xmlns and recursive can be null\n **/\nElement.prototype.getChildByAttr = function (attr, val, xmlns, recursive) {\n  return this.getChildrenByAttr(attr, val, xmlns, recursive)[0]\n}\n\n/**\n * xmlns and recursive can be null\n **/\nElement.prototype.getChildrenByAttr = function (attr, val, xmlns, recursive) {\n  var result = []\n  for (var i = 0; i < this.children.length; i++) {\n    var child = this.children[i]\n    if (child.attrs &&\n      (child.attrs[attr] === val) &&\n      (!xmlns || (child.getNS() === xmlns))) {\n      result.push(child)\n    }\n    if (recursive && child.getChildrenByAttr) {\n      result.push(child.getChildrenByAttr(attr, val, xmlns, true))\n    }\n  }\n  if (recursive) {\n    result = [].concat.apply([], result)\n  }\n  return result\n}\n\nElement.prototype.getChildrenByFilter = function (filter, recursive) {\n  var result = []\n  for (var i = 0; i < this.children.length; i++) {\n    var child = this.children[i]\n    if (filter(child)) {\n      result.push(child)\n    }\n    if (recursive && child.getChildrenByFilter) {\n      result.push(child.getChildrenByFilter(filter, true))\n    }\n  }\n  if (recursive) {\n    result = [].concat.apply([], result)\n  }\n  return result\n}\n\nElement.prototype.getText = function () {\n  var text = ''\n  for (var i = 0; i < this.children.length; i++) {\n    var child = this.children[i]\n    if ((typeof child === 'string') || (typeof child === 'number')) {\n      text += child\n    }\n  }\n  return text\n}\n\nElement.prototype.getChildText = function (name, xmlns) {\n  var child = this.getChild(name, xmlns)\n  return child ? child.getText() : null\n}\n\n/**\n * Return all direct descendents that are Elements.\n * This differs from `getChildren` in that it will exclude text nodes,\n * processing instructions, etc.\n */\nElement.prototype.getChildElements = function () {\n  return this.getChildrenByFilter(function (child) {\n    return child instanceof Element\n  })\n}\n\n/* Builder */\n\n/** returns uppermost parent */\nElement.prototype.root = function () {\n  if (this.parent) {\n    return this.parent.root()\n  }\n  return this\n}\nElement.prototype.tree = Element.prototype.root\n\n/** just parent or itself */\nElement.prototype.up = function () {\n  if (this.parent) {\n    return this.parent\n  }\n  return this\n}\n\n/** create child node and return it */\nElement.prototype.c = function (name, attrs) {\n  return this.cnode(new Element(name, attrs))\n}\n\nElement.prototype.cnode = function (child) {\n  this.children.push(child)\n  if (typeof child === 'object') {\n    child.parent = this\n  }\n  return child\n}\n\n/** add text node and return element */\nElement.prototype.t = function (text) {\n  this.children.push(text)\n  return this\n}\n\n/* Manipulation */\n\n/**\n * Either:\n *   el.remove(childEl)\n *   el.remove('author', 'urn:...')\n */\nElement.prototype.remove = function (el, xmlns) {\n  var filter\n  if (typeof el === 'string') {\n    /* 1st parameter is tag name */\n    filter = function (child) {\n      return !(child.is &&\n      child.is(el, xmlns))\n    }\n  } else {\n    /* 1st parameter is element */\n    filter = function (child) {\n      return child !== el\n    }\n  }\n\n  this.children = this.children.filter(filter)\n\n  return this\n}\n\nElement.prototype.clone = function () {\n  return clone(this)\n}\n\nElement.prototype.text = function (val) {\n  if (val && this.children.length === 1) {\n    this.children[0] = val\n    return this\n  }\n  return this.getText()\n}\n\nElement.prototype.attr = function (attr, val) {\n  if (typeof val !== 'undefined' || val === null) {\n    if (!this.attrs) {\n      this.attrs = {}\n    }\n    this.attrs[attr] = val\n    return this\n  }\n  return this.attrs[attr]\n}\n\n/* Serialization */\n\nElement.prototype.toString = function () {\n  var s = ''\n  this.write(function (c) {\n    s += c\n  })\n  return s\n}\n\nElement.prototype.toJSON = function () {\n  return {\n    name: this.name,\n    attrs: this.attrs,\n    children: this.children.map(function (child) {\n      return child && child.toJSON ? child.toJSON() : child\n    })\n  }\n}\n\nElement.prototype._addChildren = function (writer) {\n  writer('>')\n  for (var i = 0; i < this.children.length; i++) {\n    var child = this.children[i]\n    /* Skip null/undefined */\n    if (child || (child === 0)) {\n      if (child.write) {\n        child.write(writer)\n      } else if (typeof child === 'string') {\n        writer(escapeXMLText(child))\n      } else if (child.toString) {\n        writer(escapeXMLText(child.toString(10)))\n      }\n    }\n  }\n  writer('</')\n  writer(this.name)\n  writer('>')\n}\n\nElement.prototype.write = function (writer) {\n  writer('<')\n  writer(this.name)\n  for (var k in this.attrs) {\n    var v = this.attrs[k]\n    if (v != null) { // === null || undefined\n      writer(' ')\n      writer(k)\n      writer('=\"')\n      if (typeof v !== 'string') {\n        v = v.toString()\n      }\n      writer(escapeXML(v))\n      writer('\"')\n    }\n  }\n  if (this.children.length === 0) {\n    writer('/>')\n  } else {\n    this._addChildren(writer)\n  }\n}\n\nElement.prototype.nameEquals = function (el) {\n  return nameEqual(this, el)\n}\n\nElement.prototype.attrsEquals = function (el) {\n  return attrsEqual(this, el)\n}\n\nElement.prototype.childrenEquals = function (el) {\n  return childrenEqual(this, el)\n}\n\nElement.prototype.equals = function (el) {\n  return equal(this, el)\n}\n\nmodule.exports = Element\n","'use strict'\n\nfunction nameEqual (a, b) {\n  return a.name === b.name\n}\n\nfunction attrsEqual (a, b) {\n  var attrs = a.attrs\n  var keys = Object.keys(attrs)\n  var length = keys.length\n  if (length !== Object.keys(b.attrs).length) return false\n  for (var i = 0, l = length; i < l; i++) {\n    var key = keys[i]\n    var value = attrs[key]\n    if (value == null || b.attrs[key] == null) { // === null || undefined\n      if (value !== b.attrs[key]) return false\n    } else if (value.toString() !== b.attrs[key].toString()) {\n      return false\n    }\n  }\n  return true\n}\n\nfunction childrenEqual (a, b) {\n  var children = a.children\n  var length = children.length\n  if (length !== b.children.length) return false\n  for (var i = 0, l = length; i < l; i++) {\n    var child = children[i]\n    if (typeof child === 'string') {\n      if (child !== b.children[i]) return false\n    } else {\n      if (!child.equals(b.children[i])) return false\n    }\n  }\n  return true\n}\n\nfunction equal (a, b) {\n  if (!nameEqual(a, b)) return false\n  if (!attrsEqual(a, b)) return false\n  if (!childrenEqual(a, b)) return false\n  return true\n}\n\nmodule.exports.name = nameEqual\nmodule.exports.attrs = attrsEqual\nmodule.exports.children = childrenEqual\nmodule.exports.equal = equal\n","'use strict'\n\nmodule.exports = function clone (el) {\n  var clone = new el.constructor(el.name, el.attrs)\n  for (var i = 0; i < el.children.length; i++) {\n    var child = el.children[i]\n    clone.cnode(child.clone ? child.clone() : child)\n  }\n  return clone\n}\n","'use strict'\n\nvar inherits = require('inherits')\nvar EventEmitter = require('events').EventEmitter\nvar unescapeXML = require('../escape').unescapeXML\n\nvar STATE_TEXT = 0\nvar STATE_IGNORE_COMMENT = 1\nvar STATE_IGNORE_INSTRUCTION = 2\nvar STATE_TAG_NAME = 3\nvar STATE_TAG = 4\nvar STATE_ATTR_NAME = 5\nvar STATE_ATTR_EQ = 6\nvar STATE_ATTR_QUOT = 7\nvar STATE_ATTR_VALUE = 8\nvar STATE_CDATA = 9\nvar STATE_IGNORE_CDATA = 10\n\nvar SaxLtx = module.exports = function SaxLtx () {\n  EventEmitter.call(this)\n\n  var state = STATE_TEXT\n  var remainder\n  var tagName\n  var attrs\n  var endTag\n  var selfClosing\n  var attrQuote\n  var attrQuoteChar\n  var recordStart = 0\n  var attrName\n\n  this._handleTagOpening = function (endTag, tagName, attrs) {\n    if (!endTag) {\n      this.emit('startElement', tagName, attrs)\n      if (selfClosing) {\n        this.emit('endElement', tagName)\n      }\n    } else {\n      this.emit('endElement', tagName)\n    }\n  }\n\n  this.write = function (data) {\n    if (typeof data !== 'string') {\n      data = data.toString()\n    }\n    var pos = 0\n\n    /* Anything from previous write()? */\n    if (remainder) {\n      data = remainder + data\n      pos += remainder.length\n      remainder = null\n    }\n\n    function endRecording () {\n      if (typeof recordStart === 'number') {\n        var recorded = data.substring(recordStart, pos)\n        recordStart = undefined\n        return recorded\n      }\n    }\n\n    for (; pos < data.length; pos++) {\n      if (state === STATE_TEXT) {\n        // if we're looping through text, fast-forward using indexOf to\n        // the next '<' character\n        var lt = data.indexOf('<', pos)\n        if (lt !== -1 && pos !== lt) {\n          pos = lt\n        }\n      } else if (state === STATE_ATTR_VALUE) {\n        // if we're looping through an attribute, fast-forward using\n        // indexOf to the next end quote character\n        var quot = data.indexOf(attrQuoteChar, pos)\n        if (quot !== -1) {\n          pos = quot\n        }\n      } else if (state === STATE_IGNORE_COMMENT) {\n        // if we're looping through a comment, fast-forward using\n        // indexOf to the first end-comment character\n        var endcomment = data.indexOf('-->', pos)\n        if (endcomment !== -1) {\n          pos = endcomment + 2 // target the '>' character\n        }\n      } else if (state === STATE_IGNORE_CDATA) {\n        // if we're looping through a CDATA, fast-forward using\n        // indexOf to the first end-CDATA character ]]>\n        var endCDATA = data.indexOf(']]>', pos)\n        if (endCDATA !== -1) {\n          pos = endCDATA + 2 // target the '>' character\n        }\n      }\n\n      var c = data.charCodeAt(pos)\n      switch (state) {\n        case STATE_TEXT:\n          if (c === 60 /* < */) {\n            var text = endRecording()\n            if (text) {\n              this.emit('text', unescapeXML(text))\n            }\n            state = STATE_TAG_NAME\n            recordStart = pos + 1\n            attrs = {}\n          }\n          break\n        case STATE_CDATA:\n          if (c === 93 /* ] */ && data.substr(pos + 1, 2) === ']>') {\n            var cData = endRecording()\n            if (cData) {\n              this.emit('text', cData)\n            }\n            state = STATE_TEXT\n          }\n          break\n        case STATE_TAG_NAME:\n          if (c === 47 /* / */ && recordStart === pos) {\n            recordStart = pos + 1\n            endTag = true\n          } else if (c === 33 /* ! */) {\n            if (data.substr(pos + 1, 7) === '[CDATA[') {\n              recordStart = pos + 8\n              state = STATE_CDATA\n            } else {\n              recordStart = undefined\n              state = STATE_IGNORE_COMMENT\n            }\n          } else if (c === 63 /* ? */) {\n            recordStart = undefined\n            state = STATE_IGNORE_INSTRUCTION\n          } else if (c <= 32 || c === 47 /* / */ || c === 62 /* > */) {\n            tagName = endRecording()\n            pos--\n            state = STATE_TAG\n          }\n          break\n        case STATE_IGNORE_COMMENT:\n          if (c === 62 /* > */) {\n            var prevFirst = data.charCodeAt(pos - 1)\n            var prevSecond = data.charCodeAt(pos - 2)\n            if ((prevFirst === 45 /* - */ && prevSecond === 45 /* - */) ||\n                (prevFirst === 93 /* ] */ && prevSecond === 93 /* ] */)) {\n              state = STATE_TEXT\n            }\n          }\n          break\n        case STATE_IGNORE_INSTRUCTION:\n          if (c === 62 /* > */) {\n            var prev = data.charCodeAt(pos - 1)\n            if (prev === 63 /* ? */) {\n              state = STATE_TEXT\n            }\n          }\n          break\n        case STATE_TAG:\n          if (c === 62 /* > */) {\n            this._handleTagOpening(endTag, tagName, attrs)\n            tagName = undefined\n            attrs = undefined\n            endTag = undefined\n            selfClosing = undefined\n            state = STATE_TEXT\n            recordStart = pos + 1\n          } else if (c === 47 /* / */) {\n            selfClosing = true\n          } else if (c > 32) {\n            recordStart = pos\n            state = STATE_ATTR_NAME\n          }\n          break\n        case STATE_ATTR_NAME:\n          if (c <= 32 || c === 61 /* = */) {\n            attrName = endRecording()\n            pos--\n            state = STATE_ATTR_EQ\n          }\n          break\n        case STATE_ATTR_EQ:\n          if (c === 61 /* = */) {\n            state = STATE_ATTR_QUOT\n          }\n          break\n        case STATE_ATTR_QUOT:\n          if (c === 34 /* \" */ || c === 39 /* ' */) {\n            attrQuote = c\n            attrQuoteChar = c === 34 ? '\"' : \"'\"\n            state = STATE_ATTR_VALUE\n            recordStart = pos + 1\n          }\n          break\n        case STATE_ATTR_VALUE:\n          if (c === attrQuote) {\n            var value = unescapeXML(endRecording())\n            attrs[attrName] = value\n            attrName = undefined\n            state = STATE_TAG\n          }\n          break\n      }\n    }\n\n    if (typeof recordStart === 'number' &&\n      recordStart <= data.length) {\n      remainder = data.slice(recordStart)\n      recordStart = 0\n    }\n  }\n}\ninherits(SaxLtx, EventEmitter)\n\nSaxLtx.prototype.end = function (data) {\n  if (data) {\n    this.write(data)\n  }\n\n  /* Uh, yeah */\n  this.write = function () {}\n}\n","if (typeof Object.create === 'function') {\n  // implementation from standard node.js 'util' module\n  module.exports = function inherits(ctor, superCtor) {\n    if (superCtor) {\n      ctor.super_ = superCtor\n      ctor.prototype = Object.create(superCtor.prototype, {\n        constructor: {\n          value: ctor,\n          enumerable: false,\n          writable: true,\n          configurable: true\n        }\n      })\n    }\n  };\n} else {\n  // old school shim for old browsers\n  module.exports = function inherits(ctor, superCtor) {\n    if (superCtor) {\n      ctor.super_ = superCtor\n      var TempCtor = function () {}\n      TempCtor.prototype = superCtor.prototype\n      ctor.prototype = new TempCtor()\n      ctor.prototype.constructor = ctor\n    }\n  }\n}\n","'use strict'\n\nconst XMPPError = require('@xmpp/error')\n\n// https://xmpp.org/rfcs/rfc6120.html#streams-error\n\nclass StreamError extends XMPPError {\n  constructor(...args) {\n    super(...args)\n    this.name = 'StreamError'\n  }\n}\n\nmodule.exports = StreamError\n","'use strict'\n\nfunction parseURI(URI) {\n  let {port, hostname, protocol} = new URL(URI)\n  // https://github.com/nodejs/node/issues/12410#issuecomment-294138912\n  if (hostname === '[::1]') {\n    hostname = '::1'\n  }\n\n  return {port, hostname, protocol}\n}\n\nfunction parseHost(host) {\n  const {port, hostname} = parseURI(`http://${host}`)\n  return {port, hostname}\n}\n\nfunction parseService(service) {\n  return service.includes('://') ? parseURI(service) : parseHost(service)\n}\n\nObject.assign(module.exports, {parseURI, parseHost, parseService})\n","'use strict'\n\nmodule.exports = function getDomain(service) {\n  const domain = service.split('://')[1] || service\n  return domain.split(':')[0].split('/')[0]\n}\n","'use strict'\n\nconst {EventEmitter} = require('@xmpp/events')\n\nclass Reconnect extends EventEmitter {\n  constructor(entity) {\n    super()\n\n    this.delay = 1000\n    this.entity = entity\n    this._timeout = null\n  }\n\n  scheduleReconnect() {\n    const {entity, delay, _timeout} = this\n    clearTimeout(_timeout)\n    this._timeout = setTimeout(async () => {\n      if (entity.status !== 'disconnect') {\n        return\n      }\n\n      try {\n        await this.reconnect()\n        // eslint-disable-next-line no-unused-vars\n      } catch (err) {\n        // Ignoring the rejection is safe because the error is emitted on entity by #start\n      }\n    }, delay)\n  }\n\n  async reconnect() {\n    const {entity} = this\n    this.emit('reconnecting')\n\n    const {service, domain, lang} = entity.options\n    await entity.connect(service)\n    await entity.open({domain, lang})\n\n    this.emit('reconnected')\n  }\n\n  start() {\n    const {entity} = this\n    const listeners = {}\n    listeners.disconnect = () => {\n      this.scheduleReconnect()\n    }\n\n    this.listeners = listeners\n    entity.on('disconnect', listeners.disconnect)\n  }\n\n  stop() {\n    const {entity, listeners, _timeout} = this\n    entity.removeListener('disconnect', listeners.disconnect)\n    clearTimeout(_timeout)\n  }\n}\n\nmodule.exports = function reconnect({entity}) {\n  const r = new Reconnect(entity)\n  r.start()\n  return r\n}\n","'use strict'\n\nconst ConnectionWebSocket = require('./lib/Connection')\n\nmodule.exports = function websocket({entity}) {\n  entity.transports.push(ConnectionWebSocket)\n}\n","'use strict'\n\nconst Socket = require('./Socket')\nconst Connection = require('@xmpp/connection')\nconst xml = require('@xmpp/xml')\nconst FramedParser = require('./FramedParser')\n\nconst NS_FRAMING = 'urn:ietf:params:xml:ns:xmpp-framing'\n\n/* References\n * WebSocket protocol https://tools.ietf.org/html/rfc6455\n * WebSocket Web API https://html.spec.whatwg.org/multipage/comms.html#network\n * XMPP over WebSocket https://tools.ietf.org/html/rfc7395\n */\n\nclass ConnectionWebSocket extends Connection {\n  send(element, ...args) {\n    if (!element.attrs.xmlns && super.isStanza(element)) {\n      element.attrs.xmlns = 'jabber:client'\n    }\n\n    return super.send(element, ...args)\n  }\n\n  // https://tools.ietf.org/html/rfc7395#section-3.6\n  footerElement() {\n    return new xml.Element('close', {\n      xmlns: NS_FRAMING,\n    })\n  }\n\n  // https://tools.ietf.org/html/rfc7395#section-3.4\n  headerElement() {\n    const el = super.headerElement()\n    el.name = 'open'\n    el.attrs.xmlns = NS_FRAMING\n    return el\n  }\n\n  socketParameters(service) {\n    return service.match(/^wss?:\\/\\//) ? service : undefined\n  }\n}\n\nConnectionWebSocket.prototype.Socket = Socket\nConnectionWebSocket.prototype.NS = 'jabber:client'\nConnectionWebSocket.prototype.Parser = FramedParser\n\nmodule.exports = ConnectionWebSocket\n","'use strict'\n\nconst WS = require('ws')\nconst WebSocket = global.WebSocket || WS\nconst EventEmitter = require('events')\n\nconst CODE = 'ECONNERROR'\n\nclass Socket extends EventEmitter {\n  constructor() {\n    super()\n    this.listeners = Object.create(null)\n  }\n\n  connect(url) {\n    this.url = url\n    this._attachSocket(new WebSocket(url, ['xmpp']))\n  }\n\n  _attachSocket(socket) {\n    const sock = (this.socket = socket)\n    const {listeners} = this\n    listeners.open = () => {\n      this.emit('connect')\n    }\n\n    listeners.message = ({data}) => this.emit('data', data)\n    listeners.error = event => {\n      // WS\n      let {error} = event\n      // DOM\n      if (!error) {\n        error = new Error(`WebSocket ${CODE} ${this.url}`)\n        error.errno = CODE\n        error.code = CODE\n      }\n\n      error.event = event\n      error.url = this.url\n      this.emit('error', error)\n    }\n\n    listeners.close = event => {\n      this._detachSocket()\n      this.emit('close', !event.wasClean, event)\n    }\n\n    sock.addEventListener('open', listeners.open)\n    sock.addEventListener('message', listeners.message)\n    sock.addEventListener('error', listeners.error)\n    sock.addEventListener('close', listeners.close)\n  }\n\n  _detachSocket() {\n    delete this.url\n    const {socket, listeners} = this\n    Object.getOwnPropertyNames(listeners).forEach(k => {\n      socket.removeEventListener(k, listeners[k])\n      delete listeners[k]\n    })\n    delete this.socket\n  }\n\n  end() {\n    this.socket.close()\n  }\n\n  write(data, fn) {\n    if (WebSocket === WS) {\n      this.socket.send(data, fn)\n    } else {\n      this.socket.send(data)\n      fn()\n    }\n  }\n}\n\nmodule.exports = Socket\n","'use strict'\n\nconst {Parser, Element, XMLError} = require('@xmpp/xml')\n\nmodule.exports = class FramedParser extends Parser {\n  onStartElement(name, attrs) {\n    const element = new Element(name, attrs)\n\n    const {cursor} = this\n\n    if (cursor) {\n      cursor.append(element)\n    }\n\n    this.cursor = element\n  }\n\n  onEndElement(name) {\n    const {cursor} = this\n    if (name !== cursor.name) {\n      // <foo></bar>\n      this.emit('error', new XMLError(`${cursor.name} must be closed.`))\n      return\n    }\n\n    if (cursor.parent) {\n      this.cursor = cursor.parent\n      return\n    }\n\n    if (cursor.is('open', 'urn:ietf:params:xml:ns:xmpp-framing')) {\n      this.emit('start', cursor)\n    } else if (cursor.is('close', 'urn:ietf:params:xml:ns:xmpp-framing')) {\n      this.emit('end', cursor)\n    } else {\n      this.emit('element', cursor)\n    }\n\n    this.cursor = null\n  }\n}\n","'use strict'\n\nconst compose = require('koa-compose')\n\nconst IncomingContext = require('./lib/IncomingContext')\nconst OutgoingContext = require('./lib/OutgoingContext')\n\nfunction listener(entity, middleware, Context) {\n  return function(stanza) {\n    const ctx = new Context(entity, stanza)\n    return compose(middleware)(ctx)\n  }\n}\n\nfunction errorHandler(entity) {\n  return function(ctx, next) {\n    next()\n      .then(reply => reply && entity.send(reply))\n      .catch(err => entity.emit('error', err))\n  }\n}\n\nmodule.exports = function({entity}) {\n  const incoming = [errorHandler(entity)]\n  const outgoing = []\n\n  const incomingListener = listener(entity, incoming, IncomingContext)\n  const outgoingListener = listener(entity, outgoing, OutgoingContext)\n\n  entity.on('element', incomingListener)\n  entity.hookOutgoing = outgoingListener\n\n  return {\n    use(fn) {\n      incoming.push(fn)\n      return fn\n    },\n    filter(fn) {\n      outgoing.push(fn)\n      return fn\n    },\n  }\n}\n","'use strict'\n\n/**\n * Expose compositor.\n */\n\nmodule.exports = compose\n\n/**\n * Compose `middleware` returning\n * a fully valid middleware comprised\n * of all those which are passed.\n *\n * @param {Array} middleware\n * @return {Function}\n * @api public\n */\n\nfunction compose (middleware) {\n  if (!Array.isArray(middleware)) throw new TypeError('Middleware stack must be an array!')\n  for (const fn of middleware) {\n    if (typeof fn !== 'function') throw new TypeError('Middleware must be composed of functions!')\n  }\n\n  /**\n   * @param {Object} context\n   * @return {Promise}\n   * @api public\n   */\n\n  return function (context, next) {\n    // last called middleware #\n    let index = -1\n    return dispatch(0)\n    function dispatch (i) {\n      if (i <= index) return Promise.reject(new Error('next() called multiple times'))\n      index = i\n      let fn = middleware[i]\n      if (i === middleware.length) fn = next\n      if (!fn) return Promise.resolve()\n      try {\n        return Promise.resolve(fn(context, dispatch.bind(null, i + 1)));\n      } catch (err) {\n        return Promise.reject(err)\n      }\n    }\n  }\n}\n","'use strict'\n\nconst Context = require('./Context')\nconst JID = require('@xmpp/jid')\n\nmodule.exports = class IncomingContext extends Context {\n  constructor(entity, stanza) {\n    super(entity, stanza)\n\n    const {jid, domain} = entity\n\n    const to = stanza.attrs.to || (jid && jid.toString())\n    const from = stanza.attrs.from || domain\n\n    if (to) this.to = new JID(to)\n\n    if (from) {\n      this.from = new JID(from)\n      this.local = this.from.local\n      this.domain = this.from.domain\n      this.resource = this.from.resource\n    }\n  }\n}\n","'use strict'\n\nconst Context = require('./Context')\nconst JID = require('@xmpp/jid')\n\nmodule.exports = class OutgoingContext extends Context {\n  constructor(entity, stanza) {\n    super(entity, stanza)\n\n    const {jid, domain} = entity\n\n    const from = stanza.attrs.from || (jid && jid.toString())\n    const to = stanza.attrs.to || domain\n\n    if (from) this.from = new JID(from)\n\n    if (to) {\n      this.to = new JID(to)\n      this.local = this.to.local\n      this.domain = this.to.domain\n      this.resource = this.to.resource\n    }\n  }\n}\n","'use strict'\n\n/**\n * References\n * https://xmpp.org/rfcs/rfc6120.html#streams-negotiation Stream Negotiation\n * https://xmpp.org/extensions/xep-0170.html XEP-0170: Recommended Order of Stream Feature Negotiation\n * https://xmpp.org/registrar/stream-features.html XML Stream Features\n */\n\nconst route = require('./route')\n\nmodule.exports = function({middleware}) {\n  middleware.use(route())\n\n  function use(name, xmlns, handler) {\n    return middleware.use((ctx, next) => {\n      const {stanza} = ctx\n      if (!stanza.is('features', 'http://etherx.jabber.org/streams'))\n        return next()\n      const feature = stanza.getChild(name, xmlns)\n      if (!feature) return next()\n      return handler(ctx, next, feature)\n    })\n  }\n\n  return {\n    use,\n  }\n}\n","'use strict'\n\nmodule.exports = function route() {\n  return async function({stanza, entity}, next) {\n    if (!stanza.is('features', 'http://etherx.jabber.org/streams'))\n      return next()\n\n    await next()\n    if (entity.jid) entity._status('online', entity.jid)\n  }\n}\n","'use strict'\n\nconst xid = require('@xmpp/id')\nconst StanzaError = require('@xmpp/middleware/lib/StanzaError')\nconst {Deferred} = require('@xmpp/events')\nconst timeoutPromise = require('@xmpp/events').timeout\nconst xml = require('@xmpp/xml')\n\nfunction isReply({name, type}) {\n  if (name !== 'iq') return false\n  if (type !== 'error' && type !== 'result') return false\n  return true\n}\n\nclass IQCaller {\n  constructor({entity, middleware}) {\n    this.handlers = new Map()\n    this.entity = entity\n    this.middleware = middleware\n  }\n\n  start() {\n    this.middleware.use(this._route.bind(this))\n  }\n\n  _route({type, name, id, stanza}, next) {\n    if (!isReply({name, type})) return next()\n\n    const deferred = this.handlers.get(id)\n\n    if (!deferred) {\n      return next()\n    }\n\n    if (type === 'error') {\n      deferred.reject(StanzaError.fromElement(stanza.getChild('error')))\n    } else {\n      deferred.resolve(stanza)\n    }\n\n    this.handlers.delete(id)\n  }\n\n  async request(stanza, timeout = 30 * 1000) {\n    if (!stanza.attrs.id) {\n      stanza.attrs.id = xid()\n    }\n\n    const deferred = new Deferred()\n    this.handlers.set(stanza.attrs.id, deferred)\n\n    try {\n      await this.entity.send(stanza)\n      await timeoutPromise(deferred.promise, timeout)\n    } catch (err) {\n      this.handlers.delete(stanza.attrs.id)\n      throw err\n    }\n\n    return deferred.promise\n  }\n\n  _childRequest(type, element, to, ...args) {\n    const {name} = element\n    const {xmlns} = element.attrs\n    return this.request(xml('iq', {type, to}, element), ...args).then(stanza =>\n      stanza.getChild(name, xmlns)\n    )\n  }\n\n  async get(...args) {\n    return this._childRequest('get', ...args)\n  }\n\n  async set(...args) {\n    return this._childRequest('set', ...args)\n  }\n}\n\nmodule.exports = function iqCaller(...args) {\n  const iqCaller = new IQCaller(...args)\n  iqCaller.start()\n  return iqCaller\n}\n","'use strict'\n\nmodule.exports = function id() {\n  let i\n  while (!i) {\n    i = Math.random()\n      .toString(36)\n      .slice(2, 12)\n  }\n\n  return i\n}\n","'use strict'\n\n/* https://xmpp.org/rfcs/rfc6120.html#stanzas-error */\n\nconst XMPPError = require('@xmpp/error')\n\nclass StanzaError extends XMPPError {\n  constructor(condition, text, application, type) {\n    super(condition, text, application)\n    this.type = type\n    this.name = 'StanzaError'\n  }\n\n  static fromElement(element) {\n    const error = super.fromElement(element)\n    error.type = element.attrs.type\n    return error\n  }\n}\n\nmodule.exports = StanzaError\n","'use strict'\n\n/**\n * References\n * https://xmpp.org/rfcs/rfc6120.html#stanzas-semantics-iq\n * https://xmpp.org/rfcs/rfc6120.html#stanzas-error\n */\n\nconst xml = require('@xmpp/xml')\n\nconst NS_STANZA = 'urn:ietf:params:xml:ns:xmpp-stanzas'\n\nfunction isQuery({name, type}) {\n  if (name !== 'iq') return false\n  if (type === 'error' || type === 'result') return false\n  return true\n}\n\nfunction isValidQuery({type}, children, child) {\n  if (type !== 'get' && type !== 'set') return false\n  if (children.length !== 1) return false\n  if (!child) return false\n  return true\n}\n\nfunction buildReply({stanza}) {\n  return xml('iq', {\n    to: stanza.attrs.from,\n    from: stanza.attrs.to,\n    id: stanza.attrs.id,\n  })\n}\n\nfunction buildReplyResult(ctx, child) {\n  const reply = buildReply(ctx)\n  reply.attrs.type = 'result'\n  if (child) {\n    reply.append(child)\n  }\n\n  return reply\n}\n\nfunction buildReplyError(ctx, error, child) {\n  const reply = buildReply(ctx)\n  reply.attrs.type = 'error'\n  if (child) {\n    reply.append(child)\n  }\n\n  reply.append(error)\n  return reply\n}\n\nfunction buildError(type, condition) {\n  return xml('error', {type}, xml(condition, NS_STANZA))\n}\n\nfunction iqHandler(entity) {\n  return async function iqHandler(ctx, next) {\n    if (!isQuery(ctx)) return next()\n\n    const {stanza} = ctx\n    const children = stanza.getChildElements()\n    const [child] = children\n\n    if (!isValidQuery(ctx, children, child)) {\n      return buildReplyError(ctx, buildError('modify', 'bad-request'), child)\n    }\n\n    ctx.element = child\n\n    let reply\n    try {\n      reply = await next()\n    } catch (err) {\n      entity.emit('error', err)\n      reply = buildError('cancel', 'internal-server-error')\n    }\n\n    if (!reply) {\n      reply = buildError('cancel', 'service-unavailable')\n    }\n\n    if (reply instanceof xml.Element && reply.is('error')) {\n      return buildReplyError(ctx, reply, child)\n    }\n\n    return buildReplyResult(\n      ctx,\n      reply instanceof xml.Element ? reply : undefined\n    )\n  }\n}\n\nfunction route(type, ns, name, handler) {\n  return function(ctx, next) {\n    if ((ctx.type !== type) | !ctx.element || !ctx.element.is(name, ns))\n      return next()\n    return handler(ctx, next)\n  }\n}\n\nmodule.exports = function({middleware, entity}) {\n  middleware.use(iqHandler(entity))\n\n  return {\n    get(ns, name, handler) {\n      middleware.use(route('get', ns, name, handler))\n    },\n    set(ns, name, handler) {\n      middleware.use(route('set', ns, name, handler))\n    },\n  }\n}\n","'use strict'\n\nconst resolve = require('./resolve')\nconst {promise} = require('@xmpp/events')\n\nasync function fetchURIs(domain) {\n  return [\n    // Remove duplicates\n    ...new Set(\n      (\n        await resolve(domain, {\n          srv: [\n            {\n              service: 'xmpps-client',\n              protocol: 'tcp',\n            },\n            {\n              service: 'xmpp-client',\n              protocol: 'tcp',\n            },\n          ],\n        })\n      ).map(record => record.uri)\n    ),\n  ]\n}\n\nfunction filterSupportedURIs(entity, uris) {\n  return uris.filter(uri => entity._findTransport(uri))\n}\n\nasync function fallbackConnect(entity, uris) {\n  if (uris.length === 0) {\n    throw new Error(\"Couldn't connect\")\n  }\n\n  const uri = uris.shift()\n  const Transport = entity._findTransport(uri)\n\n  if (!Transport) {\n    return fallbackConnect(entity, uris)\n  }\n\n  entity._status('connecting', uri)\n  const params = Transport.prototype.socketParameters(uri)\n  const socket = new Transport.prototype.Socket()\n\n  try {\n    socket.connect(params)\n    await promise(socket, 'connect')\n    // eslint-disable-next-line no-unused-vars\n  } catch (err) {\n    return fallbackConnect(entity, uris)\n  }\n\n  entity._attachSocket(socket)\n  socket.emit('connect')\n  entity.Transport = Transport\n  entity.Socket = Transport.prototype.Socket\n  entity.Parser = Transport.prototype.Parser\n}\n\nmodule.exports = function({entity}) {\n  const _connect = entity.connect\n  entity.connect = async function connect(service) {\n    if (!service || service.match(/:\\/\\//)) {\n      return _connect.call(this, service)\n    }\n\n    const uris = filterSupportedURIs(entity, await fetchURIs(service))\n\n    if (uris.length === 0) {\n      throw new Error('No compatible transport found.')\n    }\n\n    try {\n      await fallbackConnect(entity, uris)\n    } catch (err) {\n      entity._reset()\n      entity._status('disconnect')\n      throw err\n    }\n  }\n}\n","'use strict'\n\nconst dns = require('./lib/dns')\nconst http = require('./lib/http')\n\nmodule.exports = function resolve(...args) {\n  return Promise.all([\n    dns.resolve ? dns.resolve(...args) : Promise.resolve([]),\n    http.resolve(...args),\n  ]).then(([records, endpoints]) => records.concat(endpoints))\n}\n\nif (dns.resolve) {\n  module.exports.dns = dns\n}\n\nmodule.exports.http = http\n","'use strict'\n\nconst fetch = global.fetch || require('node-fetch')\nconst parse = require('@xmpp/xml/lib/parse')\nconst compareAltConnections = require('./alt-connections').compare\n\nfunction resolve(domain) {\n  return fetch(`https://${domain}/.well-known/host-meta`)\n    .then(res => res.text())\n    .then(res => {\n      return parse(res)\n        .getChildren('Link')\n        .filter(link =>\n          [\n            'urn:xmpp:alt-connections:websocket',\n            'urn:xmpp:alt-connections:httppoll',\n            'urn:xmpp:alt-connections:xbosh',\n          ].includes(link.attrs.rel)\n        )\n        .map(({attrs}) => ({\n          rel: attrs.rel,\n          href: attrs.href,\n          method: attrs.rel.split(':').pop(),\n          uri: attrs.href,\n        }))\n        .sort(compareAltConnections)\n    })\n    .catch(() => {\n      return []\n    })\n}\n\nmodule.exports.resolve = resolve\n","'use strict'\n\nconst Parser = require('./Parser')\n\nmodule.exports = function parse(data) {\n  const p = new Parser()\n\n  let result = null\n  let error = null\n\n  p.on('start', el => {\n    result = el\n  })\n  p.on('element', el => {\n    result.append(el)\n  })\n  p.on('error', err => {\n    error = err\n  })\n\n  p.write(data)\n  p.end()\n\n  if (error) {\n    throw error\n  } else {\n    return result\n  }\n}\n","'use strict'\n\nfunction isSecure(uri) {\n  return uri.startsWith('https') || uri.startsWith('wss')\n}\n\nmodule.exports.compare = function compare(a, b) {\n  let secure\n  if (isSecure(a.uri) && !isSecure(b.uri)) {\n    secure = -1\n  } else if (!isSecure(a.uri) && isSecure(b.uri)) {\n    secure = 1\n  } else {\n    secure = 0\n  }\n\n  if (secure !== 0) {\n    return secure\n  }\n\n  let method\n  if (a.method === b.method) {\n    method = 0\n  } else if (a.method === 'websocket') {\n    method = -1\n  } else if (b.method === 'websocket') {\n    method = 1\n  } else if (a.method === 'xbosh') {\n    method = -1\n  } else if (b.method === 'xbosh') {\n    method = 1\n  } else if (a.method === 'httppoll') {\n    method = -1\n  } else if (b.method === 'httppoll') {\n    method = 1\n  } else {\n    method = 0\n  }\n\n  if (method !== 0) {\n    return method\n  }\n\n  return 0\n}\n","'use strict'\n\nconst {encode, decode} = require('@xmpp/base64')\nconst SASLError = require('./lib/SASLError')\nconst xml = require('@xmpp/xml')\nconst SASLFactory = require('saslmechanisms')\n\n// https://xmpp.org/rfcs/rfc6120.html#sasl\n\nconst NS = 'urn:ietf:params:xml:ns:xmpp-sasl'\n\nfunction getMechanismNames(features) {\n  return features.getChild('mechanisms', NS).children.map(el => el.text())\n}\n\nasync function authenticate(SASL, entity, mechname, credentials) {\n  const mech = SASL.create([mechname])\n  if (!mech) {\n    throw new Error('No compatible mechanism')\n  }\n\n  const {domain} = entity.options\n  const creds = {\n    username: null,\n    password: null,\n    server: domain,\n    host: domain,\n    realm: domain,\n    serviceType: 'xmpp',\n    serviceName: domain,\n    ...credentials,\n  }\n\n  return new Promise((resolve, reject) => {\n    const handler = element => {\n      if (element.attrs.xmlns !== NS) {\n        return\n      }\n\n      if (element.name === 'challenge') {\n        mech.challenge(decode(element.text()))\n        const resp = mech.response(creds)\n        entity.send(\n          xml(\n            'response',\n            {xmlns: NS, mechanism: mech.name},\n            typeof resp === 'string' ? encode(resp) : ''\n          )\n        )\n        return\n      }\n\n      if (element.name === 'failure') {\n        reject(SASLError.fromElement(element))\n      } else if (element.name === 'success') {\n        resolve()\n      }\n\n      entity.removeListener('nonza', handler)\n    }\n\n    entity.on('nonza', handler)\n\n    if (mech.clientFirst) {\n      entity.send(\n        xml(\n          'auth',\n          {xmlns: NS, mechanism: mech.name},\n          encode(mech.response(creds))\n        )\n      )\n    }\n  })\n}\n\nmodule.exports = function sasl({streamFeatures}, credentials) {\n  const SASL = new SASLFactory()\n\n  streamFeatures.use('mechanisms', NS, async ({stanza, entity}) => {\n    const offered = getMechanismNames(stanza)\n    const supported = SASL._mechs.map(({name}) => name)\n    const intersection = supported.filter(mech => {\n      return offered.includes(mech)\n    })\n    let mech = intersection[0]\n\n    if (typeof credentials === 'function') {\n      await credentials(\n        creds => authenticate(SASL, entity, mech, creds, stanza),\n        mech\n      )\n    } else {\n      if (!credentials.username && !credentials.password) {\n        mech = 'ANONYMOUS'\n      }\n\n      await authenticate(SASL, entity, mech, credentials, stanza)\n    }\n\n    await entity.restart()\n  })\n\n  return {\n    use(...args) {\n      return SASL.use(...args)\n    },\n  }\n}\n","'use strict'\n\nmodule.exports.encode = function encode(string) {\n  return global.btoa(string)\n}\n\nmodule.exports.decode = function decode(string) {\n  return global.atob(string)\n}\n","'use strict'\n\nconst XMPPError = require('@xmpp/error')\n\n// https://xmpp.org/rfcs/rfc6120.html#sasl-errors\n\nclass SASLError extends XMPPError {\n  constructor(...args) {\n    super(...args)\n    this.name = 'SASLError'\n  }\n}\n\nmodule.exports = SASLError\n","(function(root, factory) {\n  if (typeof exports === 'object') {\n    // CommonJS\n    factory(exports,\n            module,\n            require('./lib/factory'));\n  } else if (typeof define === 'function' && define.amd) {\n    // AMD\n    define(['exports',\n            'module',\n            './lib/factory'], factory);\n  }\n}(this, function(exports, module, Factory) {\n  \n  exports = module.exports = Factory;\n  exports.Factory = Factory;\n  \n}));\n","(function(root, factory) {\n  if (typeof exports === 'object') {\n    // CommonJS\n    factory(exports, module);\n  } else if (typeof define === 'function' && define.amd) {\n    // AMD\n    define(['exports', 'module'], factory);\n  }\n}(this, function(exports, module) {\n  \n  /**\n   * `Factory` constructor.\n   *\n   * @api public\n   */\n  function Factory() {\n    this._mechs = [];\n  }\n  \n  /**\n   * Utilize the given `mech` with optional `name`, overridding the mechanism's\n   * default name.\n   *\n   * Examples:\n   *\n   *     factory.use(FooMechanism);\n   *\n   *     factory.use('XFOO', FooMechanism);\n   *\n   * @param {String|Mechanism} name\n   * @param {Mechanism} mech\n   * @return {Factory} for chaining\n   * @api public\n   */\n  Factory.prototype.use = function(name, mech) {\n    if (!mech) {\n      mech = name;\n      name = mech.prototype.name;\n    }\n    this._mechs.push({ name: name, mech: mech });\n    return this;\n  };\n  \n  /**\n   * Create a new mechanism from supported list of `mechs`.\n   *\n   * If no mechanisms are supported, returns `null`.\n   *\n   * Examples:\n   *\n   *     var mech = factory.create(['FOO', 'BAR']);\n   *\n   * @param {Array} mechs\n   * @return {Mechanism}\n   * @api public\n   */\n  Factory.prototype.create = function(mechs) {\n    for (var i = 0, len = this._mechs.length; i < len; i++) {\n      for (var j = 0, jlen = mechs.length; j < jlen; j++) {\n        var entry = this._mechs[i];\n        if (entry.name == mechs[j]) {\n          return new entry.mech();\n        }\n      }\n    }\n    return null;\n  };\n\n  exports = module.exports = Factory;\n  \n}));\n","'use strict'\n\nconst xml = require('@xmpp/xml')\n\n/*\n * References\n * https://xmpp.org/rfcs/rfc6120.html#bind\n */\n\nconst NS = 'urn:ietf:params:xml:ns:xmpp-bind'\n\nfunction makeBindElement(resource) {\n  return xml('bind', {xmlns: NS}, resource && xml('resource', {}, resource))\n}\n\nasync function bind(entity, iqCaller, resource) {\n  const result = await iqCaller.set(makeBindElement(resource))\n  const jid = result.getChildText('jid')\n  entity._jid(jid)\n  return jid\n}\n\nfunction route({iqCaller}, resource) {\n  return async function({entity}, next) {\n    if (typeof resource === 'function') {\n      await resource(resource => bind(entity, iqCaller, resource))\n    } else {\n      await bind(entity, iqCaller, resource)\n    }\n\n    next()\n  }\n}\n\nmodule.exports = function({streamFeatures, iqCaller}, resource) {\n  streamFeatures.use('bind', NS, route({iqCaller}, resource))\n}\n","'use strict'\n\nconst xml = require('@xmpp/xml')\n\n// https://tools.ietf.org/html/draft-cridland-xmpp-session-01\n\nconst NS = 'urn:ietf:params:xml:ns:xmpp-session'\n\nmodule.exports = function({iqCaller, streamFeatures}) {\n  streamFeatures.use('session', NS, async (context, next, feature) => {\n    if (feature.getChild('optional')) return next()\n    await iqCaller.set(xml('session', NS))\n    return next()\n  })\n}\n","'use strict'\n\n/**\n * [XEP-0175: Best Practices for Use of SASL ANONYMOUS](https://xmpp.org/extensions/xep-0175.html)\n * [RFC-4504: Anonymous Simple Authentication and Security Layer (SASL) Mechanism](https://tools.ietf.org/html/rfc4505)\n */\n\nconst mech = require('sasl-anonymous')\n\nmodule.exports = function saslAnonymous(sasl) {\n  sasl.use(mech)\n}\n","(function(root, factory) {\n  if (typeof exports === 'object') {\n    // CommonJS\n    factory(exports,\n            module,\n            require('./lib/mechanism'));\n  } else if (typeof define === 'function' && define.amd) {\n    // AMD\n    define(['exports',\n            'module',\n            './lib/mechanism'], factory);\n  }\n}(this, function(exports, module, Mechanism) {\n\n  exports = module.exports = Mechanism;\n  exports.Mechanism = Mechanism;\n  \n}));\n","(function(root, factory) {\n  if (typeof exports === 'object') {\n    // CommonJS\n    factory(exports, module);\n  } else if (typeof define === 'function' && define.amd) {\n    // AMD\n    define(['exports', 'module'], factory);\n  }\n}(this, function(exports, module) {\n\n  /**\n   * ANONYMOUS `Mechanism` constructor.\n   *\n   * This class implements the ANONYMOUS SASL mechanism.\n   *\n   * The ANONYMOUS SASL mechanism provides support for permitting anonymous\n   * access to various services\n   *\n   * References:\n   *  - [RFC 4505](http://tools.ietf.org/html/rfc4505)\n   *\n   * @api public\n   */\n  function Mechanism() {\n  }\n  \n  Mechanism.prototype.name = 'ANONYMOUS';\n  Mechanism.prototype.clientFirst = true;\n  \n  /**\n   * Encode a response using optional trace information.\n   *\n   * Options:\n   *  - `trace`  trace information (optional)\n   *\n   * @param {Object} cred\n   * @api public\n   */\n  Mechanism.prototype.response = function(cred) {\n    return cred.trace || '';\n  };\n  \n  /**\n   * Decode a challenge issued by the server.\n   *\n   * @param {String} chal\n   * @api public\n   */\n  Mechanism.prototype.challenge = function(chal) {\n  };\n\n  exports = module.exports = Mechanism;\n  \n}));\n","'use strict'\n\nconst mech = require('sasl-plain')\n\nmodule.exports = function saslPlain(sasl) {\n  sasl.use(mech)\n}\n","(function(root, factory) {\n  if (typeof exports === 'object') {\n    // CommonJS\n    factory(exports,\n            module,\n            require('./lib/mechanism'));\n  } else if (typeof define === 'function' && define.amd) {\n    // AMD\n    define(['exports',\n            'module',\n            './lib/mechanism'], factory);\n  }\n}(this, function(exports, module, Mechanism) {\n\n  exports = module.exports = Mechanism;\n  exports.Mechanism = Mechanism;\n  \n}));\n","(function(root, factory) {\n  if (typeof exports === 'object') {\n    // CommonJS\n    factory(exports, module);\n  } else if (typeof define === 'function' && define.amd) {\n    // AMD\n    define(['exports', 'module'], factory);\n  }\n}(this, function(exports, module) {\n\n  /**\n   * PLAIN `Mechanism` constructor.\n   *\n   * This class implements the PLAIN SASL mechanism.\n   *\n   * The PLAIN SASL mechanism provides support for exchanging a clear-text\n   * username and password.  This mechanism should not be used without adequate\n   * security provided by an underlying transport layer. \n   *\n   * References:\n   *  - [RFC 4616](http://tools.ietf.org/html/rfc4616)\n   *\n   * @api public\n   */\n  function Mechanism() {\n  }\n  \n  Mechanism.prototype.name = 'PLAIN';\n  Mechanism.prototype.clientFirst = true;\n  \n  /**\n   * Encode a response using given credential.\n   *\n   * Options:\n   *  - `username`\n   *  - `password`\n   *  - `authzid`   authorization identity (optional)\n   *\n   * @param {Object} cred\n   * @api public\n   */\n  Mechanism.prototype.response = function(cred) {\n    var str = '';\n    str += cred.authzid || '';\n    str += '\\0';\n    str += cred.username;\n    str += '\\0';\n    str += cred.password;\n    return str;\n  };\n  \n  /**\n   * Decode a challenge issued by the server.\n   *\n   * @param {String} chal\n   * @return {Mechanism} for chaining\n   * @api public\n   */\n  Mechanism.prototype.challenge = function(chal) {\n    return this;\n  };\n\n  exports = module.exports = Mechanism;\n  \n}));\n","module.exports = __WEBPACK_EXTERNAL_MODULE__98__;","const config = require('./cubeConfig')\nconst Utils = require('./cubeInternalUtils')\nconst fetchImpl = require('./cubeDependencies').fetchImpl\nconst formDataImpl = require('./cubeDependencies').formDataImpl\n\nclass HTTPProxy {\n  constructor() {\n    this.sdkInstance = {\n      config: config,\n      session: null\n    }\n\n    this.currentUserId = null\n\n    this.requestsNumber = 0\n  }\n\n  setSession(session) {\n    this.sdkInstance.session = session\n    // if (session && session.user_id) {\n    //   this.setCurrentUserId(session.user_id);\n    // }\n  }\n\n  getSession() {\n    return this.sdkInstance.session\n  }\n\n  setCurrentUserId(userId) {\n    this.currentUserId = userId\n  }\n\n  getCurrentUserId() {\n    return this.currentUserId\n  }\n\n  logRequest(params) {\n    ++this.requestsNumber\n\n    Utils.DLog(\n      '[Request][' + this.requestsNumber + ']',\n      (params.type || 'GET') + ' ' + params.url,\n      params\n    )\n  }\n\n  logResponse(response) {\n    Utils.DLog('[Response][' + this.requestsNumber + ']', response)\n  }\n\n  buildRequestAndURL(params) {\n    const isGetOrHeadType = !params.type || params.type === 'GET' || params.type === 'HEAD'\n    const isPostOrPutType = params.type && (params.type === 'POST' || params.type === 'PUT')\n    const token =\n      this.sdkInstance &&\n      this.sdkInstance.session &&\n      this.sdkInstance.session.token\n    const isInternalRequest = params.url.indexOf('s3.amazonaws.com') === -1\n    const isMultipartFormData = params.contentType === false\n\n    let requestBody\n    let requestURL = params.url\n    const requestObject = {}\n    let responseObject\n\n    requestObject.method = params.type || 'GET'\n\n    if (params.data) {\n      requestBody = this.buildRequestBody(params, isMultipartFormData, isPostOrPutType)\n\n      if (isGetOrHeadType) {\n        requestURL += '?' + requestBody\n      } else {\n        requestObject.body = requestBody\n      }\n    }\n\n    if (!isMultipartFormData) {\n      requestObject.headers = {\n        'Content-Type':\n          isPostOrPutType ?\n            'application/json;charset=utf-8' :\n            'application/x-www-form-urlencoded; charset=UTF-8'\n      }\n    }\n\n    if (isInternalRequest) {\n      if (!requestObject.headers) {\n        requestObject.headers = {}\n      }\n\n      requestObject.headers['CB-SDK'] = 'JS ' + config.version + ' - Client'\n\n      if (token) {\n        requestObject.headers['CB-Token'] = token\n      }\n    }\n\n    if (config.timeout) {\n      requestObject.timeout = config.timeout\n    }\n\n    return [requestObject, requestURL]\n  }\n\n  buildRequestBody(params, isMultipartFormData, isPostOrPutType) {\n    const data = params.data\n\n    let dataObject\n\n    if (isMultipartFormData) {\n      dataObject = new formDataImpl()\n\n      Object.keys(data).forEach(function (item) {\n        if (params.fileToCustomObject && item === 'file') {\n          dataObject.append(item, data[item].data, data[item].name)\n        } else {\n          dataObject.append(item, params.data[item])\n        }\n      })\n    } else if (isPostOrPutType) {\n      dataObject = JSON.stringify(data)\n    } else {\n      dataObject = Object.keys(data)\n        .map(k => {\n          if (Utils.isObject(data[k])) {\n            return Object.keys(data[k])\n              .map(v => {\n                return (\n                  this.encodeURIComponent(k) +\n                  '[' +\n                  (Utils.isArray(data[k]) ? '' : v) +\n                  ']=' +\n                  this.encodeURIComponent(data[k][v])\n                )\n              })\n              .sort()\n              .join('&')\n          } else {\n            return (\n              this.encodeURIComponent(k) +\n              (Utils.isArray(data[k]) ? '[]' : '') +\n              '=' +\n              this.encodeURIComponent(data[k])\n            )\n          }\n        })\n        .sort()\n        .join('&')\n    }\n\n    return dataObject\n  }\n\n  encodeURIComponent(str) {\n    return encodeURIComponent(str).replace(/[#$&+,/:;=?@\\[\\]]/g, function (c) {\n      return '%' + c.charCodeAt(0).toString(16)\n    })\n  }\n\n  ajax(params) {\n    return new Promise((resolve, reject) => {\n      this.logRequest(params)\n\n      const requestAndURL = this.buildRequestAndURL(params)\n      const requestObject = requestAndURL[0]\n      const requestURL = requestAndURL[1]\n\n      let response\n\n      // The Promise returned from fetch() won’t reject on HTTP error\n      // status even if the response is an HTTP 404 or 500.\n      // Instead, it will resolve normally (with ok status set to false),\n      // and it will only reject on network failure or if anything prevented the request from completing.\n      fetchImpl(requestURL, requestObject)\n        .then(resp => {\n          response = resp\n          const dataType = params.dataType || 'json'\n          return dataType === 'text' ? response.text() : response.json()\n        })\n        .then(body => {\n          if (!response.ok) {\n            this.processAjaxError(\n              response,\n              body,\n              null,\n              reject,\n              resolve,\n              params\n            )\n          } else {\n            this.processAjaxResponse(body, resolve)\n          }\n        })\n        .catch(error => {\n          this.processAjaxError(response, ' ', error, reject, resolve, params)\n        })\n    })\n  }\n\n  processAjaxResponse(body, resolve) {\n    const responseBody = body && body !== ' ' ? body : 'empty body'\n    this.logResponse(responseBody)\n\n    resolve(body)\n  }\n\n  processAjaxError(response, body, error, reject, resolve, params) {\n    const statusCode = response && (response.status || response.statusCode)\n\n    const errorObject = {\n      code: (response && statusCode) || (error && error.code),\n      info: (body && typeof body === 'string' ? JSON.parse(body) : body) || (error && error.errno),\n    }\n\n    const responseBody = body || error || body.errors\n    this.logResponse(responseBody)\n\n    if (response.url.indexOf(config.urls.session) === -1) {\n      if (\n        Utils.isExpiredSessionError(errorObject) &&\n        typeof config.on.sessionExpired === 'function'\n      ) {\n        this.handleExpiredSessionResponse(\n          errorObject,\n          null,\n          reject,\n          resolve,\n          params\n        )\n      } else {\n        reject(errorObject)\n      }\n    } else {\n      reject(errorObject)\n    }\n  }\n\n  handleExpiredSessionResponse(error, response, reject, resolve, params) {\n    const handleResponse = function () {\n      if (error) {\n        reject(error)\n      } else {\n        resolve(response)\n      }\n    }\n\n    const retryCallback = function (session) {\n      if (session) {\n        this.setSession(session)\n        return this.ajax(params)\n      }\n    }\n\n    config.on.sessionExpired(handleResponse, retryCallback)\n  }\n}\n\nmodule.exports = HTTPProxy\n","const config = require('./cubeConfig')\nconst Utils = require('./cubeInternalUtils')\n\nclass AuthService {\n  constructor (proxy) {\n    this.proxy = proxy\n    this.webSessionCheckInterval = null\n  }\n\n  getSession () {\n    const ajaxParams = {\n      type: 'GET',\n      url: Utils.getUrl(config.urls.session)\n    }\n\n    return new Promise((resolve, reject) => {\n      this.proxy\n        .ajax(ajaxParams)\n        .then(res => {\n          resolve(res.session)\n        })\n        .catch(error => {\n          reject(error)\n        })\n    })\n  }\n\n  createSession (params) {\n    if (config.creds.appId === '' ||\n      config.creds.authKey === '' ||\n      config.creds.authSecret === '') {\n      throw new Error(\n        'Cannot create a new session without app credentials (app ID, auth key and auth secret)'\n      )\n    }\n\n    const route = params && params.hasOwnProperty('long') ? config.urls.webSession : config.urls.session\n\n    const sessionParams = Utils.generateCreateSessionParams(params)\n    sessionParams.signature = Utils.signParams(sessionParams, config.creds.authSecret)\n\n    const ajaxParams = {\n      type: 'POST',\n      url: Utils.getUrl(route),\n      data: sessionParams\n    }\n\n    return new Promise((resolve, reject) => {\n      this.proxy\n        .ajax(ajaxParams)\n        .then(res => {\n          const response = res.qr_code ? res.qr_code : res.session\n          this.proxy.setSession(res.session)\n          this.proxy.setCurrentUserId(res.session.user_id)\n          resolve(response)\n        })\n        .catch(error => {\n          console.log(\"error\", error);\n          reject(error)\n        })\n    })\n  }\n\n  destroySession () {\n    const ajaxParams = {\n      type: 'DELETE',\n      url: Utils.getUrl(config.urls.session),\n      dataType: 'text'\n    }\n\n    return new Promise((resolve, reject) => {\n      this.proxy\n        .ajax(ajaxParams)\n        .then(res => {\n          this.proxy.setSession(null)\n          this.proxy.setCurrentUserId(null)\n\n          resolve()\n        })\n        .catch(error => {\n          reject(error)\n        })\n    })\n  }\n\n  createWebSession (params) {\n    if (!params) {\n      params = {\n        long: 0\n      }\n    }\n\n    return this.createSession(params)\n  }\n\n  checkWebSessionUntilUpgrade (callback) {\n    const interval = config.webSession.getSessionTimeInterval\n    const timeoutError = new Error(\n      'The web session check interval was stopped (timeout)'\n    )\n\n    let timeleft = config.webSession.getSessionTimeout\n\n    const _clearWebSessionCheckTimer = () => {\n      this.webSessionCheckInterval &&\n        clearInterval(this.webSessionCheckInterval)\n    }\n\n    _clearWebSessionCheckTimer()\n\n    this.webSessionCheckInterval = setInterval(() => {\n      this.getSession()\n        .then(session => {\n          if (session.user_id !== 0) {\n            _clearWebSessionCheckTimer()\n            this.proxy.setCurrentUserId(session.user_id)\n            this.proxy.setSession(session)\n            callback(null, session)\n          } else {\n            if (timeleft > interval) {\n              timeleft -= interval\n            } else {\n              _clearWebSessionCheckTimer()\n              callback(timeoutError, null)\n            }\n          }\n        })\n        .catch(error => {\n          _clearWebSessionCheckTimer()\n          callback(error, null)\n        })\n    }, interval * 1000)\n\n    return this.webSessionCheckInterval\n  }\n\n  upgradeWebSession (webToken) {\n    const ajaxParams = {\n      type: 'PATCH',\n      url: Utils.getUrl(config.urls.webSession),\n      dataType: 'text',\n      data: {\n        web_token: webToken\n      }\n    }\n\n    return this.proxy.ajax(ajaxParams)\n  }\n\n  login (params) {\n    const ajaxParams = {\n      type: 'POST',\n      url: Utils.getUrl(config.urls.login),\n      data: params\n    }\n\n    return new Promise((resolve, reject) => {\n      this.proxy\n        .ajax(ajaxParams)\n        .then(res => {\n          this.proxy.setCurrentUserId(res.user.id)\n          resolve(res.user)\n        })\n        .catch(error => {\n          reject(error)\n        })\n    })\n  }\n\n  logout () {\n    const ajaxParams = {\n      type: 'DELETE',\n      url: Utils.getUrl(config.urls.login),\n      dataType: 'text'\n    }\n\n    this.proxy.setCurrentUserId(null)\n\n    return this.proxy.ajax(ajaxParams)\n  }\n}\n\nmodule.exports = AuthService\n","const config = require('./cubeConfig')\nconst Utils = require('./cubeInternalUtils')\n\nclass UsersService {\n  constructor(proxy) {\n    this.proxy = proxy\n  }\n\n  get(params) {\n    let url\n    const filters = []\n    let item\n\n    if (params.order) {\n      params.order = generateOrder(params.order)\n    }\n\n    if (params && params.filter) {\n      if (Utils.isArray(params.filter)) {\n        params.filter.forEach(function (el) {\n          item = generateFilter(el)\n          filters.push(item)\n        })\n      } else {\n        item = generateFilter(params.filter)\n        filters.push(item)\n      }\n      params.filter = filters\n    }\n\n    if (typeof params === 'number') {\n      url = params\n      params = {}\n    } else {\n      if (params.login) {\n        url = 'by_login'\n      } else if (params.full_name) {\n        url = 'by_full_name'\n      } else if (params.facebook_id) {\n        url = 'by_facebook_id'\n      } else if (params.twitter_id) {\n        url = 'by_twitter_id'\n      } else if (params.phone) {\n        url = 'phone'\n      } else if (params.email) {\n        url = 'by_email'\n      } else if (params.tags) {\n        url = 'by_tags'\n      } else if (params.external) {\n        url = 'external/' + params.external\n        params = {}\n      }\n    }\n\n    const ajaxParams = {\n      type: 'GET',\n      url: Utils.getUrl(config.urls.users, url),\n      data: params\n    }\n\n    return this.proxy.ajax(ajaxParams)\n  }\n\n  signup(params) {\n    const ajaxParams = {\n      type: 'POST',\n      url: Utils.getUrl(config.urls.users),\n      data: {\n        user: params\n      }\n    }\n\n    return this.proxy.ajax(ajaxParams)\n  }\n\n  update(params) {\n    const ajaxParams = {\n      type: 'PUT',\n      url: Utils.getUrl(config.urls.users, this.proxy.getCurrentUserId()),\n      data: { user: params }\n    }\n\n    return this.proxy.ajax(ajaxParams)\n  }\n\n  delete() {\n    const ajaxParams = {\n      type: 'DELETE',\n      url: Utils.getUrl(config.urls.users, this.proxy.getCurrentUserId()),\n      dataType: 'text'\n    }\n\n    return this.proxy.ajax(ajaxParams)\n  }\n\n  resetPassword(email) {\n    const ajaxParams = {\n      type: 'GET',\n      url: Utils.getUrl(config.urls.users + '/password/reset'),\n      data: {\n        email: email\n      },\n      dataType: 'text'\n    }\n\n    return this.proxy.ajax(ajaxParams)\n  }\n}\n\nmodule.exports = UsersService\n\nconst DATE_FIELDS = ['created_at', 'updated_at', 'last_request_at']\nconst NUMBER_FIELDS = ['id', 'external_user_id']\n\nfunction generateFilter(obj) {\n  let type = obj.field in DATE_FIELDS ? 'date' : typeof obj.value\n\n  if (Utils.isArray(obj.value)) {\n    if (type === 'object') {\n      type = typeof obj.value[0]\n    }\n    obj.value = obj.value.toString()\n  }\n\n  return [type, obj.field, obj.param, obj.value].join(' ')\n}\n\nfunction generateOrder(obj) {\n  const type =\n    obj.field in DATE_FIELDS\n      ? 'date'\n      : obj.field in NUMBER_FIELDS\n        ? 'number'\n        : 'string'\n  return [obj.sort, type, obj.field].join(' ')\n}\n","const config = require('./cubeConfig')\nconst Utils = require('./cubeInternalUtils')\n\nclass StorageService {\n  constructor(proxy) {\n    this.proxy = proxy\n  }\n\n  list(params) {\n    const ajaxParams = {\n      type: 'GET',\n      url: Utils.getUrl(config.urls.blobs),\n      data: params\n    }\n\n    return this.proxy.ajax(ajaxParams)\n  }\n\n  create(params) {\n    const ajaxParams = {\n      type: 'POST',\n      url: Utils.getUrl(config.urls.blobs),\n      data: { blob: params }\n    }\n\n    return this.proxy.ajax(ajaxParams)\n  }\n\n  delete(id) {\n    const ajaxParams = {\n      type: 'DELETE',\n      url: Utils.getUrl(config.urls.blobs, id),\n      dataType: 'text'\n    }\n\n    return this.proxy.ajax(ajaxParams)\n  }\n\n  createAndUpload(params) {\n    const createParams = {}\n    let file\n    let name\n    let type\n    let size\n    let fileId\n    let result\n\n    const clonedParams = JSON.parse(JSON.stringify(params))\n\n    clonedParams.file.data = '...'\n\n    file = params.file\n    name = params.name || file.name\n    type = params.type || file.type\n    size = params.size || file.size\n\n    createParams.name = name\n    createParams.content_type = type\n\n    if (params.public) {\n      createParams.public = params.public\n    }\n\n    return this.create(createParams)\n      .then(({ blob }) => {\n        const uri = parseUri(blob.blob_object_access.params)\n        const uploadUrl = uri.protocol + '://' + uri.authority + uri.path\n\n        const ajaxParams = { url: uploadUrl }\n        const data = {}\n\n        fileId = blob.id\n        result = { ...blob, size }\n\n        Object.keys(uri.queryKey).forEach(function (val) {\n          data[val] = decodeURIComponent(uri.queryKey[val])\n        })\n\n        data.file = file\n        ajaxParams.data = data\n\n        return this.upload(ajaxParams)\n      })\n      .then(uploadResult => {\n        const ajaxParams = {\n          id: fileId,\n          size: size\n        }\n        return this.markUploaded(ajaxParams)\n      })\n      .then(() => result)\n  }\n\n  upload(params) {\n    const ajaxParams = {\n      type: 'POST',\n      url: params.url,\n      dataType: 'text',\n      contentType: false,\n      data: params.data\n    }\n\n    return this.proxy.ajax(ajaxParams)\n  }\n\n  markUploaded(params) {\n    const ajaxParams = {\n      type: 'PUT',\n      url: Utils.getUrl(config.urls.blobs, params.id + '/complete'),\n      data: {\n        size: params.size\n      },\n      dataType: 'text'\n    }\n\n    return this.proxy.ajax(ajaxParams)\n  }\n\n  getInfo(id) {\n    const ajaxParams = {\n      url: Utils.getUrl(config.urls.blobs, id)\n    }\n\n    return this.proxy.ajax(ajaxParams)\n  }\n\n  getFile(uid) {\n    const ajaxParams = {\n      url: Utils.getUrl(config.urls.blobs, uid)\n    }\n\n    return this.proxy.ajax(ajaxParams)\n  }\n\n  update(params) {\n    const data = {}\n    data.blob = {}\n    if (typeof params.name !== 'undefined') {\n      data.blob.name = params.name\n    }\n\n    const ajaxParams = {\n      url: Utils.getUrl(config.urls.blobs, params.id),\n      data: data\n    }\n\n    return this.proxy.ajax(ajaxParams)\n  }\n\n  privateUrl(fileUID) {\n    return (\n      'https://' +\n      config.endpoints.api +\n      '/blobs/' +\n      fileUID +\n      '?token=' +\n      this.proxy.getSession().token\n    )\n  }\n\n  publicUrl(fileUID) {\n    return 'https://' + config.endpoints.api + '/blobs/' + fileUID\n  }\n}\n\nmodule.exports = StorageService\n\n// parseUri 1.2.2\n// (c) Steven Levithan <stevenlevithan.com>\n// MIT License\n// http://blog.stevenlevithan.com/archives/parseuri\nfunction parseUri(str) {\n  const o = parseUri.options\n  const m = o.parser[o.strictMode ? 'strict' : 'loose'].exec(str)\n\n  const uri = {}\n  let i = 14\n\n  while (i--) {\n    uri[o.key[i]] = m[i] || ''\n  }\n\n  uri[o.q.name] = {}\n  uri[o.key[12]].replace(o.q.parser, function ($0, $1, $2) {\n    if ($1) {\n      uri[o.q.name][$1] = $2\n    }\n  })\n\n  return uri\n}\n\nparseUri.options = {\n  strictMode: false,\n  key: [\n    'source',\n    'protocol',\n    'authority',\n    'userInfo',\n    'user',\n    'password',\n    'host',\n    'port',\n    'relative',\n    'path',\n    'directory',\n    'file',\n    'query',\n    'anchor'\n  ],\n  q: {\n    name: 'queryKey',\n    parser: /(?:^|&)([^&=]*)=?([^&]*)/g\n  },\n  parser: {\n    strict: /^(?:([^:\\/?#]+):)?(?:\\/\\/((?:(([^:@]*)(?::([^:@]*))?)?@)?([^:\\/?#]*)(?::(\\d*))?))?((((?:[^?#\\/]*\\/)*)([^?#]*))(?:\\?([^#]*))?(?:#(.*))?)/,\n    loose: /^(?:(?![^:@]+:[^:@\\/]*@)([^:\\/?#.]+):)?(?:\\/\\/)?((?:(([^:@]*)(?::([^:@]*))?)?@)?([^:\\/?#]*)(?::(\\d*))?)(((\\/(?:[^?#](?![^?#\\/]*\\.[^?#\\/.]+(?:[?#]|$)))*\\/?)?([^?#\\/]*))(?:\\?([^#]*))?(?:#(.*))?)/\n  }\n}\n","const config = require('./cubeConfig')\nconst Utils = require('./cubeInternalUtils')\n\nclass PushNotificationsService {\n  constructor (proxy) {\n    this.proxy = proxy\n\n    this.subscriptions = new SubscriptionsService(proxy)\n    this.events = new EventsService(proxy)\n\n    this.base64Encode = function (str) {\n      return Utils.toBase64(str)\n    }\n  }\n}\n\nclass SubscriptionsService {\n  constructor (proxy) {\n    this.proxy = proxy\n  }\n\n  create (params) {\n    const ajaxParams = {\n      type: 'POST',\n      url: Utils.getUrl(config.urls.subscriptions),\n      data: params\n    }\n\n    return this.proxy.ajax(ajaxParams)\n  }\n\n  list () {\n    const ajaxParams = {\n      type: 'GET',\n      url: Utils.getUrl(config.urls.subscriptions)\n    }\n\n    return this.proxy.ajax(ajaxParams)\n  }\n\n  delete (id) {\n    const ajaxParams = {\n      type: 'DELETE',\n      dataType: 'text',\n      url: Utils.getUrl(config.urls.subscriptions, id)\n    }\n\n    return this.proxy.ajax(ajaxParams)\n  }\n}\n\nclass EventsService {\n  constructor (proxy) {\n    this.proxy = proxy\n  }\n\n  create (params) {\n    const ajaxParams = {\n      type: 'POST',\n      url: Utils.getUrl(config.urls.events),\n      data: {\n        event: params\n      }\n    }\n\n    return this.proxy.ajax(ajaxParams)\n  }\n}\n\nmodule.exports = PushNotificationsService\n","const config = require('./cubeConfig')\nconst Utils = require('./cubeInternalUtils')\n\nclass DataService {\n  constructor(proxy) {\n    this.proxy = proxy\n  }\n\n  create(className, data) {\n    const ajaxParams = {\n      type: 'POST',\n      data: data,\n      url: Utils.getUrl(config.urls.data, className)\n    }\n\n    return this.proxy.ajax(ajaxParams)\n  }\n\n  list(className, filters) {\n    const ajaxParams = {\n      url: Utils.getUrl(config.urls.data, className),\n      data: filters\n    }\n\n    return this.proxy.ajax(ajaxParams)\n  }\n\n  update(className, data) {\n    const ajaxParams = {\n      type: 'PUT',\n      url: Utils.getUrl(config.urls.data, className + '/' + data._id),\n      data: data\n    }\n\n    return this.proxy.ajax(ajaxParams)\n  }\n\n  delete(className, requestedData) {\n    const typesData = {\n      id: 1,\n      ids: 2,\n      criteria: 3\n    }\n\n    const ajaxParams = {\n      type: 'DELETE'\n    }\n\n    /** Define what type of data passed by client */\n    let requestedTypeOf\n    if (typeof requestedData === 'string') {\n      requestedTypeOf = typesData.id\n    } else if (Utils.isArray(requestedData)) {\n      requestedTypeOf = requestedData.length > 1 ? typesData.ids : typesData.id\n    } else if (Utils.isObject(requestedData)) {\n      requestedTypeOf = typesData.criteria\n    }\n\n    if (requestedTypeOf === typesData.id) {\n      ajaxParams.url = Utils.getUrl(\n        config.urls.data,\n        className + '/' + requestedData\n      )\n      ajaxParams.dataType = 'text';\n    } else if (requestedTypeOf === typesData.ids) {\n      ajaxParams.url = Utils.getUrl(\n        config.urls.data,\n        className + '/' + requestedData.toString()\n      )\n    } else if (requestedTypeOf === typesData.criteria) {\n      ajaxParams.url = Utils.getUrl(\n        config.urls.data,\n        className + '/by_criteria'\n      )\n      ajaxParams.data = requestedData\n    }\n\n    return this.proxy.ajax(ajaxParams)\n  }\n}\n\nmodule.exports = DataService\n","const Utils = require('./cubeInternalUtils')\nconst config = require('./cubeConfig')\n\nclass AddressBookService {\n  constructor (proxy) {\n    this.proxy = proxy\n  }\n\n  uploadAddressBook (list, opts) {\n    if (!Utils.isArray(list)) {\n      new Error('First parameter must be an Array.')\n      return\n    }\n\n    const data = { contacts: list }\n\n    if (opts) {\n      if (opts.force) {\n        data.force = opts.force\n      }\n\n      if (opts.udid) {\n        data.udid = opts.udid\n      }\n    }\n\n    const ajaxParams = {\n      type: 'POST',\n      url: Utils.getUrl(config.urls.addressbook),\n      data: data\n    }\n\n    return this.proxy.ajax(ajaxParams)\n  }\n\n  get (udid) {\n    const ajaxParams = {\n      type: 'GET',\n      url: Utils.getUrl(config.urls.addressbook)\n    }\n    if (udid) {\n      ajaxParams.data = { udid: udid }\n    }\n\n    return this.proxy.ajax(ajaxParams)\n  }\n\n  getRegisteredUsers (isCompact) {\n    const ajaxParams = {\n      type: 'GET',\n      url: Utils.getUrl(config.urls.addressbookRegistered)\n    }\n    if (isCompact) {\n      ajaxParams.data = { compact: 1 }\n    }\n\n    return this.proxy.ajax(ajaxParams)\n  }\n}\n\nmodule.exports = AddressBookService\n","const Config = require('../cubeConfig'),\n  Utils = require('../cubeInternalUtils'),\n  ChatUtils = require('./cubeChatInternalUtils'),\n  ChatHelpers = require('./cubeChatHelpers'),\n  StreamManagement = require('./cubeStreamManagement'),\n  ContactListProxy = require('./cubeContactList'),\n  PrivacyListProxy = require('./cubePrivacyList'),\n  MucProxy = require('./cubeMultiUserChat'),\n  XMPPClient = require('../cubeDependencies').XMPPClient;\n\nclass ChatService {\n  constructor(proxy) {\n    this.proxy = proxy\n\n    this.xmppClient = XMPPClient.client({\n      service: Config.chatProtocol.websocket,\n      credentials: (auth, mechanism) => {\n        const crds = {\n          username: this.xmppClient.options.username,\n          password: this.xmppClient.options.password\n        };\n        return auth(crds);\n      }\n    });\n\n    this.webrtcSignalingProcessor = null;\n\n    this.stanzasCallbacks = {};\n    this.earlyIncomingMessagesQueue = [];\n\n    this.isConnected = false;\n    this._isConnecting = false;\n    this._isLogout = false;\n\n    this._checkConnectionTimer = undefined;\n    this._checkPingTimer = undefined;\n\n    this.helpers = new ChatHelpers();\n\n    this.xmppClientListeners = [];\n\n    // Chat additional modules\n    var options = {\n      xmppClient: this.xmppClient,\n      helpers: this.helpers,\n      stanzasCallbacks: this.stanzasCallbacks\n    };\n\n    this.contactList = new ContactListProxy(options);\n    this.privacylist = new PrivacyListProxy(options);\n    this.muc = new MucProxy(options);\n\n    if (Config.chat.streamManagement.enable) {\n      if (Config.chatProtocol.active === 2) {\n        this.streamManagement = new StreamManagement();\n        this._sentMessageCallback = (messageLost, messageSent) => {\n          if (typeof this.onSentMessageCallback === 'function') {\n            if (messageSent) {\n              this.onSentMessageCallback(null, messageSent);\n            } else {\n              this.onSentMessageCallback(messageLost);\n            }\n          }\n        };\n      }\n    }\n  }\n\n  connect(params) {\n    return new Promise((resolve, reject) => {\n      Utils.DLog('[Chat]', 'Connect with parameters ', params);\n\n      const userJid = ChatUtils.buildUserJid(params),\n        isInitialConnect = typeof callback === 'function';\n\n      if (this._isConnecting) {\n        if (isInitialConnect) {\n          const err = { code: 422, info: 'Already in CONNECTING state' };\n          reject(err);\n        }\n        return;\n      }\n\n      if (this.isConnected) {\n        Utils.DLog('[Chat]', 'CONNECTED - You are already connected');\n        if (isInitialConnect) {\n          resolve();\n        }\n        return;\n      }\n\n      this._isConnecting = true;\n      this._isLogout = false;\n\n      // remove all old listeners\n      this.xmppClientListeners.forEach((listener) => {\n        this.xmppClient.removeListener(listener.name, listener.callback);\n      });\n\n      const callbackConnect = () => {\n        Utils.DLog('[Chat]', 'CONNECTING');\n      };\n\n      this.xmppClient.on('connect', callbackConnect);\n      this.xmppClientListeners.push({ name: 'connect', callback: callbackConnect });\n\n      const callbackOnline = (jid) => {\n        Utils.DLog('[Chat]', 'ONLINE');\n        this.startPingTimer();\n        this._postConnectActions(isInitialConnect);\n        resolve();\n      };\n      this.xmppClient.on('online', callbackOnline);\n      this.xmppClientListeners.push({ name: 'online', callback: callbackOnline });\n\n      const callbackOffline = () => {\n        Utils.DLog('[Chat]', 'OFFLINE');\n      };\n      this.xmppClient.on('offline', callbackOffline);\n      this.xmppClientListeners.push({ name: 'offline', callback: callbackOffline });\n\n      const callbackDisconnect = () => {\n        Utils.DLog('[Chat]', 'DISCONNECTED');\n\n        if (typeof this.onDisconnectedListener === 'function') {\n          Utils.safeCallbackCall(this.onDisconnectedListener);\n        }\n\n        this.stopPingTimer();\n\n        this.isConnected = false;\n        this._isConnecting = false;\n\n        // reconnect to chat and enable check connection\n        this._establishConnection(params);\n      };\n      this.xmppClient.on('disconnect', callbackDisconnect);\n      this.xmppClientListeners.push({ name: 'disconnect', callback: callbackDisconnect });\n\n      const callbackStatus = (status, value) => {\n        Utils.DLog('[Chat]', 'status', status, value ? value.toString() : '');\n      };\n      this.xmppClient.on('status', callbackStatus);\n      this.xmppClientListeners.push({ name: 'status', callback: callbackStatus });\n\n      const callbackStanza = stanza => {\n\n        // it can be a case,\n        // when message came after xmpp auth but before resource bindging,\n        // and it can cause some crashes, e.g.\n        // https://github.com/ConnectyCube/connectycube-js-sdk-releases/issues/28\n        if (stanza.is('message') && !this.isConnected) {\n          this.earlyIncomingMessagesQueue.push(stanza);\n          Utils.DLog('[Chat]', \"on 'stanza': enqueue incoming stanza (isConnected=false)\");\n          return;\n        }\n\n        // console.log('stanza', stanza.toString())\n        // after 'input' and 'element' (only if stanza, not nonza)\n        if (stanza.is('presence')) {\n          this._onPresence(stanza);\n        } else if (stanza.is('iq')) {\n          this._onIQ(stanza);\n        } else if (stanza.is('message')) {\n          if (stanza.attrs.type === 'headline') {\n            this._onSystemMessageListener(stanza);\n          } else if (stanza.attrs.type === 'error') {\n            this._onMessageErrorListener(stanza);\n          } else {\n            this._onMessage(stanza);\n          }\n        }\n      };\n      this.xmppClient.on('stanza', callbackStanza);\n      this.xmppClientListeners.push({ name: 'stanza', callback: callbackStanza });\n\n      const callbackError = err => {\n        Utils.DLog('[Chat]', 'ERROR:', err);\n\n        if (isInitialConnect) {\n          if (err.name == 'SASLError') {\n            err = err.condition;\n          }\n          reject(err);\n        }\n\n        this.isConnected = false;\n        this._isConnecting = false;\n      };\n      this.xmppClient.on('error', callbackError);\n      this.xmppClientListeners.push({ name: 'error', callback: callbackError });\n\n      const callbackOutput = str => {\n        Utils.callTrafficUsageCallback('xmppDataWrite', { body: str })\n        Utils.DLog('[Chat]', 'SENT:', str);\n      };\n      this.xmppClient.on('output', callbackOutput);\n      this.xmppClientListeners.push({ name: 'output', callback: callbackOutput });\n\n      const callbackInput = str => {\n        Utils.callTrafficUsageCallback('xmppDataRead', { body: str })\n        Utils.DLog('[Chat]', 'RECV:', str);\n      };\n      this.xmppClient.on('input', callbackInput);\n      this.xmppClientListeners.push({ name: 'input', callback: callbackInput });\n\n      // save user connection data so they will be used when authenticate (above)\n      this.xmppClient.options.username = ChatUtils.buildUserJidLocalPart(params.userId);\n      this.xmppClient.options.password = params.password;\n      //\n      this.xmppClient.start();\n    });\n  }\n\n  /**\n   * @deprecated since version 2.0\n   */\n  getContacts() {\n    return new Promise((resolve, reject) => {\n      this.contactList.get().then(contacts => {\n        this.contactList.contacts = contacts;\n        resolve(contacts);\n      }).catch(error => {\n        reject(reject);\n      });\n    });\n  }\n\n  ping() {\n    return new Promise((resolve, reject) => {\n      const iqParams = {\n        id: ChatUtils.getUniqueId('ping'),\n        to: Config.endpoints.chat,\n        type: 'get'\n      };\n\n      const iqStanza = ChatUtils.createIqStanza(iqParams);\n\n      iqStanza\n        .c('ping', {\n          xmlns: 'urn:xmpp:ping'\n        });\n\n      this.stanzasCallbacks[iqParams.id] = stanza => {\n        const error = ChatUtils.getElement(stanza, 'error');\n        if (error) {\n          reject(ChatUtils.buildErrorFromXMPPErrorStanza(error));\n        } else {\n          resolve();\n        }\n      };\n\n      this.xmppClient.send(iqStanza);\n    });\n  }\n\n  startPingTimer() {\n    if (Config.chat.ping.enable) {\n      const validTime = Config.chat.pingTimeInterval < 60 ? 60 : Config.chat.pingTimeInterval\n      this._checkPingTimer = setInterval(() => {\n        this.ping();\n      }, validTime * 1000);\n    }\n  };\n\n  stopPingTimer() {\n    clearInterval(this._checkPingTimer);\n  };\n\n  send(jidOrUserId, message) {\n    const stanzaParams = {\n      from: this.helpers.getUserCurrentJid(),\n      to: this.helpers.jidOrUserId(jidOrUserId),\n      type: message.type ? message.type : 'chat',\n      id: message.id ? message.id : Utils.getBsonObjectId()\n    };\n\n    let messageStanza = ChatUtils.createMessageStanza(stanzaParams);\n\n    if (message.body) {\n      messageStanza\n        .c('body', {\n          xmlns: 'jabber:client'\n        })\n        .t(message.body)\n        .up();\n    }\n\n    if (message.markable) {\n      messageStanza\n        .c('markable', {\n          xmlns: 'urn:xmpp:chat-markers:0'\n        })\n        .up();\n    }\n\n    if (message.extension) {\n      messageStanza.c('extraParams', {\n        xmlns: 'jabber:client'\n      });\n\n      messageStanza = ChatUtils.filledExtraParams(messageStanza, message.extension);\n    }\n\n    if (Config.chat.streamManagement.enable) {\n      message.id = stanzaParams.id;\n      this.xmppClient.send(messageStanza, message);\n    } else {\n      this.xmppClient.send(messageStanza);\n    }\n\n    return stanzaParams.id;\n  }\n\n  sendSystemMessage(jidOrUserId, message) {\n    const stanzaParams = {\n      type: 'headline',\n      id: message.id ? message.id : Utils.getBsonObjectId(),\n      to: this.helpers.jidOrUserId(jidOrUserId)\n    };\n\n    let messageStanza = ChatUtils.createMessageStanza(stanzaParams);\n\n    if (message.body) {\n      messageStanza\n        .c('body', {\n          xmlns: 'jabber:client'\n        })\n        .t(message.body)\n        .up();\n    }\n\n    // custom parameters\n    if (message.extension) {\n      messageStanza\n        .c('extraParams', {\n          xmlns: 'jabber:client'\n        })\n        .c('moduleIdentifier')\n        .t('SystemNotifications')\n        .up();\n\n      messageStanza = ChatUtils.filledExtraParams(messageStanza, message.extension);\n    }\n\n    this.xmppClient.send(messageStanza);\n\n    return stanzaParams.id;\n  }\n\n  sendIsTypingStatus(jidOrUserId) {\n    const stanzaParams = {\n      from: this.helpers.getUserCurrentJid(),\n      to: this.helpers.jidOrUserId(jidOrUserId),\n      type: this.helpers.typeChat(jidOrUserId)\n    };\n\n    const messageStanza = ChatUtils.createMessageStanza(stanzaParams);\n\n    messageStanza.c('composing', {\n      xmlns: 'http://jabber.org/protocol/chatstates'\n    });\n\n    this.xmppClient.send(messageStanza);\n  }\n\n  sendIsStopTypingStatus(jidOrUserId) {\n    const stanzaParams = {\n      from: this.helpers.getUserCurrentJid(),\n      to: this.helpers.jidOrUserId(jidOrUserId),\n      type: this.helpers.typeChat(jidOrUserId)\n    };\n\n    const messageStanza = ChatUtils.createMessageStanza(stanzaParams);\n\n    messageStanza.c('paused', {\n      xmlns: 'http://jabber.org/protocol/chatstates'\n    });\n\n    this.xmppClient.send(messageStanza);\n  }\n\n  sendDeliveredStatus(params) {\n    const stanzaParams = {\n      type: 'chat',\n      from: this.helpers.getUserCurrentJid(),\n      id: Utils.getBsonObjectId(),\n      to: this.helpers.jidOrUserId(params.userId)\n    };\n\n    const messageStanza = ChatUtils.createMessageStanza(stanzaParams);\n    messageStanza\n      .c('received', {\n        xmlns: 'urn:xmpp:chat-markers:0',\n        id: params.messageId\n      })\n      .up();\n    messageStanza\n      .c('extraParams', {\n        xmlns: 'jabber:client'\n      })\n      .c('dialog_id')\n      .t(params.dialogId);\n\n    this.xmppClient.send(messageStanza);\n  }\n\n  sendReadStatus(params) {\n    const stanzaParams = {\n      type: 'chat',\n      from: this.helpers.getUserCurrentJid(),\n      to: this.helpers.jidOrUserId(params.userId),\n      id: Utils.getBsonObjectId()\n    };\n\n    const messageStanza = ChatUtils.createMessageStanza(stanzaParams);\n    messageStanza\n      .c('displayed', {\n        xmlns: 'urn:xmpp:chat-markers:0',\n        id: params.messageId\n      })\n      .up();\n    messageStanza\n      .c('extraParams', {\n        xmlns: 'jabber:client'\n      })\n      .c('dialog_id')\n      .t(params.dialogId);\n\n    this.xmppClient.send(messageStanza);\n  }\n\n  getLastUserActivity(jidOrUserId) {\n    return new Promise((resolve, reject) => {\n      const iqParams = {\n        from: this.helpers.getUserCurrentJid(),\n        id: ChatUtils.getUniqueId('lastActivity'),\n        to: this.helpers.jidOrUserId(jidOrUserId),\n        type: 'get'\n      };\n      const iqStanza = ChatUtils.createIqStanza(iqParams);\n\n      iqStanza.c('query', { xmlns: 'jabber:iq:last' });\n\n      this.stanzasCallbacks[iqParams.id] = stanza => {\n        const error = ChatUtils.getElement(stanza, 'error');\n        const from = ChatUtils.getAttr(stanza, 'from');\n        const userId = this.helpers.getUserIdFromJID(from);\n        const query = ChatUtils.getElement(stanza, 'query');\n        const seconds = +ChatUtils.getAttr(query, 'seconds');\n\n        // trigger onLastUserActivityListener callback\n        Utils.safeCallbackCall(this.onLastUserActivityListener, userId, seconds);\n\n        if (error) {\n          reject(ChatUtils.buildErrorFromXMPPErrorStanza(stanza));\n        } else {\n          resolve({ userId, seconds });\n        }\n      }\n\n      this.xmppClient.send(iqStanza);\n    });\n  }\n\n  markActive() {\n    const iqParams = {\n      id: this.helpers.getUniqueId('markActive'),\n      type: 'set'\n    };\n\n    const iqStanza = ChatUtils.createIqStanza(iqParams);\n    iqStanza.c('mobile', {\n      xmlns: \"http://tigase.org/protocol/mobile#v2\",\n      enable: \"false\"\n    });\n\n    this.xmppClient.send(iqStanza);\n  }\n\n  markInactive() {\n    const iqParams = {\n      id: this.helpers.getUniqueId('markActive'),\n      type: 'set'\n    };\n\n    const iqStanza = ChatUtils.createIqStanza(iqParams);\n    iqStanza.c('mobile', {\n      xmlns: \"http://tigase.org/protocol/mobile#v2\",\n      enable: \"true\"\n    });\n\n    this.xmppClient.send(iqStanza);\n  }\n\n  disconnect() {\n    Utils.DLog('[Chat]', 'disconnect');\n    clearInterval(this._checkConnectionTimer);\n    this._checkConnectionTimer = undefined;\n    this.muc.joinedRooms = {};\n    this._isLogout = true;\n    this.helpers.setUserCurrentJid('');\n\n    this.xmppClient.stop();\n  }\n\n  search(params) {\n    let query = Object.assign({}, params)\n\n    if (query.start_date) {\n      query.start_date = new Date(query.start_date).toISOString()\n    }\n\n    if (query.end_date) {\n      query.end_date = new Date(query.end_date).toISOString()\n    }\n\n    if (Utils.isArray(query.chat_dialog_ids)) {\n      query.chat_dialog_ids = query.chat_dialog_ids.join(',')\n    }\n\n    const ajaxParams = {\n      type: 'GET',\n      url: Utils.getUrl(`${Config.urls.chat}/search`),\n      data: query\n    };\n\n    return this.proxy.ajax(ajaxParams);\n  }\n\n\n  /// PRIVATE ///\n\n  _onMessage(rawStanza) {\n    const forwaredStanza = ChatUtils.getElementTreePath(rawStanza, ['sent', 'forwarded', 'message']),\n      stanza = forwaredStanza || rawStanza,\n      from = ChatUtils.getAttr(stanza, 'from'),\n      type = ChatUtils.getAttr(stanza, 'type'),\n      messageId = ChatUtils.getAttr(stanza, 'id'),\n      markable = ChatUtils.getElement(stanza, 'markable'),\n      delivered = ChatUtils.getElement(stanza, 'received'),\n      read = ChatUtils.getElement(stanza, 'displayed'),\n      composing = ChatUtils.getElement(stanza, 'composing'),\n      paused = ChatUtils.getElement(stanza, 'paused'),\n      invite = ChatUtils.getElement(stanza, 'invite'),\n      delay = ChatUtils.getElement(stanza, 'delay'),\n      extraParams = ChatUtils.getElement(stanza, 'extraParams'),\n      bodyContent = ChatUtils.getElementText(stanza, 'body'),\n      forwarded = ChatUtils.getElement(stanza, 'forwarded');\n\n    let extraParamsParsed,\n      recipientId,\n      recipient;\n\n    const forwardedMessage = forwarded ? ChatUtils.getElement(forwarded, 'message') : null;\n\n    recipient = forwardedMessage ? ChatUtils.getAttr(forwardedMessage, 'to') : null;\n    recipientId = recipient ? this.helpers.getUserIdFromJID(recipient) : null;\n\n    let dialogId = type === 'groupchat' ? this.helpers.getDialogIdFromJID(from) : null,\n      userId = type === 'groupchat' ? this.helpers.getIdFromResource(from) : this.helpers.getUserIdFromJID(from),\n      marker = delivered || read || null;\n\n    // ignore invite messages from MUC\n    if (invite) return true;\n\n    if (extraParams) {\n      extraParamsParsed = ChatUtils.parseExtraParams(extraParams);\n\n      if (extraParamsParsed.dialogId) {\n        dialogId = extraParamsParsed.dialogId;\n      }\n    }\n\n    if (composing || paused) {\n      if (\n        typeof this.onMessageTypingListener === 'function' &&\n        (type === 'chat' || type === 'groupchat' || !delay)) {\n        Utils.safeCallbackCall(this.onMessageTypingListener, !!composing, userId, dialogId);\n      }\n\n      return true;\n    }\n\n    if (marker) {\n      if (delivered) {\n        if (typeof this.onDeliveredStatusListener === 'function' && type === 'chat') {\n          Utils.safeCallbackCall(\n            this.onDeliveredStatusListener,\n            ChatUtils.getAttr(delivered, 'id'),\n            dialogId,\n            userId\n          );\n        }\n      } else {\n        if (typeof this.onReadStatusListener === 'function' && type === 'chat') {\n          Utils.safeCallbackCall(this.onReadStatusListener, ChatUtils.getAttr(read, 'id'), dialogId, userId);\n        }\n      }\n\n      return;\n    }\n\n    // autosend 'received' status (ignore messages from yourself)\n    if (markable && userId != this.helpers.getUserIdFromJID(this.helpers.userCurrentJid(this.xmppClient))) {\n      const autoSendReceiveStatusParams = {\n        messageId: messageId,\n        userId: userId,\n        dialogId: dialogId\n      };\n\n      this.sendDeliveredStatus(autoSendReceiveStatusParams);\n    }\n\n    const message = {\n      id: messageId,\n      dialog_id: dialogId,\n      recipient_id: recipientId,\n      type: type,\n      body: bodyContent,\n      extension: extraParamsParsed ? extraParamsParsed.extension : null,\n      delay: delay\n    };\n\n    if (markable) {\n      message.markable = 1;\n    }\n\n    if (typeof this.onMessageListener === 'function' && (type === 'chat' || type === 'groupchat')) {\n      Utils.safeCallbackCall(this.onMessageListener, userId, message);\n    }\n  }\n\n  _onPresence(stanza) {\n    const from = ChatUtils.getAttr(stanza, 'from'),\n      id = ChatUtils.getAttr(stanza, 'id'),\n      type = ChatUtils.getAttr(stanza, 'type'),\n      currentUserId = this.helpers.getUserIdFromJID(this.helpers.userCurrentJid(this.xmppClient)),\n      x = ChatUtils.getElement(stanza, 'x');\n\n    let xXMLNS,\n      status,\n      statusCode;\n\n    if (x) {\n      xXMLNS = ChatUtils.getAttr(x, 'xmlns');\n      status = ChatUtils.getElement(x, 'status');\n      if (status) {\n        statusCode = ChatUtils.getAttr(status, 'code');\n      }\n    }\n\n    // MUC presences\n    if (xXMLNS && xXMLNS.startsWith('http://jabber.org/protocol/muc')) {\n\n      // Error\n      if (type === 'error') {\n        // JOIN to dialog error\n        if (id.endsWith(':join')) {\n          if (typeof this.stanzasCallbacks[id] === 'function') {\n            this.stanzasCallbacks[id](stanza);\n          }\n        }\n        return;\n      }\n\n      const dialogId = this.helpers.getDialogIdFromJID(from);\n      const userId = this.helpers.getUserIdFromRoomJid(from);\n\n\n      // self presence\n      if (status) {\n        // KICK from dialog event\n        if (statusCode == '301') {\n          if (typeof this.onKickOccupant === 'function') {\n            var actorElement = ChatUtils.getElement(ChatUtils.getElement(x, 'item'), 'actor');\n            var initiatorUserJid = ChatUtils.getAttr(actorElement, 'jid');\n            Utils.safeCallbackCall(this.onKickOccupant, dialogId, this.helpers.getUserIdFromJID(initiatorUserJid));\n          }\n\n          delete this.muc.joinedRooms[this.helpers.getRoomJidFromRoomFullJid(from)];\n          return;\n\n        } else {\n          if (type === 'unavailable') {\n            // LEAVE response\n            if (status && statusCode == '110') {\n              if (typeof this.stanzasCallbacks['muc:leave'] === 'function') {\n                Utils.safeCallbackCall(this.stanzasCallbacks['muc:leave'], null);\n              }\n            }\n            return;\n          }\n\n          // JOIN response\n          if (id.endsWith(':join') && status && statusCode == '110') {\n            if (typeof this.stanzasCallbacks[id] === 'function') {\n              this.stanzasCallbacks[id](stanza);\n            }\n            return;\n          }\n        }\n\n        // Occupants JOIN/LEAVE events\n      } else {\n        if (userId != currentUserId) {\n          // Leave\n          if (type === 'unavailable') {\n            if (typeof this.onLeaveOccupant === 'function') {\n              Utils.safeCallbackCall(this.onLeaveOccupant, dialogId, parseInt(userId));\n            }\n            return;\n            // Join\n          } else {\n            if (typeof this.onJoinOccupant === 'function') {\n              Utils.safeCallbackCall(this.onJoinOccupant, dialogId, parseInt(userId));\n            }\n            return;\n          }\n        }\n      }\n    }\n\n    // ROSTER presences\n    const userId = this.helpers.getUserIdFromJID(from);\n    let contact = this.contactList.contacts[userId];\n\n    if (!type) {\n      if (typeof this.onContactListListener === 'function' && contact && contact.subscription !== 'none') {\n        Utils.safeCallbackCall(this.onContactListListener, userId);\n      }\n    } else {\n      switch (type) {\n        case 'subscribe':\n          if (contact && contact.subscription === 'to') {\n            contact ? (contact.ask = null) : (contact = { ask: null });\n            contact.subscription = 'both';\n\n            this.contactList._sendSubscriptionPresence({\n              jid: from,\n              type: 'subscribed'\n            });\n          } else {\n            if (typeof this.onSubscribeListener === 'function') {\n              Utils.safeCallbackCall(this.onSubscribeListener, userId);\n            }\n          }\n          break;\n        case 'subscribed':\n          if (contact && contact.subscription === 'from') {\n            contact ? (contact.ask = null) : (contact = { ask: null });\n            contact.subscription = 'both';\n          } else {\n            contact ? (contact.ask = null) : (contact = { ask: null });\n            contact.subscription = 'to';\n\n            if (typeof this.onConfirmSubscribeListener === 'function') {\n              Utils.safeCallbackCall(this.onConfirmSubscribeListener, userId);\n            }\n          }\n          break;\n        case 'unsubscribed':\n          contact ? (contact.ask = null) : (contact = { ask: null });\n          contact.subscription = 'none';\n\n          if (typeof this.onRejectSubscribeListener === 'function') {\n            Utils.safeCallbackCall(this.onRejectSubscribeListener, userId);\n          }\n\n          break;\n        case 'unsubscribe':\n          contact ? (contact.ask = null) : (contact = { ask: null });\n          contact.subscription = 'to';\n\n          break;\n        case 'unavailable':\n          if (\n            typeof this.onContactListListener === 'function' &&\n            contact &&\n            contact.subscription !== 'none'\n          ) {\n            Utils.safeCallbackCall(this.onContactListListener, userId, type);\n          }\n\n          // send initial presence if one of client (instance) goes offline\n          if (userId === currentUserId) {\n            this.xmppClient.send(ChatUtils.createPresenceStanza());\n          }\n\n          break;\n      }\n    }\n  }\n\n  _onIQ(stanza) {\n    const stanzaId = ChatUtils.getAttr(stanza, 'id');\n\n    if (this.stanzasCallbacks[stanzaId]) {\n      Utils.safeCallbackCall(this.stanzasCallbacks[stanzaId], stanza);\n      delete this.stanzasCallbacks[stanzaId];\n    }\n  }\n\n  _onSystemMessageListener(rawStanza) {\n    const forwaredStanza = ChatUtils.getElementTreePath(rawStanza, ['sent', 'forwarded', 'message']),\n      stanza = forwaredStanza || rawStanza,\n      from = ChatUtils.getAttr(stanza, 'from'),\n      messageId = ChatUtils.getAttr(stanza, 'id'),\n      extraParams = ChatUtils.getElement(stanza, 'extraParams'),\n      userId = this.helpers.getUserIdFromJID(from),\n      delay = ChatUtils.getElement(stanza, 'delay'),\n      moduleIdentifier = ChatUtils.getElementText(extraParams, 'moduleIdentifier'),\n      bodyContent = ChatUtils.getElementText(stanza, 'body'),\n      extraParamsParsed = ChatUtils.parseExtraParams(extraParams);\n\n    if (moduleIdentifier === 'SystemNotifications' && typeof this.onSystemMessageListener === 'function') {\n      const message = {\n        id: messageId,\n        userId: userId,\n        body: bodyContent,\n        extension: extraParamsParsed.extension\n      };\n\n      Utils.safeCallbackCall(this.onSystemMessageListener, message);\n    } else if (this.webrtcSignalingProcessor && !delay && moduleIdentifier === 'WebRTCVideoChat') {\n      this.webrtcSignalingProcessor._onMessage(userId, extraParams);\n    }\n  }\n\n  _onMessageErrorListener(stanza) {\n    // <error code=\"503\" type=\"cancel\">\n    //   <service-unavailable xmlns=\"urn:ietf:params:xml:ns:xmpp-stanzas\"/>\n    //   <text xmlns=\"urn:ietf:params:xml:ns:xmpp-stanzas\" xml:lang=\"en\">Service not available.</text>\n    // </error>\n\n    const messageId = ChatUtils.getAttr(stanza, 'id');\n    //\n    const error = ChatUtils.buildErrorFromXMPPErrorStanza(stanza);\n\n    if (typeof this.onMessageErrorListener === 'function') {\n      Utils.safeCallbackCall(this.onMessageErrorListener, messageId, error);\n    }\n  }\n\n  _postConnectActions(isInitialConnect) {\n    Utils.DLog('[Chat]', 'CONNECTED');\n\n    const presence = ChatUtils.createPresenceStanza();\n\n    if (Config.chat.streamManagement.enable && Config.chatProtocol.active === 2) {\n      this.streamManagement.enable(this.xmppClient);\n      this.streamManagement.sentMessageCallback = this._sentMessageCallback;\n    }\n\n    this.helpers.setUserCurrentJid(this.helpers.userCurrentJid(this.xmppClient));\n\n    this.isConnected = true;\n    this._isConnecting = false;\n\n    this._enableCarbons();\n\n    this.xmppClient.send(presence); // initial presence\n\n    // reconnect\n    if (!isInitialConnect) {\n      if (typeof this.onReconnectListener === 'function') {\n        Utils.safeCallbackCall(this.onReconnectListener);\n      }\n    }\n\n    if (this.earlyIncomingMessagesQueue.length > 0) {\n      Utils.DLog('[Chat]', `Flush 'earlyIncomingMessagesQueue' (length=${this.earlyIncomingMessagesQueue.length})`);\n\n      const stanzasCallback = this.xmppClientListeners.filter(listener => listener.name === 'stanza')[0].callback;\n      this.earlyIncomingMessagesQueue.forEach(stanza => {\n        stanzasCallback(stanza);\n      });\n      this.earlyIncomingMessagesQueue = [];\n    }\n  }\n\n  _establishConnection(params) {\n    if (this._isLogout || this._checkConnectionTimer) {\n      return;\n    }\n\n    const _connect = () => {\n      if (!this.isConnected && !this._isConnecting) {\n        this.connect(params);\n      } else {\n        clearInterval(this._checkConnectionTimer);\n        this._checkConnectionTimer = undefined;\n      }\n    };\n\n    _connect();\n\n    this._checkConnectionTimer = setInterval(() => {\n      _connect();\n    }, Config.chat.reconnectionTimeInterval * 1000);\n  }\n\n  _enableCarbons() {\n    const carbonParams = {\n      type: 'set',\n      from: this.helpers.getUserCurrentJid(),\n      id: ChatUtils.getUniqueId('enableCarbons')\n    };\n\n    const iqStanza = ChatUtils.createIqStanza(carbonParams);\n    iqStanza.c('enable', {\n      xmlns: 'urn:xmpp:carbons:2'\n    });\n\n    this.xmppClient.send(iqStanza);\n  }\n\n  _setSubscriptionToUserLastActivity(jidOrUserId, _isEnable) {\n    var iqParams = {\n      id: this.helpers.getUniqueId('statusStreaming'),\n      type: 'set'\n    };\n\n    var iqStanza = ChatUtils.createIqStanza(iqParams);\n\n    iqStanza.c('subscribe', {\n      xmlns: 'https://connectycube.com/protocol/status_streaming',\n      user_jid: this.helpers.jidOrUserId(jidOrUserId),\n      enable: _isEnable\n    });\n\n    this.xmppClient.send(iqStanza);\n  }\n\n  subscribeToUserLastActivityStatus(jidOrUserId) {\n    this._setSubscriptionToUserLastActivity(jidOrUserId, true)\n  }\n\n  unsubscribeFromUserLastActivityStatus(jidOrUserId) {\n    this._setSubscriptionToUserLastActivity(jidOrUserId, false)\n  }\n\n}\n\nmodule.exports = ChatService;\n","const Utils = require('../cubeInternalUtils'),\n\tConfig = require('../cubeConfig'),\n\tChatUtils = require('./cubeChatInternalUtils');\n\nclass ChatHelpers {\n\tconstructor() {\n\t\tthis._userCurrentJid = null;\n\t}\n\n\tgetUniqueId(suffix) {\n\t\treturn ChatUtils.getUniqueId(suffix);\n\t}\n\n\tjidOrUserId(jidOrUserId) {\n\t\tlet jid;\n\t\tif (typeof jidOrUserId === 'string' && jidOrUserId.includes('@')) { // jid\n\t\t\tjid = jidOrUserId;\n\t\t} else { // user id\n\t\t\tjid = jidOrUserId + '-' + Config.creds.appId + '@' + Config.endpoints.chat;\n\t\t}\n\t\treturn jid;\n\t}\n\n\ttypeChat(jidOrUserId) {\n\t\tlet chatType;\n\t\tif (typeof jidOrUserId === 'string') {\n\t\t\tchatType = jidOrUserId.indexOf('muc') > -1 ? 'groupchat' : 'chat';\n\t\t} else if (typeof jidOrUserId === 'number') {\n\t\t\tchatType = 'chat';\n\t\t} else {\n\t\t\tthrow new Error('Unsupported chat type');\n\t\t}\n\t\treturn chatType;\n\t}\n\n\tgetUserJid(userId, appId) {\n\t\tif (!appId) {\n\t\t\treturn userId + '-' + Config.creds.appId + '@' + Config.endpoints.chat;\n\t\t}\n\t\treturn userId + '-' + appId + '@' + Config.endpoints.chat;\n\t}\n\n\tgetUserNickWithMucDomain(userId) {\n\t\treturn Config.endpoints.muc + '/' + userId;\n\t}\n\n\tgetUserIdFromJID(jid) {\n\t\treturn jid.indexOf('@') < 0 ? null : parseInt(jid.split('@')[0].split('-')[0]);\n\t}\n\n\tgetDialogIdFromJID(jid) {\n\t\tif (jid.indexOf('@') < 0) return null;\n\t\treturn jid.split('@')[0].split('_')[1];\n\t}\n\n\tgetRoomJidFromDialogId(dialogId) {\n\t\treturn Config.creds.appId + '_' + dialogId + '@' + Config.endpoints.muc;\n\t}\n\n\tgetRoomJid(jid) {\n\t\treturn jid + '/' + this.getUserIdFromJID(this._userCurrentJid);\n\t}\n\n\tgetIdFromResource(jid) {\n\t\tlet s = jid.split('/');\n\t\tif (s.length < 2) return null;\n\t\ts.splice(0, 1);\n\t\treturn parseInt(s.join('/'));\n\t}\n\n\tgetRoomJidFromRoomFullJid(jid) {\n\t\tlet s = jid.split('/');\n\t\tif (s.length < 2) return null;\n\t\treturn s[0];\n\t}\n\n\tgetBsonObjectId() {\n\t\treturn Utils.getBsonObjectId();\n\t}\n\n\tgetUserIdFromRoomJid(jid) {\n\t\tlet arrayElements = jid.toString().split('/');\n\t\tif (arrayElements.length === 0) {\n\t\t\treturn null;\n\t\t}\n\t\treturn arrayElements[arrayElements.length - 1];\n\t}\n\n\tuserCurrentJid(client) {\n\t\treturn client.jid._local + '@' + client.jid._domain + '/' + client.jid._resource;\n\t}\n\n\tgetUserCurrentJid() {\n\t\treturn this._userCurrentJid;\n\t}\n\n\tsetUserCurrentJid(jid) {\n\t\tthis._userCurrentJid = jid;\n\t}\n\n\tgetDialogJid(identifier) {\n\t\treturn identifier.indexOf('@') > 0 ? identifier : this.getRoomJidFromDialogId(identifier);\n\t}\n}\n\nmodule.exports = ChatHelpers;\n","const Utils = require('../cubeInternalUtils'),\n  ChatUtils = require('./cubeChatInternalUtils');\n\nclass StreamManagementService {\n  constructor() {\n    this._NS = 'urn:xmpp:sm:3';\n\n    this._isStreamManagementEnabled = false;\n\n    // Counter of the incoming stanzas\n    this._clientProcessedStanzasCounter = 0;\n    // The client send stanza counter.\n    this._clientSentStanzasCounter = 0;\n\n    this.sentMessageCallback = null;\n\n    this._lastAck = 0;\n\n    // connection\n    this._xmppClient = null;\n\n    // Original connection.send method\n    this._originalSend = null;\n\n    // In progress stanzas queue\n    this._unackedQueue = [];\n  }\n\n  enable(connection) {\n    let enableParams = {\n      xmlns: this._NS\n    };\n\n    if (!this._isStreamManagementEnabled) {\n      this._xmppClient = connection;\n      this._originalSend = this._xmppClient.send;\n      this._xmppClient.send = this.send.bind(this);\n    }\n\n    this._clientProcessedStanzasCounter = 0;\n    this._clientSentStanzasCounter = 0;\n    this._lastAck = 0;\n\n    this._addEnableHandlers();\n\n    const stanza = ChatUtils.createNonza('enable', enableParams);\n\n    this._xmppClient.send(stanza);\n  }\n\n  _addEnableHandlers() {\n    this._xmppClient.on('element', _incomingStanzaHandler.bind(this));\n\n    function _incomingStanzaHandler(stanza) {\n      let tagName = stanza.name || stanza.tagName || stanza.nodeTree.tagName;\n\n      if (tagName === 'enabled') {\n        this._isStreamManagementEnabled = true;\n        return;\n      }\n\n      if (ChatUtils.getAttr(stanza, 'xmlns') !== this._NS) {\n        this._increaseReceivedStanzasCounter();\n      }\n\n      if (tagName === 'r') {\n        let params = {\n          xmlns: this._NS,\n          h: this._clientProcessedStanzasCounter\n        },\n          answerStanza = ChatUtils.createNonza('a', params);\n\n        this._originalSend.call(this._xmppClient, answerStanza);\n        return;\n      }\n\n      if (tagName === 'a') {\n        const h = parseInt(ChatUtils.getAttr(stanza, 'h'));\n        this._checkCounterOnIncomeStanza(h);\n      }\n    }\n  }\n\n  send(stanza, message) {\n    let tagName = stanza.name || stanza.tagName || stanza.nodeTree.tagName,\n      type = ChatUtils.getAttr(stanza, 'type'),\n      bodyContent = ChatUtils.getElementText(stanza, 'body') || '',\n      attachments = ChatUtils.getAllElements(stanza, 'attachment') || '';\n\n    this._originalSend.call(this._xmppClient, stanza);\n\n    if (tagName === 'message' && (type === 'chat' || type === 'groupchat') && (bodyContent || attachments.length)) {\n      this._sendStanzasRequest({\n        message: message,\n        expect: this._clientSentStanzasCounter\n      });\n    }\n\n    ++this._clientSentStanzasCounter;\n  }\n\n  _sendStanzasRequest(data) {\n    if (this._isStreamManagementEnabled) {\n      this._unackedQueue.push(data);\n\n      const stanza = ChatUtils.createNonza('r', { xmlns: this._NS });\n\n      this._originalSend.call(this._xmppClient, stanza);\n    }\n  }\n\n  getClientSentStanzasCounter() {\n    return this._clientSentStanzasCounter;\n  }\n\n  _checkCounterOnIncomeStanza(h) {\n    const numAcked = h - this._lastAck;\n\n    Utils.DLog('[Chat][SM][_checkCounterOnIncomeStanza]', numAcked, h, this._lastAck);\n\n    for (let i = 0; i < numAcked && this._unackedQueue.length > 0; i++) {\n      this.sentMessageCallback(null, this._unackedQueue.shift().message);\n    }\n\n    this._lastAck = h;\n  }\n\n  _increaseReceivedStanzasCounter() {\n    ++this._clientProcessedStanzasCounter;\n  }\n}\n\nmodule.exports = StreamManagementService;\n","const ChatUtils = require('./cubeChatInternalUtils'),\n    Utils = require('../cubeInternalUtils'),\n    Config = require('../cubeConfig');\n\nclass ContactListService {\n  constructor (options) {\n    this.helpers = options.helpers;\n    this.xmppClient = options.xmppClient;\n    this.stanzasCallbacks = options.stanzasCallbacks;\n    //\n    this.contacts = {};\n\n    this.xmlns = \"jabber:iq:roster\"\n  }\n\n  get() {\n    return new Promise((resolve, reject) => {\n      const stanzaId = ChatUtils.getUniqueId('getRoster');\n\n      let contacts = {},\n        iqStanza = ChatUtils.createIqStanza({\n            type: 'get',\n            from: this.helpers.getUserCurrentJid(),\n            id: stanzaId\n        });\n\n      iqStanza.c('query', {\n        xmlns: this.xmlns\n      });\n\n      this.stanzasCallbacks[stanzaId] = stanza => {\n        const items = stanza.getChild('query').children;\n\n        for (let i = 0, len = items.length; i < len; i++) {\n          const userId = this.helpers.getUserIdFromJID(ChatUtils.getAttr(items[i], 'jid')),\n            ask = ChatUtils.getAttr(items[i], 'ask'),\n            subscription = ChatUtils.getAttr(items[i], 'subscription'),\n            name = ChatUtils.getAttr(items[i], 'name'),\n            isUniqName = userId + '-' + Config.creds.appId !== name;\n\n          contacts[userId] = {\n            subscription: subscription,\n            ask: ask || null,\n            name: isUniqName ? name : null\n          };\n        }\n\n        resolve(contacts);\n      };\n\n      this.xmppClient.send(iqStanza);\n    });\n  }\n\n  add(params) {\n    return new Promise((resolve, reject) => {\n      const userId = params.userId || params,\n        userJid = this.helpers.jidOrUserId(userId),\n        stanzaId = ChatUtils.getUniqueId('addContactInRoster');\n\n      let iqStanza = ChatUtils.createIqStanza({\n        type: 'set',\n        from: this.helpers.getUserCurrentJid(),\n        id: stanzaId\n      });\n\n      this.contacts[userId] = {\n        subscription: 'none',\n        ask: 'subscribe',\n        name: params.name || null\n      };\n\n      iqStanza\n        .c('query', {\n            xmlns: this.xmlns\n        })\n        .c('item', {\n            jid: userJid,\n            name: params.name || null\n        });\n\n\n      this.stanzasCallbacks[stanzaId] = () => {\n        this._sendSubscriptionPresence({\n          jid: userJid,\n          type: 'subscribe'\n        });\n\n        resolve();\n      };\n\n      this.xmppClient.send(iqStanza);\n    });\n  }\n\n  confirm(params) {\n    return new Promise((resolve, reject) => {\n      const userId = params.userId || params,\n          userJid = this.helpers.jidOrUserId(userId);\n\n      this._sendSubscriptionPresence({\n        jid: userJid,\n        type: 'subscribed'\n      });\n\n      if (Config.chat.contactList.subscriptionMode.mutual) {\n        this.add(params, function() {\n          resolve();\n        });\n      } else {\n        resolve();\n      }\n    });\n  }\n\n  reject(userId) {\n    return new Promise((resolve, reject) => {\n      const userJid = this.helpers.jidOrUserId(userId);\n\n      this.contacts[userId] = {\n        subscription: 'none',\n        ask: null\n      };\n\n      this._sendSubscriptionPresence({\n        jid: userJid,\n        type: 'unsubscribed'\n      });\n\n      resolve();\n    });\n  }\n\n  updateName(params) {\n    return new Promise((resolve, reject) => {\n      const userJid = this.helpers.jidOrUserId(params.userId),\n          stanzaId = ChatUtils.getUniqueId('updateContactInRoster');\n\n      let contact = this.contacts[params.userId];\n\n      if (Utils.isObject(contact)) {\n        contact.name = params.name || null;\n      } else {\n        reject('No contact exists with provided user id');\n        return;\n      }\n\n      let iqStanza = ChatUtils.createIqStanza({\n        type: 'set',\n        from: this.helpers.getUserCurrentJid(),\n        id: stanzaId\n      });\n\n      iqStanza\n        .c('query', {\n            xmlns: this.xmlns\n        })\n        .c('item', {\n            jid: userJid,\n            name: params.name || null\n        });\n\n      this.stanzasCallbacks[stanzaId] = res => {\n        res.attrs.type === \"result\" ? resolve() : reject(res)\n      };\n\n      this.xmppClient.send(iqStanza);\n    });\n  }\n\n  remove(userId) {\n    return new Promise((resolve, reject) => {\n      const userJid = this.helpers.jidOrUserId(userId),\n        stanzaId = ChatUtils.getUniqueId('removeConactInRoster');\n\n      let iqStanza = ChatUtils.createIqStanza({\n        type: 'set',\n        from: this.helpers.getUserCurrentJid(),\n        id: stanzaId\n      });\n\n      iqStanza\n        .c('query', {\n            xmlns: this.xmlns\n        })\n        .c('item', {\n            jid: userJid,\n            subscription: 'remove'\n        });\n\n\n      this.stanzasCallbacks[stanzaId] = () => {\n        delete this.contacts[userId];\n        resolve();\n      };\n\n      this.xmppClient.send(iqStanza);\n    });\n  }\n\n  _sendSubscriptionPresence(params) {\n    const presenceParams = {\n      to: params.jid,\n      type: params.type\n    };\n\n    const presenceStanza = ChatUtils.createPresenceStanza(presenceParams);\n\n    this.xmppClient.send(presenceStanza);\n  }\n}\n\nmodule.exports = ContactListService;\n","const ChatUtils = require('./cubeChatInternalUtils'),\n    Utils = require('../cubeInternalUtils');\n\nclass PrivacyListService {\n  constructor (options) {\n    this.helpers = options.helpers;\n    this.xmppClient = options.xmppClient;\n    this.stanzasCallbacks = options.stanzasCallbacks;\n\n    this.xmlns = \"jabber:iq:privacy\"\n  }\n\n  create(list) {\n    return new Promise((resolve, reject) => {\n      let userId,\n          userJid,\n          userMuc,\n          userAction,\n          mutualBlock,\n          listPrivacy = {},\n          listUserId = [];\n\n      for (let i = list.items.length - 1; i >= 0; i--) {\n        const user = list.items[i];\n\n        listPrivacy[user.user_id] = {\n          action: user.action,\n          mutualBlock: user.mutualBlock === true ? true : false\n        };\n      }\n\n      listUserId = Object.keys(listPrivacy);\n\n      const iqParams = {\n        type: 'set',\n        from: this.helpers.getUserCurrentJid(),\n        id: ChatUtils.getUniqueId('edit')\n      };\n\n      let iq = ChatUtils.createIqStanza(iqParams);\n\n      iq.c('query', {\n        xmlns: this.xmlns\n      }).c('list', {\n        name: list.name\n      });\n\n      function createPrivacyItem(iq, params) {\n        let list = iq.getChild('query').getChild('list');\n\n        list.c('item', {\n          type: 'jid',\n          value: params.jidOrMuc,\n          action: params.userAction,\n          order: params.order\n        }).c('message', {})\n          .up().c('presence-in', {})\n          .up().c('presence-out', {})\n          .up().c('iq', {})\n          .up().up();\n\n        return iq;\n      }\n\n      function createPrivacyItemMutal(iq, params) {\n        let list = iq.getChild('query').getChild('list');\n\n        list.c('item', {\n          type: 'jid',\n          value: params.jidOrMuc,\n          action: params.userAction,\n          order: params.order\n        }).up();\n\n        return iq;\n      }\n\n      for (let index = 0, j = 0, len = listUserId.length; index < len; index++ , j = j + 2) {\n        userId = listUserId[index];\n        mutualBlock = listPrivacy[userId].mutualBlock;\n\n        userAction = listPrivacy[userId].action;\n        userJid = this.helpers.jidOrUserId(parseInt(userId, 10));\n        userMuc = this.helpers.getUserNickWithMucDomain(userId);\n\n        if (mutualBlock && userAction === 'deny') {\n          iq = createPrivacyItemMutal(iq, {\n            order: j + 1,\n            jidOrMuc: userJid,\n            userAction: userAction\n          });\n          iq = createPrivacyItemMutal(iq, {\n            order: j + 2,\n            jidOrMuc: userMuc,\n            userAction: userAction\n          }).up().up();\n        } else {\n          iq = createPrivacyItem(iq, {\n            order: j + 1,\n            jidOrMuc: userJid,\n            userAction: userAction\n          });\n          iq = createPrivacyItem(iq, {\n            order: j + 2,\n            jidOrMuc: userMuc,\n            userAction: userAction\n          });\n        }\n      }\n\n      this.stanzasCallbacks[iqParams.id] = stanza => {\n        ChatUtils.isErrorStanza(stanza) ? reject(ChatUtils.buildErrorFromXMPPErrorStanza(stanza)) : resolve();\n      };\n\n      this.xmppClient.send(iq);\n    });\n  }\n\n  getList(name) {\n    return new Promise((resolve, reject) => {\n      let items,\n          userJid,\n          userId,\n          usersList = [],\n          list = {};\n\n      const iqParams = {\n        type: 'get',\n        from: this.helpers.getUserCurrentJid(),\n        id: ChatUtils.getUniqueId('getlist')\n      };\n\n      let iq = ChatUtils.createIqStanza(iqParams);\n\n      iq.c('query', {\n        xmlns: this.xmlns\n      }).c('list', {\n        name: name\n      });\n\n      this.stanzasCallbacks[iqParams.id] = stanza => {\n        const stanzaQuery = stanza.getChild('query');\n\n        list = stanzaQuery ? stanzaQuery.getChild('list') : null;\n        items = list ? list.getChildElements('item') : null;\n\n        for (let i = 0, len = items.length; i < len; i = i + 2) {\n          userJid = items[i].attrs.value;\n          userId = this.helpers.getUserIdFromJID(userJid);\n          usersList.push({\n            user_id: userId,\n            action: items[i].attrs.action\n          });\n        }\n\n        list = {\n          name: list.attrs.name,\n          items: usersList\n        };\n\n        resolve(list);\n\n        delete this.stanzasCallbacks[iqParams.id];\n      };\n\n      this.xmppClient.send(iq);\n    });\n  }\n\n  update(listWithUpdates) {\n    return new Promise((resolve, reject) => {\n      this.getList(listWithUpdates.name).then((existentList) => {\n        const updatedList = {\n          items: Utils.mergeArrays(existentList.items, listWithUpdates.items),\n          name: listWithUpdates.name\n        };\n        this.create(updatedList).then(() => {\n          resolve();\n        }).catch(error => {\n          reject(error);\n        });\n      }).catch(error => {\n        reject(error);\n      });\n    });\n  }\n\n  getNames() {\n    return new Promise((resolve, reject) => {\n      const iqParams = {\n        'type': 'get',\n        'from': this.helpers.getUserCurrentJid(),\n        'id': ChatUtils.getUniqueId('getNames')\n      };\n\n      let iq = ChatUtils.createIqStanza(iqParams);\n\n      iq.c('query', {\n        xmlns: this.xmlns\n      });\n\n      this.stanzasCallbacks[iq.attrs.id] = stanza => {\n        if (!ChatUtils.isErrorStanza(stanza)) {\n          const query = stanza.getChild('query'),\n            defaultList = query.getChild('default'),\n            activeList = query.getChild('active'),\n            allLists = query.getChildElements('list');\n\n          let defaultName = defaultList ? defaultList.attrs.name : null,\n            activeName = activeList ? activeList.attrs.name : null;\n\n          let allNames = [];\n\n          for (let i = 0, len = allLists.length; i < len; i++) {\n            allNames.push(allLists[i].attrs.name);\n          }\n\n          const namesList = {\n            default: defaultName,\n            active: activeName,\n            names: allNames\n          };\n\n          resolve(namesList);\n        } else {\n          reject(ChatUtils.buildErrorFromXMPPErrorStanza(stanza));\n        }\n      };\n\n      this.xmppClient.send(iq);\n    });\n  }\n\n  delete(name) {\n    return new Promise((resolve, reject) => {\n      const iqParams = {\n        from: this.xmppClient.jid || this.xmppClient.jid.user,\n        type: 'set',\n        id: ChatUtils.getUniqueId('remove')\n      };\n\n      let iq = ChatUtils.createIqStanza(iqParams);\n\n      iq.c('query', {\n        xmlns: this.xmlns\n      }).c('list', {\n        name: name ? name : ''\n      });\n\n      this.stanzasCallbacks[iq.attrs.id] = stanza => {\n        ChatUtils.isErrorStanza(stanza) ? reject(ChatUtils.buildErrorFromXMPPErrorStanza(stanza)) : resolve();\n      };\n\n      this.xmppClient.send(iq);\n    });\n  }\n\n  setAsDefault (name) {\n    return new Promise((resolve, reject) => {\n      const iqParams = {\n        from: this.xmppClient.jid || this.xmppClient.jid.user,\n        type: 'set',\n        id: ChatUtils.getUniqueId('default')\n      };\n\n      let iq = ChatUtils.createIqStanza(iqParams);\n\n      iq.c('query', {\n        xmlns: this.xmlns\n      }).c('default', name && name.length > 0 ? { name: name } : {});\n\n      this.stanzasCallbacks[iq.attrs.id] = stanza => {\n        ChatUtils.isErrorStanza(stanza) ? reject(ChatUtils.buildErrorFromXMPPErrorStanza(stanza)) : resolve();\n      };\n\n      this.xmppClient.send(iq);\n    });\n  }\n}\n\nmodule.exports = PrivacyListService;\n","const ChatUtils = require('./cubeChatInternalUtils');\n\nclass GroupChatService {\n  constructor (options) {\n    this.helpers = options.helpers;\n    this.xmppClient = options.xmppClient;\n    this.stanzasCallbacks = options.stanzasCallbacks;\n    //\n    this.joinedRooms = {};\n\n    this.xmlns = \"http://jabber.org/protocol/muc\";\n  }\n\n  join (dialogIdOrJid) {\n    return new Promise((resolve, reject) => {\n      const id = ChatUtils.getUniqueId('join'),\n        dialogJid = this.helpers.getDialogJid(dialogIdOrJid),\n        presenceParams = {\n          id: id,\n          from: this.helpers.getUserCurrentJid(),\n          to: this.helpers.getRoomJid(dialogJid)\n        }\n\n      let presenceStanza = ChatUtils.createPresenceStanza(presenceParams);\n      presenceStanza.c('x', {\n        xmlns: this.xmlns\n      }).c('history', { maxstanzas: 0 });\n\n      this.stanzasCallbacks[id] = stanza => {\n        const from = ChatUtils.getAttr(stanza, 'from'),\n          dialogId = this.helpers.getDialogIdFromJID(from),\n          x = ChatUtils.getElement(stanza, 'x'),\n          xXMLNS = ChatUtils.getAttr(x, 'xmlns'),\n          status = ChatUtils.getElement(x, 'status'),\n          statusCode = ChatUtils.getAttr(status, 'code');\n\n        if (status && statusCode == '110') {\n          this.joinedRooms[dialogJid] = true;\n          resolve();\n        } else {\n          const type = ChatUtils.getAttr(stanza, 'type');\n\n          if (type && type === 'error' && xXMLNS === this.xmlns && id.endsWith(':join')) {\n            const errorEl = ChatUtils.getElement(stanza, 'error'),\n              code = ChatUtils.getAttr(errorEl, 'code'),\n              errorMessage = ChatUtils.getElementText(errorEl, 'text');\n\n            const errorResponse = {\n              code: code || 500,\n              message: errorMessage || 'Unknown issue'\n            }\n\n            reject(errorResponse);\n          }\n        }\n      };\n\n      this.xmppClient.send(presenceStanza);\n    });\n  }\n\n  leave (dialogIdOrJid) {\n    return new Promise((resolve, reject) => {\n      const dialogJid = this.helpers.getDialogJid(dialogIdOrJid);\n      const presenceParams = {\n        type: 'unavailable',\n        from: this.helpers.getUserCurrentJid(),\n        to: this.helpers.getRoomJid(dialogJid)\n      };\n\n      const presenceStanza = ChatUtils.createPresenceStanza(presenceParams);\n\n      delete this.joinedRooms[dialogJid];\n\n      this.stanzasCallbacks['muc:leave'] = (stanza) => {\n        resolve();\n      };\n\n      this.xmppClient.send(presenceStanza);\n    });\n  }\n\n  listOnlineUsers (dialogIdOrJid) {\n    return new Promise((resolve, reject) => {\n      const dialogJid = this.helpers.getDialogJid(dialogIdOrJid);\n      const iqParams = {\n        type: 'get',\n        to: dialogJid,\n        from: this.helpers.getUserCurrentJid(),\n        id: ChatUtils.getUniqueId('muc_disco_items'),\n      };\n\n      let iqStanza = ChatUtils.createIqStanza(iqParams);\n      iqStanza.c('query', {\n          xmlns: 'http://jabber.org/protocol/disco#items'\n      });\n\n      this.stanzasCallbacks[iqParams.id] = (stanza) => {\n        var stanzaId = stanza.attrs.id;\n\n        if (this.stanzasCallbacks[stanzaId]) {\n          const items = stanza.getChild('query').getChildElements('item');\n\n          let users = [];\n          for (var i = 0, len = items.length; i < len; i++) {\n            let userId = this.helpers.getUserIdFromRoomJid(items[i].attrs.jid);\n            users.push(parseInt(userId));\n          }\n\n          resolve(users);\n        }\n      };\n\n      this.xmppClient.send(iqStanza);\n\n    });\n  }\n}\n\nmodule.exports = GroupChatService;\n","const Config = require('../cubeConfig')\nconst Utils = require('../cubeInternalUtils')\n\nconst DIALOGS_API_URL = Config.urls.chat + '/Dialog'\n\nclass ChatDialogsService {\n  constructor (proxy) {\n    this.proxy = proxy\n  }\n\n  list (params) {\n    const ajaxParams = {\n      type: 'GET',\n      url: Utils.getUrl(DIALOGS_API_URL),\n      data: params\n    }\n\n    return this.proxy.ajax(ajaxParams)\n  }\n\n  create (params) {\n    if (params && params.occupants_ids && Utils.isArray(params.occupants_ids)) {\n      params.occupants_ids = params.occupants_ids.join(', ')\n    }\n\n    const ajaxParams = {\n      type: 'POST',\n      url: Utils.getUrl(DIALOGS_API_URL),\n      data: params\n    }\n\n    return this.proxy.ajax(ajaxParams)\n  }\n\n  update (id, params) {\n    const ajaxParams = {\n      type: 'PUT',\n      url: Utils.getUrl(DIALOGS_API_URL, id),\n      data: params\n    }\n\n    return this.proxy.ajax(ajaxParams)\n  }\n\n  delete (idOrIds, params) {\n    const ajaxParams = {\n      type: 'DELETE',\n      url: Utils.getUrl(DIALOGS_API_URL, idOrIds),\n    }\n\n    if (typeof idOrIds === 'string' || (Utils.isArray(idOrIds) && idOrIds.length === 1)) {\n      ajaxParams.dataType = 'text'\n    }\n\n    if (params) {\n      ajaxParams.data = params\n    }\n\n    return this.proxy.ajax(ajaxParams)\n  }\n\n  addAdmins (id, admins_ids) {\n    const params = {\n      push_all: {\n        admins_ids: admins_ids\n      }\n    }\n\n    const ajaxParams = {\n      type: 'PUT',\n      url: Utils.getUrl(DIALOGS_API_URL, id, 'admins'),\n      data: params\n    }\n\n    return this.proxy.ajax(ajaxParams)\n  }\n\n  removeAdmins (id, admins_ids) {\n    const params = {\n      pull_all: {\n        admins_ids: admins_ids\n      }\n    }\n\n    const ajaxParams = {\n      type: 'PUT',\n      url: Utils.getUrl(DIALOGS_API_URL, id, 'admins'),\n      data: params\n    }\n\n    return this.proxy.ajax(ajaxParams)\n  }\n\n  subscribeToPublic (id) {\n    const ajaxParams = {\n      type: 'POST',\n      url: Utils.getUrl(DIALOGS_API_URL, id, 'subscribe')\n    }\n\n    return this.proxy.ajax(ajaxParams)\n  }\n\n  unsubscribeFromPublic (id) {\n    const ajaxParams = {\n      type: 'DELETE',\n      url: Utils.getUrl(DIALOGS_API_URL, id, 'subscribe'),\n      dataType: 'text'\n    }\n\n    return this.proxy.ajax(ajaxParams)\n  }\n\n  updateNotificationsSettings (id, enabled) {\n    const settings = {\n      enabled: enabled ? 1 : 0\n    }\n\n    const ajaxParams = {\n      type: 'PUT',\n      url: Utils.getUrl(DIALOGS_API_URL, id, 'notifications'),\n      data: settings\n    }\n\n    return this.proxy.ajax(ajaxParams)\n  }\n\n  getNotificationsSettings (id) {\n    const ajaxParams = {\n      type: 'GET',\n      url: Utils.getUrl(DIALOGS_API_URL, id, 'notifications')\n    }\n\n    return this.proxy.ajax(ajaxParams)\n  }\n\n  getPublicOccupants (id, params) {\n    const ajaxParams = {\n      type: 'GET',\n      url: Utils.getUrl(DIALOGS_API_URL, id, 'occupants'),\n      data: params\n    }\n\n    return this.proxy.ajax(ajaxParams)\n  }\n}\n\nmodule.exports = ChatDialogsService\n","const Config = require('../cubeConfig')\nconst Utils = require('../cubeInternalUtils')\n\nconst MESSAGES_API_URL = Config.urls.chat + '/Message'\n\nclass ChatMessagesService {\n  constructor (proxy) {\n    this.proxy = proxy\n  }\n\n  list (params) {\n    const ajaxParams = {\n      url: Utils.getUrl(MESSAGES_API_URL),\n      data: params\n    }\n\n    return this.proxy.ajax(ajaxParams)\n  }\n\n  create (params) {\n    const ajaxParams = {\n      url: Utils.getUrl(MESSAGES_API_URL),\n      type: 'POST',\n      data: params\n    }\n\n    return this.proxy.ajax(ajaxParams)\n  }\n\n  update (id, params) {\n    const ajaxParams = {\n      type: 'PUT',\n      dataType: 'text',\n      url: Utils.getUrl(MESSAGES_API_URL, id),\n      data: params\n    }\n\n    return this.proxy.ajax(ajaxParams)\n  }\n\n  delete (id, params) {\n    const ajaxParams = {\n      url: Utils.getUrl(MESSAGES_API_URL, id),\n      type: 'DELETE',\n      dataType: 'text'\n    }\n\n    if (params) {\n      ajaxParams.data = params\n    }\n\n    return this.proxy.ajax(ajaxParams)\n  }\n\n  unreadCount (params) {\n    if (params && params.chat_dialog_ids && Utils.isArray(params.chat_dialog_ids)) {\n      params.chat_dialog_ids = params.chat_dialog_ids.join(', ')\n    }\n\n    const ajaxParams = {\n      url: Utils.getUrl(MESSAGES_API_URL + '/unread'),\n      data: params\n    }\n\n    return this.proxy.ajax(ajaxParams)\n  }\n}\n\nmodule.exports = ChatMessagesService\n","const WebRTCSession = require('./cubeWebRTCSession');\nconst WebRTCSignalingProcessor = require('./cubeWebRTCSignalingProcessor');\nconst WebRTCSignalingProvider = require('./cubeWebRTCSignalingProvider');\nconst Helpers = require('./cubeWebRTCHelpers');\nconst RTCPeerConnection = require('./cubeRTCPeerConnection');\nconst cubeWebRTCConstants = require('./cubeWebRTCConstants');\nconst SignalingConstants = cubeWebRTCConstants.SignalingConstants;\nconst SessionState = require('./cubeWebRTCConstants').SessionState;\nconst Utils = require('../cubeInternalUtils');\nconst mediaDevices = require('../cubeDependencies').mediaDevices;\n\nclass WebRTCClient {\n\n  constructor(connection) {\n    this.connection = connection;\n    this.signalingProcessor = new WebRTCSignalingProcessor(this);\n    this.signalingProvider = new WebRTCSignalingProvider(connection);\n\n    this.SessionConnectionState = cubeWebRTCConstants.SessionConnectionState;\n    this.PeerConnectionState = cubeWebRTCConstants.PeerConnectionState;\n    this.CallType = cubeWebRTCConstants.CallType;\n\n    this.sessions = {};\n\n    if (mediaDevices) {\n      mediaDevices.ondevicechange = this._onDevicesChangeListener.bind(this);\n    }\n  }\n\n  getMediaDevices(spec) {\n    const specDevices = []\n\n    return new Promise((resolve, reject) => {\n      if (!mediaDevices || !mediaDevices.enumerateDevices) {\n        reject(\"No 'enumerateDevices' API supported\");\n      } else {\n        mediaDevices.enumerateDevices().then(devices => {\n          if (spec) {\n            devices.forEach((device, i) => {\n              if (device.kind === spec) {\n                specDevices.push(device);\n              }\n            });\n            resolve(specDevices);\n          } else {\n            resolve(devices);\n          }\n        });\n      }\n    });\n  }\n\n  createNewSession(opponentsIDs, callType, opts) {\n    const callerID = Helpers.getUserIdFromJID(Helpers.userCurrentJid(this.connection));\n    const bandwidth = opts && opts.bandwidth && (!isNaN(opts.bandwidth)) ? +opts.bandwidth : 0;\n    if (!opponentsIDs) {\n      throw new Error('Can\\'t create a session without opponentsIDs.');\n    }\n\n    return this._createAndStoreSession(null, callerID, opponentsIDs, callType, bandwidth);\n  }\n\n  _createAndStoreSession(sessionID, initiatorID, opIDs, callType, bandwidth) {\n    const newSession = new WebRTCSession({\n      sessionID,\n      initiatorID,\n      opIDs,\n      callType,\n      signalingProvider: this.signalingProvider,\n      currentUserID: Helpers.getUserIdFromJID(Helpers.userCurrentJid(this.connection)),\n      bandwidth\n    });\n\n    newSession.onUserNotAnswerListener = this.onUserNotAnswerListener;\n    newSession.onRemoteStreamListener = this.onRemoteStreamListener;\n    newSession.onSessionConnectionStateChangedListener = this.onSessionConnectionStateChangedListener;\n    newSession.onSessionCloseListener = this.onSessionCloseListener;\n    newSession.onCallStatsReport = this.onCallStatsReport;\n\n    this.sessions[newSession.ID] = newSession;\n    return newSession;\n  }\n\n  clearSession(sessionId) {\n    delete this.sessions[sessionId];\n  }\n\n  /// DELEGATE (signaling)\n\n  _onCallListener(userID, sessionID, extension) {\n    const userInfo = extension.userInfo || {};\n\n    Helpers.trace(\"onCall. UserID:\" + userID + \". SessionID: \" + sessionID + \". extension: \", userInfo);\n\n    let session = this.sessions[sessionID];\n    const bandwidth = +userInfo.bandwidth || 0;\n\n    if (!session) {\n      session = this._createAndStoreSession(sessionID, extension.callerID, extension.opponentsIDs, extension.callType, bandwidth);\n      session._processOnCall(userID, extension);\n      Utils.safeCallbackCall(this.onCallListener, session, userInfo);\n    } else {\n      session._processOnCall(userID, extension);\n    }\n  }\n\n  _onAcceptListener(userID, sessionID, extension) {\n    const session = this.sessions[sessionID];\n    const userInfo = extension.userInfo || {};\n\n    Helpers.trace(\"onAccept. UserID:\" + userID + \". SessionID: \" + sessionID);\n\n    if (session && (session.state === SessionState.ACTIVE || session.state === SessionState.NEW)) {\n      Utils.safeCallbackCall(this.onAcceptCallListener, session, userID, userInfo);\n      session._processOnAccept(userID, extension);\n    } else {\n      Helpers.traceWarning(\"Ignore 'onAccept', there is no information about session \" + sessionID);\n    }\n  }\n\n  _onRejectListener(userID, sessionID, extension) {\n    const session = this.sessions[sessionID];\n\n    Helpers.trace(\"onReject. UserID:\" + userID + \". SessionID: \" + sessionID);\n\n    if (session) {\n      const userInfo = extension.userInfo || {};\n      Utils.safeCallbackCall(this.onRejectCallListener, session, userID, userInfo);\n      session._processOnReject(userID, extension);\n    } else {\n      Helpers.traceWarning(\"Ignore 'onReject', there is no information about session \" + sessionID);\n    }\n  }\n\n  _onStopListener(userID, sessionID, extension) {\n    Helpers.trace(\"onStop. UserID:\" + userID + \". SessionID: \" + sessionID);\n\n    const session = this.sessions[sessionID];\n    const userInfo = extension.userInfo || {};\n\n    if (session && (session.state === SessionState.ACTIVE || session.state === SessionState.NEW)) {\n      session._processOnStop(userID, extension);\n      Utils.safeCallbackCall(this.onStopCallListener, session, userID, userInfo);\n    } else {\n      Utils.safeCallbackCall(this.onInvalidEventsListener, 'onStop', session, userID, userInfo);\n      Helpers.traceWarning(\"Ignore 'onStop', there is no information about session \" + sessionID + \" by some reason.\");\n    }\n  }\n\n  _onIceCandidatesListener(userID, sessionID, extension) {\n    const session = this.sessions[sessionID];\n\n    Helpers.trace(\"onIceCandidates. UserID:\" + userID + \". SessionID: \" + sessionID + \". ICE candidates count: \" + extension.iceCandidates.length);\n\n    if (session) {\n      if (session.state === SessionState.ACTIVE) {\n        session._processOnIceCandidates(userID, extension);\n      } else {\n        Helpers.traceWarning('Ignore \\'OnIceCandidates\\', the session ( ' + sessionID + ' ) has invalid state.');\n      }\n    } else {\n      Helpers.traceWarning(\"Ignore 'OnIceCandidates', there is no information about session \" + sessionID);\n    }\n  }\n\n  _onDevicesChangeListener() {\n    Utils.safeCallbackCall(this.onDevicesChangeListener);\n  }\n}\n\nmodule.exports = WebRTCClient;\n","const config = require('../cubeConfig');\nconst RTCPeerConnection = require('./cubeRTCPeerConnection');\nconst Utils = require('../cubeInternalUtils');\nconst Helpers = require('./cubeWebRTCHelpers');\nconst SignalingConstants = require('./cubeWebRTCConstants').SignalingConstants;\nconst SessionState = require('./cubeWebRTCConstants').SessionState;\nconst PeerConnectionState = require('./cubeWebRTCConstants').PeerConnectionState;\nconst MediaDevicesImpl = require('../cubeDependencies').mediaDevices;\n\nclass WebRTCSession {\n    constructor(params) {\n        this.ID = params.sessionID ? params.sessionID : generateUUID();\n        this.state = SessionState.NEW;\n\n        this.initiatorID = parseInt(params.initiatorID);\n        this.opponentsIDs = params.opIDs;\n        this.callType = parseInt(params.callType);\n\n        this.peerConnections = {};\n\n        this.localStream = null;\n\n        this.mediaParams = null;\n\n        this.signalingProvider = params.signalingProvider;\n\n        this.currentUserID = params.currentUserID;\n\n        this.bandwidth = params.bandwidth;\n\n        this.answerTimer = null;\n\n        this.startCallTime = 0;\n        this.acceptCallTime = 0;\n    }\n\n    getUserMedia(params) {\n        return new Promise((resolve, reject) => {\n            MediaDevicesImpl.getUserMedia({\n                audio: params.audio || false,\n                video: params.video || false\n            }).then(stream => {\n                this.localStream = stream;\n                this.mediaParams = params;\n                if (params.elementId) {\n                    this.attachMediaStream(params.elementId, stream, params.options);\n                }\n                resolve(stream);\n            }).catch(reject);\n        });\n    }\n\n    connectionStateForUser(userID) {\n        const peerConnection = this.peerConnections[userID];\n        if (peerConnection) {\n            return peerConnection.state;\n        }\n\n        return null;\n    }\n\n    attachMediaStream(id, stream, options) {\n        const elem = document.getElementById(id);\n\n        if (elem) {\n            if (typeof elem.srcObject === 'object') {\n                elem.srcObject = stream;\n            } else {\n                elem.src = window.URL.createObjectURL(stream);\n            }\n\n            if (options && options.muted) {\n                elem.muted = true;\n            }\n\n            if (options && options.mirror) {\n                elem.style.webkitTransform = 'scaleX(-1)';\n                elem.style.transform = 'scaleX(-1)';\n            }\n\n            elem.onloadedmetadata = function (e) {\n                elem.play();\n            };\n        } else {\n            throw new Error('Unable to attach media stream, element ' + id + ' is undefined');\n        }\n    }\n\n    detachMediaStream(id) {\n        const elem = document.getElementById(id);\n        if (elem) {\n            elem.pause();\n\n            if (typeof elem.srcObject === 'object') {\n                elem.srcObject = null;\n            } else {\n                elem.src = '';\n            }\n        }\n    }\n\n    switchMediaTracks(deviceIds) {\n        return new Promise((resolve, reject) => {\n            if (deviceIds && deviceIds.audio) {\n                if (typeof (this.mediaParams.audio) === \"boolean\") {\n                    this.mediaParams.audio = {};\n                }\n                this.mediaParams.audio.deviceId = deviceIds.audio;\n            }\n\n            if (deviceIds && deviceIds.video) {\n                if (typeof (this.mediaParams.video) === \"boolean\") {\n                    this.mediaParams.video = {};\n                }\n                this.mediaParams.video.deviceId = deviceIds.video;\n            }\n\n            this.localStream.getTracks().forEach(track => {\n                track.stop();\n            });\n\n            MediaDevicesImpl.getUserMedia({\n                audio: this.mediaParams.audio || false,\n                video: this.mediaParams.video || false\n            }).then(stream => {\n                this._replaceTracks(stream);\n                resolve(stream);\n            }).catch(error => {\n                reject(error);\n            });\n        });\n    }\n\n    _replaceTracks(stream) {\n        const peers = this.peerConnections;\n        const elementId = this.mediaParams.elementId;\n        const ops = this.mediaParams.options;\n        const newStreamTracks = stream.getTracks();\n\n        if (!Utils.getEnv().reactnative) {\n            this.detachMediaStream(elementId);\n        }\n\n        newStreamTracks.forEach(track => {\n            this.localStream.addTrack(track);\n        });\n\n        if (!Utils.getEnv().reactnative) {\n            this.attachMediaStream(elementId, stream, ops);\n        }\n\n        if (!Utils.getEnv().reactnative) {\n            for (let userId in peers) {\n                const peer = peers[userId];\n                peer.getSenders().map(sender => {\n                    sender.replaceTrack(newStreamTracks.find(track => {\n                        return track.kind === sender.track.kind;\n                    }));\n                });\n            }\n        }\n    }\n\n    call(extension) {\n        const ext = _prepareExtension(extension);\n\n        Helpers.trace('Call, extension: ' + JSON.stringify(ext.userInfo));\n\n        this.state = SessionState.ACTIVE;\n\n        this.opponentsIDs.forEach((userID, i, arr) => {\n            this._callInternal(userID, ext, true);\n        });\n    }\n\n    _callInternal(userID, extension, withOnNotAnswerCallback) {\n        const peer = this._createPeer(userID, 'offer');\n\n        // TODO: use 'addTrack' for all modern browsers\n        const safariVersion = Helpers.getVersionSafari();\n\n        if (safariVersion && safariVersion >= 11) {\n            this.localStream.getTracks().forEach(track => {\n                peer.addTrack(track, this.localStream);\n            });\n        } else {\n            peer.addLocalStream(this.localStream);\n        }\n\n        this.peerConnections[userID] = peer;\n\n        peer.getAndSetLocalSessionDescription(this.callType)\n            .then(() => {\n                Helpers.trace(\"getAndSessionDescription success\");\n                /** let's send call requests to user */\n                peer._startDialingTimer(extension, withOnNotAnswerCallback);\n            }).catch(err => {\n                Helpers.trace(\"getAndSessionDescription error: \" + err);\n            });\n    }\n\n    accept(extension) {\n        const ext = _prepareExtension(extension);\n\n        Helpers.trace('Accept, extension: ' + JSON.stringify(ext.userInfo));\n\n        if (this.state === SessionState.ACTIVE) {\n            Helpers.traceError(\"Can't accept, the session is already active, return.\");\n            return;\n        }\n\n        if (this.state === SessionState.CLOSED) {\n            Helpers.traceError(\"Can't accept, the session is already closed, return.\");\n            this.stop({});\n            return;\n        }\n\n        this.state = SessionState.ACTIVE;\n\n        this.acceptCallTime = new Date();\n\n        this._clearAnswerTimer();\n\n        this._acceptInternal(this.initiatorID, ext);\n\n        // group call\n        const oppIDs = this._uniqueOpponentsIDsWithoutInitiator();\n        if (oppIDs.length > 0) {\n            const offerTime = (this.acceptCallTime - this.startCallTime) / 1000;\n            this._startWaitingOfferOrAnswerTimer(offerTime);\n\n            oppIDs.forEach(opID => {\n                if (this.currentUserID > opID) {\n                    this._callInternal(opID, {}, true);\n                }\n            });\n        }\n    }\n\n    _acceptInternal(userID, extension) {\n        const peerConnection = this.peerConnections[userID];\n\n        if (peerConnection) {\n\n            // TODO: use 'addTrack' for all modern browsers\n            const safariVersion = Helpers.getVersionSafari();\n            if (safariVersion && safariVersion >= 11) {\n                this.localStream.getTracks().forEach(track => {\n                    peerConnection.addTrack(track, this.localStream);\n                });\n            } else {\n                peerConnection.addLocalStream(this.localStream);\n            }\n\n            peerConnection\n                .setRemoteSessionDescription('offer', peerConnection.getRemoteSDP())\n                .then(() => {\n                    Helpers.trace(\"'setRemoteSessionDescription' success\");\n\n                    peerConnection\n                        .getAndSetLocalSessionDescription(this.callType)\n                        .then(() => {\n                            extension.sessionID = this.ID;\n                            extension.callType = this.callType;\n                            extension.callerID = this.initiatorID;\n                            extension.opponentsIDs = this.opponentsIDs;\n                            extension.sdp = peerConnection.localDescription.sdp;\n\n                            this.signalingProvider.sendMessage(userID, extension, SignalingConstants.SignalingType.ACCEPT);\n                        })\n                        .catch(err => {\n                            Helpers.trace(\"getAndSetLocalSessionDescription error: \" + err);\n                        });\n\n                })\n                .catch(error => {\n                    Helpers.traceError(\"'setRemoteSessionDescription' error: \" + error);\n                });\n        } else {\n            Helpers.traceError(\"Can't accept the call, there is no information about peer connection by some reason.\");\n        }\n    }\n\n    reject(extension) {\n        const ext = _prepareExtension(extension);\n\n        Helpers.trace('Reject, extension: ' + JSON.stringify(ext.userInfo));\n\n        this.state = SessionState.REJECTED;\n\n        this._clearAnswerTimer();\n\n        ext.sessionID = this.ID;\n        ext.callType = this.callType;\n        ext.callerID = this.initiatorID;\n        ext.opponentsIDs = this.opponentsIDs;\n\n        Object.keys(this.peerConnections).forEach(key => {\n            const peerConnection = this.peerConnections[key];\n            this.signalingProvider.sendMessage(peerConnection.userID, ext, SignalingConstants.SignalingType.REJECT);\n        });\n\n        this._close();\n    }\n\n    stop(extension) {\n        const ext = _prepareExtension(extension);\n\n        Helpers.trace('Stop, extension: ' + JSON.stringify(ext.userInfo));\n\n        this.state = SessionState.HUNGUP;\n\n        if (this.answerTimer) {\n            this._clearAnswerTimer();\n        }\n\n        ext.sessionID = this.ID;\n        ext.callType = this.callType;\n        ext.callerID = this.initiatorID;\n        ext.opponentsIDs = this.opponentsIDs;\n\n        Object.keys(this.peerConnections).forEach(key => {\n            const peerConnection = this.peerConnections[key];\n            this.signalingProvider.sendMessage(peerConnection.userID, ext, SignalingConstants.SignalingType.STOP);\n        });\n\n        this._close();\n    }\n\n    mute(type) {\n        this._muteStream(0, type);\n    }\n\n    unmute(type) {\n        this._muteStream(1, type);\n    }\n\n\n    _processOnCall(callerID, extension) {\n        const oppIDs = this._uniqueOpponentsIDs();\n\n        oppIDs.forEach(opID => {\n            const pConn = this.peerConnections[opID];\n\n            if (pConn) {\n                if (opID == callerID) {\n                    pConn.updateRemoteSDP(extension.sdp);\n\n                    /** The group call logic starts here */\n                    if (callerID != this.initiatorID && this.state === SessionState.ACTIVE) {\n                        this._acceptInternal(callerID, {});\n                    }\n                }\n            } else {\n                /** create peer connections for each opponent */\n                let peerConnection;\n                if (opID != callerID && this.currentUserID > opID) {\n                    peerConnection = this._createPeer(opID, 'offer');\n                } else {\n                    peerConnection = this._createPeer(opID, 'answer');\n                }\n\n                this.peerConnections[opID] = peerConnection;\n\n                if (opID == callerID) {\n                    peerConnection.updateRemoteSDP(extension.sdp);\n                    this._startAnswerTimer();\n                }\n            }\n        });\n    }\n\n    _processOnAccept(userID, extension) {\n        const peerConnection = this.peerConnections[userID];\n\n        if (peerConnection) {\n            peerConnection._clearDialingTimer();\n\n            peerConnection\n                .setRemoteSessionDescription('answer', extension.sdp)\n                .then(() => {\n                    Helpers.trace(\"'setRemoteSessionDescription' success\");\n                })\n                .catch(error => {\n                    Helpers.traceError(\"'setRemoteSessionDescription' error: \" + error);\n                });\n        } else {\n            Helpers.traceWarning(\"Ignore 'OnAccept', there is no information about peer connection by some reason.\");\n        }\n    }\n\n    _processOnReject(userID, extension) {\n        const peerConnection = this.peerConnections[userID];\n\n        this._clearWaitingOfferOrAnswerTimer();\n\n        if (peerConnection) {\n            peerConnection.release();\n        } else {\n            Helpers.traceWarning(\"Ignore 'OnReject', there is no information about peer connection by some reason.\");\n        }\n\n        this._closeSessionIfAllConnectionsClosed();\n    }\n\n    _processOnStop(userID, extension) {\n        this._clearAnswerTimer();\n\n        /** drop the call if the initiator did it */\n        if (userID === this.initiatorID) {\n            const pcKeys = Object.keys(this.peerConnections);\n            if (pcKeys.length > 0) {\n                pcKeys.forEach(key => {\n                    this.peerConnections[key].release();\n                });\n            } else {\n                Helpers.traceWarning(\"Ignore 'OnStop', there is no information about peer connections by some reason.\");\n            }\n        } else {\n            const pc = this.peerConnections[userID];\n            if (pc) {\n                pc.release();\n            } else {\n                Helpers.traceWarning(\"Ignore 'OnStop', there is no information about peer connection by some reason.\");\n            }\n        }\n\n        this._closeSessionIfAllConnectionsClosed();\n    }\n\n    _processOnIceCandidates(userID, extension) {\n        const peerConnection = this.peerConnections[userID];\n        if (peerConnection) {\n            peerConnection.addCandidates(extension.iceCandidates);\n        } else {\n            Helpers.traceWarning(\"Ignore 'OnIceCandidates', there is no information about peer connection by some reason.\");\n        }\n    }\n\n    _processCall(peerConnection, ext) {\n        const extension = ext || {};\n\n        extension.sessionID = this.ID;\n        extension.callType = this.callType;\n        extension.callerID = this.initiatorID;\n        extension.opponentsIDs = this.opponentsIDs;\n        extension.sdp = peerConnection.localDescription.sdp;\n\n        //TODO: set bandwidth to the userInfo object\n        extension.userInfo = ext.userInfo || {};\n        extension.userInfo.bandwidth = this.bandwidth;\n\n        this.signalingProvider.sendMessage(peerConnection.userID, extension, SignalingConstants.SignalingType.CALL);\n    }\n\n    _processIceCandidates(peerConnection, iceCandidates) {\n        const extension = {};\n\n        extension.sessionID = this.ID;\n        extension.callType = this.callType;\n        extension.callerID = this.initiatorID;\n        extension.opponentsIDs = this.opponentsIDs;\n\n        this.signalingProvider.sendCandidate(peerConnection.userID, iceCandidates, extension);\n    }\n\n    _processOnNotAnswer(peerConnection) {\n        Helpers.trace(\"Answer timeout callback for session \" + this.ID + \" for user \" + peerConnection.userID);\n\n        this._clearWaitingOfferOrAnswerTimer();\n\n        peerConnection.release();\n\n        Utils.safeCallbackCall(this.onUserNotAnswerListener, this, peerConnection.userID);\n\n        this._closeSessionIfAllConnectionsClosed();\n    }\n\n    _onRemoteStreamListener(userID, stream) {\n        Utils.safeCallbackCall(this.onRemoteStreamListener, this, userID, stream);\n    }\n\n    _onCallStatsReport(userId, stats, error) {\n        Utils.safeCallbackCall(this.onCallStatsReport, this, userId, stats, error);\n    }\n\n    _onSessionConnectionStateChangedListener(userID, connectionState) {\n        Utils.safeCallbackCall(this.onSessionConnectionStateChangedListener, this, userID, connectionState);\n    }\n\n\n    _createPeer(userID, peerConnectionType) {\n        this.startCallTime = new Date();\n\n        const pcConfig = {\n            iceServers: _prepareIceServers(config.videochat.iceServers)\n        };\n\n        Helpers.trace(\"_createPeer, iceServers: \" + JSON.stringify(pcConfig));\n\n        const peer = new RTCPeerConnection(pcConfig);\n        peer._init(this, userID, this.ID, peerConnectionType);\n\n        return peer;\n    }\n\n    _close() {\n        Helpers.trace('_close');\n\n        Object.keys(this.peerConnections).forEach(key => {\n            const peer = this.peerConnections[key];\n            try {\n                peer.release();\n            } catch (e) {\n                console.warn('Peer close error:', e);\n            }\n        });\n\n        this._closeLocalMediaStream();\n\n        this.state = SessionState.CLOSED;\n\n        Utils.safeCallbackCall(this.onSessionCloseListener, this);\n    }\n\n    _closeSessionIfAllConnectionsClosed() {\n        let isAllConnectionsClosed = true;\n\n        Object.keys(this.peerConnections).forEach(key => {\n            const peerCon = this.peerConnections[key];\n            let peerState;\n\n            try {\n                /*\n                TODO:\n                Uses RTCPeerConnection.signalingState instead RTCPeerConnection.iceConnectionState,\n                because state 'closed' comes after few time from Safari, but signaling state comes instantly\n                */\n                peerState = peerCon.iceConnectionState === 'closed' ? 'closed' :\n                    peerCon.signalingState === 'closed' ? 'closed' :\n                        peerCon.released ? 'closed' : null;\n            } catch (err) {\n                Helpers.traceError(err);\n                // need to set peerState to 'closed' on error. FF will crashed without this part.\n                peerState = 'closed';\n            }\n\n            if (peerState !== 'closed') {\n                isAllConnectionsClosed = false;\n            }\n        });\n\n        Helpers.trace(\"All peer connections closed: \" + isAllConnectionsClosed);\n\n        if (isAllConnectionsClosed) {\n            this._closeLocalMediaStream();\n\n            Utils.safeCallbackCall(this.onSessionCloseListener, this);\n\n            this.state = SessionState.CLOSED;\n        }\n    }\n\n    _closeLocalMediaStream() {\n        if (this.localStream) {\n            this.localStream.getAudioTracks().forEach(audioTrack => {\n                audioTrack.stop();\n            });\n\n            this.localStream.getVideoTracks().forEach(videoTrack => {\n                videoTrack.stop();\n            });\n\n            this.localStream = null;\n        }\n    }\n\n    _muteStream(enabled, type) {\n        if (type === 'audio' && this.localStream.getAudioTracks().length > 0) {\n            this.localStream.getAudioTracks().forEach(track => {\n                track.enabled = !!enabled;\n            });\n            return;\n        }\n\n        if (type === 'video' && this.localStream.getVideoTracks().length > 0) {\n            this.localStream.getVideoTracks().forEach(track => {\n                track.enabled = !!enabled;\n            });\n            return;\n        }\n    }\n\n    _clearAnswerTimer() {\n        if (this.answerTimer) {\n            Helpers.trace(\"_clearAnswerTimer\");\n            clearTimeout(this.answerTimer);\n            this.answerTimer = null;\n        }\n    }\n\n    _startAnswerTimer() {\n        Helpers.trace(\"_startAnswerTimer\");\n\n        const answerTimeoutCallback = () => {\n            Helpers.trace(\"_answerTimeoutCallback\");\n\n            if (typeof this.onSessionCloseListener === 'function') {\n                this._close();\n            }\n\n            this.answerTimer = null;\n        };\n\n        const answerTimeInterval = config.videochat.answerTimeInterval * 1000;\n        this.answerTimer = setTimeout(answerTimeoutCallback, answerTimeInterval);\n    }\n\n    _clearWaitingOfferOrAnswerTimer() {\n        if (this.waitingOfferOrAnswerTimer) {\n            Helpers.trace(\"_clearWaitingOfferOrAnswerTimer\");\n            clearTimeout(this.waitingOfferOrAnswerTimer);\n            this.waitingOfferOrAnswerTimer = null;\n        }\n    }\n\n    _startWaitingOfferOrAnswerTimer(time) {\n        const timeout = (config.videochat.answerTimeInterval - time) < 0 ? 1 : config.videochat.answerTimeInterval - time;\n\n        const waitingOfferOrAnswerTimeoutCallback = () => {\n            Helpers.trace(\"waitingOfferOrAnswerTimeoutCallback\");\n\n            Object.keys(this.peerConnections).forEach(key => {\n                const peerConnection = this.peerConnections[key];\n                if (peerConnection.state === PeerConnectionState.CONNECTING || peerConnection.state === PeerConnectionState.NEW) {\n                    this._processOnNotAnswer(peerConnection);\n                }\n            });\n\n            this.waitingOfferOrAnswerTimer = null;\n        };\n\n        Helpers.trace(\"_startWaitingOfferOrAnswerTimer, timeout: \" + timeout);\n\n        this.waitingOfferOrAnswerTimer = setTimeout(waitingOfferOrAnswerTimeoutCallback, timeout * 1000);\n    }\n\n    _uniqueOpponentsIDs() {\n        const opponents = [];\n\n        if (this.initiatorID !== this.currentUserID) {\n            opponents.push(this.initiatorID);\n        }\n\n        this.opponentsIDs.forEach(userID => {\n            if (userID != this.currentUserID) {\n                opponents.push(parseInt(userID));\n            }\n        });\n\n        return opponents;\n    }\n\n    _uniqueOpponentsIDsWithoutInitiator() {\n        const opponents = [];\n\n        this.opponentsIDs.forEach(userID => {\n            if (userID != this.currentUserID) {\n                opponents.push(parseInt(userID));\n            }\n        });\n\n        return opponents;\n    }\n\n    toString() {\n        return 'ID: ' + this.ID + ', initiatorID:  ' + this.initiatorID + ', opponentsIDs: ' + this.opponentsIDs + ', state: ' + this.state + ', callType: ' + this.callType;\n    }\n}\n\nfunction generateUUID() {\n    let d = new Date().getTime();\n    const uuid = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, c => {\n        const r = (d + Math.random() * 16) % 16 | 0;\n        d = Math.floor(d / 16);\n        return (c == 'x' ? r : (r & 0x3 | 0x8)).toString(16);\n    });\n    return uuid;\n}\n\nfunction _prepareExtension(extension) {\n    let ext = {};\n\n    try {\n        if (({}).toString.call(extension) === '[object Object]') {\n            ext.userInfo = extension;\n            ext = JSON.parse(JSON.stringify(ext).replace(/null/g, \"\\\"\\\"\"));\n        } else {\n            throw new Error('Invalid type of \"extension\" object.');\n        }\n    } catch (err) {\n        Helpers.traceWarning(err.message);\n    }\n\n    return ext;\n}\n\nfunction _prepareIceServers(iceServers) {\n    const iceServersCopy = JSON.parse(JSON.stringify(iceServers));\n\n    Object.keys(iceServersCopy).forEach((c, i, a) => {\n        if (iceServersCopy[i].hasOwnProperty('url')) {\n            iceServersCopy[i].urls = iceServersCopy[i].url;\n        } else {\n            iceServersCopy[i].url = iceServersCopy[i].urls;\n        }\n    });\n\n    return iceServersCopy;\n}\n\nmodule.exports = WebRTCSession;\n","const SignalingConstants = require('./cubeWebRTCConstants').SignalingConstants;\nconst ChatHelpers = require('../messaging/cubeChatInternalUtils');\n\nclass WebRTCSignalingProcessor {\n\n    constructor(delegate) {\n        this.delegate = delegate;\n    }\n\n    _onMessage(userId, extraParams) {\n        const extension = this._getExtension(extraParams);\n        const sessionId = extension.sessionID;\n        const signalType = extension.signalType;\n\n        /** cleanup */\n        delete extension.moduleIdentifier;\n        delete extension.sessionID;\n        delete extension.signalType;\n\n        switch (signalType) {\n            case SignalingConstants.SignalingType.CALL:\n                this.delegate._onCallListener(userId, sessionId, extension);\n                break;\n\n            case SignalingConstants.SignalingType.ACCEPT:\n                this.delegate._onAcceptListener(userId, sessionId, extension);\n                break;\n\n            case SignalingConstants.SignalingType.REJECT:\n                this.delegate._onRejectListener(userId, sessionId, extension);\n                break;\n\n            case SignalingConstants.SignalingType.STOP:\n                this.delegate._onStopListener(userId, sessionId, extension);\n                break;\n\n            case SignalingConstants.SignalingType.CANDIDATE:\n                this.delegate._onIceCandidatesListener(userId, sessionId, extension);\n                break;\n        }\n    }\n\n    // TODO: refactor it\n    _getExtension(extraParams) {\n        if (!extraParams) {\n            return null;\n        }\n\n        let extension = {}, iceCandidates = [], opponents = [],\n            candidate, opponent, childrenNodes;\n\n        let extraParamsChildNodes = extraParams.childNodes || extraParams.children;\n\n        for (let i = 0, len = extraParamsChildNodes.length; i < len; i++) {\n            const items = extraParamsChildNodes[i].childNodes || extraParamsChildNodes[i].children;\n            const itemTagName = extraParamsChildNodes[i].tagName || extraParamsChildNodes[i].name;\n\n            if (itemTagName === 'iceCandidates') {\n                for (let j = 0, len2 = items.length; j < len2; j++) {\n                    candidate = {};\n                    childrenNodes = items[j].childNodes || items[j].children;\n\n                    for (let k = 0, len3 = childrenNodes.length; k < len3; k++) {\n                        const childName = childrenNodes[k].tagName || childrenNodes[k].name;\n                        const childValue = childrenNodes[k].textContent || childrenNodes[k].children[0];\n                        candidate[childName] = childName === 'sdpMLineIndex' ? parseInt(childValue) : childValue;\n                    }\n\n                    iceCandidates.push(candidate);\n                }\n\n            } else if (itemTagName === 'opponentsIDs') {\n                for (let v = 0, len2v = items.length; v < len2v; v++) {\n                    opponent = items[v].textContent || items[v].children[0];\n                    opponents.push(parseInt(opponent));\n                }\n            } else {\n                if (items.length > 1) {\n                    let nodeTextContentSize = (extraParamsChildNodes[i].textContent || extraParamsChildNodes[i].children[0]).length;\n\n                    if (nodeTextContentSize > 4096) {\n                        let wholeNodeContent = \"\";\n\n                        for (let t = 0; t < items.length; ++t) {\n                            wholeNodeContent += (items.textContent || items.children[0]);\n                        }\n                        extension[itemTagName] = wholeNodeContent;\n                    } else {\n                        extension = ChatHelpers._XMLtoJS(extension, itemTagName, extraParamsChildNodes[i]);\n                    }\n                } else {\n                    if (itemTagName === 'userInfo') {\n                        extension = ChatHelpers._XMLtoJS(extension, itemTagName, extraParamsChildNodes[i]);\n                    } else {\n                        extension[itemTagName] = extraParamsChildNodes[i].textContent || extraParamsChildNodes[i].children[0];\n                    }\n                }\n            }\n        }\n        if (iceCandidates.length > 0) {\n            extension.iceCandidates = iceCandidates;\n        }\n        if (opponents.length > 0) {\n            extension.opponentsIDs = opponents;\n        }\n\n        return extension;\n    }\n}\n\nmodule.exports = WebRTCSignalingProcessor;\n","const Helpers = require('./cubeWebRTCHelpers');\nconst SignalingConstants = require('./cubeWebRTCConstants').SignalingConstants;\nconst Utils = require('../cubeInternalUtils');\nconst config = require('../cubeConfig');\nconst ChatHelpers = require('../messaging/cubeChatInternalUtils');\n\nclass WebRTCSignalingProvider {\n  constructor(signalingConnection) {\n    this.signalingConnection = signalingConnection;\n  }\n\n  sendCandidate(userId, iceCandidates, ext) {\n    const extension = ext || {};\n    extension.iceCandidates = iceCandidates;\n\n    this.sendMessage(userId, extension, SignalingConstants.SignalingType.CANDIDATE);\n  }\n\n  sendMessage(userId, ext, signalingType) {\n    const extension = ext || {};\n    /** basic parameters */\n    extension.moduleIdentifier = SignalingConstants.MODULE_ID;\n    extension.signalType = signalingType;\n    /** extension.sessionID */\n    /** extension.callType */\n    extension.platform = 'web';\n    /** extension.callerID */\n    /** extension.opponentsIDs */\n    /** extension.sdp */\n\n    if (extension.userInfo && !Object.keys(extension.userInfo).length) {\n      delete extension.userInfo;\n    }\n\n    const params = {\n      to: Helpers.getUserJid(userId, config.creds.appId),\n      type: 'headline',\n      id: Utils.getBsonObjectId()\n    };\n\n    let msg = ChatHelpers.createMessageStanza(params).c('extraParams', {\n      xmlns: 'jabber:client'\n    });\n\n    Object.keys(extension).forEach(field => {\n      if (field === 'iceCandidates') {\n        msg = msg.c('iceCandidates');\n        extension[field].forEach(candidate => {\n          msg = msg.c('iceCandidate');\n          Object.keys(candidate).forEach(key => {\n            msg = msg.c(key).t(candidate[key]).up();\n          });\n          msg = msg.up();\n        });\n        msg = msg.up();\n      } else if (field === 'opponentsIDs') {\n        msg = msg.c('opponentsIDs');\n        extension[field].forEach(opponentId => {\n          msg = msg.c('opponentID').t(opponentId).up();\n        });\n        msg = msg.up();\n      } else if (typeof extension[field] === 'object') {\n        ChatHelpers._JStoXML(field, extension[field], msg);\n      } else {\n        msg = msg.c(field).t(extension[field]).up();\n      }\n    });\n    msg = msg.up();\n\n    this.signalingConnection.send(msg);\n  }\n}\n\nmodule.exports = WebRTCSignalingProvider;\n","const coreConfig = require('../cubeConfig');\nconst ConferenceSession = require('./cubeConferenceSession')\nconst {DEVICE_INPUT_TYPES, CALL_TYPES} = require('./cubeConferenceConstansts') \nconst {mediaDevices} = require('../cubeDependencies')\n\nclass ConferenceClient {\n\n  constructor(proxy) {\n    this.proxy = proxy\n  }\n\n  DEVICE_INPUT_TYPES = DEVICE_INPUT_TYPES\n  CALL_TYPES = CALL_TYPES\n\n  sessionsStore = {}\n\n  onParticipantJoinedListener\n  onParticipantLeftListener\n\n  onSlowLinkListener\n  onRemoteStreamListener\n  onRemoteConnectionStateChangedListener\n  onSessionConnectionStateChangedListener\n\n  createNewSession() {\n    const session = new ConferenceSession(Object.assign(coreConfig.conference, { token: this.getCurrentSessionToken() }))\n\n    session.onParticipantJoinedListener = this.onParticipantJoinedListener\n    session.onParticipantLeftListener = this.onParticipantLeftListener\n\n    session.onSlowLinkListener = this.onSlowLinkListener\n    session.onRemoteStreamListener = this.onRemoteStreamListener\n    session.onRemoteConnectionStateChangedListener = this.onRemoteConnectionStateChangedListener\n    session.onSessionConnectionStateChangedListener = this.onSessionConnectionStateChangedListener\n\n    this.sessionsStore[session.id] = session\n\n    return session\n  }\n\n  async getMediaDevices(deviceInputType) {\n    const mediaDevices = await this._listDevices()\n    if (deviceInputType === DEVICE_INPUT_TYPES.VIDEO) {\n      return mediaDevices.filter(({kind}) => kind === DEVICE_INPUT_TYPES.VIDEO)\n    } else if (deviceInputType === DEVICE_INPUT_TYPES.AUDIO) {\n      return mediaDevices.filter(({kind}) => kind === DEVICE_INPUT_TYPES.AUDIO)\n    }\n    return mediaDevices\n  }\n\n  _listDevices() {\n    return mediaDevices.enumerateDevices()\n  }\n\n  clearSession(session_id)  {\n    delete this.sessionsStore[session_id]\n  }\n\n  getCurrentSessionToken() {\n    const currentSession  = this.proxy.getSession()\n    if (!currentSession) {\n      throw new Error('Session does not exist')\n    }\n    return this.proxy.getSession().token\n  }\n}\n\nmodule.exports = ConferenceClient","/**\n * Copyright (c) 2014-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\nvar runtime = (function (exports) {\n  \"use strict\";\n\n  var Op = Object.prototype;\n  var hasOwn = Op.hasOwnProperty;\n  var undefined; // More compressible than void 0.\n  var $Symbol = typeof Symbol === \"function\" ? Symbol : {};\n  var iteratorSymbol = $Symbol.iterator || \"@@iterator\";\n  var asyncIteratorSymbol = $Symbol.asyncIterator || \"@@asyncIterator\";\n  var toStringTagSymbol = $Symbol.toStringTag || \"@@toStringTag\";\n\n  function wrap(innerFn, outerFn, self, tryLocsList) {\n    // If outerFn provided and outerFn.prototype is a Generator, then outerFn.prototype instanceof Generator.\n    var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator;\n    var generator = Object.create(protoGenerator.prototype);\n    var context = new Context(tryLocsList || []);\n\n    // The ._invoke method unifies the implementations of the .next,\n    // .throw, and .return methods.\n    generator._invoke = makeInvokeMethod(innerFn, self, context);\n\n    return generator;\n  }\n  exports.wrap = wrap;\n\n  // Try/catch helper to minimize deoptimizations. Returns a completion\n  // record like context.tryEntries[i].completion. This interface could\n  // have been (and was previously) designed to take a closure to be\n  // invoked without arguments, but in all the cases we care about we\n  // already have an existing method we want to call, so there's no need\n  // to create a new function object. We can even get away with assuming\n  // the method takes exactly one argument, since that happens to be true\n  // in every case, so we don't have to touch the arguments object. The\n  // only additional allocation required is the completion record, which\n  // has a stable shape and so hopefully should be cheap to allocate.\n  function tryCatch(fn, obj, arg) {\n    try {\n      return { type: \"normal\", arg: fn.call(obj, arg) };\n    } catch (err) {\n      return { type: \"throw\", arg: err };\n    }\n  }\n\n  var GenStateSuspendedStart = \"suspendedStart\";\n  var GenStateSuspendedYield = \"suspendedYield\";\n  var GenStateExecuting = \"executing\";\n  var GenStateCompleted = \"completed\";\n\n  // Returning this object from the innerFn has the same effect as\n  // breaking out of the dispatch switch statement.\n  var ContinueSentinel = {};\n\n  // Dummy constructor functions that we use as the .constructor and\n  // .constructor.prototype properties for functions that return Generator\n  // objects. For full spec compliance, you may wish to configure your\n  // minifier not to mangle the names of these two functions.\n  function Generator() {}\n  function GeneratorFunction() {}\n  function GeneratorFunctionPrototype() {}\n\n  // This is a polyfill for %IteratorPrototype% for environments that\n  // don't natively support it.\n  var IteratorPrototype = {};\n  IteratorPrototype[iteratorSymbol] = function () {\n    return this;\n  };\n\n  var getProto = Object.getPrototypeOf;\n  var NativeIteratorPrototype = getProto && getProto(getProto(values([])));\n  if (NativeIteratorPrototype &&\n      NativeIteratorPrototype !== Op &&\n      hasOwn.call(NativeIteratorPrototype, iteratorSymbol)) {\n    // This environment has a native %IteratorPrototype%; use it instead\n    // of the polyfill.\n    IteratorPrototype = NativeIteratorPrototype;\n  }\n\n  var Gp = GeneratorFunctionPrototype.prototype =\n    Generator.prototype = Object.create(IteratorPrototype);\n  GeneratorFunction.prototype = Gp.constructor = GeneratorFunctionPrototype;\n  GeneratorFunctionPrototype.constructor = GeneratorFunction;\n  GeneratorFunctionPrototype[toStringTagSymbol] =\n    GeneratorFunction.displayName = \"GeneratorFunction\";\n\n  // Helper for defining the .next, .throw, and .return methods of the\n  // Iterator interface in terms of a single ._invoke method.\n  function defineIteratorMethods(prototype) {\n    [\"next\", \"throw\", \"return\"].forEach(function(method) {\n      prototype[method] = function(arg) {\n        return this._invoke(method, arg);\n      };\n    });\n  }\n\n  exports.isGeneratorFunction = function(genFun) {\n    var ctor = typeof genFun === \"function\" && genFun.constructor;\n    return ctor\n      ? ctor === GeneratorFunction ||\n        // For the native GeneratorFunction constructor, the best we can\n        // do is to check its .name property.\n        (ctor.displayName || ctor.name) === \"GeneratorFunction\"\n      : false;\n  };\n\n  exports.mark = function(genFun) {\n    if (Object.setPrototypeOf) {\n      Object.setPrototypeOf(genFun, GeneratorFunctionPrototype);\n    } else {\n      genFun.__proto__ = GeneratorFunctionPrototype;\n      if (!(toStringTagSymbol in genFun)) {\n        genFun[toStringTagSymbol] = \"GeneratorFunction\";\n      }\n    }\n    genFun.prototype = Object.create(Gp);\n    return genFun;\n  };\n\n  // Within the body of any async function, `await x` is transformed to\n  // `yield regeneratorRuntime.awrap(x)`, so that the runtime can test\n  // `hasOwn.call(value, \"__await\")` to determine if the yielded value is\n  // meant to be awaited.\n  exports.awrap = function(arg) {\n    return { __await: arg };\n  };\n\n  function AsyncIterator(generator, PromiseImpl) {\n    function invoke(method, arg, resolve, reject) {\n      var record = tryCatch(generator[method], generator, arg);\n      if (record.type === \"throw\") {\n        reject(record.arg);\n      } else {\n        var result = record.arg;\n        var value = result.value;\n        if (value &&\n            typeof value === \"object\" &&\n            hasOwn.call(value, \"__await\")) {\n          return PromiseImpl.resolve(value.__await).then(function(value) {\n            invoke(\"next\", value, resolve, reject);\n          }, function(err) {\n            invoke(\"throw\", err, resolve, reject);\n          });\n        }\n\n        return PromiseImpl.resolve(value).then(function(unwrapped) {\n          // When a yielded Promise is resolved, its final value becomes\n          // the .value of the Promise<{value,done}> result for the\n          // current iteration.\n          result.value = unwrapped;\n          resolve(result);\n        }, function(error) {\n          // If a rejected Promise was yielded, throw the rejection back\n          // into the async generator function so it can be handled there.\n          return invoke(\"throw\", error, resolve, reject);\n        });\n      }\n    }\n\n    var previousPromise;\n\n    function enqueue(method, arg) {\n      function callInvokeWithMethodAndArg() {\n        return new PromiseImpl(function(resolve, reject) {\n          invoke(method, arg, resolve, reject);\n        });\n      }\n\n      return previousPromise =\n        // If enqueue has been called before, then we want to wait until\n        // all previous Promises have been resolved before calling invoke,\n        // so that results are always delivered in the correct order. If\n        // enqueue has not been called before, then it is important to\n        // call invoke immediately, without waiting on a callback to fire,\n        // so that the async generator function has the opportunity to do\n        // any necessary setup in a predictable way. This predictability\n        // is why the Promise constructor synchronously invokes its\n        // executor callback, and why async functions synchronously\n        // execute code before the first await. Since we implement simple\n        // async functions in terms of async generators, it is especially\n        // important to get this right, even though it requires care.\n        previousPromise ? previousPromise.then(\n          callInvokeWithMethodAndArg,\n          // Avoid propagating failures to Promises returned by later\n          // invocations of the iterator.\n          callInvokeWithMethodAndArg\n        ) : callInvokeWithMethodAndArg();\n    }\n\n    // Define the unified helper method that is used to implement .next,\n    // .throw, and .return (see defineIteratorMethods).\n    this._invoke = enqueue;\n  }\n\n  defineIteratorMethods(AsyncIterator.prototype);\n  AsyncIterator.prototype[asyncIteratorSymbol] = function () {\n    return this;\n  };\n  exports.AsyncIterator = AsyncIterator;\n\n  // Note that simple async functions are implemented on top of\n  // AsyncIterator objects; they just return a Promise for the value of\n  // the final result produced by the iterator.\n  exports.async = function(innerFn, outerFn, self, tryLocsList, PromiseImpl) {\n    if (PromiseImpl === void 0) PromiseImpl = Promise;\n\n    var iter = new AsyncIterator(\n      wrap(innerFn, outerFn, self, tryLocsList),\n      PromiseImpl\n    );\n\n    return exports.isGeneratorFunction(outerFn)\n      ? iter // If outerFn is a generator, return the full iterator.\n      : iter.next().then(function(result) {\n          return result.done ? result.value : iter.next();\n        });\n  };\n\n  function makeInvokeMethod(innerFn, self, context) {\n    var state = GenStateSuspendedStart;\n\n    return function invoke(method, arg) {\n      if (state === GenStateExecuting) {\n        throw new Error(\"Generator is already running\");\n      }\n\n      if (state === GenStateCompleted) {\n        if (method === \"throw\") {\n          throw arg;\n        }\n\n        // Be forgiving, per 25.3.3.3.3 of the spec:\n        // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-generatorresume\n        return doneResult();\n      }\n\n      context.method = method;\n      context.arg = arg;\n\n      while (true) {\n        var delegate = context.delegate;\n        if (delegate) {\n          var delegateResult = maybeInvokeDelegate(delegate, context);\n          if (delegateResult) {\n            if (delegateResult === ContinueSentinel) continue;\n            return delegateResult;\n          }\n        }\n\n        if (context.method === \"next\") {\n          // Setting context._sent for legacy support of Babel's\n          // function.sent implementation.\n          context.sent = context._sent = context.arg;\n\n        } else if (context.method === \"throw\") {\n          if (state === GenStateSuspendedStart) {\n            state = GenStateCompleted;\n            throw context.arg;\n          }\n\n          context.dispatchException(context.arg);\n\n        } else if (context.method === \"return\") {\n          context.abrupt(\"return\", context.arg);\n        }\n\n        state = GenStateExecuting;\n\n        var record = tryCatch(innerFn, self, context);\n        if (record.type === \"normal\") {\n          // If an exception is thrown from innerFn, we leave state ===\n          // GenStateExecuting and loop back for another invocation.\n          state = context.done\n            ? GenStateCompleted\n            : GenStateSuspendedYield;\n\n          if (record.arg === ContinueSentinel) {\n            continue;\n          }\n\n          return {\n            value: record.arg,\n            done: context.done\n          };\n\n        } else if (record.type === \"throw\") {\n          state = GenStateCompleted;\n          // Dispatch the exception by looping back around to the\n          // context.dispatchException(context.arg) call above.\n          context.method = \"throw\";\n          context.arg = record.arg;\n        }\n      }\n    };\n  }\n\n  // Call delegate.iterator[context.method](context.arg) and handle the\n  // result, either by returning a { value, done } result from the\n  // delegate iterator, or by modifying context.method and context.arg,\n  // setting context.delegate to null, and returning the ContinueSentinel.\n  function maybeInvokeDelegate(delegate, context) {\n    var method = delegate.iterator[context.method];\n    if (method === undefined) {\n      // A .throw or .return when the delegate iterator has no .throw\n      // method always terminates the yield* loop.\n      context.delegate = null;\n\n      if (context.method === \"throw\") {\n        // Note: [\"return\"] must be used for ES3 parsing compatibility.\n        if (delegate.iterator[\"return\"]) {\n          // If the delegate iterator has a return method, give it a\n          // chance to clean up.\n          context.method = \"return\";\n          context.arg = undefined;\n          maybeInvokeDelegate(delegate, context);\n\n          if (context.method === \"throw\") {\n            // If maybeInvokeDelegate(context) changed context.method from\n            // \"return\" to \"throw\", let that override the TypeError below.\n            return ContinueSentinel;\n          }\n        }\n\n        context.method = \"throw\";\n        context.arg = new TypeError(\n          \"The iterator does not provide a 'throw' method\");\n      }\n\n      return ContinueSentinel;\n    }\n\n    var record = tryCatch(method, delegate.iterator, context.arg);\n\n    if (record.type === \"throw\") {\n      context.method = \"throw\";\n      context.arg = record.arg;\n      context.delegate = null;\n      return ContinueSentinel;\n    }\n\n    var info = record.arg;\n\n    if (! info) {\n      context.method = \"throw\";\n      context.arg = new TypeError(\"iterator result is not an object\");\n      context.delegate = null;\n      return ContinueSentinel;\n    }\n\n    if (info.done) {\n      // Assign the result of the finished delegate to the temporary\n      // variable specified by delegate.resultName (see delegateYield).\n      context[delegate.resultName] = info.value;\n\n      // Resume execution at the desired location (see delegateYield).\n      context.next = delegate.nextLoc;\n\n      // If context.method was \"throw\" but the delegate handled the\n      // exception, let the outer generator proceed normally. If\n      // context.method was \"next\", forget context.arg since it has been\n      // \"consumed\" by the delegate iterator. If context.method was\n      // \"return\", allow the original .return call to continue in the\n      // outer generator.\n      if (context.method !== \"return\") {\n        context.method = \"next\";\n        context.arg = undefined;\n      }\n\n    } else {\n      // Re-yield the result returned by the delegate method.\n      return info;\n    }\n\n    // The delegate iterator is finished, so forget it and continue with\n    // the outer generator.\n    context.delegate = null;\n    return ContinueSentinel;\n  }\n\n  // Define Generator.prototype.{next,throw,return} in terms of the\n  // unified ._invoke helper method.\n  defineIteratorMethods(Gp);\n\n  Gp[toStringTagSymbol] = \"Generator\";\n\n  // A Generator should always return itself as the iterator object when the\n  // @@iterator function is called on it. Some browsers' implementations of the\n  // iterator prototype chain incorrectly implement this, causing the Generator\n  // object to not be returned from this call. This ensures that doesn't happen.\n  // See https://github.com/facebook/regenerator/issues/274 for more details.\n  Gp[iteratorSymbol] = function() {\n    return this;\n  };\n\n  Gp.toString = function() {\n    return \"[object Generator]\";\n  };\n\n  function pushTryEntry(locs) {\n    var entry = { tryLoc: locs[0] };\n\n    if (1 in locs) {\n      entry.catchLoc = locs[1];\n    }\n\n    if (2 in locs) {\n      entry.finallyLoc = locs[2];\n      entry.afterLoc = locs[3];\n    }\n\n    this.tryEntries.push(entry);\n  }\n\n  function resetTryEntry(entry) {\n    var record = entry.completion || {};\n    record.type = \"normal\";\n    delete record.arg;\n    entry.completion = record;\n  }\n\n  function Context(tryLocsList) {\n    // The root entry object (effectively a try statement without a catch\n    // or a finally block) gives us a place to store values thrown from\n    // locations where there is no enclosing try statement.\n    this.tryEntries = [{ tryLoc: \"root\" }];\n    tryLocsList.forEach(pushTryEntry, this);\n    this.reset(true);\n  }\n\n  exports.keys = function(object) {\n    var keys = [];\n    for (var key in object) {\n      keys.push(key);\n    }\n    keys.reverse();\n\n    // Rather than returning an object with a next method, we keep\n    // things simple and return the next function itself.\n    return function next() {\n      while (keys.length) {\n        var key = keys.pop();\n        if (key in object) {\n          next.value = key;\n          next.done = false;\n          return next;\n        }\n      }\n\n      // To avoid creating an additional object, we just hang the .value\n      // and .done properties off the next function object itself. This\n      // also ensures that the minifier will not anonymize the function.\n      next.done = true;\n      return next;\n    };\n  };\n\n  function values(iterable) {\n    if (iterable) {\n      var iteratorMethod = iterable[iteratorSymbol];\n      if (iteratorMethod) {\n        return iteratorMethod.call(iterable);\n      }\n\n      if (typeof iterable.next === \"function\") {\n        return iterable;\n      }\n\n      if (!isNaN(iterable.length)) {\n        var i = -1, next = function next() {\n          while (++i < iterable.length) {\n            if (hasOwn.call(iterable, i)) {\n              next.value = iterable[i];\n              next.done = false;\n              return next;\n            }\n          }\n\n          next.value = undefined;\n          next.done = true;\n\n          return next;\n        };\n\n        return next.next = next;\n      }\n    }\n\n    // Return an iterator with no values.\n    return { next: doneResult };\n  }\n  exports.values = values;\n\n  function doneResult() {\n    return { value: undefined, done: true };\n  }\n\n  Context.prototype = {\n    constructor: Context,\n\n    reset: function(skipTempReset) {\n      this.prev = 0;\n      this.next = 0;\n      // Resetting context._sent for legacy support of Babel's\n      // function.sent implementation.\n      this.sent = this._sent = undefined;\n      this.done = false;\n      this.delegate = null;\n\n      this.method = \"next\";\n      this.arg = undefined;\n\n      this.tryEntries.forEach(resetTryEntry);\n\n      if (!skipTempReset) {\n        for (var name in this) {\n          // Not sure about the optimal order of these conditions:\n          if (name.charAt(0) === \"t\" &&\n              hasOwn.call(this, name) &&\n              !isNaN(+name.slice(1))) {\n            this[name] = undefined;\n          }\n        }\n      }\n    },\n\n    stop: function() {\n      this.done = true;\n\n      var rootEntry = this.tryEntries[0];\n      var rootRecord = rootEntry.completion;\n      if (rootRecord.type === \"throw\") {\n        throw rootRecord.arg;\n      }\n\n      return this.rval;\n    },\n\n    dispatchException: function(exception) {\n      if (this.done) {\n        throw exception;\n      }\n\n      var context = this;\n      function handle(loc, caught) {\n        record.type = \"throw\";\n        record.arg = exception;\n        context.next = loc;\n\n        if (caught) {\n          // If the dispatched exception was caught by a catch block,\n          // then let that catch block handle the exception normally.\n          context.method = \"next\";\n          context.arg = undefined;\n        }\n\n        return !! caught;\n      }\n\n      for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n        var entry = this.tryEntries[i];\n        var record = entry.completion;\n\n        if (entry.tryLoc === \"root\") {\n          // Exception thrown outside of any try block that could handle\n          // it, so set the completion value of the entire function to\n          // throw the exception.\n          return handle(\"end\");\n        }\n\n        if (entry.tryLoc <= this.prev) {\n          var hasCatch = hasOwn.call(entry, \"catchLoc\");\n          var hasFinally = hasOwn.call(entry, \"finallyLoc\");\n\n          if (hasCatch && hasFinally) {\n            if (this.prev < entry.catchLoc) {\n              return handle(entry.catchLoc, true);\n            } else if (this.prev < entry.finallyLoc) {\n              return handle(entry.finallyLoc);\n            }\n\n          } else if (hasCatch) {\n            if (this.prev < entry.catchLoc) {\n              return handle(entry.catchLoc, true);\n            }\n\n          } else if (hasFinally) {\n            if (this.prev < entry.finallyLoc) {\n              return handle(entry.finallyLoc);\n            }\n\n          } else {\n            throw new Error(\"try statement without catch or finally\");\n          }\n        }\n      }\n    },\n\n    abrupt: function(type, arg) {\n      for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n        var entry = this.tryEntries[i];\n        if (entry.tryLoc <= this.prev &&\n            hasOwn.call(entry, \"finallyLoc\") &&\n            this.prev < entry.finallyLoc) {\n          var finallyEntry = entry;\n          break;\n        }\n      }\n\n      if (finallyEntry &&\n          (type === \"break\" ||\n           type === \"continue\") &&\n          finallyEntry.tryLoc <= arg &&\n          arg <= finallyEntry.finallyLoc) {\n        // Ignore the finally entry if control is not jumping to a\n        // location outside the try/catch block.\n        finallyEntry = null;\n      }\n\n      var record = finallyEntry ? finallyEntry.completion : {};\n      record.type = type;\n      record.arg = arg;\n\n      if (finallyEntry) {\n        this.method = \"next\";\n        this.next = finallyEntry.finallyLoc;\n        return ContinueSentinel;\n      }\n\n      return this.complete(record);\n    },\n\n    complete: function(record, afterLoc) {\n      if (record.type === \"throw\") {\n        throw record.arg;\n      }\n\n      if (record.type === \"break\" ||\n          record.type === \"continue\") {\n        this.next = record.arg;\n      } else if (record.type === \"return\") {\n        this.rval = this.arg = record.arg;\n        this.method = \"return\";\n        this.next = \"end\";\n      } else if (record.type === \"normal\" && afterLoc) {\n        this.next = afterLoc;\n      }\n\n      return ContinueSentinel;\n    },\n\n    finish: function(finallyLoc) {\n      for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n        var entry = this.tryEntries[i];\n        if (entry.finallyLoc === finallyLoc) {\n          this.complete(entry.completion, entry.afterLoc);\n          resetTryEntry(entry);\n          return ContinueSentinel;\n        }\n      }\n    },\n\n    \"catch\": function(tryLoc) {\n      for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n        var entry = this.tryEntries[i];\n        if (entry.tryLoc === tryLoc) {\n          var record = entry.completion;\n          if (record.type === \"throw\") {\n            var thrown = record.arg;\n            resetTryEntry(entry);\n          }\n          return thrown;\n        }\n      }\n\n      // The context.catch method must only be called with a location\n      // argument that corresponds to a known catch block.\n      throw new Error(\"illegal catch attempt\");\n    },\n\n    delegateYield: function(iterable, resultName, nextLoc) {\n      this.delegate = {\n        iterator: values(iterable),\n        resultName: resultName,\n        nextLoc: nextLoc\n      };\n\n      if (this.method === \"next\") {\n        // Deliberately forget the last sent value so that we don't\n        // accidentally pass it on to the delegate.\n        this.arg = undefined;\n      }\n\n      return ContinueSentinel;\n    }\n  };\n\n  // Regardless of whether this script is executing as a CommonJS module\n  // or not, return the runtime object so that we can declare the variable\n  // regeneratorRuntime in the outer scope, which allows this module to be\n  // injected easily by `bin/regenerator --include-runtime script.js`.\n  return exports;\n\n}(\n  // If this script is executing as a CommonJS module, use module.exports\n  // as the regeneratorRuntime namespace. Otherwise create a new empty\n  // object. Either way, the resulting object will be used to initialize\n  // the regeneratorRuntime variable at the top of this file.\n  typeof module === \"object\" ? module.exports : {}\n));\n\ntry {\n  regeneratorRuntime = runtime;\n} catch (accidentalStrictMode) {\n  // This module should not be running in strict mode, so the above\n  // assignment should always work unless something is misconfigured. Just\n  // in case runtime.js accidentally runs in strict mode, we can escape\n  // strict mode using a global Function call. This could conceivably fail\n  // if a Content Security Policy forbids using Function, but in that case\n  // the proper solution is to fix the accidental strict mode problem. If\n  // you've misconfigured your bundler to force strict mode and applied a\n  // CSP to forbid Function, and you're not willing to fix either of those\n  // problems, please detail your unique predicament in a GitHub issue.\n  Function(\"r\", \"regeneratorRuntime = r\")(runtime);\n}\n","const Utils = require('../cubeInternalUtils');\nconst { mediaDevices } = require('../cubeDependencies')\nconst { Client: ClientJanusConf } = require('./cubeVideoCallingConference')\nconst { CALL_TYPES } = require('./cubeConferenceConstansts')\n\nclass ConferenceSession {\n\n  id\n  currentUserDisplayName\n\n  constructor(janusConfig) {\n    this.id = `${Math.random()}`\n    this._clientConf = new ClientJanusConf(janusConfig)\n    this._setOnParticipantJoinListener()\n    this._setOnParticipantLeftListener()\n    this._setOnRemoveStreamListener()\n  }\n\n  localStream\n\n  get currentRoomId() {\n    return this._clientConf.currentDialogId\n  }\n\n  set currentRoomId(roomId) {\n    return this._clientConf.currentDialogId = roomId\n  }\n\n  get currentPublisherPC() {\n    return this._clientConf.videoRoomPlugin.webrtcStuff.pc\n  }\n\n  onParticipantJoinedListener\n  onParticipantLeftListener\n\n  onSlowLinkListener\n  onRemoteStreamListener\n  onRemoteConnectionStateChangedListener\n  onSessionConnectionStateChangedListener\n\n  activeVideoDeviceId\n  activeAudioDeviceId\n\n  _createSession() {\n    return new Promise((resolve, reject) => {\n      this._clientConf.createSession({\n        success: resolve,\n        error: reject\n      })\n    })\n  }\n\n  // async joinAsPublisher(roomId, user_id) {\n  //   await this._createSession()\n  //   this.currentRoomId = roomId\n  //   await this._createPublisher(user_id)\n  // }\n\n  // async joinAsListener(roomId, user_id) {\n  //   await this._createSession()\n  //   this.currentRoomId = roomId\n  //   await this._createListener(user_id)\n  // }\n\n  async join(roomId, user_id, userDisplayName) {\n    this.currentUserDisplayName = userDisplayName\n    await this._createSession()\n    this.currentRoomId = roomId\n    await this._createPublisher(user_id)\n  }\n\n  async _createPublisher(user_id) {\n    await this._createHandler(false, user_id)\n    await this._join(this.currentRoomId, user_id)\n  }\n\n  async _createListener(user_id) {\n    await this._createHandler(true, user_id)\n  }\n\n  _createHandler(isRemote, user_id) {\n    return new Promise((resolve, reject) => {\n      this._clientConf.attachVideoConferencingPlugin(isRemote, user_id, {\n        success: resolve,\n        error: reject,\n        iceState: isRemote ? this._onRemoteIceStateChanged.bind(this, user_id) : this._onLocalIceStateChanged,\n        slowLink: isRemote ? this._onSlowLink.bind(this, user_id) : this._onSlowLink.bind(this, void 0),\n        localStream: this.localStream,\n        displayName: this.currentUserDisplayName\n      })\n    })\n  }\n\n  _join(roomId, user_id) {\n    return new Promise((resolve, reject) => {\n      this._clientConf.join(roomId, user_id, false, {\n        success: resolve,\n        error: reject,\n        displayName: this.currentUserDisplayName\n      })\n    })\n  }\n\n  _setOnParticipantJoinListener() {\n    this._clientConf.on('participantjoined', this._onParticipantJoined)\n  }\n\n  _setOnParticipantLeftListener() {\n    this._clientConf.on('participantleft', this._onParticipantLeft)\n  }\n\n  _setOnRemoveStreamListener() {\n    this._clientConf.on('remotestream', this._onRemoteStream)\n  }\n\n  _onParticipantJoined = (user_id, userDisplayName) => {\n    this._createListener(user_id)\n    Utils.safeCallbackCall(this.onParticipantJoinedListener, this, user_id, userDisplayName)\n  }\n\n  _onParticipantLeft = (user_id, userDisplayName) => {\n    Utils.safeCallbackCall(this.onParticipantLeftListener, this, user_id, userDisplayName)\n  }\n\n  _onLocalIceStateChanged = (iceState) => {\n    Utils.safeCallbackCall(this.onSessionConnectionStateChangedListener, this, iceState)\n  }\n\n  _onRemoteIceStateChanged = (user_id, iceState) => {\n    Utils.safeCallbackCall(this.onRemoteConnectionStateChangedListener, this, user_id, iceState)\n  }\n\n  _onRemoteStream = (stream, user_id) => {\n    Utils.safeCallbackCall(this.onRemoteStreamListener, this, user_id, stream)\n  }\n\n  _onSlowLink = (user_id, uplink, nacks) => {\n    Utils.safeCallbackCall(this.onSlowLinkListener, this, user_id, uplink, nacks)\n  }\n\n  listOfOnlineParticipants() {\n    return new Promise((resolve, reject) => {\n      this._clientConf.listOnlineParticipants(this.currentRoomId, {\n        success: resolve,\n        error: reject\n      })\n    })\n  }\n\n  async leave() {\n    await this._leaveGroup()\n    this.currentRoomId = void 0\n    this.currentUserDisplayName = void 0\n    await this._destroy()\n    this.localStream.getTracks().forEach(track => track.stop())\n    this.localStream = void 0\n  }\n\n  _leaveGroup() {\n    return new Promise((resolve, reject) => {\n      this._clientConf.leave({\n        success: resolve,\n        error: reject\n      })\n    })\n  }\n\n  _destroy() {\n    return new Promise((resolve, reject) => {\n      this._clientConf.destroySession({\n        success: resolve,\n        error: reject\n      })\n    })\n  }\n\n  getUserMedia(mediaParams, updateCurrentStream) {\n    const elementId = mediaParams.elementId\n    delete mediaParams.elementId\n    const attachStreamOptions = mediaParams.options\n    delete mediaParams.options\n\n    let prevAudioMuteState, prevVideoMuteState;\n\n    if (updateCurrentStream) {\n      prevAudioMuteState = this.isAudioMuted()\n      prevVideoMuteState = this.isVideoMuted()\n      this.localStream.getTracks().forEach(track => track.stop())\n    }\n    return mediaDevices.getUserMedia(mediaParams).then(stream => {\n      const newStreamTracks = stream.getTracks()\n      if (!updateCurrentStream) {\n        this.localStream = stream\n      } else {\n        this.localStream.getTracks().forEach(track => this.localStream.removeTrack(track))\n      }\n      this.activeAudioDeviceId = this.activeVideoDeviceId = void 0\n      newStreamTracks.forEach(track => {\n        const trackSetting = (!track.getSettings || Utils.getEnv().reactnative) ? null : track.getSettings()\n        if (track.kind === CALL_TYPES.AUDIO) {\n          this.activeAudioDeviceId = trackSetting && trackSetting.deviceId\n          if (updateCurrentStream) {\n            track.enabled = !prevAudioMuteState\n          }\n        } else {\n          this.activeVideoDeviceId = trackSetting && trackSetting.deviceId\n          if (updateCurrentStream) {\n            track.enabled = !prevVideoMuteState\n          }\n        }\n        if (updateCurrentStream) {\n          this.localStream.addTrack(track)\n        }\n      })\n      if (elementId) {\n        this.attachMediaStream(mediaParams.elementId, this.localStream, attachStreamOptions);\n      }\n      return this.localStream\n    })\n  }\n\n  switchMediaTracks(constraints) {\n    if (constraints[CALL_TYPES.VIDEO]) {\n      return this._switchVideo(constraints[CALL_TYPES.VIDEO])\n    } else if (constraints[CALL_TYPES.AUDIO]) {\n      return this._switchAudio(constraints[CALL_TYPES.AUDIO])\n    }\n    return Promise.reject()\n  }\n\n  _switchVideo(mediaDeviceId) {\n    return this._switchMediaTracks({\n      audio: true,\n      video: { deviceId: mediaDeviceId }\n    })\n  }\n\n  _switchAudio(mediaDeviceId) {\n    return this._switchMediaTracks({\n      audio: { deviceId: mediaDeviceId },\n      video: true\n    })\n  }\n\n  _switchMediaTracks(mediaParams) {\n    return this.getUserMedia(mediaParams, true).then(newLocalStream => {\n      const newStreamTracks = newLocalStream.getTracks()\n      const pcSenders = this.currentPublisherPC.getSenders()\n      newStreamTracks.forEach(track => {\n        const sender = pcSenders.find(sender => track.kind === sender.track.kind)\n        sender.replaceTrack(track)\n      })\n      return this.localStream\n    })\n  }\n\n  muteVideo() {\n    if (!this.isVideoMuted()) {\n      this._clientConf.toggleVideoMute()\n    }\n  }\n\n  unmuteVideo() {\n    if (this.isVideoMuted()) {\n      this._clientConf.toggleVideoMute()\n    }\n  }\n\n  muteAudio() {\n    if (!this.isAudioMuted()) {\n      this._clientConf.toggleAudioMute()\n    }\n  }\n\n  unmuteAudio() {\n    if (this.isAudioMuted()) {\n      this._clientConf.toggleAudioMute()\n    }\n  }\n\n  isVideoMuted() {\n    return this._clientConf.isVideoMuted()\n  }\n\n  isAudioMuted() {\n    return this._clientConf.isAudioMuted()\n  }\n\n  attachMediaStream(id, stream, options) {\n    const elem = document.getElementById(id);\n\n    if (elem) {\n      if (typeof elem.srcObject === 'object') {\n        elem.srcObject = stream;\n      } else {\n        elem.src = window.URL.createObjectURL(stream);\n      }\n\n      if (options && options.muted) {\n        elem.muted = true;\n      }\n\n      if (options && options.mirror) {\n        elem.style.webkitTransform = 'scaleX(-1)';\n        elem.style.transform = 'scaleX(-1)';\n      }\n\n      elem.onloadedmetadata = function (e) {\n        elem.play();\n      };\n    } else {\n      throw new Error('Unable to attach media stream, element ' + id + ' is undefined');\n    }\n  }\n}\n\nmodule.exports = ConferenceSession\n","var Janus = require('./janus.umd');\nvar Utils = require('../cubeInternalUtils');\nvar coreConfig = require('../cubeConfig');\nvar EventEmitter = require('fbemitter').EventEmitter;\nvar mediaDevices = require('../cubeDependencies').mediaDevices;\n\nvar EVENT_PARTICIPANT_JOINED = \"participantjoined\";\nvar EVENT_PARTICIPANT_LEFT = \"participantleft\";\nvar EVENT_LOCAL_STREAM = \"localstream\";\nvar EVENT_REMOTE_STREAM = \"remotestream\";\n\n\n/**\n * @class\n * @param {Object} configParams - a set of configuration parameters. The\n *  following parameters are applied:<br>\n * @param {String} configParams.server - (<b>required</b>) the address of the\n *  gateway as a specific address (e.g., http://yourserver:8088 to use\n *  the plain HTTP API or ws://yourserver:8188 for WebSockets).\n * @param {Boolean} configParams.debug - (<i>optional</i>) whether debug should\n *  be enabled on the JavaScript console (true/false). Default is true.\n * @throws \"'server' parameter is mandatory\" error if 'server' parameter is null\n *  or undefined.\n * @throws \"missing adapter.js\" error if the 'adapter.js' is not connected.\n */\nfunction VideoConferencingClient(configParams) {\n  if (!Utils.getEnv().reactnative && !adapter) {\n    throw \"Error: in order to use this library please connect adapter.js. More info https://github.com/webrtc/adapter\";\n  }\n\n  this.token = configParams.token\n  delete configParams.token\n\n  this.configs = configParams;\n  if (!this.configs.server) {\n    throw \"'server' parameter is mandatory.\";\n  } else {\n    if (this.configs.server.includes(\"http\")) {\n      this.configs.server = this.configs.server + \"/janus\";\n    }\n  }\n  if (!this.configs.debug) {\n    this.configs.debug = \"all\";\n  }\n\n  this.engine = null;\n  this.videoRoomPlugin = null;\n  this.isOnlyAudio = false;\n  //\n  this.currentDialogId = null;\n  this.remoteFeeds = [];\n  this.remoteJseps = [];\n  this.remoteFeedsAttachingInProgress = [];\n  //\n  this.currentMidiaDeviceId = null;\n  //\n  this.bitrateTimers = [];\n  //\n  this.emitter = new EventEmitter();\n}\n\n/**\n * Attach media stream to HTML 'video' element\n *\n * @static\n * @param {Object} element - HTML 'video' element\n * @param {Object} stream - WebRTC media stream\n */\nVideoConferencingClient.attachMediaStream = function (element, stream) {\n  Janus.attachMediaStream(element, stream);\n};\n\n/**\n *  Get plugged devices\n *\n * @static\n * @param {function} callback - a callback to be notified about result\n *  (with single argument - array of all devices).\n */\nVideoConferencingClient.listDevices = function (callback) {\n  mediaDevices.enumerateDevices().then(function (devices) {\n    console.debug(devices);\n    callback(devices);\n  }).catch(function (err) {\n    console.log('[VideoConferencingClient.listDevices][error]', err);\n    callback([]);\n  });;\n};\n\n/**\n *  Get plugged video input devices only\n *\n * @static\n * @param {function} callback - a callback to be notified about result\n *  (with single argument - array of video input devices).\n */\nVideoConferencingClient.listVideoinputDevices = function (callback) {\n  VideoConferencingClient.listDevices(function (devices) {\n    var videoSelect = [];\n    // code sample\n    // https://github.com/webrtc/samples/blob/gh-pages/src/content/devices/input-output/js/main.js#L27\n    for (var i = 0; i !== devices.length; ++i) {\n      var deviceInfo = devices[i];\n      if (deviceInfo.kind === 'videoinput') {\n        var videoinputDescription = deviceInfo.label || 'camera ' + (videoSelect.length + 1);\n        var videoinputId = deviceInfo.deviceId;\n        videoSelect.push({ \"label\": videoinputDescription, \"deviceId\": videoinputId });\n      }\n    }\n    callback(videoSelect);\n  });\n};\n\nVideoConferencingClient.prototype = {\n\n  /**\n   * Create video session\n   *\n   * @param {Object} callbacks - a set of callbacks to be notified about result,\n   *  namely:<br>\n   * @param {function} callbacks.success - the session was successfully created\n   *  and is ready to be used.\n   * @param {function} callbacks.error - the session was NOT successfully\n   *  created. This callback passes single argument - text description of error.\n   * @param {function} callbacks.destroyed - the session was destroyed and\n   *  can't be used any more.\n   */\n  createSession: function (callbacks) {\n    var self = this;\n\n    Janus.init({\n      debug: this.configs.debug, callback: function () {\n\n        if (!Janus.isWebrtcSupported()) {\n          if (typeof callbacks.error === 'function') {\n            callbacks.error(\"Your browser does not support WebRTC, so you can't use this functionality.\");\n          }\n          return;\n        }\n\n        self.engine = new Janus({\n          server: self.configs.server,\n          iceServers: coreConfig.videochat.iceServers,\n          token: self.token,\n\n          success: function () {\n            if (typeof callbacks.success === 'function') {\n              Utils.safeCallbackCall(callbacks.success);\n            }\n          },\n          error: function (error) {\n            if (typeof callbacks.error === 'function') {\n              Utils.safeCallbackCall(callbacks.error, error);\n            }\n          },\n          destroyed: function () {\n            if (typeof callbacks.destroyed === 'function') {\n              Utils.safeCallbackCall(callbacks.destroyed);\n            }\n          },\n          timeoutSessionCallback: function () {\n            if (typeof callbacks.timeoutSessionCallback === 'function') {\n              Utils.safeCallbackCall(callbacks.timeoutSessionCallback);\n            }\n          }\n        });\n\n      }\n    });\n  },\n\n  /**\n   * Returns the unique session identifier\n   *\n   * @returns {String} unique session identifier or null.\n   */\n  getSessionId: function () {\n    if (this.engine) {\n      return this.engine.getSessionId();\n    }\n    return null;\n  },\n\n  /**\n   * Destroy video session\n   *\n   * @param {Object} callbacks - a set of callbacks to be notified about\n   *  result, namely:<br>\n   * @param {function} callbacks.success - the session was successfully\n   *  destroyed and no longer available.\n   * @param {function} callbacks.error - the session was NOT successfully\n   *  destroyed. This callback passes single argument - text description\n   *  of error.\n   */\n  destroySession: function (callbacks) {\n    var self = this;\n    this.engine.destroy({});\n\n    if (typeof callbacks.success === 'function') {\n      Utils.safeCallbackCall(callbacks.success);\n    }\n  },\n\n  /**\n   * Сreate a video conferencing plugin handle.\n   *\n   * @param  {Boolean} isRemote  To pass 'false' when you attach plugin to\n   *  current user and pass 'true' when attach to remote user.\n   * @param  {Number}  userId  To pass 'null' when you attach plugin to\n   *  current user and pass remote user id when attach to remote user.\n   * @param {Object} callbacks - a set of callbacks to be notified about\n   *  result, namely:<br>\n   * @param {function} callbacks.success - the handle was successfully\n   *  created and is ready to be used.\n   * @param {function} callbacks.error - the handle was NOT successfully\n   *  created or some error has occured. The format of error is the following:\n   *  {\"error_code\": \"some integer code\", \"error\": \"some text description\"}.\n   *  Possible values of 'error_code': <br>\n   * <ul>\n   * <li>428: No such feed - can happen when a user joins room and quickly\n   * leaves it so other user tries to subscribe to none existend feed.\n   * Usually, this error can be ignored.</li>\n   * <li>433: Unauthorized - do not have proper rights to join this room.</li>\n   * <li>436: User ID already exists in this room.</li>\n   * <li>400: Some not usual error occured, for example - no connection to\n   *  server. </li>\n   * </ul>\n   *\n   * @param {function} callbacks.consentDialog - this callback is triggered\n   *  just before <b>getUserMedia</b> is called (parameter=<b>true</b>) and\n   *  after it is completed (parameter=<b>false</b>); this means it can be\n   *  used to modify the UI accordingly, e.g., to prompt the user about the\n   *  need to accept the device access consent requests.\n   * @param {function} callbacks.mediaState - this callback is triggered\n   *  when server starts or stops receiving your media: for instance,\n   *  a <b>mediaState</b> with type=audio and on=true means server started\n   *  receiving your audio stream (or started getting them again after\n   *  a pause of more than a second); a mediaState with type=video\n   *  and on=false means server hasn't received any video from you in the\n   *  last second, after a start was detected before; useful to figure out\n   *  when server actually started handling your media, or to detect problems\n   *  on the media path (e.g., media never started, or stopped at some time).\n   * @param {function} callbacks.webrtcState - this callback is triggered\n   *  with a <b>true</b> value when the PeerConnection associated to a handle\n   *  becomes active (so ICE, DTLS and everything else succeeded) from\n   *  the library perspective, while <b>false</b> is triggered when\n   *  the PeerConnection goes down instead; useful to figure out when WebRTC\n   *  is actually up and running between you and server (e.g., to notify\n   *  a user they're actually now active in a conference).\n   * @param {function} callbacks.slowLink - this callback is triggered when\n   *  server reports trouble either sending or receiving media on the\n   *  specified PeerConnection, typically as a consequence of too many NACKs\n   *  received from/sent to the user in the last second: for instance,\n   *  a slowLink with uplink=true means you notified several missing packets\n   *  from server, while uplink=false means server is not receiving all your\n   *  packets; useful to figure out when there are problems on the media\n   *  path (e.g., excessive loss), in order to possibly react accordingly\n   *  (e.g., decrease the bitrate if most of our packets are getting lost).\n   * @param {function} callbacks.oncleanup - the WebRTC PeerConnection with\n   *  the plugin was closed.\n   */\n  attachVideoConferencingPlugin: function (isRemote, userId, callbacks) {\n    var self = this;\n    var remoteFeed = null;\n\n    var localStream = callbacks.localStream\n    delete callbacks.localStream\n\n    var displayName = callbacks.displayName\n    delete callbacks.displayName\n\n    this.engine.attach({\n      plugin: \"janus.plugin.videoroom\",\n      success: function (pluginHandle) {\n        if (isRemote) {\n          remoteFeed = pluginHandle;\n          remoteFeed.userId = userId;\n          self.remoteFeedsAttachingInProgress[userId] = remoteFeed;\n\n          // join remote's feed (listen)\n          var listen = {\n            \"request\": \"join\", \"room\": self.currentDialogId,\n            \"ptype\": \"listener\", \"feed\": userId, \"display\": displayName\n          };\n\n          // If the publisher is VP8 and this is Safari, let's avoid video\n          // if (!Utils.getEnv().reactnative && adapter.browserDetails.browser === \"safari\") {\n          //   listen[\"offer_video\"] = true;\n          // }\n\n          remoteFeed.send({ \"message\": listen });\n        } else {\n          self.videoRoomPlugin = pluginHandle;\n        }\n\n        if (typeof callbacks.success === 'function') {\n          Utils.safeCallbackCall(callbacks.success);\n        }\n      },\n      error: function (error) {\n        if (typeof callbacks.error === 'function') {\n          Utils.safeCallbackCall(callbacks.error, error);\n        }\n      },\n      consentDialog: function (on) {\n        if (typeof callbacks.consentDialog === 'function') {\n          Utils.safeCallbackCall(callbacks.consentDialog, on);\n        }\n      },\n      mediaState: function (medium, on) {\n        if (typeof callbacks.mediaState === 'function') {\n          Utils.safeCallbackCall(callbacks.mediaState, medium, on);\n        }\n      },\n      webrtcState: function (on) {\n        if (typeof callbacks.webrtcState === 'function') {\n          Utils.safeCallbackCall(callbacks.webrtcState, on);\n        }\n      },\n      slowLink: function (uplink, nacks) {\n        if (typeof callbacks.slowLink === 'function') {\n          Utils.safeCallbackCall(callbacks.slowLink, uplink, nacks);\n        }\n      },\n      iceState: function (iceConnectionState) {\n        if (typeof callbacks.iceState === 'function') {\n          Utils.safeCallbackCall(callbacks.iceState, iceConnectionState);\n        }\n      },\n      onmessage: function (msg, jsep) {\n        var event = msg[\"videoroom\"];\n\n        // remote feed\n        if (isRemote) {\n          if (event) {\n            // Remote feed attached\n            if (event === \"attached\") {\n              var feedId = msg[\"id\"];\n              self.remoteFeeds[feedId] = self.remoteFeedsAttachingInProgress[feedId];\n              self.remoteFeedsAttachingInProgress[feedId] = null;\n            } else if (msg[\"error\"]) {\n              // #define VIDEOROOM_ERROR_NO_SUCH_FEED\t\t428\n              //\n              if (typeof callbacks.error === 'function') {\n                Utils.safeCallbackCall(callbacks.error, msg[\"error\"]);\n              }\n            }\n          }\n\n          if (jsep) {\n            var feedId = msg[\"id\"];\n\n            // ICE restart case\n            if (!feedId) {\n            }\n\n            self.remoteJseps[feedId] = jsep;\n\n            self.createAnswer({\n              remoteFeed: self.remoteFeeds[feedId], \n              jsep,\n              stream: localStream\n            }, {\n              success: function () {\n\n              },\n              error: function (error) {\n                if (typeof callbacks.error === 'function') {\n                  Utils.safeCallbackCall(callbacks.error, error);\n                }\n              }\n            });\n          }\n\n          // local feed\n        } else {\n          if (event) {\n            // We JOINED\n            if (event === \"joined\") {\n              self.createOffer({ useAudio: true, stream: localStream, useVideo: !self.isOnlyAudio }, {\n                success: function () {\n                  // Any new feed to attach to?\n                  if (msg[\"publishers\"]) {\n                    var publishers = msg[\"publishers\"];\n                    for (var f in publishers) {\n                      var userId = publishers[f][\"id\"];\n                      var userDisplayName = publishers[f][\"display\"];\n                      self.emitter.emit(EVENT_PARTICIPANT_JOINED, userId, userDisplayName);\n                    }\n                  }\n                },\n                error: function (error) {\n                  if (typeof callbacks.error === 'function') {\n                    Utils.safeCallbackCall(callbacks.error, error);\n                  }\n                }\n              });\n\n              // We JOINED and now receiving who is online\n            } else if (event === \"event\") {\n              // Any new feed to attach to?\n              if (msg[\"publishers\"]) {\n                var publishers = msg[\"publishers\"];\n\n                for (var f in publishers) {\n                  var userId = publishers[f][\"id\"];\n                  var userDisplayName = publishers[f][\"display\"];\n\n                  self.emitter.emit(EVENT_PARTICIPANT_JOINED, userId, userDisplayName);\n                }\n\n                // Someone is LEAVING\n              } else if (msg[\"leaving\"]) {\n                // One of the publishers has gone away?\n                var feedId = msg[\"leaving\"];\n                var success = self.detachRemoteFeed(feedId);\n                if (success) {\n                  self.emitter.emit(EVENT_PARTICIPANT_LEFT, feedId, null);\n                }\n\n              } else if (msg[\"unpublished\"]) {\n\n                // One of the publishers has gone away?\n                var feedId = msg[\"unpublished\"];\n                if (feedId != 'ok') {\n                  var success = self.detachRemoteFeed(feedId);\n                  if (success) {\n                    self.emitter.emit(EVENT_PARTICIPANT_LEFT, feedId, null);\n                  }\n                }\n\n              } else if (msg[\"error\"]) {\n                // #define VIDEOROOM_ERROR_ID_EXISTS\t\t\t436\n                // #define VIDEOROOM_ERROR_UNAUTHORIZED\t\t433\n                //\n                if (typeof callbacks.error === 'function') {\n                  Utils.safeCallbackCall(callbacks.error, msg[\"error\"]);\n                }\n              }\n            }\n          }\n\n          if (jsep) {\n            self.videoRoomPlugin.handleRemoteJsep({ jsep: jsep });\n\n            // TODO:\n            // handle wrong or unsupported codecs here...\n            // var video = msg[\"video_codec\"];\n            // if(mystream && mystream.getVideoTracks() && mystream.getVideoTracks().length > 0 && !video) {\n            // \t\t\"Our video stream has been rejected, viewers won't see us\";\n            // }\n\n          }\n\n        }\n      },\n      onlocalstream: function (stream) {\n        self.emitter.emit(EVENT_LOCAL_STREAM, stream);\n      },\n      onremotestream: function (stream) {\n        remoteFeed.stream = stream;\n\n        self.emitter.emit(EVENT_REMOTE_STREAM, stream, remoteFeed.userId);\n      },\n      oncleanup: function () {\n        console.info(\"ON CLEANUP\");\n        if (typeof callbacks.oncleanup === 'function') {\n          Utils.safeCallbackCall(callbacks.oncleanup);\n        }\n      },\n      detached: function () {\n\n      }\n    });\n  },\n\n  /**\n   * Returns the unique plugin identifier\n   *\n   * @returns {String} unique plugin identifier or null.\n   */\n  getPluginId: function () {\n    if (this.videoRoomPlugin) {\n      return this.videoRoomPlugin.getId();\n    }\n    return null;\n  },\n\n  /**\n   * Detach a video conferencing plugin handle.\n   *\n   * @param {Object} callbacks - a set of callbacks to be notified about\n   *  result, namely:<br>\n   * @param {function} callbacks.success - the handle was successfully\n   *  destroyed.\n   * @param {function} callbacks.error - the handle was NOT successfully\n   *  destroyed. This callback passes single argument - text description\n   *  of error.\n   */\n  detachVideoConferencingPlugin: function (callbacks) {\n    var self = this;\n\n    var clean = function () {\n      self.videoRoomPlugin = null;\n\n      // detach all remote feeds\n      Object.keys(self.remoteFeeds).forEach(function (userId) {\n        self.detachRemoteFeed(userId);\n      });\n\n      self.remoteFeeds = [];\n      self.remoteJseps = [];\n\n      self.currentMidiaDeviceId = null;\n    };\n\n    this.videoRoomPlugin.detach({\n      success: function () {\n        clean();\n\n        if (typeof callbacks.success === 'function') {\n          Utils.safeCallbackCall(callbacks.success);\n        }\n      },\n      error: function (error) {\n        clean();\n\n        if (typeof callbacks.error === 'function') {\n          Utils.safeCallbackCall(callbacks.error, error);\n        }\n      },\n    });\n  },\n\n  /**\n   * Join video conference room\n   *\n   * @param {String} chatDialogId - a chat dialog ID to join\n   * @param {Number} userId - an id of current user.\n   * @param {Boolean} isOnlyAudio - to join current room as audio-only.\n   * @param {Object} callbacks - a set of callbacks to be notified about\n   *  result, namely:<br>\n   * @param {function} callbacks.success - the chat dialog was successfully\n   *  joined.\n   * @param {function} callbacks.error - the chat dialog was NOT successfully\n   *  joined. This callback passes single argument - text description\n   *  of error.\n   */\n  join: function (chatDialogId, userId, isOnlyAudio, callbacks) {\n    var self = this;\n\n    var displayName = callbacks.displayName\n    delete callbacks.displayName \n\n    if (typeof (isOnlyAudio) !== \"boolean\") {\n      throw \"'isOnlyAudio' parameter can be of type 'boolean' only.\";\n    }\n    self.isOnlyAudio = isOnlyAudio;\n    // if (!Utils.getEnv().reactnative && adapter.browserDetails.browser === \"safari\") {\n    //   self.isOnlyAudio = false;\n    // }\n\n    console.info(\"isOnlyAudio: \" + self.isOnlyAudio);\n\n    var joinEvent = {\n      \"request\": \"join\", \"room\": chatDialogId,\n      \"ptype\": \"publisher\", \"id\": userId, \"display\": displayName\n    }; //\"display\": null\n    this.videoRoomPlugin.send({\n      \"message\": joinEvent,\n      success: function (resp) {\n        self.currentDialogId = chatDialogId;\n        self.currentUserId = userId;\n\n        if (typeof callbacks.success === 'function') {\n          Utils.safeCallbackCall(callbacks.success);\n        }\n      },\n      error: function (error) {\n        if (typeof callbacks.error === 'function') {\n          Utils.safeCallbackCall(callbacks.error, error);\n        }\n      }\n    });\n  },\n\n  /**\n   * Leave video conference room\n   *\n   * @param {Object} callbacks - a set of callbacks to be notified about\n   *  result, namely:<br>\n   * @param {function} callbacks.success - the chat dialog was successfully\n   *  left.\n   * @param {function} callbacks.error - the chat dialog was NOT successfully\n   *  left. This callback passes single argument - text description of error.\n   */\n  leave: function (callbacks) {\n    var self = this;\n\n    console.warn(\"leave\");\n\n    if (!self.engine.isConnected()) {\n      if (typeof callbacks.success === 'function') {\n        Utils.safeCallbackCall(callbacks.success);\n      }\n      return;\n    }\n\n    var leaveEvent = { \"request\": \"leave\", \"room\": this.currentDialogId, \"id\": this.currentUserId };\n    if (this.videoRoomPlugin) {\n      this.videoRoomPlugin.send({ \"message\": leaveEvent });\n    }\n    this.currentDialogId = null;\n    this.currentUserId = null;\n\n    console.warn(\"resp\");\n    if (typeof callbacks.success === 'function') {\n      Utils.safeCallbackCall(callbacks.success);\n    }\n  },\n\n  /**\n   * List online participants\n   *\n   * @param {String} chatDialogId - a chat dialog ID to list online\n   *  participants in.\n   * @param {Object} callbacks - a set of callbacks to be notified about\n   *  result, namely:<br>\n   * @param {function} callbacks.success - when everything is ok and you will\n   *  receive one argument - array of online participants.\n   * @param {function} callbacks.error - when an error occured. This callback\n   *  passes single argument - text description of error.\n   */\n  listOnlineParticipants: function (chatDialogId, callbacks) {\n    var listRequest = { \"request\": \"listparticipants\", \"room\": chatDialogId };\n    //\n    this.videoRoomPlugin.send({\n      \"message\": listRequest,\n      success: function (data) {\n        var participants = [];\n        if (data) {\n          participants = data.participants;\n        }\n        if (typeof callbacks.success === 'function') {\n          Utils.safeCallbackCall(callbacks.success, participants);\n        }\n      },\n      error: function (error) {\n        if (typeof callbacks.error === 'function') {\n          Utils.safeCallbackCall(callbacks.error, error);\n        }\n      }\n    });\n  },\n\n  /**\n   * Toggle audio mute.\n   *\n   * @returns {Boolean} true if audio is muted, otherwise - false.\n   */\n  toggleAudioMute: function () {\n    var muted = this.videoRoomPlugin.isAudioMuted();\n    if (muted) {\n      this.videoRoomPlugin.unmuteAudio();\n    } else {\n      this.videoRoomPlugin.muteAudio();\n    }\n    return this.videoRoomPlugin.isAudioMuted();\n  },\n\n  /**\n   * Is audio muted.\n   *\n   * @returns {Boolean} true if audio is muted, otherwise - false.\n   */\n  isAudioMuted: function () {\n    return this.videoRoomPlugin.isAudioMuted();\n  },\n\n  /**\n   * Toggle remote user audio mute.\n   *\n   * @param {Number} userId - an id of user to mute audio.\n   *\n   * @returns {Boolean} true if audio is muted, otherwise - false.\n   */\n  toggleRemoteAudioMute: function (userId) {\n    var remoteFeed = this.remoteFeeds[userId];\n    if (!remoteFeed) {\n      return false;\n    }\n\n    var audioTracks = remoteFeed.stream.getAudioTracks();\n    if (audioTracks && audioTracks.length > 0) {\n      for (var i = 0; i < audioTracks.length; ++i) {\n        audioTracks[i].enabled = !audioTracks[i].enabled;\n      }\n      return !audioTracks[0].enabled;\n    }\n\n    return false;\n  },\n\n  /**\n   * Is remote audio muted.\n   *\n   * @param {Number} userId - an id of user to check audio mute\n   *  state.\n   *\n   * @returns {Boolean} true if audio is muted, otherwise - false.\n   */\n  isRemoteAudioMuted: function (userId) {\n    var remoteFeed = this.remoteFeeds[userId];\n    if (!remoteFeed) {\n      return false;\n    }\n\n    var audioTracks = remoteFeed.stream.getAudioTracks();\n    if (audioTracks && audioTracks.length > 0) {\n      return !audioTracks[0].enabled;\n    }\n\n    return false;\n  },\n\n  /**\n   * Toggle video mute.\n   *\n   * @returns {Boolean} true if video is muted, otherwise - false.\n   */\n  toggleVideoMute: function () {\n    var muted = this.videoRoomPlugin.isVideoMuted();\n    if (muted) {\n      this.videoRoomPlugin.unmuteVideo();\n    } else {\n      this.videoRoomPlugin.muteVideo();\n    }\n    return this.videoRoomPlugin.isVideoMuted();\n  },\n\n  /**\n   * Is video muted.\n   *\n   * @returns {Boolean} true if video is muted, otherwise - false.\n   */\n  isVideoMuted: function () {\n    return this.videoRoomPlugin.isVideoMuted();\n  },\n\n  /**\n   * Toggle remote user video mute.\n   *\n   * @param {Number} userId - an id of user to mute video.\n   *\n   * @returns {Boolean} true if video is muted, otherwise - false.\n   */\n  toggleRemoteVideoMute: function (userId) {\n    var remoteFeed = this.remoteFeeds[userId];\n    if (!remoteFeed) {\n      return false;\n    }\n\n    var videoTracks = remoteFeed.stream.getVideoTracks();\n    if (videoTracks && videoTracks.length > 0) {\n      for (var i = 0; i < videoTracks.length; ++i) {\n        videoTracks[i].enabled = !videoTracks[i].enabled;\n      }\n      return !videoTracks[0].enabled;\n    }\n\n    return false;\n  },\n\n  /**\n   * Is remote video muted.\n   *\n   * @param {Number} userId - an id of user to check video mute\n   *  state.\n   *\n   * @returns {Boolean} true if video is muted, otherwise - false.\n   */\n  isRemoteVideoMuted: function (userId) {\n    var remoteFeed = this.remoteFeeds[userId];\n    if (!remoteFeed) {\n      return false;\n    }\n\n    var videoTracks = remoteFeed.stream.getVideoTracks();\n    if (videoTracks && videoTracks.length > 0) {\n      return !videoTracks[0].enabled;\n    }\n\n    return false;\n  },\n\n  /**\n   * Switch video input source.\n   *\n   * @param {String} mediaDeviceId - an id of media device (camera) to switch to.\n   *  Can be obtained via 'VideoConferencingClient.listVideoinputDevices'.\n   * @param {Object} callbacks - a set of callbacks to be notified about\n   *  result, namely:<br>\n   * @param {function} callbacks.success - when everything is ok.\n   * @param {function} callbacks.error - when an error occured. This callback\n   *  passes single argument - text description of error.\n   */\n  switchVideoinput: function (mediaDeviceId, callbacks) {\n\n    if (!this.videoRoomPlugin) {\n      if (typeof callbacks.error === 'function') {\n        Utils.safeCallbackCall(callbacks.error, \"No active stream\");\n      }\n      return;\n    }\n\n    if (this.isOnlyAudio) {\n      throw \"Can't switch video input in audio only call.\";\n    }\n\n    this.currentMidiaDeviceId = null;\n\n    var self = this;\n\n    this.createOffer({ video: { deviceId: mediaDeviceId }, replaceVideo: true }, {\n      success: function () {\n        console.info(\"switchVideoinput: success\");\n\n        self.currentMidiaDeviceId = mediaDeviceId;\n\n        if (typeof callbacks.success === 'function') {\n          Utils.safeCallbackCall(callbacks.success);\n        }\n      },\n      error: function (error) {\n        console.info(\"switchVideoinput: error\", error);\n\n        if (typeof callbacks.error === 'function') {\n          Utils.safeCallbackCall(callbacks.error, error);\n        }\n      }\n    });\n  },\n\n  switchAudioinput: function (mediaDeviceId, callbacks) {\n\n    if (!this.videoRoomPlugin) {\n      if (typeof callbacks.error === 'function') {\n        Utils.safeCallbackCall(callbacks.error, \"No active stream\");\n      }\n      return;\n    }\n\n    this.createOffer({ audio: { deviceId: mediaDeviceId }, replaceAudio: true }, {\n      success: function () {\n        console.info(\"switchVideoinput: success\");\n\n        if (typeof callbacks.success === 'function') {\n          Utils.safeCallbackCall(callbacks.success);\n        }\n      },\n      error: function (error) {\n        console.info(\"switchVideoinput: error\", error);\n\n        if (typeof callbacks.error === 'function') {\n          Utils.safeCallbackCall(callbacks.error, error);\n        }\n      }\n    });\n  },\n\n  /**\n   * Initiate ICE restart for remote peer.\n   * These are typically needed whenever something in your network changes\n   * (e.g., you move from WiFi to mobile or a different WiFi) but want to\n   * keep the conversation going: in this case, an ICE restart needs to take\n   * place, as the peers need to exchange the new candidates they can be\n   * reached on.\n   *\n   * @param {Number} userIdOrCallbacks - an id of user to initiate ICE restart with or callbacks if it's a local peer.\n   * @param {function} callbacks.success - when everything is ok.\n   * @param {function} callbacks.error - when an error occured. This callback\n   *  passes single argument - text description of error.\n   */\n  iceRestart: function (userIdOrCallbacks, callbacks) {\n    // remote ICE restart\n    if (callbacks) {\n      console.info(\"Performing remote ICE restart for user: \", userIdOrCallbacks);\n\n      var remoteFeed = this.remoteFeeds[userIdOrCallbacks];\n\n      if (!remoteFeed) {\n        if (typeof callbacks.error === 'function') {\n          Utils.safeCallbackCall(callbacks.error, \"No such user feed\");\n        }\n        return;\n      }\n\n      var req = { \"request\": \"configure\", \"restart\": true };\n      remoteFeed.send({ \"message\": req });\n\n      if (typeof callbacks.success === 'function') {\n        Utils.safeCallbackCall(callbacks.success);\n      }\n\n      // local ICE restart\n    } else {\n      console.info(\"Performing local ICE restart\");\n\n      this.createOffer({ iceRestart: true }, {\n        success: function () {\n          if (typeof userIdOrCallbacks.success === 'function') {\n            Utils.safeCallbackCall(userIdOrCallbacks.success);\n          }\n        },\n        error: function (error) {\n          if (typeof userIdOrCallbacks.error === 'function') {\n            Utils.safeCallbackCall(userIdOrCallbacks.error, error);\n          }\n        }\n      });\n    }\n  },\n\n  /**\n   * @private\n   */\n  createOffer: function (inputParams, callbacks) {\n    console.log(\"createOffer, inputParams: \", inputParams);\n    var self = this;\n\n    var useAudio = inputParams.useAudio;\n    var useVideo = inputParams.useVideo;\n\n    var stream = inputParams.stream;\n    delete inputParams.stream;\n\n    var replaceVideo = inputParams.replaceVideo;\n    var iceRestart = inputParams.iceRestart;\n\n    var videoQuality = self.configs.video ? self.configs.video.quality : null;\n    var videoFrameRate = self.configs.video ? self.configs.video.frameRate : null;\n\n    var params;\n    if (stream) {\n      params = { stream: stream };\n    } else if (replaceVideo) {\n      params = { media: inputParams };\n      if (videoQuality) {\n        params[\"media\"][\"video\"] = videoQuality;\n      }\n      if (videoFrameRate) {\n        params[\"media\"][\"videoFrameRate\"] = { min: videoFrameRate, max: videoFrameRate }\n      }\n    } else if (iceRestart) {\n      params = inputParams;\n    } else {\n      params = {\n        media: {\n          audioRecv: false,\n          videoRecv: false,\n          audioSend: useAudio,\n          videoSend: useVideo\n        }\n      }; // Publishers are sendonly\n      if (videoQuality) {\n        params[\"media\"][\"video\"] = videoQuality;\n      }\n      if (videoFrameRate) {\n        params[\"media\"][\"videoFrameRate\"] = { min: videoFrameRate, ideal: videoFrameRate }\n      }\n    }\n\n    console.info(\"createOffer params: \", params);\n\n    params.success = function (jsep) {\n      var publish = { \"request\": \"configure\" };\n      if (replaceVideo || iceRestart) {\n        // publish[\"update\"] = true;\n      } else {\n        publish[\"audio\"] = useAudio;\n        publish[\"video\"] = useVideo;\n      }\n      console.info(\"createOffer publish: \", publish);\n\n      self.videoRoomPlugin.send({ \"message\": publish, \"jsep\": jsep });\n\n      if (typeof callbacks.success === 'function') {\n        callbacks.success();\n      }\n    };\n\n    params.error = function (error) {\n      console.log(\"[createOffer] Error in createOffer: \", error);\n      if (useAudio) {\n        self.createOffer({ useAudio: false, useVideo: false }, callbacks);\n      } else {\n        if (typeof callbacks.error === 'function') {\n          callbacks.error(error);\n        }\n      }\n    };\n\n    this.videoRoomPlugin.createOffer(params);\n  },\n\n  /**\n   * @private\n   */\n  createAnswer: function ({remoteFeed, jsep, stream}, callbacks) {\n    var self = this;\n\n    remoteFeed.createAnswer({\n      jsep: jsep,\n      stream,\n      media: { audioSend: false, videoSend: false },\t// We want recvonly audio/video\n      success: function (jsep) {\n        var body = { \"request\": \"start\", \"room\": self.currentDialogId };\n        remoteFeed.send({ \"message\": body, \"jsep\": jsep });\n\n        if (typeof callbacks.success === 'function') {\n          Utils.safeCallbackCall(callbacks.success);\n        }\n      },\n      error: function (error) {\n        console.log(\"[createAnswer] error: \", error);\n        if (typeof callbacks.error === 'function') {\n          Utils.safeCallbackCall(callbacks.error, error);\n        }\n      }\n    });\n  },\n\n  /**\n   * @private\n   */\n  detachRemoteFeed: function (userId) {\n    var remoteFeed = this.remoteFeeds[userId];\n    if (remoteFeed) {\n      remoteFeed.detach();\n      this.remoteFeeds[userId] = null;\n      this.remoteJseps[userId] = null;\n      return true;\n    }\n    return false;\n  },\n\n  /**\n   * Start show a verbose description of the user's stream bitrate.\n   * Refresh it every 1 second.\n   *\n   * @param {Number} userId - an id of user to gets stream bitrate.\n   * @param {Object} element - DOM element to display bitrate on.\n   */\n  showBitrate: function (userId, element) {\n    var remoteFeed = this.remoteFeeds[userId];\n\n    if (!Utils.getEnv().reactnative && (adapter.browserDetails.browser === \"chrome\" || adapter.browserDetails.browser === \"firefox\")) {\n      this.bitrateTimers[userId] = setInterval(function () {\n        var bitrate = remoteFeed.getBitrate();\n        element.text(bitrate);\n      }, 1000);\n    }\n  },\n\n  /**\n   * Stop show a verbose description of the user's stream bitrate.\n   *\n   * @param {Number} userId - an id of user to stop show stream\n   * bitrate.\n   * @param {Object} element - DOM element to stop display bitrate on.\n   */\n  hideBitrate: function (userId, element) {\n    if (this.bitrateTimers[userId]) {\n      clearInterval(this.bitrateTimers[userId]);\n    }\n    this.bitrateTimers[userId] = null;\n    element.text = null;\n  },\n\n  /**\n   * Adds a listener to be invoked when events of the specified type are\n   * emitted. The data arguments emitted will be passed to the listener\n   * function. <br>\n   * Possible events:\n   * <ul>\n   * <li>'participantjoined': (userId, userDisplayName)</li>\n   * <li>'participantleft': (userId, userDisplayName)</li>\n   * <li>'localstream': (stream)</li>\n   * <li>'remotestream': (stream, userId)</li>\n   * </ul>\n   *\n   * @param {String} eventType - Name of the event to listen to\n   * @param {function} listener - Function to invoke when the specified\n   *  event is emitted\n   */\n  on: function (eventType, listener) {\n    var token = this.emitter.addListener(eventType, listener);\n  },\n\n  /**\n   * Removes all of the registered listeners.\n   *\n   * @param {?String} eventType - Optional name of the event whose registered\n   *   listeners to remove.\n   */\n  removeAllListeners: function (eventType) {\n    if (eventType) {\n      this.emitter.removeAllListeners(eventType);\n    } else {\n      this.emitter.removeAllListeners();\n    }\n  }\n};\n\nmodule.exports = { Client: VideoConferencingClient };\n","(function (global, factory) {\n\ttypeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\n\ttypeof define === 'function' && define.amd ? define(factory) :\n\t(global.Janus = factory());\n}(this, (function () {\n\n/* eslint-disable */\n/*\n * Module shim for rollup.js to work with.\n * Simply re-export Janus from janus.js, the real 'magic' is in the rollup config.\n *\n * Since this counts as 'autogenerated' code, ESLint is instructed to ignore the contents of this file when linting your project.\n */\n\n/*\n\tThe MIT License (MIT)\n\n\tCopyright (c) 2016 Meetecho\n\n\tPermission is hereby granted, free of charge, to any person obtaining\n\ta copy of this software and associated documentation files (the \"Software\"),\n\tto deal in the Software without restriction, including without limitation\n\tthe rights to use, copy, modify, merge, publish, distribute, sublicense,\n\tand/or sell copies of the Software, and to permit persons to whom the\n\tSoftware is furnished to do so, subject to the following conditions:\n\n\tThe above copyright notice and this permission notice shall be included\n\tin all copies or substantial portions of the Software.\n\n\tTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n\tOR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n\tFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL\n\tTHE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR\n\tOTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,\n\tARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR\n\tOTHER DEALINGS IN THE SOFTWARE.\n */\n\n// List of sessions\nJanus.sessions = {};\n\n// Screensharing Chrome Extension ID\nJanus.extensionId = \"hapfgfdkleiggjjpfpenajgdnfckjpaj\";\nJanus.isExtensionEnabled = function() {\n\tif(window.navigator.userAgent.match('Chrome')) {\n\t\tvar chromever = parseInt(window.navigator.userAgent.match(/Chrome\\/(.*) /)[1], 10);\n\t\tvar maxver = 33;\n\t\tif(window.navigator.userAgent.match('Linux'))\n\t\t\tmaxver = 35;\t// \"known\" crash in chrome 34 and 35 on linux\n\t\tif(chromever >= 26 && chromever <= maxver) {\n\t\t\t// Older versions of Chrome don't support this extension-based approach, so lie\n\t\t\treturn true;\n\t\t}\n\t\treturn Janus.checkJanusExtension();\n\t} else {\n\t\t// Firefox of others, no need for the extension (but this doesn't mean it will work)\n\t\treturn true;\n\t}\n};\n\nJanus.useDefaultDependencies = function (deps) {\n\tvar f = (deps && deps.fetch) || fetch;\n\tvar p = (deps && deps.Promise) || Promise;\n\tvar socketCls = (deps && deps.WebSocket) || WebSocket;\n\treturn {\n\t\tnewWebSocket: function(server, proto) { return new socketCls(server, proto); },\n\t\tisArray: function(arr) { return Array.isArray(arr); },\n\t\tcheckJanusExtension: function() { return document.querySelector('#janus-extension-installed') !== null; },\n\t\twebRTCAdapter: (deps && deps.adapter) || adapter,\n\t\thttpAPICall: function(url, options) {\n\t\t\tvar fetchOptions = {method: options.verb, cache: 'no-cache'};\n\t\t\tif(options.withCredentials !== undefined) {\n\t\t\t\tfetchOptions.credentials = options.withCredentials === true ? 'include' : (options.withCredentials ? options.withCredentials : 'omit');\n\t\t\t}\n\t\t\tif(options.body !== undefined) {\n\t\t\t\tfetchOptions.body = JSON.stringify(options.body);\n\t\t\t}\n\n\t\t\tvar fetching = f(url, fetchOptions).catch(function(error) {\n\t\t\t\treturn p.reject({message: 'Probably a network error, is the gateway down?', error: error});\n\t\t\t});\n\n\t\t\t/*\n\t\t\t * fetch() does not natively support timeouts.\n\t\t\t * Work around this by starting a timeout manually, and racing it agains the fetch() to see which thing resolves first.\n\t\t\t */\n\n\t\t\tif(options.timeout !== undefined) {\n\t\t\t\tvar timeout = new p(function(resolve, reject) {\n\t\t\t\t\tvar timerId = setTimeout(function() {\n\t\t\t\t\t\tclearTimeout(timerId);\n\t\t\t\t\t\treturn reject({message: 'Request timed out', timeout: options.timeout});\n\t\t\t\t\t}, options.timeout);\n\t\t\t\t});\n\t\t\t\tfetching = p.race([fetching,timeout]);\n\t\t\t}\n\n\t\t\tfetching.then(function(response) {\n\t\t\t\tif(response.ok) {\n\t\t\t\t\tif(typeof(options.success) === typeof(Janus.noop)) {\n\t\t\t\t\t\treturn response.json().then(function(parsed) {\n\t\t\t\t\t\t\toptions.success(parsed);\n\t\t\t\t\t\t}).catch(function(error) {\n\t\t\t\t\t\t\treturn p.reject({message: 'Failed to parse response body', error: error, response: response});\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\treturn p.reject({message: 'API call failed', response: response});\n\t\t\t\t}\n\t\t\t}).catch(function(error) {\n\t\t\t\tif(typeof(options.error) === typeof(Janus.noop)) {\n\t\t\t\t\toptions.error(error.message || '<< internal error >>', error);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\treturn fetching;\n\t\t}\n\t}\n};\n\nJanus.useOldDependencies = function (deps) {\n\tvar jq = (deps && deps.jQuery) || jQuery;\n\tvar socketCls = (deps && deps.WebSocket) || WebSocket;\n\treturn {\n\t\tnewWebSocket: function(server, proto) { return new socketCls(server, proto); },\n\t\tisArray: function(arr) { return jq.isArray(arr); },\n\t\tcheckJanusExtension: function() { return jq('#janus-extension-installed').length > 0; },\n\t\twebRTCAdapter: (deps && deps.adapter) || adapter,\n\t\thttpAPICall: function(url, options) {\n\t\t\tvar payload = options.body !== undefined ? {\n\t\t\t\tcontentType: 'application/json',\n\t\t\t\tdata: JSON.stringify(options.body)\n\t\t\t} : {};\n\t\t\tvar credentials = options.withCredentials !== undefined ? {xhrFields: {withCredentials: options.withCredentials}} : {};\n\n\t\t\treturn jq.ajax(jq.extend(payload, credentials, {\n\t\t\t\turl: url,\n\t\t\t\ttype: options.verb,\n\t\t\t\tcache: false,\n\t\t\t\tdataType: 'json',\n\t\t\t\tasync: options.async,\n\t\t\t\ttimeout: options.timeout,\n\t\t\t\tsuccess: function(result) {\n\t\t\t\t\tif(typeof(options.success) === typeof(Janus.noop)) {\n\t\t\t\t\t\toptions.success(result);\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\terror: function(xhr, status, err) {\n\t\t\t\t\tif(typeof(options.error) === typeof(Janus.noop)) {\n\t\t\t\t\t\toptions.error(status, err);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}));\n\t\t},\n\t};\n};\n\nJanus.noop = function() {};\n\n// Initialization\nJanus.init = function(options) {\n\toptions = options || {};\n\toptions.callback = (typeof options.callback == \"function\") ? options.callback : Janus.noop;\n\tif(Janus.initDone === true) {\n\t\t// Already initialized\n\t\toptions.callback();\n\t} else {\n\t\tif(typeof console == \"undefined\" || typeof console.log == \"undefined\")\n\t\t\tconsole = { log: function() {} };\n\t\t// Console logging (all debugging disabled by default)\n\t\tJanus.trace = Janus.noop;\n\t\tJanus.debug = Janus.noop;\n\t\tJanus.vdebug = Janus.noop;\n\t\tJanus.log = Janus.noop;\n\t\tJanus.warn = Janus.noop;\n\t\tJanus.error = Janus.noop;\n\t\tif(options.debug === true || options.debug === \"all\") {\n\t\t\t// Enable all debugging levels\n\t\t\tJanus.trace = console.trace.bind(console);\n\t\t\tJanus.debug = console.debug.bind(console);\n\t\t\tJanus.vdebug = console.debug.bind(console);\n\t\t\tJanus.log = console.log.bind(console);\n\t\t\tJanus.warn = console.warn.bind(console);\n\t\t\tJanus.error = console.error.bind(console);\n\t\t} else if(Array.isArray(options.debug)) {\n\t\t\tfor(var i in options.debug) {\n\t\t\t\tvar d = options.debug[i];\n\t\t\t\tswitch(d) {\n\t\t\t\t\tcase \"trace\":\n\t\t\t\t\t\tJanus.trace = console.trace.bind(console);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"debug\":\n\t\t\t\t\t\tJanus.debug = console.debug.bind(console);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"vdebug\":\n\t\t\t\t\t\tJanus.vdebug = console.debug.bind(console);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"log\":\n\t\t\t\t\t\tJanus.log = console.log.bind(console);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"warn\":\n\t\t\t\t\t\tJanus.warn = console.warn.bind(console);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase \"error\":\n\t\t\t\t\t\tJanus.error = console.error.bind(console);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tconsole.error(\"Unknown debugging option '\" + d + \"' (supported: 'trace', 'debug', 'vdebug', 'log', warn', 'error')\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tJanus.log(\"Initializing library\");\n\n\t\tvar usedDependencies = options.dependencies || Janus.useDefaultDependencies();\n\t\tJanus.isArray = usedDependencies.isArray;\n\t\tJanus.webRTCAdapter = usedDependencies.webRTCAdapter;\n\t\tJanus.httpAPICall = usedDependencies.httpAPICall;\n\t\tJanus.checkJanusExtension = usedDependencies.checkJanusExtension;\n\t\tJanus.newWebSocket = usedDependencies.newWebSocket;\n\n\t\t// Helper method to enumerate devices\n\t\tJanus.listDevices = function(callback, config) {\n\t\t\tcallback = (typeof callback == \"function\") ? callback : Janus.noop;\n\t\t\tif (config == null) config = { audio: true, video: true };\n\t\t\tif(navigator.mediaDevices) {\n\t\t\t\tnavigator.mediaDevices.getUserMedia(config)\n\t\t\t\t.then(function(stream) {\n\t\t\t\t\tnavigator.mediaDevices.enumerateDevices().then(function(devices) {\n\t\t\t\t\t\tJanus.debug(devices);\n\t\t\t\t\t\tcallback(devices);\n\t\t\t\t\t\t// Get rid of the now useless stream\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tvar tracks = stream.getTracks();\n\t\t\t\t\t\t\tfor(var i in tracks) {\n\t\t\t\t\t\t\t\tvar mst = tracks[i];\n\t\t\t\t\t\t\t\tif(mst !== null && mst !== undefined)\n\t\t\t\t\t\t\t\t\tmst.stop();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} catch(e) {}\n\t\t\t\t\t});\n\t\t\t\t})\n\t\t\t\t.catch(function(err) {\n\t\t\t\t\tJanus.error(err);\n\t\t\t\t\tcallback([]);\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tJanus.warn(\"navigator.mediaDevices unavailable\");\n\t\t\t\tcallback([]);\n\t\t\t}\n\t\t};\n\t\t// Helper methods to attach/reattach a stream to a video element (previously part of adapter.js)\n\t\tJanus.attachMediaStream = function(element, stream) {\n\t\t\tif(Janus.webRTCAdapter.browserDetails.browser === 'chrome') {\n\t\t\t\tvar chromever = Janus.webRTCAdapter.browserDetails.version;\n\t\t\t\tif(chromever >= 43) {\n\t\t\t\t\telement.srcObject = stream;\n\t\t\t\t} else if(typeof element.src !== 'undefined') {\n\t\t\t\t\telement.src = URL.createObjectURL(stream);\n\t\t\t\t} else {\n\t\t\t\t\tJanus.error(\"Error attaching stream to element\");\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\telement.srcObject = stream;\n\t\t\t}\n\t\t};\n\t\tJanus.reattachMediaStream = function(to, from) {\n\t\t\tif(Janus.webRTCAdapter.browserDetails.browser === 'chrome') {\n\t\t\t\tvar chromever = Janus.webRTCAdapter.browserDetails.version;\n\t\t\t\tif(chromever >= 43) {\n\t\t\t\t\tto.srcObject = from.srcObject;\n\t\t\t\t} else if(typeof to.src !== 'undefined') {\n\t\t\t\t\tto.src = from.src;\n\t\t\t\t} else {\n\t\t\t\t\tJanus.error(\"Error reattaching stream to element\");\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tto.srcObject = from.srcObject;\n\t\t\t}\n\t\t};\n\t\t// Detect tab close: make sure we don't loose existing onbeforeunload handlers\n\t\tvar oldOBF = window.onbeforeunload;\n\t\twindow.onbeforeunload = function() {\n\t\t\tJanus.log(\"Closing window\");\n\t\t\tfor(var s in Janus.sessions) {\n\t\t\t\tif(Janus.sessions[s] !== null && Janus.sessions[s] !== undefined &&\n\t\t\t\t\t\tJanus.sessions[s].destroyOnUnload) {\n\t\t\t\t\tJanus.log(\"Destroying session \" + s);\n\t\t\t\t\tJanus.sessions[s].destroy({asyncRequest: false});\n\t\t\t\t}\n\t\t\t}\n\t\t\tif(oldOBF && typeof oldOBF == \"function\")\n\t\t\t\toldOBF();\n\t\t};\n\t\tJanus.initDone = true;\n\t\toptions.callback();\n\t}\n};\n\n// Helper method to check whether WebRTC is supported by this browser\nJanus.isWebrtcSupported = function() {\n\treturn window.RTCPeerConnection !== undefined && window.RTCPeerConnection !== null &&\n\t\tnavigator.getUserMedia !== undefined && navigator.getUserMedia !== null;\n};\n\n// Helper method to create random identifiers (e.g., transaction)\nJanus.randomString = function(len) {\n\tvar charSet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';\n\tvar randomString = '';\n\tfor (var i = 0; i < len; i++) {\n\t\tvar randomPoz = Math.floor(Math.random() * charSet.length);\n\t\trandomString += charSet.substring(randomPoz,randomPoz+1);\n\t}\n\treturn randomString;\n};\n\n\nfunction Janus(gatewayCallbacks) {\n\tif(Janus.initDone === undefined) {\n\t\tgatewayCallbacks.error(\"Library not initialized\");\n\t\treturn {};\n\t}\n\tif(!Janus.isWebrtcSupported()) {\n\t\tgatewayCallbacks.error(\"WebRTC not supported by this browser\");\n\t\treturn {};\n\t}\n\tJanus.log(\"Library initialized: \" + Janus.initDone);\n\tgatewayCallbacks = gatewayCallbacks || {};\n\tgatewayCallbacks.success = (typeof gatewayCallbacks.success == \"function\") ? gatewayCallbacks.success : Janus.noop;\n\tgatewayCallbacks.error = (typeof gatewayCallbacks.error == \"function\") ? gatewayCallbacks.error : Janus.noop;\n\tgatewayCallbacks.destroyed = (typeof gatewayCallbacks.destroyed == \"function\") ? gatewayCallbacks.destroyed : Janus.noop;\n\tif(gatewayCallbacks.server === null || gatewayCallbacks.server === undefined) {\n\t\tgatewayCallbacks.error(\"Invalid gateway url\");\n\t\treturn {};\n\t}\n\tvar websockets = false;\n\tvar ws = null;\n\tvar wsHandlers = {};\n\tvar wsKeepaliveTimeoutId = null;\n\n\tvar servers = null, serversIndex = 0;\n\tvar server = gatewayCallbacks.server;\n\tif(Janus.isArray(server)) {\n\t\tJanus.log(\"Multiple servers provided (\" + server.length + \"), will use the first that works\");\n\t\tserver = null;\n\t\tservers = gatewayCallbacks.server;\n\t\tJanus.debug(servers);\n\t} else {\n\t\tif(server.indexOf(\"ws\") === 0) {\n\t\t\twebsockets = true;\n\t\t\tJanus.log(\"Using WebSockets to contact Janus: \" + server);\n\t\t} else {\n\t\t\twebsockets = false;\n\t\t\tJanus.log(\"Using REST API to contact Janus: \" + server);\n\t\t}\n\t}\n\tvar iceServers = gatewayCallbacks.iceServers;\n\tif(iceServers === undefined || iceServers === null)\n\t\ticeServers = [{urls: \"stun:stun.l.google.com:19302\"}];\n\tvar iceTransportPolicy = gatewayCallbacks.iceTransportPolicy;\n\tvar bundlePolicy = gatewayCallbacks.bundlePolicy;\n\t// Whether IPv6 candidates should be gathered\n\tvar ipv6Support = gatewayCallbacks.ipv6;\n\tif(ipv6Support === undefined || ipv6Support === null)\n\t\tipv6Support = false;\n\t// Whether we should enable the withCredentials flag for XHR requests\n\tvar withCredentials = false;\n\tif(gatewayCallbacks.withCredentials !== undefined && gatewayCallbacks.withCredentials !== null)\n\t\twithCredentials = gatewayCallbacks.withCredentials === true;\n\t// Optional max events\n\tvar maxev = null;\n\tif(gatewayCallbacks.max_poll_events !== undefined && gatewayCallbacks.max_poll_events !== null)\n\t\tmaxev = gatewayCallbacks.max_poll_events;\n\tif(maxev < 1)\n\t\tmaxev = 1;\n\t// Token to use (only if the token based authentication mechanism is enabled)\n\tvar token = null;\n\tif(gatewayCallbacks.token !== undefined && gatewayCallbacks.token !== null)\n\t\ttoken = gatewayCallbacks.token;\n\t// API secret to use (only if the shared API secret is enabled)\n\tvar apisecret = null;\n\tif(gatewayCallbacks.apisecret !== undefined && gatewayCallbacks.apisecret !== null)\n\t\tapisecret = gatewayCallbacks.apisecret;\n\t// Whether we should destroy this session when onbeforeunload is called\n\tthis.destroyOnUnload = true;\n\tif(gatewayCallbacks.destroyOnUnload !== undefined && gatewayCallbacks.destroyOnUnload !== null)\n\t\tthis.destroyOnUnload = (gatewayCallbacks.destroyOnUnload === true);\n\n\tvar connected = false;\n\t// var reconnected = false;\n\t// var reconnecting = false;\n\tvar sessionId = null;\n\tvar pluginHandles = {};\n\tvar that = this;\n\tvar retries = 0;\n\tvar transactions = {};\n\tcreateSession(gatewayCallbacks);\n\n\t// Public methods\n\tthis.getServer = function() { return server; };\n\tthis.isConnected = function() { return connected; };\n\tthis.getSessionId = function() { return sessionId; };\n\tthis.destroy = function(callbacks) { destroySession(callbacks); };\n\tthis.attach = function(callbacks) { createHandle(callbacks); };\n\tthis.timeoutSessionCallback = (typeof gatewayCallbacks.timeoutSessionCallback == \"function\") ? gatewayCallbacks.timeoutSessionCallback : Janus.noop;\n\n\tfunction eventHandler() {\n\t\tif(sessionId == null)\n\t\t\treturn;\n\t\tJanus.debug('Long poll...');\n\t\tif(!connected) {\n\t\t\tJanus.warn(\"Is the gateway down? (connected=false)\");\n\t\t\treturn;\n\t\t}\n\t\tvar longpoll = server + \"/\" + sessionId + \"?rid=\" + new Date().getTime();\n\t\tif(maxev !== undefined && maxev !== null)\n\t\t\tlongpoll = longpoll + \"&maxev=\" + maxev;\n\t\tif(token !== null && token !== undefined)\n\t\t\tlongpoll = longpoll + \"&token=\" + token;\n\t\tif(apisecret !== null && apisecret !== undefined)\n\t\t\tlongpoll = longpoll + \"&apisecret=\" + apisecret;\n\t\tJanus.httpAPICall(longpoll, {\n\t\t\tverb: 'GET',\n\t\t\twithCredentials: withCredentials,\n\t\t\tsuccess: handleEvent,\n\t\t\ttimeout: 60000,\t// FIXME\n\t\t\terror: function(textStatus, errorThrown) {\n\t\t\t\tJanus.error(textStatus + \": \" + errorThrown);\n\t\t\t\tretries++;\n\t\t\t\tif(retries > 3) {\n\t\t\t\t\t// Did we just lose the gateway? :-(\n\t\t\t\t\tconnected = false;\n\t\t\t\t\tgatewayCallbacks.error(\"Lost connection to the gateway (is it down?)\");\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\teventHandler();\n\t\t\t}\n\t\t});\n\t}\n\n\t// Private event handler: this will trigger plugin callbacks, if set\n\tfunction handleEvent(json, skipTimeout) {\n\t\tretries = 0;\n\t\tif(!websockets && sessionId !== undefined && sessionId !== null && skipTimeout !== true)\n\t\t\tsetTimeout(eventHandler, 200);\n\t\tif(!websockets && Janus.isArray(json)) {\n\t\t\t// We got an array: it means we passed a maxev > 1, iterate on all objects\n\t\t\tfor(var i=0; i<json.length; i++) {\n\t\t\t\thandleEvent(json[i], true);\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\tif(json[\"janus\"] === \"keepalive\") {\n\t\t\t// Nothing happened\n\t\t\tJanus.vdebug(\"Got a keepalive on session \" + sessionId);\n\t\t\treturn;\n\t\t} else if(json[\"janus\"] === \"ack\") {\n\t\t\t// Just an ack, we can probably ignore\n\t\t\tJanus.debug(\"Got an ack on session \" + sessionId);\n\t\t\tJanus.debug(json);\n\t\t\tvar transaction = json[\"transaction\"];\n\t\t\tif(transaction !== null && transaction !== undefined) {\n\t\t\t\tvar reportSuccess = transactions[transaction];\n\t\t\t\tif(reportSuccess !== null && reportSuccess !== undefined) {\n\t\t\t\t\treportSuccess(json);\n\t\t\t\t}\n\t\t\t\tdelete transactions[transaction];\n\t\t\t}\n\t\t\treturn;\n\t\t} else if(json[\"janus\"] === \"success\") {\n\t\t\t// Success!\n\t\t\tJanus.debug(\"Got a success on session \" + sessionId);\n\t\t\tJanus.debug(json);\n\t\t\tvar transaction = json[\"transaction\"];\n\t\t\tif(transaction !== null && transaction !== undefined) {\n\t\t\t\tvar reportSuccess = transactions[transaction];\n\t\t\t\tif(reportSuccess !== null && reportSuccess !== undefined) {\n\t\t\t\t\treportSuccess(json);\n\t\t\t\t}\n\t\t\t\tdelete transactions[transaction];\n\t\t\t}\n\t\t\treturn;\n\t\t} else if(json[\"janus\"] === \"webrtcup\") {\n\t\t\t// The PeerConnection with the gateway is up! Notify this\n\t\t\tJanus.debug(\"Got a webrtcup event on session \" + sessionId);\n\t\t\tJanus.debug(json);\n\t\t\tvar sender = json[\"sender\"];\n\t\t\tif(sender === undefined || sender === null) {\n\t\t\t\tJanus.warn(\"Missing sender...\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tvar pluginHandle = pluginHandles[sender];\n\t\t\tif(pluginHandle === undefined || pluginHandle === null) {\n\t\t\t\tJanus.debug(\"This handle is not attached to this session\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tpluginHandle.webrtcState(true);\n\t\t\treturn;\n\t\t} else if(json[\"janus\"] === \"hangup\") {\n\t\t\t// A plugin asked the core to hangup a PeerConnection on one of our handles\n\t\t\tJanus.debug(\"Got a hangup event on session \" + sessionId);\n\t\t\tJanus.debug(json);\n\t\t\tvar sender = json[\"sender\"];\n\t\t\tif(sender === undefined || sender === null) {\n\t\t\t\tJanus.warn(\"Missing sender...\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tvar pluginHandle = pluginHandles[sender];\n\t\t\tif(pluginHandle === undefined || pluginHandle === null) {\n\t\t\t\tJanus.debug(\"This handle is not attached to this session\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tpluginHandle.webrtcState(false, json[\"reason\"]);\n\t\t\tpluginHandle.hangup();\n\t\t} else if(json[\"janus\"] === \"detached\") {\n\t\t\t// A plugin asked the core to detach one of our handles\n\t\t\tJanus.debug(\"Got a detached event on session \" + sessionId);\n\t\t\tJanus.debug(json);\n\t\t\tvar sender = json[\"sender\"];\n\t\t\tif(sender === undefined || sender === null) {\n\t\t\t\tJanus.warn(\"Missing sender...\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tvar pluginHandle = pluginHandles[sender];\n\t\t\tif(pluginHandle === undefined || pluginHandle === null) {\n\t\t\t\t// Don't warn here because destroyHandle causes this situation.\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tpluginHandle.detached = true;\n\t\t\tpluginHandle.ondetached();\n\t\t\tpluginHandle.detach();\n\t\t} else if(json[\"janus\"] === \"media\") {\n\t\t\t// Media started/stopped flowing\n\t\t\tJanus.debug(\"Got a media event on session \" + sessionId);\n\t\t\tJanus.debug(json);\n\t\t\tvar sender = json[\"sender\"];\n\t\t\tif(sender === undefined || sender === null) {\n\t\t\t\tJanus.warn(\"Missing sender...\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tvar pluginHandle = pluginHandles[sender];\n\t\t\tif(pluginHandle === undefined || pluginHandle === null) {\n\t\t\t\tJanus.debug(\"This handle is not attached to this session\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tpluginHandle.mediaState(json[\"type\"], json[\"receiving\"]);\n\t\t} else if(json[\"janus\"] === \"slowlink\") {\n\t\t\tJanus.debug(\"Got a slowlink event on session \" + sessionId);\n\t\t\tJanus.debug(json);\n\t\t\t// Trouble uplink or downlink\n\t\t\tvar sender = json[\"sender\"];\n\t\t\tif(sender === undefined || sender === null) {\n\t\t\t\tJanus.warn(\"Missing sender...\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tvar pluginHandle = pluginHandles[sender];\n\t\t\tif(pluginHandle === undefined || pluginHandle === null) {\n\t\t\t\tJanus.debug(\"This handle is not attached to this session\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tpluginHandle.slowLink(json[\"uplink\"], json[\"nacks\"]);\n\t\t} else if(json[\"janus\"] === \"error\") {\n\t\t\t// Oops, something wrong happened\n\t\t\tJanus.error(\"Ooops: \" + json[\"error\"].code + \" \" + json[\"error\"].reason);\t// FIXME\n\t\t\tJanus.debug(json);\n\t\t\tvar transaction = json[\"transaction\"];\n\t\t\tif(transaction !== null && transaction !== undefined) {\n\t\t\t\tvar reportSuccess = transactions[transaction];\n\t\t\t\tif(reportSuccess !== null && reportSuccess !== undefined) {\n\t\t\t\t\treportSuccess(json);\n\t\t\t\t}\n\t\t\t\tdelete transactions[transaction];\n\t\t\t}\n\t\t\treturn;\n\t\t} else if(json[\"janus\"] === \"event\") {\n\t\t\tJanus.debug(\"Got a plugin event on session \" + sessionId);\n\t\t\tJanus.debug(json);\n\t\t\tvar sender = json[\"sender\"];\n\t\t\tif(sender === undefined || sender === null) {\n\t\t\t\tJanus.warn(\"Missing sender...\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tvar plugindata = json[\"plugindata\"];\n\t\t\tif(plugindata === undefined || plugindata === null) {\n\t\t\t\tJanus.warn(\"Missing plugindata...\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tJanus.debug(\"  -- Event is coming from \" + sender + \" (\" + plugindata[\"plugin\"] + \")\");\n\t\t\tvar data = plugindata[\"data\"];\n\t\t\tJanus.debug(data);\n\t\t\tvar pluginHandle = pluginHandles[sender];\n\t\t\tif(pluginHandle === undefined || pluginHandle === null) {\n\t\t\t\tJanus.warn(\"This handle is not attached to this session\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tvar jsep = json[\"jsep\"];\n\t\t\tif(jsep !== undefined && jsep !== null) {\n\t\t\t\tJanus.debug(\"Handling SDP as well...\");\n\t\t\t\tJanus.debug(jsep);\n\t\t\t}\n\t\t\tvar callback = pluginHandle.onmessage;\n\t\t\tif(callback !== null && callback !== undefined) {\n\t\t\t\tJanus.debug(\"Notifying application...\");\n\t\t\t\t// Send to callback specified when attaching plugin handle\n\t\t\t\tcallback(data, jsep);\n\t\t\t} else {\n\t\t\t\t// Send to generic callback (?)\n\t\t\t\tJanus.debug(\"No provided notification callback\");\n\t\t\t}\n\t\t} else if(json[\"janus\"] === \"timeout\") {\n\t\t\tvar sessionId = json[\"session_id\"];\n\t\t\tvar session = Janus.sessions[sessionId];\n\t\t\tif(session){\n\t\t\t\tsession.timeoutSessionCallback();\n\t\t\t}\n\t\t} else {\n\t\t\tJanus.warn(\"Unkown message/event  '\" + json[\"janus\"] + \"' on session \" + sessionId);\n\t\t\tJanus.debug(json);\n\t\t}\n\t}\n\n\t// Private helper to send keep-alive messages on WebSockets\n\tfunction keepAlive() {\n\t\tif(server === null || !websockets || !connected)\n\t\t\treturn;\n\t\twsKeepaliveTimeoutId = setTimeout(keepAlive, 30000);\n\t\tvar request = { \"janus\": \"keepalive\", \"session_id\": sessionId, \"transaction\": Janus.randomString(12) };\n\t\tif(token !== null && token !== undefined)\n\t\t\trequest[\"token\"] = token;\n\t\tif(apisecret !== null && apisecret !== undefined)\n\t\t\trequest[\"apisecret\"] = apisecret;\n\t\tws.send(JSON.stringify(request));\n\t}\n\n\t// Private method to create a session\n\tfunction createSession(callbacks) {\n\t\tvar transaction = Janus.randomString(12);\n\t\tvar request = { \"janus\": \"create\", \"transaction\": transaction };\n\t\tif(token !== null && token !== undefined)\n\t\t\trequest[\"token\"] = token;\n\t\tif(apisecret !== null && apisecret !== undefined)\n\t\t\trequest[\"apisecret\"] = apisecret;\n\t\tif(server === null && Janus.isArray(servers)) {\n\t\t\t// We still need to find a working server from the list we were given\n\t\t\tserver = servers[serversIndex];\n\t\t\tif(server.indexOf(\"ws\") === 0) {\n\t\t\t\twebsockets = true;\n\t\t\t\tJanus.log(\"Server #\" + (serversIndex+1) + \": trying WebSockets to contact Janus (\" + server + \")\");\n\t\t\t} else {\n\t\t\t\twebsockets = false;\n\t\t\t\tJanus.log(\"Server #\" + (serversIndex+1) + \": trying REST API to contact Janus (\" + server + \")\");\n\t\t\t}\n\t\t}\n\t\tif(websockets) {\n\t\t\tws = Janus.newWebSocket(server, 'janus-protocol');\n\t\t\twsHandlers = {\n\t\t\t\t'error': function() {\n\t\t\t\t\tconsole.warn(\"WS error\");\n\n\t\t\t\t\tJanus.error(\"Error connecting to the Janus WebSockets server... \" + server);\n\t\t\t\t\tif (Janus.isArray(servers)) {\n\t\t\t\t\t\tserversIndex++;\n\t\t\t\t\t\tif (serversIndex == servers.length) {\n\t\t\t\t\t\t\t// We tried all the servers the user gave us and they all failed\n\t\t\t\t\t\t\tcallbacks.error(\"Error connecting to any of the provided Janus servers: Is the gateway down?\");\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// Let's try the next server\n\t\t\t\t\t\tserver = null;\n\t\t\t\t\t\tsetTimeout(function() {\n\t\t\t\t\t\t\tcreateSession(callbacks);\n\t\t\t\t\t\t}, 200);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tcallbacks.error(\"Error connecting to the Janus WebSockets server: Is the gateway down?\");\n\t\t\t\t},\n\n\t\t\t\t'open': function() {\n\t\t\t\t\tconsole.warn(\"WS connected\");\n\n\t\t\t\t\t// if(reconnecting){\n\t\t\t\t\t// \treconnecting = false;\n\t\t\t\t\t// \treconnected = true;\n\t\t\t\t\t// \tconsole.warn(\"WS reconnected\");\n\t\t\t\t\t// }\n\n\t\t\t\t\t// if(!reconnected){\n\t\t\t\t\t\t// We need to be notified about the success\n\t\t\t\t\t\ttransactions[transaction] = function(json) {\n\t\t\t\t\t\t\tJanus.debug(json);\n\t\t\t\t\t\t\tif (json[\"janus\"] !== \"success\") {\n\t\t\t\t\t\t\t\tJanus.error(\"Ooops: \" + json[\"error\"].code + \" \" + json[\"error\"].reason);\t// FIXME\n\t\t\t\t\t\t\t\tcallbacks.error(json[\"error\"].reason);\n\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\twsKeepaliveTimeoutId = setTimeout(keepAlive, 30000);\n\t\t\t\t\t\t\tconnected = true;\n\t\t\t\t\t\t\tsessionId = json.data[\"id\"];\n\t\t\t\t\t\t\tJanus.log(\"Created session: \" + sessionId);\n\t\t\t\t\t\t\tJanus.sessions[sessionId] = that;\n\t\t\t\t\t\t\tcallbacks.success();\n\t\t\t\t\t\t};\n\t\t\t\t\t\tws.send(JSON.stringify(request));\n\t\t\t\t\t// }else{\n\t\t\t\t\t// \tconnected = true;\n\t\t\t\t\t// }\n\t\t\t\t},\n\n\t\t\t\t'message': function(event) {\n\t\t\t\t\thandleEvent(JSON.parse(event.data));\n\t\t\t\t},\n\n\t\t\t\t'close': function() {\n\t\t\t\t\tif (server === null || !connected) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\t// if(connected){\n\t\t\t\t\t// \treconnecting = false;\n\t\t\t\t\t// }\n\t\t\t\t\tconnected = false;\n\t\t\t\t\t// reconnected = false;\n\n\t\t\t\t\tconsole.warn(\"WS close\");\n\t\t\t\t\t// // reconnection\n\t\t\t\t\t// //\n\t\t\t\t\t// // Try to reconnect in 5 seconds\n\t\t\t\t\t// setTimeout(function(){\n\t\t\t\t\t// \treconnecting = true;\n\t\t\t\t\t// \tconsole.warn(\"WS reconnection\");\n\t\t\t\t\t// \tcreateSession(callbacks);\n\t\t\t\t\t// }, 2000);\n\n\n\t\t\t\t\t// FIXME What if this is called when the page is closed?\n\t\t\t\t\tgatewayCallbacks.error(\"Lost connection to the gateway (is it down?)\");\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tfor(var eventName in wsHandlers) {\n\t\t\t\tws.addEventListener(eventName, wsHandlers[eventName]);\n\t\t\t}\n\n\t\t\treturn;\n\t\t}\n\t\tJanus.httpAPICall(server, {\n\t\t\tverb: 'POST',\n\t\t\twithCredentials: withCredentials,\n\t\t\tbody: request,\n\t\t\tsuccess: function(json) {\n\t\t\t\tJanus.debug(json);\n\t\t\t\tif(json[\"janus\"] !== \"success\") {\n\t\t\t\t\tJanus.error(\"Ooops: \" + json[\"error\"].code + \" \" + json[\"error\"].reason);\t// FIXME\n\t\t\t\t\tcallbacks.error(json[\"error\"].reason);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tconnected = true;\n\t\t\t\tsessionId = json.data[\"id\"];\n\t\t\t\tJanus.log(\"Created session: \" + sessionId);\n\t\t\t\tJanus.sessions[sessionId] = that;\n\t\t\t\teventHandler();\n\t\t\t\tcallbacks.success();\n\t\t\t},\n\t\t\terror: function(textStatus, errorThrown) {\n\t\t\t\tJanus.error(textStatus + \": \" + errorThrown);\t// FIXME\n\t\t\t\tif(Janus.isArray(servers)) {\n\t\t\t\t\tserversIndex++;\n\t\t\t\t\tif(serversIndex == servers.length) {\n\t\t\t\t\t\t// We tried all the servers the user gave us and they all failed\n\t\t\t\t\t\tcallbacks.error(\"Error connecting to any of the provided Janus servers: Is the gateway down?\");\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\t// Let's try the next server\n\t\t\t\t\tserver = null;\n\t\t\t\t\tsetTimeout(function() { createSession(callbacks); }, 200);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif(errorThrown === \"\")\n\t\t\t\t\tcallbacks.error(textStatus + \": Is the gateway down?\");\n\t\t\t\telse\n\t\t\t\t\tcallbacks.error(textStatus + \": \" + errorThrown);\n\t\t\t}\n\t\t});\n\t}\n\n\t// Private method to destroy a session\n\tfunction destroySession(callbacks) {\n\t\tcallbacks = callbacks || {};\n\t\t// FIXME This method triggers a success even when we fail\n\t\tcallbacks.success = (typeof callbacks.success == \"function\") ? callbacks.success : Janus.noop;\n\t\tvar asyncRequest = true;\n\t\tif(callbacks.asyncRequest !== undefined && callbacks.asyncRequest !== null)\n\t\t\tasyncRequest = (callbacks.asyncRequest === true);\n\t\tJanus.log(\"Destroying session \" + sessionId + \" (async=\" + asyncRequest + \")\");\n\t\tif(!connected) {\n\t\t\tJanus.warn(\"Is the gateway down? (connected=false)\");\n\t\t\tcallbacks.success();\n\t\t\treturn;\n\t\t}\n\t\tif(sessionId === undefined || sessionId === null) {\n\t\t\tJanus.warn(\"No session to destroy\");\n\t\t\tcallbacks.success();\n\t\t\tgatewayCallbacks.destroyed();\n\t\t\treturn;\n\t\t}\n\t\tdelete Janus.sessions[sessionId];\n\t\t// No need to destroy all handles first, Janus will do that itself\n\t\tvar request = { \"janus\": \"destroy\", \"transaction\": Janus.randomString(12) };\n\t\tif(token !== null && token !== undefined)\n\t\t\trequest[\"token\"] = token;\n\t\tif(apisecret !== null && apisecret !== undefined)\n\t\t\trequest[\"apisecret\"] = apisecret;\n\t\tif(websockets) {\n\t\t\trequest[\"session_id\"] = sessionId;\n\n\t\t\tvar unbindWebSocket = function() {\n\t\t\t\tfor(var eventName in wsHandlers) {\n\t\t\t\t\tws.removeEventListener(eventName, wsHandlers[eventName]);\n\t\t\t\t}\n\t\t\t\tws.removeEventListener('message', onUnbindMessage);\n\t\t\t\tws.removeEventListener('error', onUnbindError);\n\t\t\t\tif(wsKeepaliveTimeoutId) {\n\t\t\t\t\tclearTimeout(wsKeepaliveTimeoutId);\n\t\t\t\t}\n\t\t\t\tws.close();\n\t\t\t};\n\n\t\t\tvar onUnbindMessage = function(event){\n\t\t\t\tvar data = JSON.parse(event.data);\n\t\t\t\tif(data.session_id == request.session_id && data.transaction == request.transaction) {\n\t\t\t\t\tunbindWebSocket();\n\t\t\t\t\tcallbacks.success();\n\t\t\t\t\tgatewayCallbacks.destroyed();\n\t\t\t\t}\n\t\t\t};\n\t\t\tvar onUnbindError = function(event) {\n\t\t\t\tunbindWebSocket();\n\t\t\t\tcallbacks.error(\"Failed to destroy the gateway: Is the gateway down?\");\n\t\t\t\tgatewayCallbacks.destroyed();\n\t\t\t};\n\n\t\t\tws.addEventListener('message', onUnbindMessage);\n\t\t\tws.addEventListener('error', onUnbindError);\n\n\t\t\tws.send(JSON.stringify(request));\n\t\t\treturn;\n\t\t}\n\t\tJanus.httpAPICall(server + \"/\" + sessionId, {\n\t\t\tverb: 'POST',\n\t\t\tasync: asyncRequest,\t// Sometimes we need false here, or destroying in onbeforeunload won't work\n\t\t\twithCredentials: withCredentials,\n\t\t\tbody: request,\n\t\t\tsuccess: function(json) {\n\t\t\t\tJanus.log(\"Destroyed session:\");\n\t\t\t\tJanus.debug(json);\n\t\t\t\tsessionId = null;\n\t\t\t\tconnected = false;\n\t\t\t\tif(json[\"janus\"] !== \"success\") {\n\t\t\t\t\tJanus.error(\"Ooops: \" + json[\"error\"].code + \" \" + json[\"error\"].reason);\t// FIXME\n\t\t\t\t}\n\t\t\t\tcallbacks.success();\n\t\t\t\tgatewayCallbacks.destroyed();\n\t\t\t},\n\t\t\terror: function(textStatus, errorThrown) {\n\t\t\t\tJanus.error(textStatus + \": \" + errorThrown);\t// FIXME\n\t\t\t\t// Reset everything anyway\n\t\t\t\tsessionId = null;\n\t\t\t\tconnected = false;\n\t\t\t\tcallbacks.success();\n\t\t\t\tgatewayCallbacks.destroyed();\n\t\t\t}\n\t\t});\n\t}\n\n\t// Private method to create a plugin handle\n\tfunction createHandle(callbacks) {\n\t\tcallbacks = callbacks || {};\n\t\tcallbacks.success = (typeof callbacks.success == \"function\") ? callbacks.success : Janus.noop;\n\t\tcallbacks.error = (typeof callbacks.error == \"function\") ? callbacks.error : Janus.noop;\n\t\tcallbacks.consentDialog = (typeof callbacks.consentDialog == \"function\") ? callbacks.consentDialog : Janus.noop;\n\t\tcallbacks.iceState = (typeof callbacks.iceState == \"function\") ? callbacks.iceState : Janus.noop;\n\t\tcallbacks.mediaState = (typeof callbacks.mediaState == \"function\") ? callbacks.mediaState : Janus.noop;\n\t\tcallbacks.webrtcState = (typeof callbacks.webrtcState == \"function\") ? callbacks.webrtcState : Janus.noop;\n\t\tcallbacks.slowLink = (typeof callbacks.slowLink == \"function\") ? callbacks.slowLink : Janus.noop;\n\t\tcallbacks.onmessage = (typeof callbacks.onmessage == \"function\") ? callbacks.onmessage : Janus.noop;\n\t\tcallbacks.onlocalstream = (typeof callbacks.onlocalstream == \"function\") ? callbacks.onlocalstream : Janus.noop;\n\t\tcallbacks.onremotestream = (typeof callbacks.onremotestream == \"function\") ? callbacks.onremotestream : Janus.noop;\n\t\tcallbacks.ondata = (typeof callbacks.ondata == \"function\") ? callbacks.ondata : Janus.noop;\n\t\tcallbacks.ondataopen = (typeof callbacks.ondataopen == \"function\") ? callbacks.ondataopen : Janus.noop;\n\t\tcallbacks.oncleanup = (typeof callbacks.oncleanup == \"function\") ? callbacks.oncleanup : Janus.noop;\n\t\tcallbacks.ondetached = (typeof callbacks.ondetached == \"function\") ? callbacks.ondetached : Janus.noop;\n\t\tif(!connected) {\n\t\t\tJanus.warn(\"Is the gateway down? (connected=false)\");\n\t\t\tcallbacks.error(\"Is the gateway down? (connected=false)\");\n\t\t\treturn;\n\t\t}\n\t\tvar plugin = callbacks.plugin;\n\t\tif(plugin === undefined || plugin === null) {\n\t\t\tJanus.error(\"Invalid plugin\");\n\t\t\tcallbacks.error(\"Invalid plugin\");\n\t\t\treturn;\n\t\t}\n\t\tvar opaqueId = callbacks.opaqueId;\n\t\tvar transaction = Janus.randomString(12);\n\t\tvar request = { \"janus\": \"attach\", \"plugin\": plugin, \"opaque_id\": opaqueId, \"transaction\": transaction };\n\t\tif(token !== null && token !== undefined)\n\t\t\trequest[\"token\"] = token;\n\t\tif(apisecret !== null && apisecret !== undefined)\n\t\t\trequest[\"apisecret\"] = apisecret;\n\t\t// If we know the browser supports BUNDLE and/or rtcp-mux, let's advertise those right away\n\t\tif(Janus.webRTCAdapter.browserDetails.browser == \"chrome\" || Janus.webRTCAdapter.browserDetails.browser == \"firefox\" ||\n\t\t\t\tJanus.webRTCAdapter.browserDetails.browser == \"safari\") {\n\t\t\trequest[\"force-bundle\"] = true;\n\t\t\trequest[\"force-rtcp-mux\"] = true;\n\t\t}\n\t\tif(websockets) {\n\t\t\ttransactions[transaction] = function(json) {\n\t\t\t\tJanus.debug(json);\n\t\t\t\tif(json[\"janus\"] !== \"success\") {\n\t\t\t\t\tJanus.error(\"Ooops: \" + json[\"error\"].code + \" \" + json[\"error\"].reason);\t// FIXME\n\t\t\t\t\tcallbacks.error(\"Ooops: \" + json[\"error\"].code + \" \" + json[\"error\"].reason);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tvar handleId = json.data[\"id\"];\n\t\t\t\tJanus.log(\"Created handle: \" + handleId);\n\t\t\t\tvar pluginHandle =\n\t\t\t\t\t{\n\t\t\t\t\t\tsession : that,\n\t\t\t\t\t\tplugin : plugin,\n\t\t\t\t\t\tid : handleId,\n\t\t\t\t\t\tdetached : false,\n\t\t\t\t\t\twebrtcStuff : {\n\t\t\t\t\t\t\tstarted : false,\n\t\t\t\t\t\t\tmyStream : null,\n\t\t\t\t\t\t\tstreamExternal : false,\n\t\t\t\t\t\t\tremoteStream : null,\n\t\t\t\t\t\t\tmySdp : null,\n\t\t\t\t\t\t\tmediaConstraints : null,\n\t\t\t\t\t\t\tpc : null,\n\t\t\t\t\t\t\tdataChannel : null,\n\t\t\t\t\t\t\tdtmfSender : null,\n\t\t\t\t\t\t\ttrickle : true,\n\t\t\t\t\t\t\ticeDone : false,\n\t\t\t\t\t\t\tvolume : {\n\t\t\t\t\t\t\t\tvalue : null,\n\t\t\t\t\t\t\t\ttimer : null\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tbitrate : {\n\t\t\t\t\t\t\t\tvalue : null,\n\t\t\t\t\t\t\t\tbsnow : null,\n\t\t\t\t\t\t\t\tbsbefore : null,\n\t\t\t\t\t\t\t\ttsnow : null,\n\t\t\t\t\t\t\t\ttsbefore : null,\n\t\t\t\t\t\t\t\ttimer : null\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t\tgetId : function() { return handleId; },\n\t\t\t\t\t\tgetPlugin : function() { return plugin; },\n\t\t\t\t\t\tgetVolume : function() { return getVolume(handleId); },\n\t\t\t\t\t\tisAudioMuted : function() { return isMuted(handleId, false); },\n\t\t\t\t\t\tmuteAudio : function() { return mute(handleId, false, true); },\n\t\t\t\t\t\tunmuteAudio : function() { return mute(handleId, false, false); },\n\t\t\t\t\t\tisVideoMuted : function() { return isMuted(handleId, true); },\n\t\t\t\t\t\tmuteVideo : function() { return mute(handleId, true, true); },\n\t\t\t\t\t\tunmuteVideo : function() { return mute(handleId, true, false); },\n\t\t\t\t\t\tgetBitrate : function() { return getBitrate(handleId); },\n\t\t\t\t\t\tsend : function(callbacks) { sendMessage(handleId, callbacks); },\n\t\t\t\t\t\tdata : function(callbacks) { sendData(handleId, callbacks); },\n\t\t\t\t\t\tdtmf : function(callbacks) { sendDtmf(handleId, callbacks); },\n\t\t\t\t\t\tconsentDialog : callbacks.consentDialog,\n\t\t\t\t\t\ticeState : callbacks.iceState,\n\t\t\t\t\t\tmediaState : callbacks.mediaState,\n\t\t\t\t\t\twebrtcState : callbacks.webrtcState,\n\t\t\t\t\t\tslowLink : callbacks.slowLink,\n\t\t\t\t\t\tonmessage : callbacks.onmessage,\n\t\t\t\t\t\tcreateOffer : function(callbacks) { prepareWebrtc(handleId, callbacks); },\n\t\t\t\t\t\tcreateAnswer : function(callbacks) { prepareWebrtc(handleId, callbacks); },\n\t\t\t\t\t\thandleRemoteJsep : function(callbacks) { prepareWebrtcPeer(handleId, callbacks); },\n\t\t\t\t\t\tonlocalstream : callbacks.onlocalstream,\n\t\t\t\t\t\tonremotestream : callbacks.onremotestream,\n\t\t\t\t\t\tondata : callbacks.ondata,\n\t\t\t\t\t\tondataopen : callbacks.ondataopen,\n\t\t\t\t\t\toncleanup : callbacks.oncleanup,\n\t\t\t\t\t\tondetached : callbacks.ondetached,\n\t\t\t\t\t\thangup : function(sendRequest) { cleanupWebrtc(handleId, sendRequest === true); },\n\t\t\t\t\t\tdetach : function(callbacks) { destroyHandle(handleId, callbacks); }\n\t\t\t\t\t};\n\t\t\t\tpluginHandles[handleId] = pluginHandle;\n\t\t\t\tcallbacks.success(pluginHandle);\n\t\t\t};\n\t\t\trequest[\"session_id\"] = sessionId;\n\t\t\tws.send(JSON.stringify(request));\n\t\t\treturn;\n\t\t}\n\t\tJanus.httpAPICall(server + \"/\" + sessionId, {\n\t\t\tverb: 'POST',\n\t\t\twithCredentials: withCredentials,\n\t\t\tbody: request,\n\t\t\tsuccess: function(json) {\n\t\t\t\tJanus.debug(json);\n\t\t\t\tif(json[\"janus\"] !== \"success\") {\n\t\t\t\t\tJanus.error(\"Ooops: \" + json[\"error\"].code + \" \" + json[\"error\"].reason);\t// FIXME\n\t\t\t\t\tcallbacks.error(\"Ooops: \" + json[\"error\"].code + \" \" + json[\"error\"].reason);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tvar handleId = json.data[\"id\"];\n\t\t\t\tJanus.log(\"Created handle: \" + handleId);\n\t\t\t\tvar pluginHandle =\n\t\t\t\t\t{\n\t\t\t\t\t\tsession : that,\n\t\t\t\t\t\tplugin : plugin,\n\t\t\t\t\t\tid : handleId,\n\t\t\t\t\t\tdetached : false,\n\t\t\t\t\t\twebrtcStuff : {\n\t\t\t\t\t\t\tstarted : false,\n\t\t\t\t\t\t\tmyStream : null,\n\t\t\t\t\t\t\tstreamExternal : false,\n\t\t\t\t\t\t\tremoteStream : null,\n\t\t\t\t\t\t\tmySdp : null,\n\t\t\t\t\t\t\tmediaConstraints : null,\n\t\t\t\t\t\t\tpc : null,\n\t\t\t\t\t\t\tdataChannel : null,\n\t\t\t\t\t\t\tdtmfSender : null,\n\t\t\t\t\t\t\ttrickle : true,\n\t\t\t\t\t\t\ticeDone : false,\n\t\t\t\t\t\t\tvolume : {\n\t\t\t\t\t\t\t\tvalue : null,\n\t\t\t\t\t\t\t\ttimer : null\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tbitrate : {\n\t\t\t\t\t\t\t\tvalue : null,\n\t\t\t\t\t\t\t\tbsnow : null,\n\t\t\t\t\t\t\t\tbsbefore : null,\n\t\t\t\t\t\t\t\ttsnow : null,\n\t\t\t\t\t\t\t\ttsbefore : null,\n\t\t\t\t\t\t\t\ttimer : null\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t\tgetId : function() { return handleId; },\n\t\t\t\t\t\tgetPlugin : function() { return plugin; },\n\t\t\t\t\t\tgetVolume : function() { return getVolume(handleId); },\n\t\t\t\t\t\tisAudioMuted : function() { return isMuted(handleId, false); },\n\t\t\t\t\t\tmuteAudio : function() { return mute(handleId, false, true); },\n\t\t\t\t\t\tunmuteAudio : function() { return mute(handleId, false, false); },\n\t\t\t\t\t\tisVideoMuted : function() { return isMuted(handleId, true); },\n\t\t\t\t\t\tmuteVideo : function() { return mute(handleId, true, true); },\n\t\t\t\t\t\tunmuteVideo : function() { return mute(handleId, true, false); },\n\t\t\t\t\t\tgetBitrate : function() { return getBitrate(handleId); },\n\t\t\t\t\t\tsend : function(callbacks) { sendMessage(handleId, callbacks); },\n\t\t\t\t\t\tdata : function(callbacks) { sendData(handleId, callbacks); },\n\t\t\t\t\t\tdtmf : function(callbacks) { sendDtmf(handleId, callbacks); },\n\t\t\t\t\t\tconsentDialog : callbacks.consentDialog,\n\t\t\t\t\t\ticeState : callbacks.iceState,\n\t\t\t\t\t\tmediaState : callbacks.mediaState,\n\t\t\t\t\t\twebrtcState : callbacks.webrtcState,\n\t\t\t\t\t\tslowLink : callbacks.slowLink,\n\t\t\t\t\t\tonmessage : callbacks.onmessage,\n\t\t\t\t\t\tcreateOffer : function(callbacks) { prepareWebrtc(handleId, callbacks); },\n\t\t\t\t\t\tcreateAnswer : function(callbacks) { prepareWebrtc(handleId, callbacks); },\n\t\t\t\t\t\thandleRemoteJsep : function(callbacks) { prepareWebrtcPeer(handleId, callbacks); },\n\t\t\t\t\t\tonlocalstream : callbacks.onlocalstream,\n\t\t\t\t\t\tonremotestream : callbacks.onremotestream,\n\t\t\t\t\t\tondata : callbacks.ondata,\n\t\t\t\t\t\tondataopen : callbacks.ondataopen,\n\t\t\t\t\t\toncleanup : callbacks.oncleanup,\n\t\t\t\t\t\tondetached : callbacks.ondetached,\n\t\t\t\t\t\thangup : function(sendRequest) { cleanupWebrtc(handleId, sendRequest === true); },\n\t\t\t\t\t\tdetach : function(callbacks) { destroyHandle(handleId, callbacks); }\n\t\t\t\t\t};\n\t\t\t\tpluginHandles[handleId] = pluginHandle;\n\t\t\t\tcallbacks.success(pluginHandle);\n\t\t\t},\n\t\t\terror: function(textStatus, errorThrown) {\n\t\t\t\tJanus.error(textStatus + \": \" + errorThrown);\t// FIXME\n\t\t\t}\n\t\t});\n\t}\n\n\t// Private method to send a message\n\tfunction sendMessage(handleId, callbacks) {\n\t\tcallbacks = callbacks || {};\n\t\tcallbacks.success = (typeof callbacks.success == \"function\") ? callbacks.success : Janus.noop;\n\t\tcallbacks.error = (typeof callbacks.error == \"function\") ? callbacks.error : Janus.noop;\n\t\tif(!connected) {\n\t\t\tJanus.warn(\"Is the gateway down? (connected=false)\");\n\t\t\tcallbacks.error(\"Is the gateway down? (connected=false)\");\n\t\t\treturn;\n\t\t}\n\t\tvar message = callbacks.message;\n\t\tvar jsep = callbacks.jsep;\n\t\tvar transaction = Janus.randomString(12);\n\t\tvar request = { \"janus\": \"message\", \"body\": message, \"transaction\": transaction };\n\t\tif(token !== null && token !== undefined)\n\t\t\trequest[\"token\"] = token;\n\t\tif(apisecret !== null && apisecret !== undefined)\n\t\t\trequest[\"apisecret\"] = apisecret;\n\t\tif(jsep !== null && jsep !== undefined)\n\t\t\trequest.jsep = jsep;\n\t\tJanus.debug(\"Sending message to plugin (handle=\" + handleId + \"):\");\n\t\tJanus.debug(request);\n\t\tif(websockets) {\n\t\t\trequest[\"session_id\"] = sessionId;\n\t\t\trequest[\"handle_id\"] = handleId;\n\t\t\ttransactions[transaction] = function(json) {\n\t\t\t\tJanus.debug(\"Message sent!\");\n\t\t\t\tJanus.debug(json);\n\t\t\t\tif(json[\"janus\"] === \"success\") {\n\t\t\t\t\t// We got a success, must have been a synchronous transaction\n\t\t\t\t\tvar plugindata = json[\"plugindata\"];\n\t\t\t\t\tif(plugindata === undefined || plugindata === null) {\n\t\t\t\t\t\tJanus.warn(\"Request succeeded, but missing plugindata...\");\n\t\t\t\t\t\tcallbacks.success();\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tJanus.log(\"Synchronous transaction successful (\" + plugindata[\"plugin\"] + \")\");\n\t\t\t\t\tvar data = plugindata[\"data\"];\n\t\t\t\t\tJanus.debug(data);\n\t\t\t\t\tcallbacks.success(data);\n\t\t\t\t\treturn;\n\t\t\t\t} else if(json[\"janus\"] !== \"ack\") {\n\t\t\t\t\t// Not a success and not an ack, must be an error\n\t\t\t\t\tif(json[\"error\"] !== undefined && json[\"error\"] !== null) {\n\t\t\t\t\t\tJanus.error(\"Ooops: \" + json[\"error\"].code + \" \" + json[\"error\"].reason);\t// FIXME\n\t\t\t\t\t\tcallbacks.error(json[\"error\"].code + \" \" + json[\"error\"].reason);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tJanus.error(\"Unknown error\");\t// FIXME\n\t\t\t\t\t\tcallbacks.error(\"Unknown error\");\n\t\t\t\t\t}\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\t// If we got here, the plugin decided to handle the request asynchronously\n\t\t\t\tcallbacks.success();\n\t\t\t};\n\t\t\tws.send(JSON.stringify(request));\n\t\t\treturn;\n\t\t}\n\t\tJanus.httpAPICall(server + \"/\" + sessionId + \"/\" + handleId, {\n\t\t\tverb: 'POST',\n\t\t\twithCredentials: withCredentials,\n\t\t\tbody: request,\n\t\t\tsuccess: function(json) {\n\t\t\t\tJanus.debug(\"Message sent!\");\n\t\t\t\tJanus.debug(json);\n\t\t\t\tif(json[\"janus\"] === \"success\") {\n\t\t\t\t\t// We got a success, must have been a synchronous transaction\n\t\t\t\t\tvar plugindata = json[\"plugindata\"];\n\t\t\t\t\tif(plugindata === undefined || plugindata === null) {\n\t\t\t\t\t\tJanus.warn(\"Request succeeded, but missing plugindata...\");\n\t\t\t\t\t\tcallbacks.success();\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\tJanus.log(\"Synchronous transaction successful (\" + plugindata[\"plugin\"] + \")\");\n\t\t\t\t\tvar data = plugindata[\"data\"];\n\t\t\t\t\tJanus.debug(data);\n\t\t\t\t\tcallbacks.success(data);\n\t\t\t\t\treturn;\n\t\t\t\t} else if(json[\"janus\"] !== \"ack\") {\n\t\t\t\t\t// Not a success and not an ack, must be an error\n\t\t\t\t\tif(json[\"error\"] !== undefined && json[\"error\"] !== null) {\n\t\t\t\t\t\tJanus.error(\"Ooops: \" + json[\"error\"].code + \" \" + json[\"error\"].reason);\t// FIXME\n\t\t\t\t\t\tcallbacks.error(json[\"error\"].code + \" \" + json[\"error\"].reason);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tJanus.error(\"Unknown error\");\t// FIXME\n\t\t\t\t\t\tcallbacks.error(\"Unknown error\");\n\t\t\t\t\t}\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\t// If we got here, the plugin decided to handle the request asynchronously\n\t\t\t\tcallbacks.success();\n\t\t\t},\n\t\t\terror: function(textStatus, errorThrown) {\n\t\t\t\tJanus.error(textStatus + \": \" + errorThrown);\t// FIXME\n\t\t\t\tcallbacks.error(textStatus + \": \" + errorThrown);\n\t\t\t}\n\t\t});\n\t}\n\n\t// Private method to send a trickle candidate\n\tfunction sendTrickleCandidate(handleId, candidate) {\n\t\tif(!connected) {\n\t\t\tJanus.warn(\"Is the gateway down? (connected=false)\");\n\t\t\treturn;\n\t\t}\n\t\tvar request = { \"janus\": \"trickle\", \"candidate\": candidate, \"transaction\": Janus.randomString(12) };\n\t\tif(token !== null && token !== undefined)\n\t\t\trequest[\"token\"] = token;\n\t\tif(apisecret !== null && apisecret !== undefined)\n\t\t\trequest[\"apisecret\"] = apisecret;\n\t\tJanus.vdebug(\"Sending trickle candidate (handle=\" + handleId + \"):\");\n\t\tJanus.vdebug(request);\n\t\tif(websockets) {\n\t\t\trequest[\"session_id\"] = sessionId;\n\t\t\trequest[\"handle_id\"] = handleId;\n\t\t\tws.send(JSON.stringify(request));\n\t\t\treturn;\n\t\t}\n\t\tJanus.httpAPICall(server + \"/\" + sessionId + \"/\" + handleId, {\n\t\t\tverb: 'POST',\n\t\t\twithCredentials: withCredentials,\n\t\t\tbody: request,\n\t\t\tsuccess: function(json) {\n\t\t\t\tJanus.vdebug(\"Candidate sent!\");\n\t\t\t\tJanus.vdebug(json);\n\t\t\t\tif(json[\"janus\"] !== \"ack\") {\n\t\t\t\t\tJanus.error(\"Ooops: \" + json[\"error\"].code + \" \" + json[\"error\"].reason);\t// FIXME\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t},\n\t\t\terror: function(textStatus, errorThrown) {\n\t\t\t\tJanus.error(textStatus + \": \" + errorThrown);\t// FIXME\n\t\t\t}\n\t\t});\n\t}\n\n\t// Private method to send a data channel message\n\tfunction sendData(handleId, callbacks) {\n\t\tcallbacks = callbacks || {};\n\t\tcallbacks.success = (typeof callbacks.success == \"function\") ? callbacks.success : Janus.noop;\n\t\tcallbacks.error = (typeof callbacks.error == \"function\") ? callbacks.error : Janus.noop;\n\t\tvar pluginHandle = pluginHandles[handleId];\n\t\tif(pluginHandle === null || pluginHandle === undefined ||\n\t\t\t\tpluginHandle.webrtcStuff === null || pluginHandle.webrtcStuff === undefined) {\n\t\t\tJanus.warn(\"Invalid handle\");\n\t\t\tcallbacks.error(\"Invalid handle\");\n\t\t\treturn;\n\t\t}\n\t\tvar config = pluginHandle.webrtcStuff;\n\t\tvar text = callbacks.text;\n\t\tif(text === null || text === undefined) {\n\t\t\tJanus.warn(\"Invalid text\");\n\t\t\tcallbacks.error(\"Invalid text\");\n\t\t\treturn;\n\t\t}\n\t\tJanus.log(\"Sending string on data channel: \" + text);\n\t\tconfig.dataChannel.send(text);\n\t\tcallbacks.success();\n\t}\n\n\t// Private method to send a DTMF tone\n\tfunction sendDtmf(handleId, callbacks) {\n\t\tcallbacks = callbacks || {};\n\t\tcallbacks.success = (typeof callbacks.success == \"function\") ? callbacks.success : Janus.noop;\n\t\tcallbacks.error = (typeof callbacks.error == \"function\") ? callbacks.error : Janus.noop;\n\t\tvar pluginHandle = pluginHandles[handleId];\n\t\tif(pluginHandle === null || pluginHandle === undefined ||\n\t\t\t\tpluginHandle.webrtcStuff === null || pluginHandle.webrtcStuff === undefined) {\n\t\t\tJanus.warn(\"Invalid handle\");\n\t\t\tcallbacks.error(\"Invalid handle\");\n\t\t\treturn;\n\t\t}\n\t\tvar config = pluginHandle.webrtcStuff;\n\t\tif(config.dtmfSender === null || config.dtmfSender === undefined) {\n\t\t\t// Create the DTMF sender, if possible\n\t\t\tif(config.myStream !== undefined && config.myStream !== null) {\n\t\t\t\tvar tracks = config.myStream.getAudioTracks();\n\t\t\t\tif(tracks !== null && tracks !== undefined && tracks.length > 0) {\n\t\t\t\t\tvar local_audio_track = tracks[0];\n\t\t\t\t\tconfig.dtmfSender = config.pc.createDTMFSender(local_audio_track);\n\t\t\t\t\tJanus.log(\"Created DTMF Sender\");\n\t\t\t\t\tconfig.dtmfSender.ontonechange = function(tone) { Janus.debug(\"Sent DTMF tone: \" + tone.tone); };\n\t\t\t\t}\n\t\t\t}\n\t\t\tif(config.dtmfSender === null || config.dtmfSender === undefined) {\n\t\t\t\tJanus.warn(\"Invalid DTMF configuration\");\n\t\t\t\tcallbacks.error(\"Invalid DTMF configuration\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\tvar dtmf = callbacks.dtmf;\n\t\tif(dtmf === null || dtmf === undefined) {\n\t\t\tJanus.warn(\"Invalid DTMF parameters\");\n\t\t\tcallbacks.error(\"Invalid DTMF parameters\");\n\t\t\treturn;\n\t\t}\n\t\tvar tones = dtmf.tones;\n\t\tif(tones === null || tones === undefined) {\n\t\t\tJanus.warn(\"Invalid DTMF string\");\n\t\t\tcallbacks.error(\"Invalid DTMF string\");\n\t\t\treturn;\n\t\t}\n\t\tvar duration = dtmf.duration;\n\t\tif(duration === null || duration === undefined)\n\t\t\tduration = 500;\t// We choose 500ms as the default duration for a tone\n\t\tvar gap = dtmf.gap;\n\t\tif(gap === null || gap === undefined)\n\t\t\tgap = 50;\t// We choose 50ms as the default gap between tones\n\t\tJanus.debug(\"Sending DTMF string \" + tones + \" (duration \" + duration + \"ms, gap \" + gap + \"ms)\");\n\t\tconfig.dtmfSender.insertDTMF(tones, duration, gap);\n\t}\n\n\t// Private method to destroy a plugin handle\n\tfunction destroyHandle(handleId, callbacks) {\n\t\tcallbacks = callbacks || {};\n\t\tcallbacks.success = (typeof callbacks.success == \"function\") ? callbacks.success : Janus.noop;\n\t\tcallbacks.error = (typeof callbacks.error == \"function\") ? callbacks.error : Janus.noop;\n\t\tvar asyncRequest = true;\n\t\tif(callbacks.asyncRequest !== undefined && callbacks.asyncRequest !== null)\n\t\t\tasyncRequest = (callbacks.asyncRequest === true);\n\t\tJanus.log(\"Destroying handle \" + handleId + \" (async=\" + asyncRequest + \")\");\n\t\tcleanupWebrtc(handleId);\n\t\tif (pluginHandles[handleId].detached) {\n\t\t\t// Plugin was already detached by Janus, calling detach again will return a handle not found error, so just exit here\n\t\t\tdelete pluginHandles[handleId];\n\t\t\tcallbacks.success();\n\t\t\treturn;\n\t\t}\n\t\tif(!connected) {\n\t\t\tJanus.warn(\"Is the gateway down? (connected=false)\");\n\t\t\tcallbacks.error(\"Is the gateway down? (connected=false)\");\n\t\t\treturn;\n\t\t}\n\t\tvar request = { \"janus\": \"detach\", \"transaction\": Janus.randomString(12) };\n\t\tif(token !== null && token !== undefined)\n\t\t\trequest[\"token\"] = token;\n\t\tif(apisecret !== null && apisecret !== undefined)\n\t\t\trequest[\"apisecret\"] = apisecret;\n\t\tif(websockets) {\n\t\t\trequest[\"session_id\"] = sessionId;\n\t\t\trequest[\"handle_id\"] = handleId;\n\t\t\tws.send(JSON.stringify(request));\n\t\t\tdelete pluginHandles[handleId];\n\t\t\tcallbacks.success();\n\t\t\treturn;\n\t\t}\n\t\tJanus.httpAPICall(server + \"/\" + sessionId + \"/\" + handleId, {\n\t\t\tverb: 'POST',\n\t\t\tasync: asyncRequest,\t// Sometimes we need false here, or destroying in onbeforeunload won't work\n\t\t\twithCredentials: withCredentials,\n\t\t\tbody: request,\n\t\t\tsuccess: function(json) {\n\t\t\t\tJanus.log(\"Destroyed handle:\");\n\t\t\t\tJanus.debug(json);\n\t\t\t\tif(json[\"janus\"] !== \"success\") {\n\t\t\t\t\tJanus.error(\"Ooops: \" + json[\"error\"].code + \" \" + json[\"error\"].reason);\t// FIXME\n\t\t\t\t}\n\t\t\t\tdelete pluginHandles[handleId];\n\t\t\t\tcallbacks.success();\n\t\t\t},\n\t\t\terror: function(textStatus, errorThrown) {\n\t\t\t\tJanus.error(textStatus + \": \" + errorThrown);\t// FIXME\n\t\t\t\t// We cleanup anyway\n\t\t\t\tdelete pluginHandles[handleId];\n\t\t\t\tcallbacks.success();\n\t\t\t}\n\t\t});\n\t}\n\n\t// WebRTC stuff\n\tfunction streamsDone(handleId, jsep, media, callbacks, stream) {\n\t\tconsole.warn(\"streamsDone\", media);\n\t\tvar pluginHandle = pluginHandles[handleId];\n\t\tif(pluginHandle === null || pluginHandle === undefined ||\n\t\t\t\tpluginHandle.webrtcStuff === null || pluginHandle.webrtcStuff === undefined) {\n\t\t\tJanus.warn(\"Invalid handle\");\n\t\t\tcallbacks.error(\"Invalid handle\");\n\t\t\treturn;\n\t\t}\n\t\tvar config = pluginHandle.webrtcStuff;\n\t\tJanus.debug(\"streamsDone:\", stream);\n\t\tif(stream) {\n\t\t\tJanus.debug(\"  -- Audio tracks:\", stream.getAudioTracks());\n\t\t\tJanus.debug(\"  -- Video tracks:\", stream.getVideoTracks());\n\t\t}\n\t\t// If we're updating, check if we need to remove/replace one of the tracks\n\t\tif(media.update && !config.streamExternal) {\n\t\t\tif(media.removeAudio || media.replaceAudio) {\n\t\t\t\tif(config.myStream && config.myStream.getAudioTracks() && config.myStream.getAudioTracks().length) {\n\t\t\t\t\tJanus.log(\"Removing audio track:\", config.myStream.getAudioTracks()[0]);\n\t\t\t\t\tconfig.myStream.removeTrack(config.myStream.getAudioTracks()[0]);\n\t\t\t\t}\n\t\t\t\tif(config.pc.getSenders() && config.pc.getSenders().length) {\n\t\t\t\t\tfor(var index in config.pc.getSenders()) {\n\t\t\t\t\t\tvar s = config.pc.getSenders()[index];\n\t\t\t\t\t\tif(s && s.track && s.track.kind === \"audio\") {\n\t\t\t\t\t\t\tJanus.log(\"Removing audio sender:\", s);\n\t\t\t\t\t\t\tconfig.pc.removeTrack(s);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif(media.removeVideo || media.replaceVideo) {\n\t\t\t\tif(config.myStream && config.myStream.getVideoTracks() && config.myStream.getVideoTracks().length) {\n\t\t\t\t\tJanus.log(\"Removing video track:\", config.myStream.getVideoTracks()[0]);\n\t\t\t\t\tconfig.myStream.removeTrack(config.myStream.getVideoTracks()[0]);\n\t\t\t\t}\n\t\t\t\tif(config.pc.getSenders() && config.pc.getSenders().length) {\n\t\t\t\t\tfor(var index in config.pc.getSenders()) {\n\t\t\t\t\t\tvar s = config.pc.getSenders()[index];\n\t\t\t\t\t\tif(s && s.track && s.track.kind === \"video\") {\n\t\t\t\t\t\t\tJanus.log(\"Removing video sender:\", s);\n\t\t\t\t\t\t\tconfig.pc.removeTrack(s);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t// We're now capturing the new stream: check if we're updating or if it's a new thing\n\t\tvar addTracks = false;\n\t\tif(!config.myStream || !media.update || config.streamExternal) {\n\t\t\tconfig.myStream = stream;\n\t\t\taddTracks = true;\n\t\t} else {\n\t\t\t// We only need to update the existing stream\n\t\t\tif(((!media.update && isAudioSendEnabled(media)) || (media.update && (media.addAudio || media.replaceAudio))) &&\n\t\t\t\t\tstream.getAudioTracks() && stream.getAudioTracks().length) {\n\t\t\t\tJanus.log(\"Adding audio track:\", stream.getAudioTracks()[0]);\n\t\t\t\tconfig.myStream.addTrack(stream.getAudioTracks()[0]);\n\t\t\t\tconfig.pc.addTrack(stream.getAudioTracks()[0], stream);\n\t\t\t}\n\t\t\tif(((!media.update && isVideoSendEnabled(media)) || (media.update && (media.addVideo || media.replaceVideo))) &&\n\t\t\t\t\tstream.getVideoTracks() && stream.getVideoTracks().length) {\n\t\t\t\tJanus.log(\"Adding video track:\", stream.getVideoTracks()[0]);\n\t\t\t\tconfig.myStream.addTrack(stream.getVideoTracks()[0]);\n\t\t\t\tconfig.pc.addTrack(stream.getVideoTracks()[0], stream);\n\t\t\t}\n\t\t}\n\t\t// If we still need to create a PeerConnection, let's do that\n\t\tif(!config.pc) {\n\t\t\tvar pc_config = {\"iceServers\": iceServers, \"iceTransportPolicy\": iceTransportPolicy, \"bundlePolicy\": bundlePolicy};\n\t\t\t//~ var pc_constraints = {'mandatory': {'MozDontOfferDataChannel':true}};\n\t\t\tvar pc_constraints = {\n\t\t\t\t\"optional\": [{\"DtlsSrtpKeyAgreement\": true}]\n\t\t\t};\n\t\t\tif(ipv6Support === true) {\n\t\t\t\t// FIXME This is only supported in Chrome right now\n\t\t\t\t// For support in Firefox track this: https://bugzilla.mozilla.org/show_bug.cgi?id=797262\n\t\t\t\tpc_constraints.optional.push({\"googIPv6\":true});\n\t\t\t}\n\t\t\t// Any custom constraint to add?\n\t\t\tif(callbacks.rtcConstraints && typeof callbacks.rtcConstraints === 'object') {\n\t\t\t\tJanus.debug(\"Adding custom PeerConnection constraints:\", callbacks.rtcConstraints);\n\t\t\t\tfor(var i in callbacks.rtcConstraints) {\n\t\t\t\t\tpc_constraints.optional.push(callbacks.rtcConstraints[i]);\n\t\t\t\t}\n\t\t\t}\n\t\t\tif(Janus.webRTCAdapter.browserDetails.browser === \"edge\") {\n\t\t\t\t// This is Edge, enable BUNDLE explicitly\n\t\t\t\tpc_config.bundlePolicy = \"max-bundle\";\n\t\t\t}\n\t\t\tJanus.log(\"Creating PeerConnection\");\n\t\t\tJanus.debug(pc_constraints);\n\t\t\tconfig.pc = new RTCPeerConnection(pc_config, pc_constraints);\n\t\t\tJanus.debug(config.pc);\n\t\t\tif(config.pc.getStats) {\t// FIXME\n\t\t\t\tconfig.volume.value = 0;\n\t\t\t\tconfig.bitrate.value = \"0 kbits/sec\";\n\t\t\t}\n\t\t\tJanus.log(\"Preparing local SDP and gathering candidates (trickle=\" + config.trickle + \")\");\n\t\t\tconfig.pc.oniceconnectionstatechange = function(e) {\n\t\t\t\tif(config.pc)\n\t\t\t\t\tpluginHandle.iceState(config.pc.iceConnectionState);\n\t\t\t};\n\t\t\tconfig.pc.onicecandidate = function(event) {\n\t\t\t\tif (event.candidate == null ||\n\t\t\t\t\t\t(Janus.webRTCAdapter.browserDetails.browser === 'edge' && event.candidate.candidate.indexOf('endOfCandidates') > 0)) {\n\t\t\t\t\tJanus.log(\"End of candidates.\");\n\t\t\t\t\tconfig.iceDone = true;\n\t\t\t\t\tif(config.trickle === true) {\n\t\t\t\t\t\t// Notify end of candidates\n\t\t\t\t\t\tsendTrickleCandidate(handleId, {\"completed\": true});\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// No trickle, time to send the complete SDP (including all candidates)\n\t\t\t\t\t\tsendSDP(handleId, callbacks);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// JSON.stringify doesn't work on some WebRTC objects anymore\n\t\t\t\t\t// See https://code.google.com/p/chromium/issues/detail?id=467366\n\t\t\t\t\tvar candidate = {\n\t\t\t\t\t\t\"candidate\": event.candidate.candidate,\n\t\t\t\t\t\t\"sdpMid\": event.candidate.sdpMid,\n\t\t\t\t\t\t\"sdpMLineIndex\": event.candidate.sdpMLineIndex\n\t\t\t\t\t};\n\t\t\t\t\tif(config.trickle === true) {\n\t\t\t\t\t\t// Send candidate\n\t\t\t\t\t\tsendTrickleCandidate(handleId, candidate);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\t\t\tconfig.pc.ontrack = function(event) {\n\t\t\t\tJanus.log(\"Handling Remote Track\");\n\t\t\t\tJanus.debug(event);\n\t\t\t\tif(!event.streams)\n\t\t\t\t\treturn;\n\t\t\t\tif (!config.remoteStream) {\n\t\t\t\t\tconfig.remoteStream = event.streams[0];\n\t\t\t\t\tpluginHandle.onremotestream(config.remoteStream);\n\t\t\t\t}\n\t\t\t\tif(event.track && !event.track.onended) {\n\t\t\t\t\tJanus.log(\"Adding onended callback to track:\", event.track);\n\t\t\t\t\tconfig.remoteStream.addTrack(event.track)\n\t\t\t\t\tevent.track.onended = function(ev) {\n\t\t\t\t\t\tJanus.log(\"Remote track removed:\", ev);\n\t\t\t\t\t\tif(config.remoteStream) {\n\t\t\t\t\t\t\tconfig.remoteStream.removeTrack(ev.target);\n\t\t\t\t\t\t\tpluginHandle.onremotestream(config.remoteStream);\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\t\tif(addTracks && stream !== null && stream !== undefined) {\n\t\t\tJanus.log('Adding local stream');\n\t\t\tstream.getTracks().forEach(function(track) { config.pc.addTrack(track, stream); });\n\t\t}\n\t\t// Any data channel to create?\n\t\tif(isDataEnabled(media) && !config.dataChannel) {\n\t\t\tJanus.log(\"Creating data channel\");\n\t\t\tvar onDataChannelMessage = function(event) {\n\t\t\t\tJanus.log('Received message on data channel: ' + event.data);\n\t\t\t\tpluginHandle.ondata(event.data);\t// FIXME\n\t\t\t};\n\t\t\tvar onDataChannelStateChange = function() {\n\t\t\t\tvar dcState = config.dataChannel !== null ? config.dataChannel.readyState : \"null\";\n\t\t\t\tJanus.log('State change on data channel: ' + dcState);\n\t\t\t\tif(dcState === 'open') {\n\t\t\t\t\tpluginHandle.ondataopen();\t// FIXME\n\t\t\t\t}\n\t\t\t};\n\t\t\tvar onDataChannelError = function(error) {\n\t\t\t\tJanus.error('Got error on data channel:', error);\n\t\t\t\t// TODO\n\t\t\t};\n\t\t\t// Until we implement the proxying of open requests within the Janus core, we open a channel ourselves whatever the case\n\t\t\tconfig.dataChannel = config.pc.createDataChannel(\"JanusDataChannel\", {ordered:false});\t// FIXME Add options (ordered, maxRetransmits, etc.)\n\t\t\tconfig.dataChannel.onmessage = onDataChannelMessage;\n\t\t\tconfig.dataChannel.onopen = onDataChannelStateChange;\n\t\t\tconfig.dataChannel.onclose = onDataChannelStateChange;\n\t\t\tconfig.dataChannel.onerror = onDataChannelError;\n\t\t}\n\t\t// If there's a new local stream, let's notify the application\n\t\tif(config.myStream)\n\t\t\tpluginHandle.onlocalstream(config.myStream);\n\t\t// Create offer/answer now\n\t\tif(jsep === null || jsep === undefined) {\n\t\t\tcreateOffer(handleId, media, callbacks);\n\t\t} else {\n\t\t\tconfig.pc.setRemoteDescription(\n\t\t\t\t\tnew RTCSessionDescription(jsep),\n\t\t\t\t\tfunction() {\n\t\t\t\t\t\tJanus.log(\"Remote description accepted!\");\n\t\t\t\t\t\tcreateAnswer(handleId, media, callbacks);\n\t\t\t\t\t}, callbacks.error);\n\t\t}\n\t}\n\n\tfunction prepareWebrtc(handleId, callbacks) {\n\t\tcallbacks = callbacks || {};\n\t\tcallbacks.success = (typeof callbacks.success == \"function\") ? callbacks.success : Janus.noop;\n\t\tcallbacks.error = (typeof callbacks.error == \"function\") ? callbacks.error : webrtcError;\n\t\tvar jsep = callbacks.jsep;\n\t\tcallbacks.media = callbacks.media || { audio: true, video: true };\n\t\tvar media = callbacks.media;\n\t\tvar pluginHandle = pluginHandles[handleId];\n\t\tif(pluginHandle === null || pluginHandle === undefined ||\n\t\t\t\tpluginHandle.webrtcStuff === null || pluginHandle.webrtcStuff === undefined) {\n\t\t\tJanus.warn(\"Invalid handle\");\n\t\t\tcallbacks.error(\"Invalid handle\");\n\t\t\treturn;\n\t\t}\n\t\tvar config = pluginHandle.webrtcStuff;\n\t\t// Are we updating a session?\n\t\tif(config.pc === undefined || config.pc === null) {\n\t\t\t// Nope, new PeerConnection\n\t\t\tmedia.update = false;\n\t\t} else if(config.pc !== undefined && config.pc !== null) {\n\t\t\tJanus.log(\"Updating existing media session\");\n\t\t\tmedia.update = true;\n\t\t\t// Check if there's anything do add/remove/replace, or if we\n\t\t\t// can go directly to preparing the new SDP offer or answer\n\t\t\tif(callbacks.stream !== null && callbacks.stream !== undefined) {\n\t\t\t\t// External stream: is this the same as the one we were using before?\n\t\t\t\tif(callbacks.stream !== config.myStream) {\n\t\t\t\t\tJanus.log(\"Renegotiation involves a new external stream\");\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// Check if there are changes on audio\n\t\t\t\tif(media.addAudio) {\n\t\t\t\t\tmedia.replaceAudio = false;\n\t\t\t\t\tmedia.removeAudio = false;\n\t\t\t\t\tmedia.audioSend = true;\n\t\t\t\t\tif(config.myStream && config.myStream.getAudioTracks() && config.myStream.getAudioTracks().length) {\n\t\t\t\t\t\tJanus.error(\"Can't add audio stream, there already is one\");\n\t\t\t\t\t\tcallbacks.error(\"Can't add audio stream, there already is one\");\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t} else if(media.removeAudio) {\n\t\t\t\t\tmedia.replaceAudio = false;\n\t\t\t\t\tmedia.addAudio = false;\n\t\t\t\t\tmedia.audioSend = false;\n\t\t\t\t} else if(media.replaceAudio) {\n\t\t\t\t\tmedia.addAudio = false;\n\t\t\t\t\tmedia.removeAudio = false;\n\t\t\t\t\tmedia.audioSend = true;\n\t\t\t\t}\n\t\t\t\tif(config.myStream === null || config.myStream === undefined) {\n\t\t\t\t\t// No media stream: if we were asked to replace, it's actually an \"add\"\n\t\t\t\t\tif(media.replaceAudio) {\n\t\t\t\t\t\tmedia.replaceAudio = false;\n\t\t\t\t\t\tmedia.addAudio = true;\n\t\t\t\t\t\tmedia.audioSend = true;\n\t\t\t\t\t}\n\t\t\t\t\tif(isAudioSendEnabled(media))\n\t\t\t\t\t\tmedia.addAudio = true;\n\t\t\t\t} else {\n\t\t\t\t\tif(config.myStream.getAudioTracks() === null\n\t\t\t\t\t\t\t|| config.myStream.getAudioTracks() === undefined\n\t\t\t\t\t\t\t|| config.myStream.getAudioTracks().length === 0) {\n\t\t\t\t\t\t// No audio track: if we were asked to replace, it's actually an \"add\"\n\t\t\t\t\t\tif(media.replaceAudio) {\n\t\t\t\t\t\t\tmedia.replaceAudio = false;\n\t\t\t\t\t\t\tmedia.addAudio = true;\n\t\t\t\t\t\t\tmedia.audioSend = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif(isAudioSendEnabled(media))\n\t\t\t\t\t\t\tmedia.addAudio = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// Check if there are changes on video\n\t\t\t\tif(media.addVideo) {\n\t\t\t\t\tmedia.replaceVideo = false;\n\t\t\t\t\tmedia.removeVideo = false;\n\t\t\t\t\tmedia.videoSend = true;\n\t\t\t\t\tif(config.myStream && config.myStream.getVideoTracks() && config.myStream.getVideoTracks().length) {\n\t\t\t\t\t\tJanus.error(\"Can't add video stream, there already is one\");\n\t\t\t\t\t\tcallbacks.error(\"Can't add video stream, there already is one\");\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t} else if(media.removeVideo) {\n\t\t\t\t\tmedia.replaceVideo = false;\n\t\t\t\t\tmedia.addVideo = false;\n\t\t\t\t\tmedia.videoSend = false;\n\t\t\t\t} else if(media.replaceVideo) {\n\t\t\t\t\tmedia.addVideo = false;\n\t\t\t\t\tmedia.removeVideo = false;\n\t\t\t\t\tmedia.videoSend = true;\n\t\t\t\t}\n\t\t\t\tif(config.myStream === null || config.myStream === undefined) {\n\t\t\t\t\t// No media stream: if we were asked to replace, it's actually an \"add\"\n\t\t\t\t\tif(media.replaceVideo) {\n\t\t\t\t\t\tmedia.replaceVideo = false;\n\t\t\t\t\t\tmedia.addVideo = true;\n\t\t\t\t\t\tmedia.videoSend = true;\n\t\t\t\t\t}\n\t\t\t\t\tif(isVideoSendEnabled(media))\n\t\t\t\t\t\tmedia.addVideo = true;\n\t\t\t\t} else {\n\t\t\t\t\tif(config.myStream.getVideoTracks() === null\n\t\t\t\t\t\t\t|| config.myStream.getVideoTracks() === undefined\n\t\t\t\t\t\t\t|| config.myStream.getVideoTracks().length === 0) {\n\t\t\t\t\t\t// No video track: if we were asked to replace, it's actually an \"add\"\n\t\t\t\t\t\tif(media.replaceVideo) {\n\t\t\t\t\t\t\tmedia.replaceVideo = false;\n\t\t\t\t\t\t\tmedia.addVideo = true;\n\t\t\t\t\t\t\tmedia.videoSend = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif(isVideoSendEnabled(media))\n\t\t\t\t\t\t\tmedia.addVideo = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// Data channels can only be added\n\t\t\t\tif(media.addData)\n\t\t\t\t\tmedia.data = true;\n\t\t\t}\n\t\t}\n\t\tconfig.trickle = isTrickleEnabled(callbacks.trickle);\n\t\t// Was a MediaStream object passed, or do we need to take care of that?\n\t\tif(callbacks.stream !== null && callbacks.stream !== undefined) {\n\t\t\tvar stream = callbacks.stream;\n\t\t\tJanus.log(\"MediaStream provided by the application\");\n\t\t\tJanus.debug(stream);\n\t\t\t// If this is an update, let's check if we need to release the previous stream\n\t\t\tif(media.update) {\n\t\t\t\tif(config.myStream && config.myStream !== callbacks.stream && !config.streamExternal) {\n\t\t\t\t\t// We're replacing a stream we captured ourselves with an external one\n\t\t\t\t\ttry {\n\t\t\t\t\t\t// Try a MediaStreamTrack.stop() for each track\n\t\t\t\t\t\tvar tracks = config.myStream.getTracks();\n\t\t\t\t\t\tfor(var i in tracks) {\n\t\t\t\t\t\t\tvar mst = tracks[i];\n\t\t\t\t\t\t\tJanus.log(mst);\n\t\t\t\t\t\t\tif(mst !== null && mst !== undefined)\n\t\t\t\t\t\t\t\tmst.stop();\n\t\t\t\t\t\t}\n\t\t\t\t\t} catch(e) {\n\t\t\t\t\t\t// Do nothing if this fails\n\t\t\t\t\t}\n\t\t\t\t\tconfig.myStream = null;\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Skip the getUserMedia part\n\t\t\tconfig.streamExternal = true;\n\t\t\tstreamsDone(handleId, jsep, media, callbacks, stream);\n\t\t\treturn;\n\t\t}\n\t\tif(isAudioSendEnabled(media) || isVideoSendEnabled(media)) {\n\t\t\tvar constraints = { mandatory: {}, optional: []};\n\t\t\tpluginHandle.consentDialog(true);\n\t\t\tvar audioSupport = isAudioSendEnabled(media);\n\t\t\tif(audioSupport === true && media != undefined && media != null) {\n\t\t\t\tif(typeof media.audio === 'object') {\n\t\t\t\t\taudioSupport = media.audio;\n\t\t\t\t}\n\t\t\t}\n\t\t\tvar videoSupport = isVideoSendEnabled(media);\n\t\t\tif(videoSupport === true && media != undefined && media != null) {\n\t\t\t\tvar simulcast = callbacks.simulcast === true ? true : false;\n\t\t\t\tif(simulcast && !jsep && (media.video === undefined || media.video === false))\n\t\t\t\t\tmedia.video = \"hires\";\n\t\t\t\tif(media.video && media.video != 'screen' && media.video != 'window') {\n\t\t\t\t\tif(typeof media.video === 'object') {\n\t\t\t\t\t\tvideoSupport = media.video;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tvar width = 0;\n\t\t\t\t\t\tvar height = 0, maxHeight = 0;\n\t\t\t\t\t\tif(media.video === 'lowres') {\n\t\t\t\t\t\t\t// Small resolution, 4:3\n\t\t\t\t\t\t\theight = 240;\n\t\t\t\t\t\t\tmaxHeight = 240;\n\t\t\t\t\t\t\twidth = 320;\n\t\t\t\t\t\t} else if(media.video === 'lowres-16:9') {\n\t\t\t\t\t\t\t// Small resolution, 16:9\n\t\t\t\t\t\t\theight = 180;\n\t\t\t\t\t\t\tmaxHeight = 180;\n\t\t\t\t\t\t\twidth = 320;\n\t\t\t\t\t\t} else if(media.video === 'hires' || media.video === 'hires-16:9' || media.video === 'hdres') {\n\t\t\t\t\t\t\t// High(HD) resolution is only 16:9\n\t\t\t\t\t\t\theight = 720;\n\t\t\t\t\t\t\tmaxHeight = 720;\n\t\t\t\t\t\t\twidth = 1280;\n\t\t\t\t\t\t} else if(media.video === 'fhdres') {\n\t\t\t\t\t\t\t// Full HD resolution is only 16:9\n\t\t\t\t\t\t\theight = 1080;\n\t\t\t\t\t\t\tmaxHeight = 1080;\n\t\t\t\t\t\t\twidth = 1920;\n\t\t\t\t\t\t} else if(media.video === '4kres') {\n\t\t\t\t\t\t\t// 4K resolution is only 16:9\n\t\t\t\t\t\t\theight = 2160;\n\t\t\t\t\t\t\tmaxHeight = 2160;\n\t\t\t\t\t\t\twidth = 3840;\n\t\t\t\t\t\t} else if(media.video === 'stdres') {\n\t\t\t\t\t\t\t// Normal resolution, 4:3\n\t\t\t\t\t\t\theight = 480;\n\t\t\t\t\t\t\tmaxHeight = 480;\n\t\t\t\t\t\t\twidth  = 640;\n\t\t\t\t\t\t} else if(media.video === 'stdres-16:9') {\n\t\t\t\t\t\t\t// Normal resolution, 16:9\n\t\t\t\t\t\t\theight = 360;\n\t\t\t\t\t\t\tmaxHeight = 360;\n\t\t\t\t\t\t\twidth = 640;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tJanus.log(\"Default video setting is stdres 4:3\");\n\t\t\t\t\t\t\theight = 480;\n\t\t\t\t\t\t\tmaxHeight = 480;\n\t\t\t\t\t\t\twidth = 640;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tJanus.log(\"Adding media constraint:\", media.video);\n\t\t\t\t\t\tvideoSupport = {\n\t\t\t\t\t\t\t'height': {'ideal': height},\n\t\t\t\t\t\t\t'width':  {'ideal': width}\n\t\t\t\t\t\t};\n\t\t\t\t\t\tif(media.videoFrameRate){\n\t\t\t\t\t\t\tvideoSupport[\"frameRate\"] = media.videoFrameRate;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tJanus.debug(\"Adding video constraint:\", videoSupport);\n\t\t\t\t\t}\n\t\t\t\t} else if(media.video === 'screen' || media.video === 'window') {\n\t\t\t\t\tif(!media.screenshareFrameRate) {\n\t\t\t\t\t\tmedia.screenshareFrameRate = 3;\n\t\t\t\t\t}\n\t\t\t\t\t// Not a webcam, but screen capture\n\t\t\t\t\tif(window.location.protocol !== 'https:') {\n\t\t\t\t\t\t// Screen sharing mandates HTTPS\n\t\t\t\t\t\tJanus.warn(\"Screen sharing only works on HTTPS, try the https:// version of this page\");\n\t\t\t\t\t\tpluginHandle.consentDialog(false);\n\t\t\t\t\t\tcallbacks.error(\"Screen sharing only works on HTTPS, try the https:// version of this page\");\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t\t// We're going to try and use the extension for Chrome 34+, the old approach\n\t\t\t\t\t// for older versions of Chrome, or the experimental support in Firefox 33+\n\t\t\t\t\tvar cache = {};\n\t\t\t\t\tfunction callbackUserMedia (error, stream) {\n\t\t\t\t\t\tpluginHandle.consentDialog(false);\n\t\t\t\t\t\tif(error) {\n\t\t\t\t\t\t\tcallbacks.error({code: error.code, name: error.name, message: error.message});\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tstreamsDone(handleId, jsep, media, callbacks, stream);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tfunction getScreenMedia(constraints, gsmCallback, useAudio) {\n\t\t\t\t\t\tJanus.log(\"Adding media constraint (screen capture)\");\n\t\t\t\t\t\tJanus.debug(constraints);\n\t\t\t\t\t\tnavigator.mediaDevices.getUserMedia(constraints)\n\t\t\t\t\t\t\t.then(function(stream) {\n\t\t\t\t\t\t\t\tif(useAudio){\n\t\t\t\t\t\t\t\t\tnavigator.mediaDevices.getUserMedia({ audio: true, video: false })\n\t\t\t\t\t\t\t\t\t.then(function (audioStream) {\n\t\t\t\t\t\t\t\t\t\tstream.addTrack(audioStream.getAudioTracks()[0]);\n\t\t\t\t\t\t\t\t\t\tgsmCallback(null, stream);\n\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tgsmCallback(null, stream);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t.catch(function(error) { pluginHandle.consentDialog(false); gsmCallback(error); });\n\t\t\t\t\t}\n\t\t\t\t\tif(Janus.webRTCAdapter.browserDetails.browser === 'chrome') {\n\t\t\t\t\t\tvar chromever = Janus.webRTCAdapter.browserDetails.version;\n\t\t\t\t\t\tvar maxver = 33;\n\t\t\t\t\t\tif(window.navigator.userAgent.match('Linux'))\n\t\t\t\t\t\t\tmaxver = 35;\t// \"known\" crash in chrome 34 and 35 on linux\n\t\t\t\t\t\tif(chromever >= 26 && chromever <= maxver) {\n\t\t\t\t\t\t\t// Chrome 26->33 requires some awkward chrome://flags manipulation\n\t\t\t\t\t\t\tconstraints = {\n\t\t\t\t\t\t\t\tvideo: {\n\t\t\t\t\t\t\t\t\tmandatory: {\n\t\t\t\t\t\t\t\t\t\tgoogLeakyBucket: true,\n\t\t\t\t\t\t\t\t\t\tmaxWidth: window.screen.width,\n\t\t\t\t\t\t\t\t\t\tmaxHeight: window.screen.height,\n\t\t\t\t\t\t\t\t\t\tminFrameRate: media.screenshareFrameRate,\n\t\t\t\t\t\t\t\t\t\tmaxFrameRate: media.screenshareFrameRate,\n\t\t\t\t\t\t\t\t\t\tchromeMediaSource: 'screen'\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\taudio: isAudioSendEnabled(media)\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\tgetScreenMedia(constraints, callbackUserMedia);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// Chrome 34+ requires an extension\n\t\t\t\t\t\t\tvar pending = window.setTimeout(\n\t\t\t\t\t\t\t\tfunction () {\n\t\t\t\t\t\t\t\t\terror = new Error('NavigatorUserMediaError');\n\t\t\t\t\t\t\t\t\terror.name = 'The required Chrome extension is not installed: click <a href=\"#\">here</a> to install it. (NOTE: this will need you to refresh the page)';\n\t\t\t\t\t\t\t\t\tpluginHandle.consentDialog(false);\n\t\t\t\t\t\t\t\t\treturn callbacks.error(error);\n\t\t\t\t\t\t\t\t}, 1000);\n\t\t\t\t\t\t\tcache[pending] = [callbackUserMedia, null];\n\t\t\t\t\t\t\twindow.postMessage({ type: 'janusGetScreen', id: pending }, '*');\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if (window.navigator.userAgent.match('Firefox')) {\n\t\t\t\t\t\tvar ffver = parseInt(window.navigator.userAgent.match(/Firefox\\/(.*)/)[1], 10);\n\t\t\t\t\t\tif(ffver >= 33) {\n\t\t\t\t\t\t\t// Firefox 33+ has experimental support for screen sharing\n\t\t\t\t\t\t\tconstraints = {\n\t\t\t\t\t\t\t\tvideo: {\n\t\t\t\t\t\t\t\t\tmozMediaSource: media.video,\n\t\t\t\t\t\t\t\t\tmediaSource: media.video\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\taudio: isAudioSendEnabled(media)\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\tgetScreenMedia(constraints, function (err, stream) {\n\t\t\t\t\t\t\t\tcallbackUserMedia(err, stream);\n\t\t\t\t\t\t\t\t// Workaround for https://bugzilla.mozilla.org/show_bug.cgi?id=1045810\n\t\t\t\t\t\t\t\tif (!err) {\n\t\t\t\t\t\t\t\t\tvar lastTime = stream.currentTime;\n\t\t\t\t\t\t\t\t\tvar polly = window.setInterval(function () {\n\t\t\t\t\t\t\t\t\t\tif(!stream)\n\t\t\t\t\t\t\t\t\t\t\twindow.clearInterval(polly);\n\t\t\t\t\t\t\t\t\t\tif(stream.currentTime == lastTime) {\n\t\t\t\t\t\t\t\t\t\t\twindow.clearInterval(polly);\n\t\t\t\t\t\t\t\t\t\t\tif(stream.onended) {\n\t\t\t\t\t\t\t\t\t\t\t\tstream.onended();\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\tlastTime = stream.currentTime;\n\t\t\t\t\t\t\t\t\t}, 500);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tvar error = new Error('NavigatorUserMediaError');\n\t\t\t\t\t\t\terror.name = 'Your version of Firefox does not support screen sharing, please install Firefox 33 (or more recent versions)';\n\t\t\t\t\t\t\tpluginHandle.consentDialog(false);\n\t\t\t\t\t\t\tcallbacks.error(error);\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// Wait for events from the Chrome Extension\n\t\t\t\t\twindow.addEventListener('message', function (event) {\n\t\t\t\t\t\tif(event.origin != window.location.origin)\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\tif(event.data.type == 'janusGotScreen' && cache[event.data.id]) {\n\t\t\t\t\t\t\tvar data = cache[event.data.id];\n\t\t\t\t\t\t\tvar callback = data[0];\n\t\t\t\t\t\t\tdelete cache[event.data.id];\n\n\t\t\t\t\t\t\tif (event.data.sourceId === '') {\n\t\t\t\t\t\t\t\t// user canceled\n\t\t\t\t\t\t\t\tvar error = new Error('NavigatorUserMediaError');\n\t\t\t\t\t\t\t\terror.name = 'You cancelled the request for permission, giving up...';\n\t\t\t\t\t\t\t\tpluginHandle.consentDialog(false);\n\t\t\t\t\t\t\t\tcallbacks.error(error);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tconstraints = {\n\t\t\t\t\t\t\t\t\taudio: false,\n\t\t\t\t\t\t\t\t\tvideo: {\n\t\t\t\t\t\t\t\t\t\tmandatory: {\n\t\t\t\t\t\t\t\t\t\t\tchromeMediaSource: 'desktop',\n\t\t\t\t\t\t\t\t\t\t\tmaxWidth: window.screen.width,\n\t\t\t\t\t\t\t\t\t\t\tmaxHeight: window.screen.height,\n\t\t\t\t\t\t\t\t\t\t\tminFrameRate: media.screenshareFrameRate,\n\t\t\t\t\t\t\t\t\t\t\tmaxFrameRate: media.screenshareFrameRate,\n\t\t\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t\t\t\toptional: [\n\t\t\t\t\t\t\t\t\t\t\t{googLeakyBucket: true},\n\t\t\t\t\t\t\t\t\t\t\t{googTemporalLayeredScreencast: true}\n\t\t\t\t\t\t\t\t\t\t]\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\tconstraints.video.mandatory.chromeMediaSourceId = event.data.sourceId;\n\t\t\t\t\t\t\t\tgetScreenMedia(constraints, callback, isAudioSendEnabled(media));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else if (event.data.type == 'janusGetScreenPending') {\n\t\t\t\t\t\t\twindow.clearTimeout(event.data.id);\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t\t// If we got here, we're not screensharing\n\t\t\tif(media === null || media === undefined || media.video !== 'screen') {\n\t\t\t\t// Check whether all media sources are actually available or not\n\t\t\t\tnavigator.mediaDevices.enumerateDevices().then(function(devices) {\n\t\t\t\t\tvar audioExist = devices.some(function(device) {\n\t\t\t\t\t\treturn device.kind === 'audioinput';\n\t\t\t\t\t}),\n\t\t\t\t\tvideoExist = devices.some(function(device) {\n\t\t\t\t\t\treturn device.kind === 'videoinput';\n\t\t\t\t\t});\n\n\t\t\t\t\t// Check whether a missing device is really a problem\n\t\t\t\t\tvar audioSend = isAudioSendEnabled(media);\n\t\t\t\t\tvar videoSend = isVideoSendEnabled(media);\n\t\t\t\t\tvar needAudioDevice = isAudioSendRequired(media);\n\t\t\t\t\tvar needVideoDevice = isVideoSendRequired(media);\n\t\t\t\t\tif(audioSend || videoSend || needAudioDevice || needVideoDevice) {\n\t\t\t\t\t\t// We need to send either audio or video\n\t\t\t\t\t\tvar haveAudioDevice = audioSend ? audioExist : false;\n\t\t\t\t\t\tvar haveVideoDevice = videoSend ? videoExist : false;\n\t\t\t\t\t\tif(!haveAudioDevice && !haveVideoDevice) {\n\t\t\t\t\t\t\t// FIXME Should we really give up, or just assume recvonly for both?\n\t\t\t\t\t\t\tpluginHandle.consentDialog(false);\n\t\t\t\t\t\t\tcallbacks.error('No capture device found');\n\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t} else if(!haveAudioDevice && needAudioDevice) {\n\t\t\t\t\t\t\tpluginHandle.consentDialog(false);\n\t\t\t\t\t\t\tcallbacks.error('Audio capture is required, but no capture device found');\n\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t} else if(!haveVideoDevice && needVideoDevice) {\n\t\t\t\t\t\t\tpluginHandle.consentDialog(false);\n\t\t\t\t\t\t\tcallbacks.error('Video capture is required, but no capture device found');\n\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tnavigator.mediaDevices.getUserMedia({\n\t\t\t\t\t\taudio: audioExist ? audioSupport : false,\n\t\t\t\t\t\tvideo: videoExist ? videoSupport : false\n\t\t\t\t\t})\n\t\t\t\t\t.then(function(stream) {\n\t\t\t\t\t\tpluginHandle.consentDialog(false); streamsDone(handleId, jsep, media, callbacks, stream);\n\t\t\t\t\t}).catch(function(error) {\n\t\t\t\t\t\tpluginHandle.consentDialog(false); callbacks.error({code: error.code, name: error.name, message: error.message});\n\t\t\t\t\t});\n\t\t\t\t})\n\t\t\t\t.catch(function(error) {\n\t\t\t\t\tpluginHandle.consentDialog(false);\n\t\t\t\t\tcallbacks.error('enumerateDevices error', error);\n\t\t\t\t});\n\t\t\t}\n\t\t} else {\n\t\t\t// No need to do a getUserMedia, create offer/answer right away\n\t\t\tstreamsDone(handleId, jsep, media, callbacks);\n\t\t}\n\t}\n\n\tfunction prepareWebrtcPeer(handleId, callbacks) {\n\t\tcallbacks = callbacks || {};\n\t\tcallbacks.success = (typeof callbacks.success == \"function\") ? callbacks.success : Janus.noop;\n\t\tcallbacks.error = (typeof callbacks.error == \"function\") ? callbacks.error : webrtcError;\n\t\tvar jsep = callbacks.jsep;\n\t\tvar pluginHandle = pluginHandles[handleId];\n\t\tif(pluginHandle === null || pluginHandle === undefined ||\n\t\t\t\tpluginHandle.webrtcStuff === null || pluginHandle.webrtcStuff === undefined) {\n\t\t\tJanus.warn(\"Invalid handle\");\n\t\t\tcallbacks.error(\"Invalid handle\");\n\t\t\treturn;\n\t\t}\n\t\tvar config = pluginHandle.webrtcStuff;\n\t\tif(jsep !== undefined && jsep !== null) {\n\t\t\tif(config.pc === null) {\n\t\t\t\tJanus.warn(\"Wait, no PeerConnection?? if this is an answer, use createAnswer and not handleRemoteJsep\");\n\t\t\t\tcallbacks.error(\"No PeerConnection: if this is an answer, use createAnswer and not handleRemoteJsep\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconfig.pc.setRemoteDescription(\n\t\t\t\t\tnew RTCSessionDescription(jsep),\n\t\t\t\t\tfunction() {\n\t\t\t\t\t\tJanus.log(\"Remote description accepted!\");\n\t\t\t\t\t\tcallbacks.success();\n\t\t\t\t\t}, callbacks.error);\n\t\t} else {\n\t\t\tcallbacks.error(\"Invalid JSEP\");\n\t\t}\n\t}\n\n\tfunction createOffer(handleId, media, callbacks) {\n\t\tconsole.warn(\"createOffer:\", media);\n\n\t\tcallbacks = callbacks || {};\n\t\tcallbacks.success = (typeof callbacks.success == \"function\") ? callbacks.success : Janus.noop;\n\t\tcallbacks.error = (typeof callbacks.error == \"function\") ? callbacks.error : Janus.noop;\n\t\tvar pluginHandle = pluginHandles[handleId];\n\t\tif(pluginHandle === null || pluginHandle === undefined ||\n\t\t\t\tpluginHandle.webrtcStuff === null || pluginHandle.webrtcStuff === undefined) {\n\t\t\tJanus.warn(\"Invalid handle\");\n\t\t\tcallbacks.error(\"Invalid handle\");\n\t\t\treturn;\n\t\t}\n\t\tvar config = pluginHandle.webrtcStuff;\n\t\tvar simulcast = callbacks.simulcast === true ? true : false;\n\t\tif(!simulcast) {\n\t\t\tJanus.log(\"Creating offer (iceDone=\" + config.iceDone + \")\");\n\t\t} else {\n\t\t\tJanus.log(\"Creating offer (iceDone=\" + config.iceDone + \", simulcast=\" + simulcast + \")\");\n\t\t}\n\t\t// https://code.google.com/p/webrtc/issues/detail?id=3508\n\t\tvar mediaConstraints = {\n\t\t\t'offerToReceiveAudio':isAudioRecvEnabled(media),\n\t\t\t'offerToReceiveVideo':isVideoRecvEnabled(media)\n\t\t};\n\t\tvar iceRestart = callbacks.iceRestart === true ? true : false;\n\t\tif(iceRestart) {\n\t\t\tmediaConstraints[\"iceRestart\"] = true;\n\t\t}\n\t\tJanus.debug(mediaConstraints);\n\t\t// Check if this is Firefox and we've been asked to do simulcasting\n\t\tvar sendVideo = isVideoSendEnabled(media);\n\t\tif(sendVideo && simulcast && Janus.webRTCAdapter.browserDetails.browser === \"firefox\") {\n\t\t\t// FIXME Based on https://gist.github.com/voluntas/088bc3cc62094730647b\n\t\t\tJanus.log(\"Enabling Simulcasting for Firefox (RID)\");\n\t\t\tvar sender = config.pc.getSenders()[1];\n\t\t\tJanus.log(sender);\n\t\t\tvar parameters = sender.getParameters();\n\t\t\tJanus.log(parameters);\n\t\t\tsender.setParameters({encodings: [\n\t\t\t\t{ rid: \"high\", active: true, priority: \"high\", maxBitrate: 1000000 },\n\t\t\t\t{ rid: \"medium\", active: true, priority: \"medium\", maxBitrate: 300000 },\n\t\t\t\t{ rid: \"low\", active: true, priority: \"low\", maxBitrate: 100000 }\n\t\t\t]});\n\t\t}\n\t\tconfig.pc.createOffer(\n\t\t\tfunction(offer) {\n\t\t\t\tJanus.debug(offer);\n\t\t\t\tJanus.log(\"Setting local description\");\n\t\t\t\tif(sendVideo && simulcast) {\n\t\t\t\t\t// This SDP munging only works with Chrome\n\t\t\t\t\tif(Janus.webRTCAdapter.browserDetails.browser === \"chrome\") {\n\t\t\t\t\t\tJanus.log(\"Enabling Simulcasting for Chrome (SDP munging)\");\n\t\t\t\t\t\toffer.sdp = mungeSdpForSimulcasting(offer.sdp);\n\t\t\t\t\t} else if(Janus.webRTCAdapter.browserDetails.browser !== \"firefox\") {\n\t\t\t\t\t\tJanus.warn(\"simulcast=true, but this is not Chrome nor Firefox, ignoring\");\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tconfig.mySdp = offer.sdp;\n\t\t\t\tconfig.pc.setLocalDescription(offer);\n\t\t\t\tconfig.mediaConstraints = mediaConstraints;\n\t\t\t\tif(!config.iceDone && !config.trickle) {\n\t\t\t\t\t// Don't do anything until we have all candidates\n\t\t\t\t\tJanus.log(\"Waiting for all candidates...\");\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tJanus.log(\"Offer ready\");\n\t\t\t\tJanus.debug(callbacks);\n\t\t\t\t// JSON.stringify doesn't work on some WebRTC objects anymore\n\t\t\t\t// See https://code.google.com/p/chromium/issues/detail?id=467366\n\t\t\t\tvar jsep = {\n\t\t\t\t\t\"type\": offer.type,\n\t\t\t\t\t\"sdp\": offer.sdp\n\t\t\t\t};\n\t\t\t\tcallbacks.success(jsep);\n\t\t\t}, callbacks.error, mediaConstraints);\n\t}\n\n\tfunction createAnswer(handleId, media, callbacks) {\n\t\tcallbacks = callbacks || {};\n\t\tcallbacks.success = (typeof callbacks.success == \"function\") ? callbacks.success : Janus.noop;\n\t\tcallbacks.error = (typeof callbacks.error == \"function\") ? callbacks.error : Janus.noop;\n\t\tvar pluginHandle = pluginHandles[handleId];\n\t\tif(pluginHandle === null || pluginHandle === undefined ||\n\t\t\t\tpluginHandle.webrtcStuff === null || pluginHandle.webrtcStuff === undefined) {\n\t\t\tJanus.warn(\"Invalid handle\");\n\t\t\tcallbacks.error(\"Invalid handle\");\n\t\t\treturn;\n\t\t}\n\t\tvar config = pluginHandle.webrtcStuff;\n\t\tvar simulcast = callbacks.simulcast === true ? true : false;\n\t\tif(!simulcast) {\n\t\t\tJanus.log(\"Creating answer (iceDone=\" + config.iceDone + \")\");\n\t\t} else {\n\t\t\tJanus.log(\"Creating answer (iceDone=\" + config.iceDone + \", simulcast=\" + simulcast + \")\");\n\t\t}\n\t\tvar mediaConstraints = null;\n\t\tif(Janus.webRTCAdapter.browserDetails.browser == \"firefox\" || Janus.webRTCAdapter.browserDetails.browser == \"edge\") {\n\t\t\tmediaConstraints = {\n\t\t\t\t'offerToReceiveAudio':isAudioRecvEnabled(media),\n\t\t\t\t'offerToReceiveVideo':isVideoRecvEnabled(media)\n\t\t\t};\n\t\t} else {\n\t\t\tmediaConstraints = {\n\t\t\t\t'mandatory': {\n\t\t\t\t\t'OfferToReceiveAudio':isAudioRecvEnabled(media),\n\t\t\t\t\t'OfferToReceiveVideo':isVideoRecvEnabled(media)\n\t\t\t\t}\n\t\t\t};\n\t\t}\n\t\tJanus.debug(mediaConstraints);\n\t\t// Check if this is Firefox and we've been asked to do simulcasting\n\t\tvar sendVideo = isVideoSendEnabled(media);\n\t\tif(sendVideo && simulcast && Janus.webRTCAdapter.browserDetails.browser === \"firefox\") {\n\t\t\t// FIXME Based on https://gist.github.com/voluntas/088bc3cc62094730647b\n\t\t\tJanus.log(\"Enabling Simulcasting for Firefox (RID)\");\n\t\t\tvar sender = config.pc.getSenders()[1];\n\t\t\tJanus.log(sender);\n\t\t\tvar parameters = sender.getParameters();\n\t\t\tJanus.log(parameters);\n\t\t\tsender.setParameters({encodings: [\n\t\t\t\t{ rid: \"high\", active: true, priority: \"high\", maxBitrate: 1000000 },\n\t\t\t\t{ rid: \"medium\", active: true, priority: \"medium\", maxBitrate: 300000 },\n\t\t\t\t{ rid: \"low\", active: true, priority: \"low\", maxBitrate: 100000 }\n\t\t\t]});\n\t\t}\n\t\tconfig.pc.createAnswer(\n\t\t\tfunction(answer) {\n\t\t\t\tJanus.debug(answer);\n\t\t\t\tJanus.log(\"Setting local description\");\n\t\t\t\tif(sendVideo && simulcast) {\n\t\t\t\t\t// This SDP munging only works with Chrome\n\t\t\t\t\tif(Janus.webRTCAdapter.browserDetails.browser === \"chrome\") {\n\t\t\t\t\t\t// FIXME Apparently trying to simulcast when answering breaks video in Chrome...\n\t\t\t\t\t\t//~ Janus.log(\"Enabling Simulcasting for Chrome (SDP munging)\");\n\t\t\t\t\t\t//~ answer.sdp = mungeSdpForSimulcasting(answer.sdp);\n\t\t\t\t\t\tJanus.warn(\"simulcast=true, but this is an answer, and video breaks in Chrome if we enable it\");\n\t\t\t\t\t} else if(Janus.webRTCAdapter.browserDetails.browser !== \"firefox\") {\n\t\t\t\t\t\tJanus.warn(\"simulcast=true, but this is not Chrome nor Firefox, ignoring\");\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tconfig.mySdp = answer.sdp;\n\t\t\t\tconfig.pc.setLocalDescription(answer);\n\t\t\t\tconfig.mediaConstraints = mediaConstraints;\n\t\t\t\tif(!config.iceDone && !config.trickle) {\n\t\t\t\t\t// Don't do anything until we have all candidates\n\t\t\t\t\tJanus.log(\"Waiting for all candidates...\");\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\t// JSON.stringify doesn't work on some WebRTC objects anymore\n\t\t\t\t// See https://code.google.com/p/chromium/issues/detail?id=467366\n\t\t\t\tvar jsep = {\n\t\t\t\t\t\"type\": answer.type,\n\t\t\t\t\t\"sdp\": answer.sdp\n\t\t\t\t};\n\t\t\t\tcallbacks.success(jsep);\n\t\t\t}, callbacks.error, mediaConstraints);\n\t}\n\n\tfunction sendSDP(handleId, callbacks) {\n\t\tcallbacks = callbacks || {};\n\t\tcallbacks.success = (typeof callbacks.success == \"function\") ? callbacks.success : Janus.noop;\n\t\tcallbacks.error = (typeof callbacks.error == \"function\") ? callbacks.error : Janus.noop;\n\t\tvar pluginHandle = pluginHandles[handleId];\n\t\tif(pluginHandle === null || pluginHandle === undefined ||\n\t\t\t\tpluginHandle.webrtcStuff === null || pluginHandle.webrtcStuff === undefined) {\n\t\t\tJanus.warn(\"Invalid handle, not sending anything\");\n\t\t\treturn;\n\t\t}\n\t\tvar config = pluginHandle.webrtcStuff;\n\t\tJanus.log(\"Sending offer/answer SDP...\");\n\t\tif(config.mySdp === null || config.mySdp === undefined) {\n\t\t\tJanus.warn(\"Local SDP instance is invalid, not sending anything...\");\n\t\t\treturn;\n\t\t}\n\t\tconfig.mySdp = {\n\t\t\t\"type\": config.pc.localDescription.type,\n\t\t\t\"sdp\": config.pc.localDescription.sdp\n\t\t};\n\t\tif(config.trickle === false)\n\t\t\tconfig.mySdp[\"trickle\"] = false;\n\t\tJanus.debug(callbacks);\n\t\tconfig.sdpSent = true;\n\t\tcallbacks.success(config.mySdp);\n\t}\n\n\tfunction getVolume(handleId) {\n\t\tvar pluginHandle = pluginHandles[handleId];\n\t\tif(pluginHandle === null || pluginHandle === undefined ||\n\t\t\t\tpluginHandle.webrtcStuff === null || pluginHandle.webrtcStuff === undefined) {\n\t\t\tJanus.warn(\"Invalid handle\");\n\t\t\treturn 0;\n\t\t}\n\t\tvar config = pluginHandle.webrtcStuff;\n\t\t// Start getting the volume, if getStats is supported\n\t\tif(config.pc.getStats && Janus.webRTCAdapter.browserDetails.browser == \"chrome\") {\t// FIXME\n\t\t\tif(config.remoteStream === null || config.remoteStream === undefined) {\n\t\t\t\tJanus.warn(\"Remote stream unavailable\");\n\t\t\t\treturn 0;\n\t\t\t}\n\t\t\t// http://webrtc.googlecode.com/svn/trunk/samples/js/demos/html/constraints-and-stats.html\n\t\t\tif(config.volume.timer === null || config.volume.timer === undefined) {\n\t\t\t\tJanus.log(\"Starting volume monitor\");\n\t\t\t\tconfig.volume.timer = setInterval(function() {\n\t\t\t\t\tconfig.pc.getStats(function(stats) {\n\t\t\t\t\t\tvar results = stats.result();\n\t\t\t\t\t\tfor(var i=0; i<results.length; i++) {\n\t\t\t\t\t\t\tvar res = results[i];\n\t\t\t\t\t\t\tif(res.type == 'ssrc' && res.stat('audioOutputLevel')) {\n\t\t\t\t\t\t\t\tconfig.volume.value = res.stat('audioOutputLevel');\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}, 200);\n\t\t\t\treturn 0;\t// We don't have a volume to return yet\n\t\t\t}\n\t\t\treturn config.volume.value;\n\t\t} else {\n\t\t\tJanus.log(\"Getting the remote volume unsupported by browser\");\n\t\t\treturn 0;\n\t\t}\n\t}\n\n\tfunction isMuted(handleId, video) {\n\t\tvar pluginHandle = pluginHandles[handleId];\n\t\tif(pluginHandle === null || pluginHandle === undefined ||\n\t\t\t\tpluginHandle.webrtcStuff === null || pluginHandle.webrtcStuff === undefined) {\n\t\t\tJanus.warn(\"Invalid handle\");\n\t\t\treturn true;\n\t\t}\n\t\tvar config = pluginHandle.webrtcStuff;\n\t\tif(config.pc === null || config.pc === undefined) {\n\t\t\tJanus.warn(\"Invalid PeerConnection\");\n\t\t\treturn true;\n\t\t}\n\t\tif(config.myStream === undefined || config.myStream === null) {\n\t\t\tJanus.warn(\"Invalid local MediaStream\");\n\t\t\treturn true;\n\t\t}\n\t\tif(video) {\n\t\t\t// Check video track\n\t\t\tif(config.myStream.getVideoTracks() === null\n\t\t\t\t\t|| config.myStream.getVideoTracks() === undefined\n\t\t\t\t\t|| config.myStream.getVideoTracks().length === 0) {\n\t\t\t\tJanus.warn(\"No video track\");\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\treturn !config.myStream.getVideoTracks()[0].enabled;\n\t\t} else {\n\t\t\t// Check audio track\n\t\t\tif(config.myStream.getAudioTracks() === null\n\t\t\t\t\t|| config.myStream.getAudioTracks() === undefined\n\t\t\t\t\t|| config.myStream.getAudioTracks().length === 0) {\n\t\t\t\tJanus.warn(\"No audio track\");\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\treturn !config.myStream.getAudioTracks()[0].enabled;\n\t\t}\n\t}\n\n\tfunction mute(handleId, video, mute) {\n\t\tvar pluginHandle = pluginHandles[handleId];\n\t\tif(pluginHandle === null || pluginHandle === undefined ||\n\t\t\t\tpluginHandle.webrtcStuff === null || pluginHandle.webrtcStuff === undefined) {\n\t\t\tJanus.warn(\"Invalid handle\");\n\t\t\treturn false;\n\t\t}\n\t\tvar config = pluginHandle.webrtcStuff;\n\t\tif(config.pc === null || config.pc === undefined) {\n\t\t\tJanus.warn(\"Invalid PeerConnection\");\n\t\t\treturn false;\n\t\t}\n\t\tif(config.myStream === undefined || config.myStream === null) {\n\t\t\tJanus.warn(\"Invalid local MediaStream\");\n\t\t\treturn false;\n\t\t}\n\t\tif(video) {\n\t\t\t// Mute/unmute video track\n\t\t\tif(config.myStream.getVideoTracks() === null\n\t\t\t\t\t|| config.myStream.getVideoTracks() === undefined\n\t\t\t\t\t|| config.myStream.getVideoTracks().length === 0) {\n\t\t\t\tJanus.warn(\"No video track\");\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tconfig.myStream.getVideoTracks()[0].enabled = mute ? false : true;\n\t\t\treturn true;\n\t\t} else {\n\t\t\t// Mute/unmute audio track\n\t\t\tif(config.myStream.getAudioTracks() === null\n\t\t\t\t\t|| config.myStream.getAudioTracks() === undefined\n\t\t\t\t\t|| config.myStream.getAudioTracks().length === 0) {\n\t\t\t\tJanus.warn(\"No audio track\");\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tconfig.myStream.getAudioTracks()[0].enabled = mute ? false : true;\n\t\t\treturn true;\n\t\t}\n\t}\n\n\tfunction getBitrate(handleId) {\n\t\tvar pluginHandle = pluginHandles[handleId];\n\t\tif(pluginHandle === null || pluginHandle === undefined ||\n\t\t\t\tpluginHandle.webrtcStuff === null || pluginHandle.webrtcStuff === undefined) {\n\t\t\tJanus.warn(\"Invalid handle\");\n\t\t\treturn \"Invalid handle\";\n\t\t}\n\t\tvar config = pluginHandle.webrtcStuff;\n\t\tif(config.pc === null || config.pc === undefined)\n\t\t\treturn \"Invalid PeerConnection\";\n\t\t// Start getting the bitrate, if getStats is supported\n\t\tif(config.pc.getStats) {\n\t\t\tif(config.bitrate.timer === null || config.bitrate.timer === undefined) {\n\t\t\t\tJanus.log(\"Starting bitrate timer (via getStats)\");\n\t\t\t\tconfig.bitrate.timer = setInterval(function() {\n\t\t\t\t\tconfig.pc.getStats()\n\t\t\t\t\t\t.then(function(stats) {\n\t\t\t\t\t\t\tstats.forEach(function (res) {\n\t\t\t\t\t\t\t\tif(!res)\n\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\tvar inStats = false;\n\t\t\t\t\t\t\t\t// Check if these are statistics on incoming media\n\t\t\t\t\t\t\t\tif((res.mediaType === \"video\" || res.id.toLowerCase().indexOf(\"video\") > -1) &&\n\t\t\t\t\t\t\t\t\t\tres.type === \"inbound-rtp\" && res.id.indexOf(\"rtcp\") < 0) {\n\t\t\t\t\t\t\t\t\t// New stats\n\t\t\t\t\t\t\t\t\tinStats = true;\n\t\t\t\t\t\t\t\t} else if(res.type == 'ssrc' && res.bytesReceived &&\n\t\t\t\t\t\t\t\t\t\t(res.googCodecName === \"VP8\" || res.googCodecName === \"\")) {\n\t\t\t\t\t\t\t\t\t// Older Chromer versions\n\t\t\t\t\t\t\t\t\tinStats = true;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t// Parse stats now\n\t\t\t\t\t\t\t\tif(inStats) {\n\t\t\t\t\t\t\t\t\tconfig.bitrate.bsnow = res.bytesReceived;\n\t\t\t\t\t\t\t\t\tconfig.bitrate.tsnow = res.timestamp;\n\t\t\t\t\t\t\t\t\tif(config.bitrate.bsbefore === null || config.bitrate.tsbefore === null) {\n\t\t\t\t\t\t\t\t\t\t// Skip this round\n\t\t\t\t\t\t\t\t\t\tconfig.bitrate.bsbefore = config.bitrate.bsnow;\n\t\t\t\t\t\t\t\t\t\tconfig.bitrate.tsbefore = config.bitrate.tsnow;\n\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\t// Calculate bitrate\n\t\t\t\t\t\t\t\t\t\tvar timePassed = config.bitrate.tsnow - config.bitrate.tsbefore;\n\t\t\t\t\t\t\t\t\t\tif(Janus.webRTCAdapter.browserDetails.browser == \"safari\")\n\t\t\t\t\t\t\t\t\t\t\ttimePassed = timePassed/1000;\t// Apparently the timestamp is in microseconds, in Safari\n\t\t\t\t\t\t\t\t\t\tvar bitRate = Math.round((config.bitrate.bsnow - config.bitrate.bsbefore) * 8 / timePassed);\n\t\t\t\t\t\t\t\t\t\tconfig.bitrate.value = bitRate + ' kbits/sec';\n\t\t\t\t\t\t\t\t\t\t//~ Janus.log(\"Estimated bitrate is \" + config.bitrate.value);\n\t\t\t\t\t\t\t\t\t\tconfig.bitrate.bsbefore = config.bitrate.bsnow;\n\t\t\t\t\t\t\t\t\t\tconfig.bitrate.tsbefore = config.bitrate.tsnow;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t});\n\t\t\t\t}, 1000);\n\t\t\t\treturn \"0 kbits/sec\";\t// We don't have a bitrate value yet\n\t\t\t}\n\t\t\treturn config.bitrate.value;\n\t\t} else {\n\t\t\tJanus.warn(\"Getting the video bitrate unsupported by browser\");\n\t\t\treturn \"Feature unsupported by browser\";\n\t\t}\n\t}\n\n\tfunction webrtcError(error) {\n\t\tJanus.error(\"WebRTC error:\", error);\n\t}\n\n\tfunction cleanupWebrtc(handleId, hangupRequest) {\n\t\tJanus.log(\"Cleaning WebRTC stuff\");\n\t\tvar pluginHandle = pluginHandles[handleId];\n\t\tif(pluginHandle === null || pluginHandle === undefined) {\n\t\t\t// Nothing to clean\n\t\t\treturn;\n\t\t}\n\t\tvar config = pluginHandle.webrtcStuff;\n\t\tif(config !== null && config !== undefined) {\n\t\t\tif(hangupRequest === true) {\n\t\t\t\t// Send a hangup request (we don't really care about the response)\n\t\t\t\tvar request = { \"janus\": \"hangup\", \"transaction\": Janus.randomString(12) };\n\t\t\t\tif(token !== null && token !== undefined)\n\t\t\t\t\trequest[\"token\"] = token;\n\t\t\t\tif(apisecret !== null && apisecret !== undefined)\n\t\t\t\t\trequest[\"apisecret\"] = apisecret;\n\t\t\t\tJanus.debug(\"Sending hangup request (handle=\" + handleId + \"):\");\n\t\t\t\tJanus.debug(request);\n\t\t\t\tif(websockets) {\n\t\t\t\t\trequest[\"session_id\"] = sessionId;\n\t\t\t\t\trequest[\"handle_id\"] = handleId;\n\t\t\t\t\tws.send(JSON.stringify(request));\n\t\t\t\t} else {\n\t\t\t\t\tJanus.httpAPICall(server + \"/\" + sessionId + \"/\" + handleId, {\n\t\t\t\t\t\tverb: 'POST',\n\t\t\t\t\t\twithCredentials: withCredentials,\n\t\t\t\t\t\tdata: request\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Cleanup stack\n\t\t\tconfig.remoteStream = null;\n\t\t\tif(config.volume.timer)\n\t\t\t\tclearInterval(config.volume.timer);\n\t\t\tconfig.volume.value = null;\n\t\t\tif(config.bitrate.timer)\n\t\t\t\tclearInterval(config.bitrate.timer);\n\t\t\tconfig.bitrate.timer = null;\n\t\t\tconfig.bitrate.bsnow = null;\n\t\t\tconfig.bitrate.bsbefore = null;\n\t\t\tconfig.bitrate.tsnow = null;\n\t\t\tconfig.bitrate.tsbefore = null;\n\t\t\tconfig.bitrate.value = null;\n\t\t\ttry {\n\t\t\t\t// Try a MediaStreamTrack.stop() for each track\n\t\t\t\tif(!config.streamExternal && config.myStream !== null && config.myStream !== undefined) {\n\t\t\t\t\tJanus.log(\"Stopping local stream tracks\");\n\t\t\t\t\tvar tracks = config.myStream.getTracks();\n\t\t\t\t\tfor(var i in tracks) {\n\t\t\t\t\t\tvar mst = tracks[i];\n\t\t\t\t\t\tJanus.log(mst);\n\t\t\t\t\t\tif(mst !== null && mst !== undefined)\n\t\t\t\t\t\t\tmst.stop();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} catch(e) {\n\t\t\t\t// Do nothing if this fails\n\t\t\t}\n\t\t\tconfig.streamExternal = false;\n\t\t\tconfig.myStream = null;\n\t\t\t// Close PeerConnection\n\t\t\ttry {\n\t\t\t\tconfig.pc.close();\n\t\t\t} catch(e) {\n\t\t\t\t// Do nothing\n\t\t\t}\n\t\t\tconfig.pc = null;\n\t\t\tconfig.mySdp = null;\n\t\t\tconfig.iceDone = false;\n\t\t\tconfig.dataChannel = null;\n\t\t\tconfig.dtmfSender = null;\n\t\t}\n\t\tpluginHandle.oncleanup();\n\t}\n\n\t// Helper method to munge an SDP to enable simulcasting (Chrome only)\n\tfunction mungeSdpForSimulcasting(sdp) {\n\t\t// Let's munge the SDP to add the attributes for enabling simulcasting\n\t\t// (based on https://gist.github.com/ggarber/a19b4c33510028b9c657)\n\t\tvar lines = sdp.split(\"\\r\\n\");\n\t\tvar video = false;\n\t\tvar ssrc = [ -1 ], ssrc_fid = -1;\n\t\tvar cname = null, msid = null, mslabel = null, label = null;\n\t\tvar insertAt = -1;\n\t\tfor(var i=0; i<lines.length; i++) {\n\t\t\tvar mline = lines[i].match(/m=(\\w+) */);\n\t\t\tif(mline) {\n\t\t\t\tvar medium = mline[1];\n\t\t\t\tif(medium === \"video\") {\n\t\t\t\t\t// New video m-line: make sure it's the first one\n\t\t\t\t\tif(ssrc[0] < 0) {\n\t\t\t\t\t\tvideo = true;\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// We're done, let's add the new attributes here\n\t\t\t\t\t\tinsertAt = i;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// New non-video m-line: do we have what we were looking for?\n\t\t\t\t\tif(ssrc[0] > -1) {\n\t\t\t\t\t\t// We're done, let's add the new attributes here\n\t\t\t\t\t\tinsertAt = i;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif(!video)\n\t\t\t\tcontinue;\n\t\t\tvar fid = lines[i].match(/a=ssrc-group:FID (\\d+) (\\d+)/);\n\t\t\tif(fid) {\n\t\t\t\tssrc[0] = fid[1];\n\t\t\t\tssrc_fid = fid[2];\n\t\t\t\tlines.splice(i, 1); i--;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif(ssrc[0]) {\n\t\t\t\tvar match = lines[i].match('a=ssrc:' + ssrc[0] + ' cname:(.+)');\n\t\t\t\tif(match) {\n\t\t\t\t\tcname = match[1];\n\t\t\t\t}\n\t\t\t\tmatch = lines[i].match('a=ssrc:' + ssrc[0] + ' msid:(.+)');\n\t\t\t\tif(match) {\n\t\t\t\t\tmsid = match[1];\n\t\t\t\t}\n\t\t\t\tmatch = lines[i].match('a=ssrc:' + ssrc[0] + ' mslabel:(.+)');\n\t\t\t\tif(match) {\n\t\t\t\t\tmslabel = match[1];\n\t\t\t\t}\n\t\t\t\tmatch = lines[i].match('a=ssrc:' + ssrc + ' label:(.+)');\n\t\t\t\tif(match) {\n\t\t\t\t\tlabel = match[1];\n\t\t\t\t}\n\t\t\t\tif(lines[i].indexOf('a=ssrc:' + ssrc_fid) === 0) {\n\t\t\t\t\tlines.splice(i, 1); i--;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tif(lines[i].indexOf('a=ssrc:' + ssrc[0]) === 0) {\n\t\t\t\t\tlines.splice(i, 1); i--;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif(lines[i].length == 0) {\n\t\t\t\tlines.splice(i, 1); i--;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t}\n\t\tif(ssrc[0] < 0) {\n\t\t\t// Couldn't find a FID attribute, let's just take the first video SSRC we find\n\t\t\tinsertAt = -1;\n\t\t\tvideo = false;\n\t\t\tfor(var i=0; i<lines.length; i++) {\n\t\t\t\tvar mline = lines[i].match(/m=(\\w+) */);\n\t\t\t\tif(mline) {\n\t\t\t\t\tvar medium = mline[1];\n\t\t\t\t\tif(medium === \"video\") {\n\t\t\t\t\t\t// New video m-line: make sure it's the first one\n\t\t\t\t\t\tif(ssrc[0] < 0) {\n\t\t\t\t\t\t\tvideo = true;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// We're done, let's add the new attributes here\n\t\t\t\t\t\t\tinsertAt = i;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// New non-video m-line: do we have what we were looking for?\n\t\t\t\t\t\tif(ssrc[0] > -1) {\n\t\t\t\t\t\t\t// We're done, let's add the new attributes here\n\t\t\t\t\t\t\tinsertAt = i;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tif(!video)\n\t\t\t\t\tcontinue;\n\t\t\t\tif(ssrc[0] < 0) {\n\t\t\t\t\tvar value = lines[i].match(/a=ssrc:(\\d+)/);\n\t\t\t\t\tif(value) {\n\t\t\t\t\t\tssrc[0] = value[1];\n\t\t\t\t\t\tlines.splice(i, 1); i--;\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tvar match = lines[i].match('a=ssrc:' + ssrc[0] + ' cname:(.+)');\n\t\t\t\t\tif(match) {\n\t\t\t\t\t\tcname = match[1];\n\t\t\t\t\t}\n\t\t\t\t\tmatch = lines[i].match('a=ssrc:' + ssrc[0] + ' msid:(.+)');\n\t\t\t\t\tif(match) {\n\t\t\t\t\t\tmsid = match[1];\n\t\t\t\t\t}\n\t\t\t\t\tmatch = lines[i].match('a=ssrc:' + ssrc[0] + ' mslabel:(.+)');\n\t\t\t\t\tif(match) {\n\t\t\t\t\t\tmslabel = match[1];\n\t\t\t\t\t}\n\t\t\t\t\tmatch = lines[i].match('a=ssrc:' + ssrc + ' label:(.+)');\n\t\t\t\t\tif(match) {\n\t\t\t\t\t\tlabel = match[1];\n\t\t\t\t\t}\n\t\t\t\t\tif(lines[i].indexOf('a=ssrc:' + ssrc_fid) === 0) {\n\t\t\t\t\t\tlines.splice(i, 1); i--;\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tif(lines[i].indexOf('a=ssrc:' + ssrc[0]) === 0) {\n\t\t\t\t\t\tlines.splice(i, 1); i--;\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif(lines[i].length == 0) {\n\t\t\t\t\tlines.splice(i, 1); i--;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif(ssrc[0] < 0) {\n\t\t\t// Still nothing, let's just return the SDP we were asked to munge\n\t\t\tJanus.warn(\"Couldn't find the video SSRC, simulcasting NOT enabled\");\n\t\t\treturn sdp;\n\t\t}\n\t\tif(insertAt < 0) {\n\t\t\t// Append at the end\n\t\t\tinsertAt = lines.length;\n\t\t}\n\t\t// Generate a couple of SSRCs\n\t\tssrc[1] = Math.floor(Math.random()*0xFFFFFFFF);\n\t\tssrc[2] = Math.floor(Math.random()*0xFFFFFFFF);\n\t\t// Add attributes to the SDP\n\t\tfor(var i=0; i<ssrc.length; i++) {\n\t\t\tif(cname) {\n\t\t\t\tlines.splice(insertAt, 0, 'a=ssrc:' + ssrc[i] + ' cname:' + cname);\n\t\t\t\tinsertAt++;\n\t\t\t}\n\t\t\tif(msid) {\n\t\t\t\tlines.splice(insertAt, 0, 'a=ssrc:' + ssrc[i] + ' msid:' + msid);\n\t\t\t\tinsertAt++;\n\t\t\t}\n\t\t\tif(mslabel) {\n\t\t\t\tlines.splice(insertAt, 0, 'a=ssrc:' + ssrc[i] + ' mslabel:' + msid);\n\t\t\t\tinsertAt++;\n\t\t\t}\n\t\t\tif(label) {\n\t\t\t\tlines.splice(insertAt, 0, 'a=ssrc:' + ssrc[i] + ' label:' + msid);\n\t\t\t\tinsertAt++;\n\t\t\t}\n\t\t}\n\t\tlines.splice(insertAt, 0, 'a=ssrc-group:SIM ' + ssrc[0] + ' ' + ssrc[1] + ' ' + ssrc[2]);\n\t\tsdp = lines.join(\"\\r\\n\");\n\t\tif(!sdp.endsWith(\"\\r\\n\"))\n\t\t\tsdp += \"\\r\\n\";\n\t\treturn sdp;\n\t}\n\n\t// Helper methods to parse a media object\n\tfunction isAudioSendEnabled(media) {\n\t\tJanus.debug(\"isAudioSendEnabled:\", media);\n\t\tif(media === undefined || media === null)\n\t\t\treturn true;\t// Default\n\t\tif(media.audio === false)\n\t\t\treturn false;\t// Generic audio has precedence\n\t\tif(media.audioSend === undefined || media.audioSend === null)\n\t\t\treturn true;\t// Default\n\t\treturn (media.audioSend === true);\n\t}\n\n\tfunction isAudioSendRequired(media) {\n\t\tJanus.debug(\"isAudioSendRequired:\", media);\n\t\tif(media === undefined || media === null)\n\t\t\treturn false;\t// Default\n\t\tif(media.audio === false || media.audioSend === false)\n\t\t\treturn false;\t// If we're not asking to capture audio, it's not required\n\t\tif(media.failIfNoAudio === undefined || media.failIfNoAudio === null)\n\t\t\treturn false;\t// Default\n\t\treturn (media.failIfNoAudio === true);\n\t}\n\n\tfunction isAudioRecvEnabled(media) {\n\t\tJanus.debug(\"isAudioRecvEnabled:\", media);\n\t\tif(media === undefined || media === null)\n\t\t\treturn true;\t// Default\n\t\tif(media.audio === false)\n\t\t\treturn false;\t// Generic audio has precedence\n\t\tif(media.audioRecv === undefined || media.audioRecv === null)\n\t\t\treturn true;\t// Default\n\t\treturn (media.audioRecv === true);\n\t}\n\n\tfunction isVideoSendEnabled(media) {\n\t\tJanus.debug(\"isVideoSendEnabled:\", media);\n\t\tif(media === undefined || media === null)\n\t\t\treturn true;\t// Default\n\t\tif(media.video === false)\n\t\t\treturn false;\t// Generic video has precedence\n\t\tif(media.videoSend === undefined || media.videoSend === null)\n\t\t\treturn true;\t// Default\n\t\treturn (media.videoSend === true);\n\t}\n\n\tfunction isVideoSendRequired(media) {\n\t\tJanus.debug(\"isVideoSendRequired:\", media);\n\t\tif(media === undefined || media === null)\n\t\t\treturn false;\t// Default\n\t\tif(media.video === false || media.videoSend === false)\n\t\t\treturn false;\t// If we're not asking to capture video, it's not required\n\t\tif(media.failIfNoVideo === undefined || media.failIfNoVideo === null)\n\t\t\treturn false;\t// Default\n\t\treturn (media.failIfNoVideo === true);\n\t}\n\n\tfunction isVideoRecvEnabled(media) {\n\t\tJanus.debug(\"isVideoRecvEnabled:\", media);\n\t\tif(media === undefined || media === null)\n\t\t\treturn true;\t// Default\n\t\tif(media.video === false)\n\t\t\treturn false;\t// Generic video has precedence\n\t\tif(media.videoRecv === undefined || media.videoRecv === null)\n\t\t\treturn true;\t// Default\n\t\treturn (media.videoRecv === true);\n\t}\n\n\tfunction isDataEnabled(media) {\n\t\tJanus.debug(\"isDataEnabled:\", media);\n\t\tif(Janus.webRTCAdapter.browserDetails.browser == \"edge\") {\n\t\t\tJanus.warn(\"Edge doesn't support data channels yet\");\n\t\t\treturn false;\n\t\t}\n\t\tif(media === undefined || media === null)\n\t\t\treturn false;\t// Default\n\t\treturn (media.data === true);\n\t}\n\n\tfunction isTrickleEnabled(trickle) {\n\t\tJanus.debug(\"isTrickleEnabled:\", trickle);\n\t\tif(trickle === undefined || trickle === null)\n\t\t\treturn true;\t// Default is true\n\t\treturn (trickle === true);\n\t}\n}\n\nreturn Janus;\n\n})));\n","/**\n * Copyright (c) 2014-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n */\n\nvar fbemitter = {\n  EventEmitter: require('./lib/BaseEventEmitter'),\n  EmitterSubscription : require('./lib/EmitterSubscription')\n};\n\nmodule.exports = fbemitter;\n","/**\n * Copyright (c) 2014-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule BaseEventEmitter\n * @typechecks\n */\n\n'use strict';\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\nvar EmitterSubscription = require('./EmitterSubscription');\nvar EventSubscriptionVendor = require('./EventSubscriptionVendor');\n\nvar emptyFunction = require('fbjs/lib/emptyFunction');\nvar invariant = require('fbjs/lib/invariant');\n\n/**\n * @class BaseEventEmitter\n * @description\n * An EventEmitter is responsible for managing a set of listeners and publishing\n * events to them when it is told that such events happened. In addition to the\n * data for the given event it also sends a event control object which allows\n * the listeners/handlers to prevent the default behavior of the given event.\n *\n * The emitter is designed to be generic enough to support all the different\n * contexts in which one might want to emit events. It is a simple multicast\n * mechanism on top of which extra functionality can be composed. For example, a\n * more advanced emitter may use an EventHolder and EventFactory.\n */\n\nvar BaseEventEmitter = (function () {\n  /**\n   * @constructor\n   */\n\n  function BaseEventEmitter() {\n    _classCallCheck(this, BaseEventEmitter);\n\n    this._subscriber = new EventSubscriptionVendor();\n    this._currentSubscription = null;\n  }\n\n  /**\n   * Adds a listener to be invoked when events of the specified type are\n   * emitted. An optional calling context may be provided. The data arguments\n   * emitted will be passed to the listener function.\n   *\n   * TODO: Annotate the listener arg's type. This is tricky because listeners\n   *       can be invoked with varargs.\n   *\n   * @param {string} eventType - Name of the event to listen to\n   * @param {function} listener - Function to invoke when the specified event is\n   *   emitted\n   * @param {*} context - Optional context object to use when invoking the\n   *   listener\n   */\n\n  BaseEventEmitter.prototype.addListener = function addListener(eventType, listener, context) {\n    return this._subscriber.addSubscription(eventType, new EmitterSubscription(this._subscriber, listener, context));\n  };\n\n  /**\n   * Similar to addListener, except that the listener is removed after it is\n   * invoked once.\n   *\n   * @param {string} eventType - Name of the event to listen to\n   * @param {function} listener - Function to invoke only once when the\n   *   specified event is emitted\n   * @param {*} context - Optional context object to use when invoking the\n   *   listener\n   */\n\n  BaseEventEmitter.prototype.once = function once(eventType, listener, context) {\n    var emitter = this;\n    return this.addListener(eventType, function () {\n      emitter.removeCurrentListener();\n      listener.apply(context, arguments);\n    });\n  };\n\n  /**\n   * Removes all of the registered listeners, including those registered as\n   * listener maps.\n   *\n   * @param {?string} eventType - Optional name of the event whose registered\n   *   listeners to remove\n   */\n\n  BaseEventEmitter.prototype.removeAllListeners = function removeAllListeners(eventType) {\n    this._subscriber.removeAllSubscriptions(eventType);\n  };\n\n  /**\n   * Provides an API that can be called during an eventing cycle to remove the\n   * last listener that was invoked. This allows a developer to provide an event\n   * object that can remove the listener (or listener map) during the\n   * invocation.\n   *\n   * If it is called when not inside of an emitting cycle it will throw.\n   *\n   * @throws {Error} When called not during an eventing cycle\n   *\n   * @example\n   *   var subscription = emitter.addListenerMap({\n   *     someEvent: function(data, event) {\n   *       console.log(data);\n   *       emitter.removeCurrentListener();\n   *     }\n   *   });\n   *\n   *   emitter.emit('someEvent', 'abc'); // logs 'abc'\n   *   emitter.emit('someEvent', 'def'); // does not log anything\n   */\n\n  BaseEventEmitter.prototype.removeCurrentListener = function removeCurrentListener() {\n    !!!this._currentSubscription ? process.env.NODE_ENV !== 'production' ? invariant(false, 'Not in an emitting cycle; there is no current subscription') : invariant(false) : undefined;\n    this._subscriber.removeSubscription(this._currentSubscription);\n  };\n\n  /**\n   * Returns an array of listeners that are currently registered for the given\n   * event.\n   *\n   * @param {string} eventType - Name of the event to query\n   * @return {array}\n   */\n\n  BaseEventEmitter.prototype.listeners = function listeners(eventType) /* TODO: Array<EventSubscription> */{\n    var subscriptions = this._subscriber.getSubscriptionsForType(eventType);\n    return subscriptions ? subscriptions.filter(emptyFunction.thatReturnsTrue).map(function (subscription) {\n      return subscription.listener;\n    }) : [];\n  };\n\n  /**\n   * Emits an event of the given type with the given data. All handlers of that\n   * particular type will be notified.\n   *\n   * @param {string} eventType - Name of the event to emit\n   * @param {*} Arbitrary arguments to be passed to each registered listener\n   *\n   * @example\n   *   emitter.addListener('someEvent', function(message) {\n   *     console.log(message);\n   *   });\n   *\n   *   emitter.emit('someEvent', 'abc'); // logs 'abc'\n   */\n\n  BaseEventEmitter.prototype.emit = function emit(eventType) {\n    var subscriptions = this._subscriber.getSubscriptionsForType(eventType);\n    if (subscriptions) {\n      var keys = Object.keys(subscriptions);\n      for (var ii = 0; ii < keys.length; ii++) {\n        var key = keys[ii];\n        var subscription = subscriptions[key];\n        // The subscription may have been removed during this event loop.\n        if (subscription) {\n          this._currentSubscription = subscription;\n          this.__emitToSubscription.apply(this, [subscription].concat(Array.prototype.slice.call(arguments)));\n        }\n      }\n      this._currentSubscription = null;\n    }\n  };\n\n  /**\n   * Provides a hook to override how the emitter emits an event to a specific\n   * subscription. This allows you to set up logging and error boundaries\n   * specific to your environment.\n   *\n   * @param {EmitterSubscription} subscription\n   * @param {string} eventType\n   * @param {*} Arbitrary arguments to be passed to each registered listener\n   */\n\n  BaseEventEmitter.prototype.__emitToSubscription = function __emitToSubscription(subscription, eventType) {\n    var args = Array.prototype.slice.call(arguments, 2);\n    subscription.listener.apply(subscription.context, args);\n  };\n\n  return BaseEventEmitter;\n})();\n\nmodule.exports = BaseEventEmitter;","/**\n * Copyright (c) 2014-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n *\n * @providesModule EventSubscription\n * @typechecks\n */\n\n'use strict';\n\n/**\n * EventSubscription represents a subscription to a particular event. It can\n * remove its own subscription.\n */\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\nvar EventSubscription = (function () {\n\n  /**\n   * @param {EventSubscriptionVendor} subscriber the subscriber that controls\n   *   this subscription.\n   */\n\n  function EventSubscription(subscriber) {\n    _classCallCheck(this, EventSubscription);\n\n    this.subscriber = subscriber;\n  }\n\n  /**\n   * Removes this subscription from the subscriber that controls it.\n   */\n\n  EventSubscription.prototype.remove = function remove() {\n    if (this.subscriber) {\n      this.subscriber.removeSubscription(this);\n      this.subscriber = null;\n    }\n  };\n\n  return EventSubscription;\n})();\n\nmodule.exports = EventSubscription;","/**\n * Copyright (c) 2014-present, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * LICENSE file in the root directory of this source tree. An additional grant\n * of patent rights can be found in the PATENTS file in the same directory.\n * \n * @providesModule EventSubscriptionVendor\n * @typechecks\n */\n\n'use strict';\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\nvar invariant = require('fbjs/lib/invariant');\n\n/**\n * EventSubscriptionVendor stores a set of EventSubscriptions that are\n * subscribed to a particular event type.\n */\n\nvar EventSubscriptionVendor = (function () {\n  function EventSubscriptionVendor() {\n    _classCallCheck(this, EventSubscriptionVendor);\n\n    this._subscriptionsForType = {};\n    this._currentSubscription = null;\n  }\n\n  /**\n   * Adds a subscription keyed by an event type.\n   *\n   * @param {string} eventType\n   * @param {EventSubscription} subscription\n   */\n\n  EventSubscriptionVendor.prototype.addSubscription = function addSubscription(eventType, subscription) {\n    !(subscription.subscriber === this) ? process.env.NODE_ENV !== 'production' ? invariant(false, 'The subscriber of the subscription is incorrectly set.') : invariant(false) : undefined;\n    if (!this._subscriptionsForType[eventType]) {\n      this._subscriptionsForType[eventType] = [];\n    }\n    var key = this._subscriptionsForType[eventType].length;\n    this._subscriptionsForType[eventType].push(subscription);\n    subscription.eventType = eventType;\n    subscription.key = key;\n    return subscription;\n  };\n\n  /**\n   * Removes a bulk set of the subscriptions.\n   *\n   * @param {?string} eventType - Optional name of the event type whose\n   *   registered supscriptions to remove, if null remove all subscriptions.\n   */\n\n  EventSubscriptionVendor.prototype.removeAllSubscriptions = function removeAllSubscriptions(eventType) {\n    if (eventType === undefined) {\n      this._subscriptionsForType = {};\n    } else {\n      delete this._subscriptionsForType[eventType];\n    }\n  };\n\n  /**\n   * Removes a specific subscription. Instead of calling this function, call\n   * `subscription.remove()` directly.\n   *\n   * @param {object} subscription\n   */\n\n  EventSubscriptionVendor.prototype.removeSubscription = function removeSubscription(subscription) {\n    var eventType = subscription.eventType;\n    var key = subscription.key;\n\n    var subscriptionsForType = this._subscriptionsForType[eventType];\n    if (subscriptionsForType) {\n      delete subscriptionsForType[key];\n    }\n  };\n\n  /**\n   * Returns the array of subscriptions that are currently registered for the\n   * given event type.\n   *\n   * Note: This array can be potentially sparse as subscriptions are deleted\n   * from it when they are removed.\n   *\n   * TODO: This returns a nullable array. wat?\n   *\n   * @param {string} eventType\n   * @return {?array}\n   */\n\n  EventSubscriptionVendor.prototype.getSubscriptionsForType = function getSubscriptionsForType(eventType) {\n    return this._subscriptionsForType[eventType];\n  };\n\n  return EventSubscriptionVendor;\n})();\n\nmodule.exports = EventSubscriptionVendor;","\"use strict\";\n\n/**\n * Copyright (c) 2013-present, Facebook, Inc.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n *\n * \n */\n\nfunction makeEmptyFunction(arg) {\n  return function () {\n    return arg;\n  };\n}\n\n/**\n * This function accepts and discards inputs; it has no side effects. This is\n * primarily useful idiomatically for overridable function endpoints which\n * always need to be callable, since JS lacks a null-call idiom ala Cocoa.\n */\nvar emptyFunction = function emptyFunction() {};\n\nemptyFunction.thatReturns = makeEmptyFunction;\nemptyFunction.thatReturnsFalse = makeEmptyFunction(false);\nemptyFunction.thatReturnsTrue = makeEmptyFunction(true);\nemptyFunction.thatReturnsNull = makeEmptyFunction(null);\nemptyFunction.thatReturnsThis = function () {\n  return this;\n};\nemptyFunction.thatReturnsArgument = function (arg) {\n  return arg;\n};\n\nmodule.exports = emptyFunction;"],"sourceRoot":""}