{"version":3,"file":"surveyjs-widgets.min.js","mappings":"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","sources":["webpack://surveyjs-widgets/webpack/universalModuleDefinition","webpack://surveyjs-widgets/./node_modules/recordrtc/RecordRTC.js","webpack://surveyjs-widgets/./src/images/editor.svg","webpack://surveyjs-widgets/./src/images/barrating.svg","webpack://surveyjs-widgets/./src/images/datepicker.svg","webpack://surveyjs-widgets/./src/images/microphone.svg","webpack://surveyjs-widgets/./src/images/nouislider.svg","webpack://surveyjs-widgets/./src/images/sortablejs.svg","webpack://surveyjs-widgets/./src/images/tagbox.svg","webpack://surveyjs-widgets/./src/bootstrap-slider.js","webpack://surveyjs-widgets/./src/ck-editor.js","webpack://surveyjs-widgets/./src/easy-autocomplete.js","webpack://surveyjs-widgets/./src/emotionsratings.js","webpack://surveyjs-widgets/./src/icheck.js","webpack://surveyjs-widgets/./src/inputmask.js","webpack://surveyjs-widgets/./src/jquery-bar-rating.js","webpack://surveyjs-widgets/./src/jquery-ui-datepicker.js","webpack://surveyjs-widgets/./src/microphone.js","webpack://surveyjs-widgets/./src/nouislider.js","webpack://surveyjs-widgets/./src/pretty-checkbox.js","webpack://surveyjs-widgets/./src/select2-tagbox.js","webpack://surveyjs-widgets/./src/select2.js","webpack://surveyjs-widgets/./src/sortablejs.js","webpack://surveyjs-widgets/external umd {\"root\":\"Inputmask\",\"commonjs2\":\"inputmask\",\"commonjs\":\"inputmask\",\"amd\":\"inputmask\"}","webpack://surveyjs-widgets/external umd {\"root\":\"Slider\",\"commonjs2\":\"bootstrap-slider\",\"commonjs\":\"bootstrap-slider\",\"amd\":\"bootstrap-slider\"}","webpack://surveyjs-widgets/external umd {\"root\":\"Sortable\",\"commonjs2\":\"sortablejs\",\"commonjs\":\"sortablejs\",\"amd\":\"sortablejs\"}","webpack://surveyjs-widgets/external umd {\"root\":\"noUiSlider\",\"commonjs2\":\"nouislider\",\"commonjs\":\"nouislider\",\"amd\":\"nouislider\"}","webpack://surveyjs-widgets/webpack/bootstrap","webpack://surveyjs-widgets/webpack/runtime/compat get default export","webpack://surveyjs-widgets/webpack/runtime/define property getters","webpack://surveyjs-widgets/webpack/runtime/global","webpack://surveyjs-widgets/webpack/runtime/hasOwnProperty shorthand","webpack://surveyjs-widgets/webpack/runtime/make namespace object","webpack://surveyjs-widgets/./src/bootstrapdatepicker.js"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory(require(\"inputmask\"), require(\"nouislider\"), require(\"sortablejs\"), require(\"bootstrap-slider\"));\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine(\"surveyjs-widgets\", [\"inputmask\", \"nouislider\", \"sortablejs\", \"bootstrap-slider\"], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"surveyjs-widgets\"] = factory(require(\"inputmask\"), require(\"nouislider\"), require(\"sortablejs\"), require(\"bootstrap-slider\"));\n\telse\n\t\troot[\"surveyjs-widgets\"] = factory(root[\"Inputmask\"], root[\"noUiSlider\"], root[\"Sortable\"], root[\"Slider\"]);\n})(self, (__WEBPACK_EXTERNAL_MODULE__801__, __WEBPACK_EXTERNAL_MODULE__658__, __WEBPACK_EXTERNAL_MODULE__976__, __WEBPACK_EXTERNAL_MODULE__851__) => {\nreturn ","'use strict';\r\n\r\n// Last time updated: 2021-03-09 3:20:22 AM UTC\r\n\r\n// ________________\r\n// RecordRTC v5.6.2\r\n\r\n// Open-Sourced: https://github.com/muaz-khan/RecordRTC\r\n\r\n// --------------------------------------------------\r\n// Muaz Khan - www.MuazKhan.com\r\n// MIT License - www.WebRTC-Experiment.com/licence\r\n// --------------------------------------------------\r\n\r\n// ____________\r\n// RecordRTC.js\r\n\r\n/**\r\n * {@link https://github.com/muaz-khan/RecordRTC|RecordRTC} is a WebRTC JavaScript library for audio/video as well as screen activity recording. It supports Chrome, Firefox, Opera, Android, and Microsoft Edge. Platforms: Linux, Mac and Windows. \r\n * @summary Record audio, video or screen inside the browser.\r\n * @license {@link https://github.com/muaz-khan/RecordRTC/blob/master/LICENSE|MIT}\r\n * @author {@link https://MuazKhan.com|Muaz Khan}\r\n * @typedef RecordRTC\r\n * @class\r\n * @example\r\n * var recorder = RecordRTC(mediaStream or [arrayOfMediaStream], {\r\n * type: 'video', // audio or video or gif or canvas\r\n * recorderType: MediaStreamRecorder || CanvasRecorder || StereoAudioRecorder || Etc\r\n * });\r\n * recorder.startRecording();\r\n * @see For further information:\r\n * @see {@link https://github.com/muaz-khan/RecordRTC|RecordRTC Source Code}\r\n * @param {MediaStream} mediaStream - Single media-stream object, array of media-streams, html-canvas-element, etc.\r\n * @param {object} config - {type:\"video\", recorderType: MediaStreamRecorder, disableLogs: true, numberOfAudioChannels: 1, bufferSize: 0, sampleRate: 0, desiredSampRate: 16000, video: HTMLVideoElement, etc.}\r\n */\r\n\r\nfunction RecordRTC(mediaStream, config) {\r\n if (!mediaStream) {\r\n throw 'First parameter is required.';\r\n }\r\n\r\n config = config || {\r\n type: 'video'\r\n };\r\n\r\n config = new RecordRTCConfiguration(mediaStream, config);\r\n\r\n // a reference to user's recordRTC object\r\n var self = this;\r\n\r\n function startRecording(config2) {\r\n if (!config.disableLogs) {\r\n console.log('RecordRTC version: ', self.version);\r\n }\r\n\r\n if (!!config2) {\r\n // allow users to set options using startRecording method\r\n // config2 is similar to main \"config\" object (second parameter over RecordRTC constructor)\r\n config = new RecordRTCConfiguration(mediaStream, config2);\r\n }\r\n\r\n if (!config.disableLogs) {\r\n console.log('started recording ' + config.type + ' stream.');\r\n }\r\n\r\n if (mediaRecorder) {\r\n mediaRecorder.clearRecordedData();\r\n mediaRecorder.record();\r\n\r\n setState('recording');\r\n\r\n if (self.recordingDuration) {\r\n handleRecordingDuration();\r\n }\r\n return self;\r\n }\r\n\r\n initRecorder(function() {\r\n if (self.recordingDuration) {\r\n handleRecordingDuration();\r\n }\r\n });\r\n\r\n return self;\r\n }\r\n\r\n function initRecorder(initCallback) {\r\n if (initCallback) {\r\n config.initCallback = function() {\r\n initCallback();\r\n initCallback = config.initCallback = null; // recorder.initRecorder should be call-backed once.\r\n };\r\n }\r\n\r\n var Recorder = new GetRecorderType(mediaStream, config);\r\n\r\n mediaRecorder = new Recorder(mediaStream, config);\r\n mediaRecorder.record();\r\n\r\n setState('recording');\r\n\r\n if (!config.disableLogs) {\r\n console.log('Initialized recorderType:', mediaRecorder.constructor.name, 'for output-type:', config.type);\r\n }\r\n }\r\n\r\n function stopRecording(callback) {\r\n callback = callback || function() {};\r\n\r\n if (!mediaRecorder) {\r\n warningLog();\r\n return;\r\n }\r\n\r\n if (self.state === 'paused') {\r\n self.resumeRecording();\r\n\r\n setTimeout(function() {\r\n stopRecording(callback);\r\n }, 1);\r\n return;\r\n }\r\n\r\n if (self.state !== 'recording' && !config.disableLogs) {\r\n console.warn('Recording state should be: \"recording\", however current state is: ', self.state);\r\n }\r\n\r\n if (!config.disableLogs) {\r\n console.log('Stopped recording ' + config.type + ' stream.');\r\n }\r\n\r\n if (config.type !== 'gif') {\r\n mediaRecorder.stop(_callback);\r\n } else {\r\n mediaRecorder.stop();\r\n _callback();\r\n }\r\n\r\n setState('stopped');\r\n\r\n function _callback(__blob) {\r\n if (!mediaRecorder) {\r\n if (typeof callback.call === 'function') {\r\n callback.call(self, '');\r\n } else {\r\n callback('');\r\n }\r\n return;\r\n }\r\n\r\n Object.keys(mediaRecorder).forEach(function(key) {\r\n if (typeof mediaRecorder[key] === 'function') {\r\n return;\r\n }\r\n\r\n self[key] = mediaRecorder[key];\r\n });\r\n\r\n var blob = mediaRecorder.blob;\r\n\r\n if (!blob) {\r\n if (__blob) {\r\n mediaRecorder.blob = blob = __blob;\r\n } else {\r\n throw 'Recording failed.';\r\n }\r\n }\r\n\r\n if (blob && !config.disableLogs) {\r\n console.log(blob.type, '->', bytesToSize(blob.size));\r\n }\r\n\r\n if (callback) {\r\n var url;\r\n\r\n try {\r\n url = URL.createObjectURL(blob);\r\n } catch (e) {}\r\n\r\n if (typeof callback.call === 'function') {\r\n callback.call(self, url);\r\n } else {\r\n callback(url);\r\n }\r\n }\r\n\r\n if (!config.autoWriteToDisk) {\r\n return;\r\n }\r\n\r\n getDataURL(function(dataURL) {\r\n var parameter = {};\r\n parameter[config.type + 'Blob'] = dataURL;\r\n DiskStorage.Store(parameter);\r\n });\r\n }\r\n }\r\n\r\n function pauseRecording() {\r\n if (!mediaRecorder) {\r\n warningLog();\r\n return;\r\n }\r\n\r\n if (self.state !== 'recording') {\r\n if (!config.disableLogs) {\r\n console.warn('Unable to pause the recording. Recording state: ', self.state);\r\n }\r\n return;\r\n }\r\n\r\n setState('paused');\r\n\r\n mediaRecorder.pause();\r\n\r\n if (!config.disableLogs) {\r\n console.log('Paused recording.');\r\n }\r\n }\r\n\r\n function resumeRecording() {\r\n if (!mediaRecorder) {\r\n warningLog();\r\n return;\r\n }\r\n\r\n if (self.state !== 'paused') {\r\n if (!config.disableLogs) {\r\n console.warn('Unable to resume the recording. Recording state: ', self.state);\r\n }\r\n return;\r\n }\r\n\r\n setState('recording');\r\n\r\n // not all libs have this method yet\r\n mediaRecorder.resume();\r\n\r\n if (!config.disableLogs) {\r\n console.log('Resumed recording.');\r\n }\r\n }\r\n\r\n function readFile(_blob) {\r\n postMessage(new FileReaderSync().readAsDataURL(_blob));\r\n }\r\n\r\n function getDataURL(callback, _mediaRecorder) {\r\n if (!callback) {\r\n throw 'Pass a callback function over getDataURL.';\r\n }\r\n\r\n var blob = _mediaRecorder ? _mediaRecorder.blob : (mediaRecorder || {}).blob;\r\n\r\n if (!blob) {\r\n if (!config.disableLogs) {\r\n console.warn('Blob encoder did not finish its job yet.');\r\n }\r\n\r\n setTimeout(function() {\r\n getDataURL(callback, _mediaRecorder);\r\n }, 1000);\r\n return;\r\n }\r\n\r\n if (typeof Worker !== 'undefined' && !navigator.mozGetUserMedia) {\r\n var webWorker = processInWebWorker(readFile);\r\n\r\n webWorker.onmessage = function(event) {\r\n callback(event.data);\r\n };\r\n\r\n webWorker.postMessage(blob);\r\n } else {\r\n var reader = new FileReader();\r\n reader.readAsDataURL(blob);\r\n reader.onload = function(event) {\r\n callback(event.target.result);\r\n };\r\n }\r\n\r\n function processInWebWorker(_function) {\r\n try {\r\n var blob = URL.createObjectURL(new Blob([_function.toString(),\r\n 'this.onmessage = function (eee) {' + _function.name + '(eee.data);}'\r\n ], {\r\n type: 'application/javascript'\r\n }));\r\n\r\n var worker = new Worker(blob);\r\n URL.revokeObjectURL(blob);\r\n return worker;\r\n } catch (e) {}\r\n }\r\n }\r\n\r\n function handleRecordingDuration(counter) {\r\n counter = counter || 0;\r\n\r\n if (self.state === 'paused') {\r\n setTimeout(function() {\r\n handleRecordingDuration(counter);\r\n }, 1000);\r\n return;\r\n }\r\n\r\n if (self.state === 'stopped') {\r\n return;\r\n }\r\n\r\n if (counter >= self.recordingDuration) {\r\n stopRecording(self.onRecordingStopped);\r\n return;\r\n }\r\n\r\n counter += 1000; // 1-second\r\n\r\n setTimeout(function() {\r\n handleRecordingDuration(counter);\r\n }, 1000);\r\n }\r\n\r\n function setState(state) {\r\n if (!self) {\r\n return;\r\n }\r\n\r\n self.state = state;\r\n\r\n if (typeof self.onStateChanged.call === 'function') {\r\n self.onStateChanged.call(self, state);\r\n } else {\r\n self.onStateChanged(state);\r\n }\r\n }\r\n\r\n var WARNING = 'It seems that recorder is destroyed or \"startRecording\" is not invoked for ' + config.type + ' recorder.';\r\n\r\n function warningLog() {\r\n if (config.disableLogs === true) {\r\n return;\r\n }\r\n\r\n console.warn(WARNING);\r\n }\r\n\r\n var mediaRecorder;\r\n\r\n var returnObject = {\r\n /**\r\n * This method starts the recording.\r\n * @method\r\n * @memberof RecordRTC\r\n * @instance\r\n * @example\r\n * var recorder = RecordRTC(mediaStream, {\r\n * type: 'video'\r\n * });\r\n * recorder.startRecording();\r\n */\r\n startRecording: startRecording,\r\n\r\n /**\r\n * This method stops the recording. It is strongly recommended to get \"blob\" or \"URI\" inside the callback to make sure all recorders finished their job.\r\n * @param {function} callback - Callback to get the recorded blob.\r\n * @method\r\n * @memberof RecordRTC\r\n * @instance\r\n * @example\r\n * recorder.stopRecording(function() {\r\n * // use either \"this\" or \"recorder\" object; both are identical\r\n * video.src = this.toURL();\r\n * var blob = this.getBlob();\r\n * });\r\n */\r\n stopRecording: stopRecording,\r\n\r\n /**\r\n * This method pauses the recording. You can resume recording using \"resumeRecording\" method.\r\n * @method\r\n * @memberof RecordRTC\r\n * @instance\r\n * @todo Firefox is unable to pause the recording. Fix it.\r\n * @example\r\n * recorder.pauseRecording(); // pause the recording\r\n * recorder.resumeRecording(); // resume again\r\n */\r\n pauseRecording: pauseRecording,\r\n\r\n /**\r\n * This method resumes the recording.\r\n * @method\r\n * @memberof RecordRTC\r\n * @instance\r\n * @example\r\n * recorder.pauseRecording(); // first of all, pause the recording\r\n * recorder.resumeRecording(); // now resume it\r\n */\r\n resumeRecording: resumeRecording,\r\n\r\n /**\r\n * This method initializes the recording.\r\n * @method\r\n * @memberof RecordRTC\r\n * @instance\r\n * @todo This method should be deprecated.\r\n * @example\r\n * recorder.initRecorder();\r\n */\r\n initRecorder: initRecorder,\r\n\r\n /**\r\n * Ask RecordRTC to auto-stop the recording after 5 minutes.\r\n * @method\r\n * @memberof RecordRTC\r\n * @instance\r\n * @example\r\n * var fiveMinutes = 5 * 1000 * 60;\r\n * recorder.setRecordingDuration(fiveMinutes, function() {\r\n * var blob = this.getBlob();\r\n * video.src = this.toURL();\r\n * });\r\n * \r\n * // or otherwise\r\n * recorder.setRecordingDuration(fiveMinutes).onRecordingStopped(function() {\r\n * var blob = this.getBlob();\r\n * video.src = this.toURL();\r\n * });\r\n */\r\n setRecordingDuration: function(recordingDuration, callback) {\r\n if (typeof recordingDuration === 'undefined') {\r\n throw 'recordingDuration is required.';\r\n }\r\n\r\n if (typeof recordingDuration !== 'number') {\r\n throw 'recordingDuration must be a number.';\r\n }\r\n\r\n self.recordingDuration = recordingDuration;\r\n self.onRecordingStopped = callback || function() {};\r\n\r\n return {\r\n onRecordingStopped: function(callback) {\r\n self.onRecordingStopped = callback;\r\n }\r\n };\r\n },\r\n\r\n /**\r\n * This method can be used to clear/reset all the recorded data.\r\n * @method\r\n * @memberof RecordRTC\r\n * @instance\r\n * @todo Figure out the difference between \"reset\" and \"clearRecordedData\" methods.\r\n * @example\r\n * recorder.clearRecordedData();\r\n */\r\n clearRecordedData: function() {\r\n if (!mediaRecorder) {\r\n warningLog();\r\n return;\r\n }\r\n\r\n mediaRecorder.clearRecordedData();\r\n\r\n if (!config.disableLogs) {\r\n console.log('Cleared old recorded data.');\r\n }\r\n },\r\n\r\n /**\r\n * Get the recorded blob. Use this method inside the \"stopRecording\" callback.\r\n * @method\r\n * @memberof RecordRTC\r\n * @instance\r\n * @example\r\n * recorder.stopRecording(function() {\r\n * var blob = this.getBlob();\r\n *\r\n * var file = new File([blob], 'filename.webm', {\r\n * type: 'video/webm'\r\n * });\r\n *\r\n * var formData = new FormData();\r\n * formData.append('file', file); // upload \"File\" object rather than a \"Blob\"\r\n * uploadToServer(formData);\r\n * });\r\n * @returns {Blob} Returns recorded data as \"Blob\" object.\r\n */\r\n getBlob: function() {\r\n if (!mediaRecorder) {\r\n warningLog();\r\n return;\r\n }\r\n\r\n return mediaRecorder.blob;\r\n },\r\n\r\n /**\r\n * Get data-URI instead of Blob.\r\n * @param {function} callback - Callback to get the Data-URI.\r\n * @method\r\n * @memberof RecordRTC\r\n * @instance\r\n * @example\r\n * recorder.stopRecording(function() {\r\n * recorder.getDataURL(function(dataURI) {\r\n * video.src = dataURI;\r\n * });\r\n * });\r\n */\r\n getDataURL: getDataURL,\r\n\r\n /**\r\n * Get virtual/temporary URL. Usage of this URL is limited to current tab.\r\n * @method\r\n * @memberof RecordRTC\r\n * @instance\r\n * @example\r\n * recorder.stopRecording(function() {\r\n * video.src = this.toURL();\r\n * });\r\n * @returns {String} Returns a virtual/temporary URL for the recorded \"Blob\".\r\n */\r\n toURL: function() {\r\n if (!mediaRecorder) {\r\n warningLog();\r\n return;\r\n }\r\n\r\n return URL.createObjectURL(mediaRecorder.blob);\r\n },\r\n\r\n /**\r\n * Get internal recording object (i.e. internal module) e.g. MutliStreamRecorder, MediaStreamRecorder, StereoAudioRecorder or WhammyRecorder etc.\r\n * @method\r\n * @memberof RecordRTC\r\n * @instance\r\n * @example\r\n * var internalRecorder = recorder.getInternalRecorder();\r\n * if(internalRecorder instanceof MultiStreamRecorder) {\r\n * internalRecorder.addStreams([newAudioStream]);\r\n * internalRecorder.resetVideoStreams([screenStream]);\r\n * }\r\n * @returns {Object} Returns internal recording object.\r\n */\r\n getInternalRecorder: function() {\r\n return mediaRecorder;\r\n },\r\n\r\n /**\r\n * Invoke save-as dialog to save the recorded blob into your disk.\r\n * @param {string} fileName - Set your own file name.\r\n * @method\r\n * @memberof RecordRTC\r\n * @instance\r\n * @example\r\n * recorder.stopRecording(function() {\r\n * this.save('file-name');\r\n *\r\n * // or manually:\r\n * invokeSaveAsDialog(this.getBlob(), 'filename.webm');\r\n * });\r\n */\r\n save: function(fileName) {\r\n if (!mediaRecorder) {\r\n warningLog();\r\n return;\r\n }\r\n\r\n invokeSaveAsDialog(mediaRecorder.blob, fileName);\r\n },\r\n\r\n /**\r\n * This method gets a blob from indexed-DB storage.\r\n * @param {function} callback - Callback to get the recorded blob.\r\n * @method\r\n * @memberof RecordRTC\r\n * @instance\r\n * @example\r\n * recorder.getFromDisk(function(dataURL) {\r\n * video.src = dataURL;\r\n * });\r\n */\r\n getFromDisk: function(callback) {\r\n if (!mediaRecorder) {\r\n warningLog();\r\n return;\r\n }\r\n\r\n RecordRTC.getFromDisk(config.type, callback);\r\n },\r\n\r\n /**\r\n * This method appends an array of webp images to the recorded video-blob. It takes an \"array\" object.\r\n * @type {Array.}\r\n * @param {Array} arrayOfWebPImages - Array of webp images.\r\n * @method\r\n * @memberof RecordRTC\r\n * @instance\r\n * @todo This method should be deprecated.\r\n * @example\r\n * var arrayOfWebPImages = [];\r\n * arrayOfWebPImages.push({\r\n * duration: index,\r\n * image: 'data:image/webp;base64,...'\r\n * });\r\n * recorder.setAdvertisementArray(arrayOfWebPImages);\r\n */\r\n setAdvertisementArray: function(arrayOfWebPImages) {\r\n config.advertisement = [];\r\n\r\n var length = arrayOfWebPImages.length;\r\n for (var i = 0; i < length; i++) {\r\n config.advertisement.push({\r\n duration: i,\r\n image: arrayOfWebPImages[i]\r\n });\r\n }\r\n },\r\n\r\n /**\r\n * It is equivalent to \"recorder.getBlob()\" method. Usage of \"getBlob\" is recommended, though.\r\n * @property {Blob} blob - Recorded Blob can be accessed using this property.\r\n * @memberof RecordRTC\r\n * @instance\r\n * @readonly\r\n * @example\r\n * recorder.stopRecording(function() {\r\n * var blob = this.blob;\r\n *\r\n * // below one is recommended\r\n * var blob = this.getBlob();\r\n * });\r\n */\r\n blob: null,\r\n\r\n /**\r\n * This works only with {recorderType:StereoAudioRecorder}. Use this property on \"stopRecording\" to verify the encoder's sample-rates.\r\n * @property {number} bufferSize - Buffer-size used to encode the WAV container\r\n * @memberof RecordRTC\r\n * @instance\r\n * @readonly\r\n * @example\r\n * recorder.stopRecording(function() {\r\n * alert('Recorder used this buffer-size: ' + this.bufferSize);\r\n * });\r\n */\r\n bufferSize: 0,\r\n\r\n /**\r\n * This works only with {recorderType:StereoAudioRecorder}. Use this property on \"stopRecording\" to verify the encoder's sample-rates.\r\n * @property {number} sampleRate - Sample-rates used to encode the WAV container\r\n * @memberof RecordRTC\r\n * @instance\r\n * @readonly\r\n * @example\r\n * recorder.stopRecording(function() {\r\n * alert('Recorder used these sample-rates: ' + this.sampleRate);\r\n * });\r\n */\r\n sampleRate: 0,\r\n\r\n /**\r\n * {recorderType:StereoAudioRecorder} returns ArrayBuffer object.\r\n * @property {ArrayBuffer} buffer - Audio ArrayBuffer, supported only in Chrome.\r\n * @memberof RecordRTC\r\n * @instance\r\n * @readonly\r\n * @example\r\n * recorder.stopRecording(function() {\r\n * var arrayBuffer = this.buffer;\r\n * alert(arrayBuffer.byteLength);\r\n * });\r\n */\r\n buffer: null,\r\n\r\n /**\r\n * This method resets the recorder. So that you can reuse single recorder instance many times.\r\n * @method\r\n * @memberof RecordRTC\r\n * @instance\r\n * @example\r\n * recorder.reset();\r\n * recorder.startRecording();\r\n */\r\n reset: function() {\r\n if (self.state === 'recording' && !config.disableLogs) {\r\n console.warn('Stop an active recorder.');\r\n }\r\n\r\n if (mediaRecorder && typeof mediaRecorder.clearRecordedData === 'function') {\r\n mediaRecorder.clearRecordedData();\r\n }\r\n mediaRecorder = null;\r\n setState('inactive');\r\n self.blob = null;\r\n },\r\n\r\n /**\r\n * This method is called whenever recorder's state changes. Use this as an \"event\".\r\n * @property {String} state - A recorder's state can be: recording, paused, stopped or inactive.\r\n * @method\r\n * @memberof RecordRTC\r\n * @instance\r\n * @example\r\n * recorder.onStateChanged = function(state) {\r\n * console.log('Recorder state: ', state);\r\n * };\r\n */\r\n onStateChanged: function(state) {\r\n if (!config.disableLogs) {\r\n console.log('Recorder state changed:', state);\r\n }\r\n },\r\n\r\n /**\r\n * A recorder can have inactive, recording, paused or stopped states.\r\n * @property {String} state - A recorder's state can be: recording, paused, stopped or inactive.\r\n * @memberof RecordRTC\r\n * @static\r\n * @readonly\r\n * @example\r\n * // this looper function will keep you updated about the recorder's states.\r\n * (function looper() {\r\n * document.querySelector('h1').innerHTML = 'Recorder\\'s state is: ' + recorder.state;\r\n * if(recorder.state === 'stopped') return; // ignore+stop\r\n * setTimeout(looper, 1000); // update after every 3-seconds\r\n * })();\r\n * recorder.startRecording();\r\n */\r\n state: 'inactive',\r\n\r\n /**\r\n * Get recorder's readonly state.\r\n * @method\r\n * @memberof RecordRTC\r\n * @example\r\n * var state = recorder.getState();\r\n * @returns {String} Returns recording state.\r\n */\r\n getState: function() {\r\n return self.state;\r\n },\r\n\r\n /**\r\n * Destroy RecordRTC instance. Clear all recorders and objects.\r\n * @method\r\n * @memberof RecordRTC\r\n * @example\r\n * recorder.destroy();\r\n */\r\n destroy: function() {\r\n var disableLogsCache = config.disableLogs;\r\n\r\n config = {\r\n disableLogs: true\r\n };\r\n self.reset();\r\n setState('destroyed');\r\n returnObject = self = null;\r\n\r\n if (Storage.AudioContextConstructor) {\r\n Storage.AudioContextConstructor.close();\r\n Storage.AudioContextConstructor = null;\r\n }\r\n\r\n config.disableLogs = disableLogsCache;\r\n\r\n if (!config.disableLogs) {\r\n console.log('RecordRTC is destroyed.');\r\n }\r\n },\r\n\r\n /**\r\n * RecordRTC version number\r\n * @property {String} version - Release version number.\r\n * @memberof RecordRTC\r\n * @static\r\n * @readonly\r\n * @example\r\n * alert(recorder.version);\r\n */\r\n version: '5.6.2'\r\n };\r\n\r\n if (!this) {\r\n self = returnObject;\r\n return returnObject;\r\n }\r\n\r\n // if someone wants to use RecordRTC with the \"new\" keyword.\r\n for (var prop in returnObject) {\r\n this[prop] = returnObject[prop];\r\n }\r\n\r\n self = this;\r\n\r\n return returnObject;\r\n}\r\n\r\nRecordRTC.version = '5.6.2';\r\n\r\nif (typeof module !== 'undefined' /* && !!module.exports*/ ) {\r\n module.exports = RecordRTC;\r\n}\r\n\r\nif (typeof define === 'function' && define.amd) {\r\n define('RecordRTC', [], function() {\r\n return RecordRTC;\r\n });\r\n}\n\r\nRecordRTC.getFromDisk = function(type, callback) {\r\n if (!callback) {\r\n throw 'callback is mandatory.';\r\n }\r\n\r\n console.log('Getting recorded ' + (type === 'all' ? 'blobs' : type + ' blob ') + ' from disk!');\r\n DiskStorage.Fetch(function(dataURL, _type) {\r\n if (type !== 'all' && _type === type + 'Blob' && callback) {\r\n callback(dataURL);\r\n }\r\n\r\n if (type === 'all' && callback) {\r\n callback(dataURL, _type.replace('Blob', ''));\r\n }\r\n });\r\n};\r\n\r\n/**\r\n * This method can be used to store recorded blobs into IndexedDB storage.\r\n * @param {object} options - {audio: Blob, video: Blob, gif: Blob}\r\n * @method\r\n * @memberof RecordRTC\r\n * @example\r\n * RecordRTC.writeToDisk({\r\n * audio: audioBlob,\r\n * video: videoBlob,\r\n * gif : gifBlob\r\n * });\r\n */\r\nRecordRTC.writeToDisk = function(options) {\r\n console.log('Writing recorded blob(s) to disk!');\r\n options = options || {};\r\n if (options.audio && options.video && options.gif) {\r\n options.audio.getDataURL(function(audioDataURL) {\r\n options.video.getDataURL(function(videoDataURL) {\r\n options.gif.getDataURL(function(gifDataURL) {\r\n DiskStorage.Store({\r\n audioBlob: audioDataURL,\r\n videoBlob: videoDataURL,\r\n gifBlob: gifDataURL\r\n });\r\n });\r\n });\r\n });\r\n } else if (options.audio && options.video) {\r\n options.audio.getDataURL(function(audioDataURL) {\r\n options.video.getDataURL(function(videoDataURL) {\r\n DiskStorage.Store({\r\n audioBlob: audioDataURL,\r\n videoBlob: videoDataURL\r\n });\r\n });\r\n });\r\n } else if (options.audio && options.gif) {\r\n options.audio.getDataURL(function(audioDataURL) {\r\n options.gif.getDataURL(function(gifDataURL) {\r\n DiskStorage.Store({\r\n audioBlob: audioDataURL,\r\n gifBlob: gifDataURL\r\n });\r\n });\r\n });\r\n } else if (options.video && options.gif) {\r\n options.video.getDataURL(function(videoDataURL) {\r\n options.gif.getDataURL(function(gifDataURL) {\r\n DiskStorage.Store({\r\n videoBlob: videoDataURL,\r\n gifBlob: gifDataURL\r\n });\r\n });\r\n });\r\n } else if (options.audio) {\r\n options.audio.getDataURL(function(audioDataURL) {\r\n DiskStorage.Store({\r\n audioBlob: audioDataURL\r\n });\r\n });\r\n } else if (options.video) {\r\n options.video.getDataURL(function(videoDataURL) {\r\n DiskStorage.Store({\r\n videoBlob: videoDataURL\r\n });\r\n });\r\n } else if (options.gif) {\r\n options.gif.getDataURL(function(gifDataURL) {\r\n DiskStorage.Store({\r\n gifBlob: gifDataURL\r\n });\r\n });\r\n }\r\n};\n\r\n// __________________________\r\n// RecordRTC-Configuration.js\r\n\r\n/**\r\n * {@link RecordRTCConfiguration} is an inner/private helper for {@link RecordRTC}.\r\n * @summary It configures the 2nd parameter passed over {@link RecordRTC} and returns a valid \"config\" object.\r\n * @license {@link https://github.com/muaz-khan/RecordRTC/blob/master/LICENSE|MIT}\r\n * @author {@link https://MuazKhan.com|Muaz Khan}\r\n * @typedef RecordRTCConfiguration\r\n * @class\r\n * @example\r\n * var options = RecordRTCConfiguration(mediaStream, options);\r\n * @see {@link https://github.com/muaz-khan/RecordRTC|RecordRTC Source Code}\r\n * @param {MediaStream} mediaStream - MediaStream object fetched using getUserMedia API or generated using captureStreamUntilEnded or WebAudio API.\r\n * @param {object} config - {type:\"video\", disableLogs: true, numberOfAudioChannels: 1, bufferSize: 0, sampleRate: 0, video: HTMLVideoElement, getNativeBlob:true, etc.}\r\n */\r\n\r\nfunction RecordRTCConfiguration(mediaStream, config) {\r\n if (!config.recorderType && !config.type) {\r\n if (!!config.audio && !!config.video) {\r\n config.type = 'video';\r\n } else if (!!config.audio && !config.video) {\r\n config.type = 'audio';\r\n }\r\n }\r\n\r\n if (config.recorderType && !config.type) {\r\n if (config.recorderType === WhammyRecorder || config.recorderType === CanvasRecorder || (typeof WebAssemblyRecorder !== 'undefined' && config.recorderType === WebAssemblyRecorder)) {\r\n config.type = 'video';\r\n } else if (config.recorderType === GifRecorder) {\r\n config.type = 'gif';\r\n } else if (config.recorderType === StereoAudioRecorder) {\r\n config.type = 'audio';\r\n } else if (config.recorderType === MediaStreamRecorder) {\r\n if (getTracks(mediaStream, 'audio').length && getTracks(mediaStream, 'video').length) {\r\n config.type = 'video';\r\n } else if (!getTracks(mediaStream, 'audio').length && getTracks(mediaStream, 'video').length) {\r\n config.type = 'video';\r\n } else if (getTracks(mediaStream, 'audio').length && !getTracks(mediaStream, 'video').length) {\r\n config.type = 'audio';\r\n } else {\r\n // config.type = 'UnKnown';\r\n }\r\n }\r\n }\r\n\r\n if (typeof MediaStreamRecorder !== 'undefined' && typeof MediaRecorder !== 'undefined' && 'requestData' in MediaRecorder.prototype) {\r\n if (!config.mimeType) {\r\n config.mimeType = 'video/webm';\r\n }\r\n\r\n if (!config.type) {\r\n config.type = config.mimeType.split('/')[0];\r\n }\r\n\r\n if (!config.bitsPerSecond) {\r\n // config.bitsPerSecond = 128000;\r\n }\r\n }\r\n\r\n // consider default type=audio\r\n if (!config.type) {\r\n if (config.mimeType) {\r\n config.type = config.mimeType.split('/')[0];\r\n }\r\n if (!config.type) {\r\n config.type = 'audio';\r\n }\r\n }\r\n\r\n return config;\r\n}\n\r\n// __________________\r\n// GetRecorderType.js\r\n\r\n/**\r\n * {@link GetRecorderType} is an inner/private helper for {@link RecordRTC}.\r\n * @summary It returns best recorder-type available for your browser.\r\n * @license {@link https://github.com/muaz-khan/RecordRTC/blob/master/LICENSE|MIT}\r\n * @author {@link https://MuazKhan.com|Muaz Khan}\r\n * @typedef GetRecorderType\r\n * @class\r\n * @example\r\n * var RecorderType = GetRecorderType(options);\r\n * var recorder = new RecorderType(options);\r\n * @see {@link https://github.com/muaz-khan/RecordRTC|RecordRTC Source Code}\r\n * @param {MediaStream} mediaStream - MediaStream object fetched using getUserMedia API or generated using captureStreamUntilEnded or WebAudio API.\r\n * @param {object} config - {type:\"video\", disableLogs: true, numberOfAudioChannels: 1, bufferSize: 0, sampleRate: 0, video: HTMLVideoElement, etc.}\r\n */\r\n\r\nfunction GetRecorderType(mediaStream, config) {\r\n var recorder;\r\n\r\n // StereoAudioRecorder can work with all three: Edge, Firefox and Chrome\r\n // todo: detect if it is Edge, then auto use: StereoAudioRecorder\r\n if (isChrome || isEdge || isOpera) {\r\n // Media Stream Recording API has not been implemented in chrome yet;\r\n // That's why using WebAudio API to record stereo audio in WAV format\r\n recorder = StereoAudioRecorder;\r\n }\r\n\r\n if (typeof MediaRecorder !== 'undefined' && 'requestData' in MediaRecorder.prototype && !isChrome) {\r\n recorder = MediaStreamRecorder;\r\n }\r\n\r\n // video recorder (in WebM format)\r\n if (config.type === 'video' && (isChrome || isOpera)) {\r\n recorder = WhammyRecorder;\r\n\r\n if (typeof WebAssemblyRecorder !== 'undefined' && typeof ReadableStream !== 'undefined') {\r\n recorder = WebAssemblyRecorder;\r\n }\r\n }\r\n\r\n // video recorder (in Gif format)\r\n if (config.type === 'gif') {\r\n recorder = GifRecorder;\r\n }\r\n\r\n // html2canvas recording!\r\n if (config.type === 'canvas') {\r\n recorder = CanvasRecorder;\r\n }\r\n\r\n if (isMediaRecorderCompatible() && recorder !== CanvasRecorder && recorder !== GifRecorder && typeof MediaRecorder !== 'undefined' && 'requestData' in MediaRecorder.prototype) {\r\n if (getTracks(mediaStream, 'video').length || getTracks(mediaStream, 'audio').length) {\r\n // audio-only recording\r\n if (config.type === 'audio') {\r\n if (typeof MediaRecorder.isTypeSupported === 'function' && MediaRecorder.isTypeSupported('audio/webm')) {\r\n recorder = MediaStreamRecorder;\r\n }\r\n // else recorder = StereoAudioRecorder;\r\n } else {\r\n // video or screen tracks\r\n if (typeof MediaRecorder.isTypeSupported === 'function' && MediaRecorder.isTypeSupported('video/webm')) {\r\n recorder = MediaStreamRecorder;\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (mediaStream instanceof Array && mediaStream.length) {\r\n recorder = MultiStreamRecorder;\r\n }\r\n\r\n if (config.recorderType) {\r\n recorder = config.recorderType;\r\n }\r\n\r\n if (!config.disableLogs && !!recorder && !!recorder.name) {\r\n console.log('Using recorderType:', recorder.name || recorder.constructor.name);\r\n }\r\n\r\n if (!recorder && isSafari) {\r\n recorder = MediaStreamRecorder;\r\n }\r\n\r\n return recorder;\r\n}\n\r\n// _____________\r\n// MRecordRTC.js\r\n\r\n/**\r\n * MRecordRTC runs on top of {@link RecordRTC} to bring multiple recordings in a single place, by providing simple API.\r\n * @summary MRecordRTC stands for \"Multiple-RecordRTC\".\r\n * @license {@link https://github.com/muaz-khan/RecordRTC/blob/master/LICENSE|MIT}\r\n * @author {@link https://MuazKhan.com|Muaz Khan}\r\n * @typedef MRecordRTC\r\n * @class\r\n * @example\r\n * var recorder = new MRecordRTC();\r\n * recorder.addStream(MediaStream);\r\n * recorder.mediaType = {\r\n * audio: true, // or StereoAudioRecorder or MediaStreamRecorder\r\n * video: true, // or WhammyRecorder or MediaStreamRecorder or WebAssemblyRecorder or CanvasRecorder\r\n * gif: true // or GifRecorder\r\n * };\r\n * // mimeType is optional and should be set only in advance cases.\r\n * recorder.mimeType = {\r\n * audio: 'audio/wav',\r\n * video: 'video/webm',\r\n * gif: 'image/gif'\r\n * };\r\n * recorder.startRecording();\r\n * @see For further information:\r\n * @see {@link https://github.com/muaz-khan/RecordRTC/tree/master/MRecordRTC|MRecordRTC Source Code}\r\n * @param {MediaStream} mediaStream - MediaStream object fetched using getUserMedia API or generated using captureStreamUntilEnded or WebAudio API.\r\n * @requires {@link RecordRTC}\r\n */\r\n\r\nfunction MRecordRTC(mediaStream) {\r\n\r\n /**\r\n * This method attaches MediaStream object to {@link MRecordRTC}.\r\n * @param {MediaStream} mediaStream - A MediaStream object, either fetched using getUserMedia API, or generated using captureStreamUntilEnded or WebAudio API.\r\n * @method\r\n * @memberof MRecordRTC\r\n * @example\r\n * recorder.addStream(MediaStream);\r\n */\r\n this.addStream = function(_mediaStream) {\r\n if (_mediaStream) {\r\n mediaStream = _mediaStream;\r\n }\r\n };\r\n\r\n /**\r\n * This property can be used to set the recording type e.g. audio, or video, or gif, or canvas.\r\n * @property {object} mediaType - {audio: true, video: true, gif: true}\r\n * @memberof MRecordRTC\r\n * @example\r\n * var recorder = new MRecordRTC();\r\n * recorder.mediaType = {\r\n * audio: true, // TRUE or StereoAudioRecorder or MediaStreamRecorder\r\n * video: true, // TRUE or WhammyRecorder or MediaStreamRecorder or WebAssemblyRecorder or CanvasRecorder\r\n * gif : true // TRUE or GifRecorder\r\n * };\r\n */\r\n this.mediaType = {\r\n audio: true,\r\n video: true\r\n };\r\n\r\n /**\r\n * This method starts recording.\r\n * @method\r\n * @memberof MRecordRTC\r\n * @example\r\n * recorder.startRecording();\r\n */\r\n this.startRecording = function() {\r\n var mediaType = this.mediaType;\r\n var recorderType;\r\n var mimeType = this.mimeType || {\r\n audio: null,\r\n video: null,\r\n gif: null\r\n };\r\n\r\n if (typeof mediaType.audio !== 'function' && isMediaRecorderCompatible() && !getTracks(mediaStream, 'audio').length) {\r\n mediaType.audio = false;\r\n }\r\n\r\n if (typeof mediaType.video !== 'function' && isMediaRecorderCompatible() && !getTracks(mediaStream, 'video').length) {\r\n mediaType.video = false;\r\n }\r\n\r\n if (typeof mediaType.gif !== 'function' && isMediaRecorderCompatible() && !getTracks(mediaStream, 'video').length) {\r\n mediaType.gif = false;\r\n }\r\n\r\n if (!mediaType.audio && !mediaType.video && !mediaType.gif) {\r\n throw 'MediaStream must have either audio or video tracks.';\r\n }\r\n\r\n if (!!mediaType.audio) {\r\n recorderType = null;\r\n if (typeof mediaType.audio === 'function') {\r\n recorderType = mediaType.audio;\r\n }\r\n\r\n this.audioRecorder = new RecordRTC(mediaStream, {\r\n type: 'audio',\r\n bufferSize: this.bufferSize,\r\n sampleRate: this.sampleRate,\r\n numberOfAudioChannels: this.numberOfAudioChannels || 2,\r\n disableLogs: this.disableLogs,\r\n recorderType: recorderType,\r\n mimeType: mimeType.audio,\r\n timeSlice: this.timeSlice,\r\n onTimeStamp: this.onTimeStamp\r\n });\r\n\r\n if (!mediaType.video) {\r\n this.audioRecorder.startRecording();\r\n }\r\n }\r\n\r\n if (!!mediaType.video) {\r\n recorderType = null;\r\n if (typeof mediaType.video === 'function') {\r\n recorderType = mediaType.video;\r\n }\r\n\r\n var newStream = mediaStream;\r\n\r\n if (isMediaRecorderCompatible() && !!mediaType.audio && typeof mediaType.audio === 'function') {\r\n var videoTrack = getTracks(mediaStream, 'video')[0];\r\n\r\n if (isFirefox) {\r\n newStream = new MediaStream();\r\n newStream.addTrack(videoTrack);\r\n\r\n if (recorderType && recorderType === WhammyRecorder) {\r\n // Firefox does NOT supports webp-encoding yet\r\n // But Firefox do supports WebAssemblyRecorder\r\n recorderType = MediaStreamRecorder;\r\n }\r\n } else {\r\n newStream = new MediaStream();\r\n newStream.addTrack(videoTrack);\r\n }\r\n }\r\n\r\n this.videoRecorder = new RecordRTC(newStream, {\r\n type: 'video',\r\n video: this.video,\r\n canvas: this.canvas,\r\n frameInterval: this.frameInterval || 10,\r\n disableLogs: this.disableLogs,\r\n recorderType: recorderType,\r\n mimeType: mimeType.video,\r\n timeSlice: this.timeSlice,\r\n onTimeStamp: this.onTimeStamp,\r\n workerPath: this.workerPath,\r\n webAssemblyPath: this.webAssemblyPath,\r\n frameRate: this.frameRate, // used by WebAssemblyRecorder; values: usually 30; accepts any.\r\n bitrate: this.bitrate // used by WebAssemblyRecorder; values: 0 to 1000+\r\n });\r\n\r\n if (!mediaType.audio) {\r\n this.videoRecorder.startRecording();\r\n }\r\n }\r\n\r\n if (!!mediaType.audio && !!mediaType.video) {\r\n var self = this;\r\n\r\n var isSingleRecorder = isMediaRecorderCompatible() === true;\r\n\r\n if (mediaType.audio instanceof StereoAudioRecorder && !!mediaType.video) {\r\n isSingleRecorder = false;\r\n } else if (mediaType.audio !== true && mediaType.video !== true && mediaType.audio !== mediaType.video) {\r\n isSingleRecorder = false;\r\n }\r\n\r\n if (isSingleRecorder === true) {\r\n self.audioRecorder = null;\r\n self.videoRecorder.startRecording();\r\n } else {\r\n self.videoRecorder.initRecorder(function() {\r\n self.audioRecorder.initRecorder(function() {\r\n // Both recorders are ready to record things accurately\r\n self.videoRecorder.startRecording();\r\n self.audioRecorder.startRecording();\r\n });\r\n });\r\n }\r\n }\r\n\r\n if (!!mediaType.gif) {\r\n recorderType = null;\r\n if (typeof mediaType.gif === 'function') {\r\n recorderType = mediaType.gif;\r\n }\r\n this.gifRecorder = new RecordRTC(mediaStream, {\r\n type: 'gif',\r\n frameRate: this.frameRate || 200,\r\n quality: this.quality || 10,\r\n disableLogs: this.disableLogs,\r\n recorderType: recorderType,\r\n mimeType: mimeType.gif\r\n });\r\n this.gifRecorder.startRecording();\r\n }\r\n };\r\n\r\n /**\r\n * This method stops recording.\r\n * @param {function} callback - Callback function is invoked when all encoders finished their jobs.\r\n * @method\r\n * @memberof MRecordRTC\r\n * @example\r\n * recorder.stopRecording(function(recording){\r\n * var audioBlob = recording.audio;\r\n * var videoBlob = recording.video;\r\n * var gifBlob = recording.gif;\r\n * });\r\n */\r\n this.stopRecording = function(callback) {\r\n callback = callback || function() {};\r\n\r\n if (this.audioRecorder) {\r\n this.audioRecorder.stopRecording(function(blobURL) {\r\n callback(blobURL, 'audio');\r\n });\r\n }\r\n\r\n if (this.videoRecorder) {\r\n this.videoRecorder.stopRecording(function(blobURL) {\r\n callback(blobURL, 'video');\r\n });\r\n }\r\n\r\n if (this.gifRecorder) {\r\n this.gifRecorder.stopRecording(function(blobURL) {\r\n callback(blobURL, 'gif');\r\n });\r\n }\r\n };\r\n\r\n /**\r\n * This method pauses recording.\r\n * @method\r\n * @memberof MRecordRTC\r\n * @example\r\n * recorder.pauseRecording();\r\n */\r\n this.pauseRecording = function() {\r\n if (this.audioRecorder) {\r\n this.audioRecorder.pauseRecording();\r\n }\r\n\r\n if (this.videoRecorder) {\r\n this.videoRecorder.pauseRecording();\r\n }\r\n\r\n if (this.gifRecorder) {\r\n this.gifRecorder.pauseRecording();\r\n }\r\n };\r\n\r\n /**\r\n * This method resumes recording.\r\n * @method\r\n * @memberof MRecordRTC\r\n * @example\r\n * recorder.resumeRecording();\r\n */\r\n this.resumeRecording = function() {\r\n if (this.audioRecorder) {\r\n this.audioRecorder.resumeRecording();\r\n }\r\n\r\n if (this.videoRecorder) {\r\n this.videoRecorder.resumeRecording();\r\n }\r\n\r\n if (this.gifRecorder) {\r\n this.gifRecorder.resumeRecording();\r\n }\r\n };\r\n\r\n /**\r\n * This method can be used to manually get all recorded blobs.\r\n * @param {function} callback - All recorded blobs are passed back to the \"callback\" function.\r\n * @method\r\n * @memberof MRecordRTC\r\n * @example\r\n * recorder.getBlob(function(recording){\r\n * var audioBlob = recording.audio;\r\n * var videoBlob = recording.video;\r\n * var gifBlob = recording.gif;\r\n * });\r\n * // or\r\n * var audioBlob = recorder.getBlob().audio;\r\n * var videoBlob = recorder.getBlob().video;\r\n */\r\n this.getBlob = function(callback) {\r\n var output = {};\r\n\r\n if (this.audioRecorder) {\r\n output.audio = this.audioRecorder.getBlob();\r\n }\r\n\r\n if (this.videoRecorder) {\r\n output.video = this.videoRecorder.getBlob();\r\n }\r\n\r\n if (this.gifRecorder) {\r\n output.gif = this.gifRecorder.getBlob();\r\n }\r\n\r\n if (callback) {\r\n callback(output);\r\n }\r\n\r\n return output;\r\n };\r\n\r\n /**\r\n * Destroy all recorder instances.\r\n * @method\r\n * @memberof MRecordRTC\r\n * @example\r\n * recorder.destroy();\r\n */\r\n this.destroy = function() {\r\n if (this.audioRecorder) {\r\n this.audioRecorder.destroy();\r\n this.audioRecorder = null;\r\n }\r\n\r\n if (this.videoRecorder) {\r\n this.videoRecorder.destroy();\r\n this.videoRecorder = null;\r\n }\r\n\r\n if (this.gifRecorder) {\r\n this.gifRecorder.destroy();\r\n this.gifRecorder = null;\r\n }\r\n };\r\n\r\n /**\r\n * This method can be used to manually get all recorded blobs' DataURLs.\r\n * @param {function} callback - All recorded blobs' DataURLs are passed back to the \"callback\" function.\r\n * @method\r\n * @memberof MRecordRTC\r\n * @example\r\n * recorder.getDataURL(function(recording){\r\n * var audioDataURL = recording.audio;\r\n * var videoDataURL = recording.video;\r\n * var gifDataURL = recording.gif;\r\n * });\r\n */\r\n this.getDataURL = function(callback) {\r\n this.getBlob(function(blob) {\r\n if (blob.audio && blob.video) {\r\n getDataURL(blob.audio, function(_audioDataURL) {\r\n getDataURL(blob.video, function(_videoDataURL) {\r\n callback({\r\n audio: _audioDataURL,\r\n video: _videoDataURL\r\n });\r\n });\r\n });\r\n } else if (blob.audio) {\r\n getDataURL(blob.audio, function(_audioDataURL) {\r\n callback({\r\n audio: _audioDataURL\r\n });\r\n });\r\n } else if (blob.video) {\r\n getDataURL(blob.video, function(_videoDataURL) {\r\n callback({\r\n video: _videoDataURL\r\n });\r\n });\r\n }\r\n });\r\n\r\n function getDataURL(blob, callback00) {\r\n if (typeof Worker !== 'undefined') {\r\n var webWorker = processInWebWorker(function readFile(_blob) {\r\n postMessage(new FileReaderSync().readAsDataURL(_blob));\r\n });\r\n\r\n webWorker.onmessage = function(event) {\r\n callback00(event.data);\r\n };\r\n\r\n webWorker.postMessage(blob);\r\n } else {\r\n var reader = new FileReader();\r\n reader.readAsDataURL(blob);\r\n reader.onload = function(event) {\r\n callback00(event.target.result);\r\n };\r\n }\r\n }\r\n\r\n function processInWebWorker(_function) {\r\n var blob = URL.createObjectURL(new Blob([_function.toString(),\r\n 'this.onmessage = function (eee) {' + _function.name + '(eee.data);}'\r\n ], {\r\n type: 'application/javascript'\r\n }));\r\n\r\n var worker = new Worker(blob);\r\n var url;\r\n if (typeof URL !== 'undefined') {\r\n url = URL;\r\n } else if (typeof webkitURL !== 'undefined') {\r\n url = webkitURL;\r\n } else {\r\n throw 'Neither URL nor webkitURL detected.';\r\n }\r\n url.revokeObjectURL(blob);\r\n return worker;\r\n }\r\n };\r\n\r\n /**\r\n * This method can be used to ask {@link MRecordRTC} to write all recorded blobs into IndexedDB storage.\r\n * @method\r\n * @memberof MRecordRTC\r\n * @example\r\n * recorder.writeToDisk();\r\n */\r\n this.writeToDisk = function() {\r\n RecordRTC.writeToDisk({\r\n audio: this.audioRecorder,\r\n video: this.videoRecorder,\r\n gif: this.gifRecorder\r\n });\r\n };\r\n\r\n /**\r\n * This method can be used to invoke a save-as dialog for all recorded blobs.\r\n * @param {object} args - {audio: 'audio-name', video: 'video-name', gif: 'gif-name'}\r\n * @method\r\n * @memberof MRecordRTC\r\n * @example\r\n * recorder.save({\r\n * audio: 'audio-file-name',\r\n * video: 'video-file-name',\r\n * gif : 'gif-file-name'\r\n * });\r\n */\r\n this.save = function(args) {\r\n args = args || {\r\n audio: true,\r\n video: true,\r\n gif: true\r\n };\r\n\r\n if (!!args.audio && this.audioRecorder) {\r\n this.audioRecorder.save(typeof args.audio === 'string' ? args.audio : '');\r\n }\r\n\r\n if (!!args.video && this.videoRecorder) {\r\n this.videoRecorder.save(typeof args.video === 'string' ? args.video : '');\r\n }\r\n if (!!args.gif && this.gifRecorder) {\r\n this.gifRecorder.save(typeof args.gif === 'string' ? args.gif : '');\r\n }\r\n };\r\n}\r\n\r\n/**\r\n * This method can be used to get all recorded blobs from IndexedDB storage.\r\n * @param {string} type - 'all' or 'audio' or 'video' or 'gif'\r\n * @param {function} callback - Callback function to get all stored blobs.\r\n * @method\r\n * @memberof MRecordRTC\r\n * @example\r\n * MRecordRTC.getFromDisk('all', function(dataURL, type){\r\n * if(type === 'audio') { }\r\n * if(type === 'video') { }\r\n * if(type === 'gif') { }\r\n * });\r\n */\r\nMRecordRTC.getFromDisk = RecordRTC.getFromDisk;\r\n\r\n/**\r\n * This method can be used to store recorded blobs into IndexedDB storage.\r\n * @param {object} options - {audio: Blob, video: Blob, gif: Blob}\r\n * @method\r\n * @memberof MRecordRTC\r\n * @example\r\n * MRecordRTC.writeToDisk({\r\n * audio: audioBlob,\r\n * video: videoBlob,\r\n * gif : gifBlob\r\n * });\r\n */\r\nMRecordRTC.writeToDisk = RecordRTC.writeToDisk;\r\n\r\nif (typeof RecordRTC !== 'undefined') {\r\n RecordRTC.MRecordRTC = MRecordRTC;\r\n}\n\r\nvar browserFakeUserAgent = 'Fake/5.0 (FakeOS) AppleWebKit/123 (KHTML, like Gecko) Fake/12.3.4567.89 Fake/123.45';\r\n\r\n(function(that) {\r\n if (!that) {\r\n return;\r\n }\r\n\r\n if (typeof window !== 'undefined') {\r\n return;\r\n }\r\n\r\n if (typeof global === 'undefined') {\r\n return;\r\n }\r\n\r\n global.navigator = {\r\n userAgent: browserFakeUserAgent,\r\n getUserMedia: function() {}\r\n };\r\n\r\n if (!global.console) {\r\n global.console = {};\r\n }\r\n\r\n if (typeof global.console.log === 'undefined' || typeof global.console.error === 'undefined') {\r\n global.console.error = global.console.log = global.console.log || function() {\r\n console.log(arguments);\r\n };\r\n }\r\n\r\n if (typeof document === 'undefined') {\r\n /*global document:true */\r\n that.document = {\r\n documentElement: {\r\n appendChild: function() {\r\n return '';\r\n }\r\n }\r\n };\r\n\r\n document.createElement = document.captureStream = document.mozCaptureStream = function() {\r\n var obj = {\r\n getContext: function() {\r\n return obj;\r\n },\r\n play: function() {},\r\n pause: function() {},\r\n drawImage: function() {},\r\n toDataURL: function() {\r\n return '';\r\n },\r\n style: {}\r\n };\r\n return obj;\r\n };\r\n\r\n that.HTMLVideoElement = function() {};\r\n }\r\n\r\n if (typeof location === 'undefined') {\r\n /*global location:true */\r\n that.location = {\r\n protocol: 'file:',\r\n href: '',\r\n hash: ''\r\n };\r\n }\r\n\r\n if (typeof screen === 'undefined') {\r\n /*global screen:true */\r\n that.screen = {\r\n width: 0,\r\n height: 0\r\n };\r\n }\r\n\r\n if (typeof URL === 'undefined') {\r\n /*global screen:true */\r\n that.URL = {\r\n createObjectURL: function() {\r\n return '';\r\n },\r\n revokeObjectURL: function() {\r\n return '';\r\n }\r\n };\r\n }\r\n\r\n /*global window:true */\r\n that.window = global;\r\n})(typeof global !== 'undefined' ? global : null);\n\r\n// _____________________________\r\n// Cross-Browser-Declarations.js\r\n\r\n// animation-frame used in WebM recording\r\n\r\n/*jshint -W079 */\r\nvar requestAnimationFrame = window.requestAnimationFrame;\r\nif (typeof requestAnimationFrame === 'undefined') {\r\n if (typeof webkitRequestAnimationFrame !== 'undefined') {\r\n /*global requestAnimationFrame:true */\r\n requestAnimationFrame = webkitRequestAnimationFrame;\r\n } else if (typeof mozRequestAnimationFrame !== 'undefined') {\r\n /*global requestAnimationFrame:true */\r\n requestAnimationFrame = mozRequestAnimationFrame;\r\n } else if (typeof msRequestAnimationFrame !== 'undefined') {\r\n /*global requestAnimationFrame:true */\r\n requestAnimationFrame = msRequestAnimationFrame;\r\n } else if (typeof requestAnimationFrame === 'undefined') {\r\n // via: https://gist.github.com/paulirish/1579671\r\n var lastTime = 0;\r\n\r\n /*global requestAnimationFrame:true */\r\n requestAnimationFrame = function(callback, element) {\r\n var currTime = new Date().getTime();\r\n var timeToCall = Math.max(0, 16 - (currTime - lastTime));\r\n var id = setTimeout(function() {\r\n callback(currTime + timeToCall);\r\n }, timeToCall);\r\n lastTime = currTime + timeToCall;\r\n return id;\r\n };\r\n }\r\n}\r\n\r\n/*jshint -W079 */\r\nvar cancelAnimationFrame = window.cancelAnimationFrame;\r\nif (typeof cancelAnimationFrame === 'undefined') {\r\n if (typeof webkitCancelAnimationFrame !== 'undefined') {\r\n /*global cancelAnimationFrame:true */\r\n cancelAnimationFrame = webkitCancelAnimationFrame;\r\n } else if (typeof mozCancelAnimationFrame !== 'undefined') {\r\n /*global cancelAnimationFrame:true */\r\n cancelAnimationFrame = mozCancelAnimationFrame;\r\n } else if (typeof msCancelAnimationFrame !== 'undefined') {\r\n /*global cancelAnimationFrame:true */\r\n cancelAnimationFrame = msCancelAnimationFrame;\r\n } else if (typeof cancelAnimationFrame === 'undefined') {\r\n /*global cancelAnimationFrame:true */\r\n cancelAnimationFrame = function(id) {\r\n clearTimeout(id);\r\n };\r\n }\r\n}\r\n\r\n// WebAudio API representer\r\nvar AudioContext = window.AudioContext;\r\n\r\nif (typeof AudioContext === 'undefined') {\r\n if (typeof webkitAudioContext !== 'undefined') {\r\n /*global AudioContext:true */\r\n AudioContext = webkitAudioContext;\r\n }\r\n\r\n if (typeof mozAudioContext !== 'undefined') {\r\n /*global AudioContext:true */\r\n AudioContext = mozAudioContext;\r\n }\r\n}\r\n\r\n/*jshint -W079 */\r\nvar URL = window.URL;\r\n\r\nif (typeof URL === 'undefined' && typeof webkitURL !== 'undefined') {\r\n /*global URL:true */\r\n URL = webkitURL;\r\n}\r\n\r\nif (typeof navigator !== 'undefined' && typeof navigator.getUserMedia === 'undefined') { // maybe window.navigator?\r\n if (typeof navigator.webkitGetUserMedia !== 'undefined') {\r\n navigator.getUserMedia = navigator.webkitGetUserMedia;\r\n }\r\n\r\n if (typeof navigator.mozGetUserMedia !== 'undefined') {\r\n navigator.getUserMedia = navigator.mozGetUserMedia;\r\n }\r\n}\r\n\r\nvar isEdge = navigator.userAgent.indexOf('Edge') !== -1 && (!!navigator.msSaveBlob || !!navigator.msSaveOrOpenBlob);\r\nvar isOpera = !!window.opera || navigator.userAgent.indexOf('OPR/') !== -1;\r\nvar isFirefox = navigator.userAgent.toLowerCase().indexOf('firefox') > -1 && ('netscape' in window) && / rv:/.test(navigator.userAgent);\r\nvar isChrome = (!isOpera && !isEdge && !!navigator.webkitGetUserMedia) || isElectron() || navigator.userAgent.toLowerCase().indexOf('chrome/') !== -1;\r\n\r\nvar isSafari = /^((?!chrome|android).)*safari/i.test(navigator.userAgent);\r\n\r\nif (isSafari && !isChrome && navigator.userAgent.indexOf('CriOS') !== -1) {\r\n isSafari = false;\r\n isChrome = true;\r\n}\r\n\r\nvar MediaStream = window.MediaStream;\r\n\r\nif (typeof MediaStream === 'undefined' && typeof webkitMediaStream !== 'undefined') {\r\n MediaStream = webkitMediaStream;\r\n}\r\n\r\n/*global MediaStream:true */\r\nif (typeof MediaStream !== 'undefined') {\r\n // override \"stop\" method for all browsers\r\n if (typeof MediaStream.prototype.stop === 'undefined') {\r\n MediaStream.prototype.stop = function() {\r\n this.getTracks().forEach(function(track) {\r\n track.stop();\r\n });\r\n };\r\n }\r\n}\r\n\r\n// below function via: http://goo.gl/B3ae8c\r\n/**\r\n * Return human-readable file size.\r\n * @param {number} bytes - Pass bytes and get formatted string.\r\n * @returns {string} - formatted string\r\n * @example\r\n * bytesToSize(1024*1024*5) === '5 GB'\r\n * @see {@link https://github.com/muaz-khan/RecordRTC|RecordRTC Source Code}\r\n */\r\nfunction bytesToSize(bytes) {\r\n var k = 1000;\r\n var sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB'];\r\n if (bytes === 0) {\r\n return '0 Bytes';\r\n }\r\n var i = parseInt(Math.floor(Math.log(bytes) / Math.log(k)), 10);\r\n return (bytes / Math.pow(k, i)).toPrecision(3) + ' ' + sizes[i];\r\n}\r\n\r\n/**\r\n * @param {Blob} file - File or Blob object. This parameter is required.\r\n * @param {string} fileName - Optional file name e.g. \"Recorded-Video.webm\"\r\n * @example\r\n * invokeSaveAsDialog(blob or file, [optional] fileName);\r\n * @see {@link https://github.com/muaz-khan/RecordRTC|RecordRTC Source Code}\r\n */\r\nfunction invokeSaveAsDialog(file, fileName) {\r\n if (!file) {\r\n throw 'Blob object is required.';\r\n }\r\n\r\n if (!file.type) {\r\n try {\r\n file.type = 'video/webm';\r\n } catch (e) {}\r\n }\r\n\r\n var fileExtension = (file.type || 'video/webm').split('/')[1];\r\n if (fileExtension.indexOf(';') !== -1) {\r\n // extended mimetype, e.g. 'video/webm;codecs=vp8,opus'\r\n fileExtension = fileExtension.split(';')[0];\r\n }\r\n if (fileName && fileName.indexOf('.') !== -1) {\r\n var splitted = fileName.split('.');\r\n fileName = splitted[0];\r\n fileExtension = splitted[1];\r\n }\r\n\r\n var fileFullName = (fileName || (Math.round(Math.random() * 9999999999) + 888888888)) + '.' + fileExtension;\r\n\r\n if (typeof navigator.msSaveOrOpenBlob !== 'undefined') {\r\n return navigator.msSaveOrOpenBlob(file, fileFullName);\r\n } else if (typeof navigator.msSaveBlob !== 'undefined') {\r\n return navigator.msSaveBlob(file, fileFullName);\r\n }\r\n\r\n var hyperlink = document.createElement('a');\r\n hyperlink.href = URL.createObjectURL(file);\r\n hyperlink.download = fileFullName;\r\n\r\n hyperlink.style = 'display:none;opacity:0;color:transparent;';\r\n (document.body || document.documentElement).appendChild(hyperlink);\r\n\r\n if (typeof hyperlink.click === 'function') {\r\n hyperlink.click();\r\n } else {\r\n hyperlink.target = '_blank';\r\n hyperlink.dispatchEvent(new MouseEvent('click', {\r\n view: window,\r\n bubbles: true,\r\n cancelable: true\r\n }));\r\n }\r\n\r\n URL.revokeObjectURL(hyperlink.href);\r\n}\r\n\r\n/**\r\n * from: https://github.com/cheton/is-electron/blob/master/index.js\r\n **/\r\nfunction isElectron() {\r\n // Renderer process\r\n if (typeof window !== 'undefined' && typeof window.process === 'object' && window.process.type === 'renderer') {\r\n return true;\r\n }\r\n\r\n // Main process\r\n if (typeof process !== 'undefined' && typeof process.versions === 'object' && !!process.versions.electron) {\r\n return true;\r\n }\r\n\r\n // Detect the user agent when the `nodeIntegration` option is set to true\r\n if (typeof navigator === 'object' && typeof navigator.userAgent === 'string' && navigator.userAgent.indexOf('Electron') >= 0) {\r\n return true;\r\n }\r\n\r\n return false;\r\n}\r\n\r\nfunction getTracks(stream, kind) {\r\n if (!stream || !stream.getTracks) {\r\n return [];\r\n }\r\n\r\n return stream.getTracks().filter(function(t) {\r\n return t.kind === (kind || 'audio');\r\n });\r\n}\r\n\r\nfunction setSrcObject(stream, element) {\r\n if ('srcObject' in element) {\r\n element.srcObject = stream;\r\n } else if ('mozSrcObject' in element) {\r\n element.mozSrcObject = stream;\r\n } else {\r\n element.srcObject = stream;\r\n }\r\n}\r\n\r\n/**\r\n * @param {Blob} file - File or Blob object.\r\n * @param {function} callback - Callback function.\r\n * @example\r\n * getSeekableBlob(blob or file, callback);\r\n * @see {@link https://github.com/muaz-khan/RecordRTC|RecordRTC Source Code}\r\n */\r\nfunction getSeekableBlob(inputBlob, callback) {\r\n // EBML.js copyrights goes to: https://github.com/legokichi/ts-ebml\r\n if (typeof EBML === 'undefined') {\r\n throw new Error('Please link: https://www.webrtc-experiment.com/EBML.js');\r\n }\r\n\r\n var reader = new EBML.Reader();\r\n var decoder = new EBML.Decoder();\r\n var tools = EBML.tools;\r\n\r\n var fileReader = new FileReader();\r\n fileReader.onload = function(e) {\r\n var ebmlElms = decoder.decode(this.result);\r\n ebmlElms.forEach(function(element) {\r\n reader.read(element);\r\n });\r\n reader.stop();\r\n var refinedMetadataBuf = tools.makeMetadataSeekable(reader.metadatas, reader.duration, reader.cues);\r\n var body = this.result.slice(reader.metadataSize);\r\n var newBlob = new Blob([refinedMetadataBuf, body], {\r\n type: 'video/webm'\r\n });\r\n\r\n callback(newBlob);\r\n };\r\n fileReader.readAsArrayBuffer(inputBlob);\r\n}\r\n\r\nif (typeof RecordRTC !== 'undefined') {\r\n RecordRTC.invokeSaveAsDialog = invokeSaveAsDialog;\r\n RecordRTC.getTracks = getTracks;\r\n RecordRTC.getSeekableBlob = getSeekableBlob;\r\n RecordRTC.bytesToSize = bytesToSize;\r\n RecordRTC.isElectron = isElectron;\r\n}\r\n\r\n// __________ (used to handle stuff like http://goo.gl/xmE5eg) issue #129\r\n// Storage.js\r\n\r\n/**\r\n * Storage is a standalone object used by {@link RecordRTC} to store reusable objects e.g. \"new AudioContext\".\r\n * @license {@link https://github.com/muaz-khan/RecordRTC/blob/master/LICENSE|MIT}\r\n * @author {@link https://MuazKhan.com|Muaz Khan}\r\n * @example\r\n * Storage.AudioContext === webkitAudioContext\r\n * @property {webkitAudioContext} AudioContext - Keeps a reference to AudioContext object.\r\n * @see {@link https://github.com/muaz-khan/RecordRTC|RecordRTC Source Code}\r\n */\r\n\r\nvar Storage = {};\r\n\r\nif (typeof AudioContext !== 'undefined') {\r\n Storage.AudioContext = AudioContext;\r\n} else if (typeof webkitAudioContext !== 'undefined') {\r\n Storage.AudioContext = webkitAudioContext;\r\n}\r\n\r\nif (typeof RecordRTC !== 'undefined') {\r\n RecordRTC.Storage = Storage;\r\n}\n\r\nfunction isMediaRecorderCompatible() {\r\n if (isFirefox || isSafari || isEdge) {\r\n return true;\r\n }\r\n\r\n var nVer = navigator.appVersion;\r\n var nAgt = navigator.userAgent;\r\n var fullVersion = '' + parseFloat(navigator.appVersion);\r\n var majorVersion = parseInt(navigator.appVersion, 10);\r\n var nameOffset, verOffset, ix;\r\n\r\n if (isChrome || isOpera) {\r\n verOffset = nAgt.indexOf('Chrome');\r\n fullVersion = nAgt.substring(verOffset + 7);\r\n }\r\n\r\n // trim the fullVersion string at semicolon/space if present\r\n if ((ix = fullVersion.indexOf(';')) !== -1) {\r\n fullVersion = fullVersion.substring(0, ix);\r\n }\r\n\r\n if ((ix = fullVersion.indexOf(' ')) !== -1) {\r\n fullVersion = fullVersion.substring(0, ix);\r\n }\r\n\r\n majorVersion = parseInt('' + fullVersion, 10);\r\n\r\n if (isNaN(majorVersion)) {\r\n fullVersion = '' + parseFloat(navigator.appVersion);\r\n majorVersion = parseInt(navigator.appVersion, 10);\r\n }\r\n\r\n return majorVersion >= 49;\r\n}\n\r\n// ______________________\r\n// MediaStreamRecorder.js\r\n\r\n/**\r\n * MediaStreamRecorder is an abstraction layer for {@link https://w3c.github.io/mediacapture-record/MediaRecorder.html|MediaRecorder API}. It is used by {@link RecordRTC} to record MediaStream(s) in both Chrome and Firefox.\r\n * @summary Runs top over {@link https://w3c.github.io/mediacapture-record/MediaRecorder.html|MediaRecorder API}.\r\n * @license {@link https://github.com/muaz-khan/RecordRTC/blob/master/LICENSE|MIT}\r\n * @author {@link https://github.com/muaz-khan|Muaz Khan}\r\n * @typedef MediaStreamRecorder\r\n * @class\r\n * @example\r\n * var config = {\r\n * mimeType: 'video/webm', // vp8, vp9, h264, mkv, opus/vorbis\r\n * audioBitsPerSecond : 256 * 8 * 1024,\r\n * videoBitsPerSecond : 256 * 8 * 1024,\r\n * bitsPerSecond: 256 * 8 * 1024, // if this is provided, skip above two\r\n * checkForInactiveTracks: true,\r\n * timeSlice: 1000, // concatenate intervals based blobs\r\n * ondataavailable: function() {} // get intervals based blobs\r\n * }\r\n * var recorder = new MediaStreamRecorder(mediaStream, config);\r\n * recorder.record();\r\n * recorder.stop(function(blob) {\r\n * video.src = URL.createObjectURL(blob);\r\n *\r\n * // or\r\n * var blob = recorder.blob;\r\n * });\r\n * @see {@link https://github.com/muaz-khan/RecordRTC|RecordRTC Source Code}\r\n * @param {MediaStream} mediaStream - MediaStream object fetched using getUserMedia API or generated using captureStreamUntilEnded or WebAudio API.\r\n * @param {object} config - {disableLogs:true, initCallback: function, mimeType: \"video/webm\", timeSlice: 1000}\r\n * @throws Will throw an error if first argument \"MediaStream\" is missing. Also throws error if \"MediaRecorder API\" are not supported by the browser.\r\n */\r\n\r\nfunction MediaStreamRecorder(mediaStream, config) {\r\n var self = this;\r\n\r\n if (typeof mediaStream === 'undefined') {\r\n throw 'First argument \"MediaStream\" is required.';\r\n }\r\n\r\n if (typeof MediaRecorder === 'undefined') {\r\n throw 'Your browser does not support the Media Recorder API. Please try other modules e.g. WhammyRecorder or StereoAudioRecorder.';\r\n }\r\n\r\n config = config || {\r\n // bitsPerSecond: 256 * 8 * 1024,\r\n mimeType: 'video/webm'\r\n };\r\n\r\n if (config.type === 'audio') {\r\n if (getTracks(mediaStream, 'video').length && getTracks(mediaStream, 'audio').length) {\r\n var stream;\r\n if (!!navigator.mozGetUserMedia) {\r\n stream = new MediaStream();\r\n stream.addTrack(getTracks(mediaStream, 'audio')[0]);\r\n } else {\r\n // webkitMediaStream\r\n stream = new MediaStream(getTracks(mediaStream, 'audio'));\r\n }\r\n mediaStream = stream;\r\n }\r\n\r\n if (!config.mimeType || config.mimeType.toString().toLowerCase().indexOf('audio') === -1) {\r\n config.mimeType = isChrome ? 'audio/webm' : 'audio/ogg';\r\n }\r\n\r\n if (config.mimeType && config.mimeType.toString().toLowerCase() !== 'audio/ogg' && !!navigator.mozGetUserMedia) {\r\n // forcing better codecs on Firefox (via #166)\r\n config.mimeType = 'audio/ogg';\r\n }\r\n }\r\n\r\n var arrayOfBlobs = [];\r\n\r\n /**\r\n * This method returns array of blobs. Use only with \"timeSlice\". Its useful to preview recording anytime, without using the \"stop\" method.\r\n * @method\r\n * @memberof MediaStreamRecorder\r\n * @example\r\n * var arrayOfBlobs = recorder.getArrayOfBlobs();\r\n * @returns {Array} Returns array of recorded blobs.\r\n */\r\n this.getArrayOfBlobs = function() {\r\n return arrayOfBlobs;\r\n };\r\n\r\n /**\r\n * This method records MediaStream.\r\n * @method\r\n * @memberof MediaStreamRecorder\r\n * @example\r\n * recorder.record();\r\n */\r\n this.record = function() {\r\n // set defaults\r\n self.blob = null;\r\n self.clearRecordedData();\r\n self.timestamps = [];\r\n allStates = [];\r\n arrayOfBlobs = [];\r\n\r\n var recorderHints = config;\r\n\r\n if (!config.disableLogs) {\r\n console.log('Passing following config over MediaRecorder API.', recorderHints);\r\n }\r\n\r\n if (mediaRecorder) {\r\n // mandatory to make sure Firefox doesn't fails to record streams 3-4 times without reloading the page.\r\n mediaRecorder = null;\r\n }\r\n\r\n if (isChrome && !isMediaRecorderCompatible()) {\r\n // to support video-only recording on stable\r\n recorderHints = 'video/vp8';\r\n }\r\n\r\n if (typeof MediaRecorder.isTypeSupported === 'function' && recorderHints.mimeType) {\r\n if (!MediaRecorder.isTypeSupported(recorderHints.mimeType)) {\r\n if (!config.disableLogs) {\r\n console.warn('MediaRecorder API seems unable to record mimeType:', recorderHints.mimeType);\r\n }\r\n\r\n recorderHints.mimeType = config.type === 'audio' ? 'audio/webm' : 'video/webm';\r\n }\r\n }\r\n\r\n // using MediaRecorder API here\r\n try {\r\n mediaRecorder = new MediaRecorder(mediaStream, recorderHints);\r\n\r\n // reset\r\n config.mimeType = recorderHints.mimeType;\r\n } catch (e) {\r\n // chrome-based fallback\r\n mediaRecorder = new MediaRecorder(mediaStream);\r\n }\r\n\r\n // old hack?\r\n if (recorderHints.mimeType && !MediaRecorder.isTypeSupported && 'canRecordMimeType' in mediaRecorder && mediaRecorder.canRecordMimeType(recorderHints.mimeType) === false) {\r\n if (!config.disableLogs) {\r\n console.warn('MediaRecorder API seems unable to record mimeType:', recorderHints.mimeType);\r\n }\r\n }\r\n\r\n // Dispatching OnDataAvailable Handler\r\n mediaRecorder.ondataavailable = function(e) {\r\n if (e.data) {\r\n allStates.push('ondataavailable: ' + bytesToSize(e.data.size));\r\n }\r\n\r\n if (typeof config.timeSlice === 'number') {\r\n if (e.data && e.data.size) {\r\n arrayOfBlobs.push(e.data);\r\n updateTimeStamp();\r\n\r\n if (typeof config.ondataavailable === 'function') {\r\n // intervals based blobs\r\n var blob = config.getNativeBlob ? e.data : new Blob([e.data], {\r\n type: getMimeType(recorderHints)\r\n });\r\n config.ondataavailable(blob);\r\n }\r\n }\r\n return;\r\n }\r\n\r\n if (!e.data || !e.data.size || e.data.size < 100 || self.blob) {\r\n // make sure that stopRecording always getting fired\r\n // even if there is invalid data\r\n if (self.recordingCallback) {\r\n self.recordingCallback(new Blob([], {\r\n type: getMimeType(recorderHints)\r\n }));\r\n self.recordingCallback = null;\r\n }\r\n return;\r\n }\r\n\r\n self.blob = config.getNativeBlob ? e.data : new Blob([e.data], {\r\n type: getMimeType(recorderHints)\r\n });\r\n\r\n if (self.recordingCallback) {\r\n self.recordingCallback(self.blob);\r\n self.recordingCallback = null;\r\n }\r\n };\r\n\r\n mediaRecorder.onstart = function() {\r\n allStates.push('started');\r\n };\r\n\r\n mediaRecorder.onpause = function() {\r\n allStates.push('paused');\r\n };\r\n\r\n mediaRecorder.onresume = function() {\r\n allStates.push('resumed');\r\n };\r\n\r\n mediaRecorder.onstop = function() {\r\n allStates.push('stopped');\r\n };\r\n\r\n mediaRecorder.onerror = function(error) {\r\n if (!error) {\r\n return;\r\n }\r\n\r\n if (!error.name) {\r\n error.name = 'UnknownError';\r\n }\r\n\r\n allStates.push('error: ' + error);\r\n\r\n if (!config.disableLogs) {\r\n // via: https://w3c.github.io/mediacapture-record/MediaRecorder.html#exception-summary\r\n if (error.name.toString().toLowerCase().indexOf('invalidstate') !== -1) {\r\n console.error('The MediaRecorder is not in a state in which the proposed operation is allowed to be executed.', error);\r\n } else if (error.name.toString().toLowerCase().indexOf('notsupported') !== -1) {\r\n console.error('MIME type (', recorderHints.mimeType, ') is not supported.', error);\r\n } else if (error.name.toString().toLowerCase().indexOf('security') !== -1) {\r\n console.error('MediaRecorder security error', error);\r\n }\r\n\r\n // older code below\r\n else if (error.name === 'OutOfMemory') {\r\n console.error('The UA has exhaused the available memory. User agents SHOULD provide as much additional information as possible in the message attribute.', error);\r\n } else if (error.name === 'IllegalStreamModification') {\r\n console.error('A modification to the stream has occurred that makes it impossible to continue recording. An example would be the addition of a Track while recording is occurring. User agents SHOULD provide as much additional information as possible in the message attribute.', error);\r\n } else if (error.name === 'OtherRecordingError') {\r\n console.error('Used for an fatal error other than those listed above. User agents SHOULD provide as much additional information as possible in the message attribute.', error);\r\n } else if (error.name === 'GenericError') {\r\n console.error('The UA cannot provide the codec or recording option that has been requested.', error);\r\n } else {\r\n console.error('MediaRecorder Error', error);\r\n }\r\n }\r\n\r\n (function(looper) {\r\n if (!self.manuallyStopped && mediaRecorder && mediaRecorder.state === 'inactive') {\r\n delete config.timeslice;\r\n\r\n // 10 minutes, enough?\r\n mediaRecorder.start(10 * 60 * 1000);\r\n return;\r\n }\r\n\r\n setTimeout(looper, 1000);\r\n })();\r\n\r\n if (mediaRecorder.state !== 'inactive' && mediaRecorder.state !== 'stopped') {\r\n mediaRecorder.stop();\r\n }\r\n };\r\n\r\n if (typeof config.timeSlice === 'number') {\r\n updateTimeStamp();\r\n mediaRecorder.start(config.timeSlice);\r\n } else {\r\n // default is 60 minutes; enough?\r\n // use config => {timeSlice: 1000} otherwise\r\n\r\n mediaRecorder.start(3.6e+6);\r\n }\r\n\r\n if (config.initCallback) {\r\n config.initCallback(); // old code\r\n }\r\n };\r\n\r\n /**\r\n * @property {Array} timestamps - Array of time stamps\r\n * @memberof MediaStreamRecorder\r\n * @example\r\n * console.log(recorder.timestamps);\r\n */\r\n this.timestamps = [];\r\n\r\n function updateTimeStamp() {\r\n self.timestamps.push(new Date().getTime());\r\n\r\n if (typeof config.onTimeStamp === 'function') {\r\n config.onTimeStamp(self.timestamps[self.timestamps.length - 1], self.timestamps);\r\n }\r\n }\r\n\r\n function getMimeType(secondObject) {\r\n if (mediaRecorder && mediaRecorder.mimeType) {\r\n return mediaRecorder.mimeType;\r\n }\r\n\r\n return secondObject.mimeType || 'video/webm';\r\n }\r\n\r\n /**\r\n * This method stops recording MediaStream.\r\n * @param {function} callback - Callback function, that is used to pass recorded blob back to the callee.\r\n * @method\r\n * @memberof MediaStreamRecorder\r\n * @example\r\n * recorder.stop(function(blob) {\r\n * video.src = URL.createObjectURL(blob);\r\n * });\r\n */\r\n this.stop = function(callback) {\r\n callback = callback || function() {};\r\n\r\n self.manuallyStopped = true; // used inside the mediaRecorder.onerror\r\n\r\n if (!mediaRecorder) {\r\n return;\r\n }\r\n\r\n this.recordingCallback = callback;\r\n\r\n if (mediaRecorder.state === 'recording') {\r\n mediaRecorder.stop();\r\n }\r\n\r\n if (typeof config.timeSlice === 'number') {\r\n setTimeout(function() {\r\n self.blob = new Blob(arrayOfBlobs, {\r\n type: getMimeType(config)\r\n });\r\n\r\n self.recordingCallback(self.blob);\r\n }, 100);\r\n }\r\n };\r\n\r\n /**\r\n * This method pauses the recording process.\r\n * @method\r\n * @memberof MediaStreamRecorder\r\n * @example\r\n * recorder.pause();\r\n */\r\n this.pause = function() {\r\n if (!mediaRecorder) {\r\n return;\r\n }\r\n\r\n if (mediaRecorder.state === 'recording') {\r\n mediaRecorder.pause();\r\n }\r\n };\r\n\r\n /**\r\n * This method resumes the recording process.\r\n * @method\r\n * @memberof MediaStreamRecorder\r\n * @example\r\n * recorder.resume();\r\n */\r\n this.resume = function() {\r\n if (!mediaRecorder) {\r\n return;\r\n }\r\n\r\n if (mediaRecorder.state === 'paused') {\r\n mediaRecorder.resume();\r\n }\r\n };\r\n\r\n /**\r\n * This method resets currently recorded data.\r\n * @method\r\n * @memberof MediaStreamRecorder\r\n * @example\r\n * recorder.clearRecordedData();\r\n */\r\n this.clearRecordedData = function() {\r\n if (mediaRecorder && mediaRecorder.state === 'recording') {\r\n self.stop(clearRecordedDataCB);\r\n }\r\n\r\n clearRecordedDataCB();\r\n };\r\n\r\n function clearRecordedDataCB() {\r\n arrayOfBlobs = [];\r\n mediaRecorder = null;\r\n self.timestamps = [];\r\n }\r\n\r\n // Reference to \"MediaRecorder\" object\r\n var mediaRecorder;\r\n\r\n /**\r\n * Access to native MediaRecorder API\r\n * @method\r\n * @memberof MediaStreamRecorder\r\n * @instance\r\n * @example\r\n * var internal = recorder.getInternalRecorder();\r\n * internal.ondataavailable = function() {}; // override\r\n * internal.stream, internal.onpause, internal.onstop, etc.\r\n * @returns {Object} Returns internal recording object.\r\n */\r\n this.getInternalRecorder = function() {\r\n return mediaRecorder;\r\n };\r\n\r\n function isMediaStreamActive() {\r\n if ('active' in mediaStream) {\r\n if (!mediaStream.active) {\r\n return false;\r\n }\r\n } else if ('ended' in mediaStream) { // old hack\r\n if (mediaStream.ended) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n }\r\n\r\n /**\r\n * @property {Blob} blob - Recorded data as \"Blob\" object.\r\n * @memberof MediaStreamRecorder\r\n * @example\r\n * recorder.stop(function() {\r\n * var blob = recorder.blob;\r\n * });\r\n */\r\n this.blob = null;\r\n\r\n\r\n /**\r\n * Get MediaRecorder readonly state.\r\n * @method\r\n * @memberof MediaStreamRecorder\r\n * @example\r\n * var state = recorder.getState();\r\n * @returns {String} Returns recording state.\r\n */\r\n this.getState = function() {\r\n if (!mediaRecorder) {\r\n return 'inactive';\r\n }\r\n\r\n return mediaRecorder.state || 'inactive';\r\n };\r\n\r\n // list of all recording states\r\n var allStates = [];\r\n\r\n /**\r\n * Get MediaRecorder all recording states.\r\n * @method\r\n * @memberof MediaStreamRecorder\r\n * @example\r\n * var state = recorder.getAllStates();\r\n * @returns {Array} Returns all recording states\r\n */\r\n this.getAllStates = function() {\r\n return allStates;\r\n };\r\n\r\n // if any Track within the MediaStream is muted or not enabled at any time, \r\n // the browser will only record black frames \r\n // or silence since that is the content produced by the Track\r\n // so we need to stopRecording as soon as any single track ends.\r\n if (typeof config.checkForInactiveTracks === 'undefined') {\r\n config.checkForInactiveTracks = false; // disable to minimize CPU usage\r\n }\r\n\r\n var self = this;\r\n\r\n // this method checks if media stream is stopped\r\n // or if any track is ended.\r\n (function looper() {\r\n if (!mediaRecorder || config.checkForInactiveTracks === false) {\r\n return;\r\n }\r\n\r\n if (isMediaStreamActive() === false) {\r\n if (!config.disableLogs) {\r\n console.log('MediaStream seems stopped.');\r\n }\r\n self.stop();\r\n return;\r\n }\r\n\r\n setTimeout(looper, 1000); // check every second\r\n })();\r\n\r\n // for debugging\r\n this.name = 'MediaStreamRecorder';\r\n this.toString = function() {\r\n return this.name;\r\n };\r\n}\r\n\r\nif (typeof RecordRTC !== 'undefined') {\r\n RecordRTC.MediaStreamRecorder = MediaStreamRecorder;\r\n}\r\n\r\n// source code from: http://typedarray.org/wp-content/projects/WebAudioRecorder/script.js\r\n// https://github.com/mattdiamond/Recorderjs#license-mit\r\n// ______________________\r\n// StereoAudioRecorder.js\r\n\r\n/**\r\n * StereoAudioRecorder is a standalone class used by {@link RecordRTC} to bring \"stereo\" audio-recording in chrome.\r\n * @summary JavaScript standalone object for stereo audio recording.\r\n * @license {@link https://github.com/muaz-khan/RecordRTC/blob/master/LICENSE|MIT}\r\n * @author {@link https://MuazKhan.com|Muaz Khan}\r\n * @typedef StereoAudioRecorder\r\n * @class\r\n * @example\r\n * var recorder = new StereoAudioRecorder(MediaStream, {\r\n * sampleRate: 44100,\r\n * bufferSize: 4096\r\n * });\r\n * recorder.record();\r\n * recorder.stop(function(blob) {\r\n * video.src = URL.createObjectURL(blob);\r\n * });\r\n * @see {@link https://github.com/muaz-khan/RecordRTC|RecordRTC Source Code}\r\n * @param {MediaStream} mediaStream - MediaStream object fetched using getUserMedia API or generated using captureStreamUntilEnded or WebAudio API.\r\n * @param {object} config - {sampleRate: 44100, bufferSize: 4096, numberOfAudioChannels: 1, etc.}\r\n */\r\n\r\nfunction StereoAudioRecorder(mediaStream, config) {\r\n if (!getTracks(mediaStream, 'audio').length) {\r\n throw 'Your stream has no audio tracks.';\r\n }\r\n\r\n config = config || {};\r\n\r\n var self = this;\r\n\r\n // variables\r\n var leftchannel = [];\r\n var rightchannel = [];\r\n var recording = false;\r\n var recordingLength = 0;\r\n var jsAudioNode;\r\n\r\n var numberOfAudioChannels = 2;\r\n\r\n /**\r\n * Set sample rates such as 8K or 16K. Reference: http://stackoverflow.com/a/28977136/552182\r\n * @property {number} desiredSampRate - Desired Bits per sample * 1000\r\n * @memberof StereoAudioRecorder\r\n * @instance\r\n * @example\r\n * var recorder = StereoAudioRecorder(mediaStream, {\r\n * desiredSampRate: 16 * 1000 // bits-per-sample * 1000\r\n * });\r\n */\r\n var desiredSampRate = config.desiredSampRate;\r\n\r\n // backward compatibility\r\n if (config.leftChannel === true) {\r\n numberOfAudioChannels = 1;\r\n }\r\n\r\n if (config.numberOfAudioChannels === 1) {\r\n numberOfAudioChannels = 1;\r\n }\r\n\r\n if (!numberOfAudioChannels || numberOfAudioChannels < 1) {\r\n numberOfAudioChannels = 2;\r\n }\r\n\r\n if (!config.disableLogs) {\r\n console.log('StereoAudioRecorder is set to record number of channels: ' + numberOfAudioChannels);\r\n }\r\n\r\n // if any Track within the MediaStream is muted or not enabled at any time, \r\n // the browser will only record black frames \r\n // or silence since that is the content produced by the Track\r\n // so we need to stopRecording as soon as any single track ends.\r\n if (typeof config.checkForInactiveTracks === 'undefined') {\r\n config.checkForInactiveTracks = true;\r\n }\r\n\r\n function isMediaStreamActive() {\r\n if (config.checkForInactiveTracks === false) {\r\n // always return \"true\"\r\n return true;\r\n }\r\n\r\n if ('active' in mediaStream) {\r\n if (!mediaStream.active) {\r\n return false;\r\n }\r\n } else if ('ended' in mediaStream) { // old hack\r\n if (mediaStream.ended) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n }\r\n\r\n /**\r\n * This method records MediaStream.\r\n * @method\r\n * @memberof StereoAudioRecorder\r\n * @example\r\n * recorder.record();\r\n */\r\n this.record = function() {\r\n if (isMediaStreamActive() === false) {\r\n throw 'Please make sure MediaStream is active.';\r\n }\r\n\r\n resetVariables();\r\n\r\n isAudioProcessStarted = isPaused = false;\r\n recording = true;\r\n\r\n if (typeof config.timeSlice !== 'undefined') {\r\n looper();\r\n }\r\n };\r\n\r\n function mergeLeftRightBuffers(config, callback) {\r\n function mergeAudioBuffers(config, cb) {\r\n var numberOfAudioChannels = config.numberOfAudioChannels;\r\n\r\n // todo: \"slice(0)\" --- is it causes loop? Should be removed?\r\n var leftBuffers = config.leftBuffers.slice(0);\r\n var rightBuffers = config.rightBuffers.slice(0);\r\n var sampleRate = config.sampleRate;\r\n var internalInterleavedLength = config.internalInterleavedLength;\r\n var desiredSampRate = config.desiredSampRate;\r\n\r\n if (numberOfAudioChannels === 2) {\r\n leftBuffers = mergeBuffers(leftBuffers, internalInterleavedLength);\r\n rightBuffers = mergeBuffers(rightBuffers, internalInterleavedLength);\r\n\r\n if (desiredSampRate) {\r\n leftBuffers = interpolateArray(leftBuffers, desiredSampRate, sampleRate);\r\n rightBuffers = interpolateArray(rightBuffers, desiredSampRate, sampleRate);\r\n }\r\n }\r\n\r\n if (numberOfAudioChannels === 1) {\r\n leftBuffers = mergeBuffers(leftBuffers, internalInterleavedLength);\r\n\r\n if (desiredSampRate) {\r\n leftBuffers = interpolateArray(leftBuffers, desiredSampRate, sampleRate);\r\n }\r\n }\r\n\r\n // set sample rate as desired sample rate\r\n if (desiredSampRate) {\r\n sampleRate = desiredSampRate;\r\n }\r\n\r\n // for changing the sampling rate, reference:\r\n // http://stackoverflow.com/a/28977136/552182\r\n function interpolateArray(data, newSampleRate, oldSampleRate) {\r\n var fitCount = Math.round(data.length * (newSampleRate / oldSampleRate));\r\n var newData = [];\r\n var springFactor = Number((data.length - 1) / (fitCount - 1));\r\n newData[0] = data[0];\r\n for (var i = 1; i < fitCount - 1; i++) {\r\n var tmp = i * springFactor;\r\n var before = Number(Math.floor(tmp)).toFixed();\r\n var after = Number(Math.ceil(tmp)).toFixed();\r\n var atPoint = tmp - before;\r\n newData[i] = linearInterpolate(data[before], data[after], atPoint);\r\n }\r\n newData[fitCount - 1] = data[data.length - 1];\r\n return newData;\r\n }\r\n\r\n function linearInterpolate(before, after, atPoint) {\r\n return before + (after - before) * atPoint;\r\n }\r\n\r\n function mergeBuffers(channelBuffer, rLength) {\r\n var result = new Float64Array(rLength);\r\n var offset = 0;\r\n var lng = channelBuffer.length;\r\n\r\n for (var i = 0; i < lng; i++) {\r\n var buffer = channelBuffer[i];\r\n result.set(buffer, offset);\r\n offset += buffer.length;\r\n }\r\n\r\n return result;\r\n }\r\n\r\n function interleave(leftChannel, rightChannel) {\r\n var length = leftChannel.length + rightChannel.length;\r\n\r\n var result = new Float64Array(length);\r\n\r\n var inputIndex = 0;\r\n\r\n for (var index = 0; index < length;) {\r\n result[index++] = leftChannel[inputIndex];\r\n result[index++] = rightChannel[inputIndex];\r\n inputIndex++;\r\n }\r\n return result;\r\n }\r\n\r\n function writeUTFBytes(view, offset, string) {\r\n var lng = string.length;\r\n for (var i = 0; i < lng; i++) {\r\n view.setUint8(offset + i, string.charCodeAt(i));\r\n }\r\n }\r\n\r\n // interleave both channels together\r\n var interleaved;\r\n\r\n if (numberOfAudioChannels === 2) {\r\n interleaved = interleave(leftBuffers, rightBuffers);\r\n }\r\n\r\n if (numberOfAudioChannels === 1) {\r\n interleaved = leftBuffers;\r\n }\r\n\r\n var interleavedLength = interleaved.length;\r\n\r\n // create wav file\r\n var resultingBufferLength = 44 + interleavedLength * 2;\r\n\r\n var buffer = new ArrayBuffer(resultingBufferLength);\r\n\r\n var view = new DataView(buffer);\r\n\r\n // RIFF chunk descriptor/identifier \r\n writeUTFBytes(view, 0, 'RIFF');\r\n\r\n // RIFF chunk length\r\n // changed \"44\" to \"36\" via #401\r\n view.setUint32(4, 36 + interleavedLength * 2, true);\r\n\r\n // RIFF type \r\n writeUTFBytes(view, 8, 'WAVE');\r\n\r\n // format chunk identifier \r\n // FMT sub-chunk\r\n writeUTFBytes(view, 12, 'fmt ');\r\n\r\n // format chunk length \r\n view.setUint32(16, 16, true);\r\n\r\n // sample format (raw)\r\n view.setUint16(20, 1, true);\r\n\r\n // stereo (2 channels)\r\n view.setUint16(22, numberOfAudioChannels, true);\r\n\r\n // sample rate \r\n view.setUint32(24, sampleRate, true);\r\n\r\n // byte rate (sample rate * block align)\r\n view.setUint32(28, sampleRate * numberOfAudioChannels * 2, true);\r\n\r\n // block align (channel count * bytes per sample) \r\n view.setUint16(32, numberOfAudioChannels * 2, true);\r\n\r\n // bits per sample \r\n view.setUint16(34, 16, true);\r\n\r\n // data sub-chunk\r\n // data chunk identifier \r\n writeUTFBytes(view, 36, 'data');\r\n\r\n // data chunk length \r\n view.setUint32(40, interleavedLength * 2, true);\r\n\r\n // write the PCM samples\r\n var lng = interleavedLength;\r\n var index = 44;\r\n var volume = 1;\r\n for (var i = 0; i < lng; i++) {\r\n view.setInt16(index, interleaved[i] * (0x7FFF * volume), true);\r\n index += 2;\r\n }\r\n\r\n if (cb) {\r\n return cb({\r\n buffer: buffer,\r\n view: view\r\n });\r\n }\r\n\r\n postMessage({\r\n buffer: buffer,\r\n view: view\r\n });\r\n }\r\n\r\n if (config.noWorker) {\r\n mergeAudioBuffers(config, function(data) {\r\n callback(data.buffer, data.view);\r\n });\r\n return;\r\n }\r\n\r\n\r\n var webWorker = processInWebWorker(mergeAudioBuffers);\r\n\r\n webWorker.onmessage = function(event) {\r\n callback(event.data.buffer, event.data.view);\r\n\r\n // release memory\r\n URL.revokeObjectURL(webWorker.workerURL);\r\n\r\n // kill webworker (or Chrome will kill your page after ~25 calls)\r\n webWorker.terminate();\r\n };\r\n\r\n webWorker.postMessage(config);\r\n }\r\n\r\n function processInWebWorker(_function) {\r\n var workerURL = URL.createObjectURL(new Blob([_function.toString(),\r\n ';this.onmessage = function (eee) {' + _function.name + '(eee.data);}'\r\n ], {\r\n type: 'application/javascript'\r\n }));\r\n\r\n var worker = new Worker(workerURL);\r\n worker.workerURL = workerURL;\r\n return worker;\r\n }\r\n\r\n /**\r\n * This method stops recording MediaStream.\r\n * @param {function} callback - Callback function, that is used to pass recorded blob back to the callee.\r\n * @method\r\n * @memberof StereoAudioRecorder\r\n * @example\r\n * recorder.stop(function(blob) {\r\n * video.src = URL.createObjectURL(blob);\r\n * });\r\n */\r\n this.stop = function(callback) {\r\n callback = callback || function() {};\r\n\r\n // stop recording\r\n recording = false;\r\n\r\n mergeLeftRightBuffers({\r\n desiredSampRate: desiredSampRate,\r\n sampleRate: sampleRate,\r\n numberOfAudioChannels: numberOfAudioChannels,\r\n internalInterleavedLength: recordingLength,\r\n leftBuffers: leftchannel,\r\n rightBuffers: numberOfAudioChannels === 1 ? [] : rightchannel,\r\n noWorker: config.noWorker\r\n }, function(buffer, view) {\r\n /**\r\n * @property {Blob} blob - The recorded blob object.\r\n * @memberof StereoAudioRecorder\r\n * @example\r\n * recorder.stop(function(){\r\n * var blob = recorder.blob;\r\n * });\r\n */\r\n self.blob = new Blob([view], {\r\n type: 'audio/wav'\r\n });\r\n\r\n /**\r\n * @property {ArrayBuffer} buffer - The recorded buffer object.\r\n * @memberof StereoAudioRecorder\r\n * @example\r\n * recorder.stop(function(){\r\n * var buffer = recorder.buffer;\r\n * });\r\n */\r\n self.buffer = new ArrayBuffer(view.buffer.byteLength);\r\n\r\n /**\r\n * @property {DataView} view - The recorded data-view object.\r\n * @memberof StereoAudioRecorder\r\n * @example\r\n * recorder.stop(function(){\r\n * var view = recorder.view;\r\n * });\r\n */\r\n self.view = view;\r\n\r\n self.sampleRate = desiredSampRate || sampleRate;\r\n self.bufferSize = bufferSize;\r\n\r\n // recorded audio length\r\n self.length = recordingLength;\r\n\r\n isAudioProcessStarted = false;\r\n\r\n if (callback) {\r\n callback(self.blob);\r\n }\r\n });\r\n };\r\n\r\n if (typeof RecordRTC.Storage === 'undefined') {\r\n RecordRTC.Storage = {\r\n AudioContextConstructor: null,\r\n AudioContext: window.AudioContext || window.webkitAudioContext\r\n };\r\n }\r\n\r\n if (!RecordRTC.Storage.AudioContextConstructor || RecordRTC.Storage.AudioContextConstructor.state === 'closed') {\r\n RecordRTC.Storage.AudioContextConstructor = new RecordRTC.Storage.AudioContext();\r\n }\r\n\r\n var context = RecordRTC.Storage.AudioContextConstructor;\r\n\r\n // creates an audio node from the microphone incoming stream\r\n var audioInput = context.createMediaStreamSource(mediaStream);\r\n\r\n var legalBufferValues = [0, 256, 512, 1024, 2048, 4096, 8192, 16384];\r\n\r\n /**\r\n * From the spec: This value controls how frequently the audioprocess event is\r\n * dispatched and how many sample-frames need to be processed each call.\r\n * Lower values for buffer size will result in a lower (better) latency.\r\n * Higher values will be necessary to avoid audio breakup and glitches\r\n * The size of the buffer (in sample-frames) which needs to\r\n * be processed each time onprocessaudio is called.\r\n * Legal values are (256, 512, 1024, 2048, 4096, 8192, 16384).\r\n * @property {number} bufferSize - Buffer-size for how frequently the audioprocess event is dispatched.\r\n * @memberof StereoAudioRecorder\r\n * @example\r\n * recorder = new StereoAudioRecorder(mediaStream, {\r\n * bufferSize: 4096\r\n * });\r\n */\r\n\r\n // \"0\" means, let chrome decide the most accurate buffer-size for current platform.\r\n var bufferSize = typeof config.bufferSize === 'undefined' ? 4096 : config.bufferSize;\r\n\r\n if (legalBufferValues.indexOf(bufferSize) === -1) {\r\n if (!config.disableLogs) {\r\n console.log('Legal values for buffer-size are ' + JSON.stringify(legalBufferValues, null, '\\t'));\r\n }\r\n }\r\n\r\n if (context.createJavaScriptNode) {\r\n jsAudioNode = context.createJavaScriptNode(bufferSize, numberOfAudioChannels, numberOfAudioChannels);\r\n } else if (context.createScriptProcessor) {\r\n jsAudioNode = context.createScriptProcessor(bufferSize, numberOfAudioChannels, numberOfAudioChannels);\r\n } else {\r\n throw 'WebAudio API has no support on this browser.';\r\n }\r\n\r\n // connect the stream to the script processor\r\n audioInput.connect(jsAudioNode);\r\n\r\n if (!config.bufferSize) {\r\n bufferSize = jsAudioNode.bufferSize; // device buffer-size\r\n }\r\n\r\n /**\r\n * The sample rate (in sample-frames per second) at which the\r\n * AudioContext handles audio. It is assumed that all AudioNodes\r\n * in the context run at this rate. In making this assumption,\r\n * sample-rate converters or \"varispeed\" processors are not supported\r\n * in real-time processing.\r\n * The sampleRate parameter describes the sample-rate of the\r\n * linear PCM audio data in the buffer in sample-frames per second.\r\n * An implementation must support sample-rates in at least\r\n * the range 22050 to 96000.\r\n * @property {number} sampleRate - Buffer-size for how frequently the audioprocess event is dispatched.\r\n * @memberof StereoAudioRecorder\r\n * @example\r\n * recorder = new StereoAudioRecorder(mediaStream, {\r\n * sampleRate: 44100\r\n * });\r\n */\r\n var sampleRate = typeof config.sampleRate !== 'undefined' ? config.sampleRate : context.sampleRate || 44100;\r\n\r\n if (sampleRate < 22050 || sampleRate > 96000) {\r\n // Ref: http://stackoverflow.com/a/26303918/552182\r\n if (!config.disableLogs) {\r\n console.log('sample-rate must be under range 22050 and 96000.');\r\n }\r\n }\r\n\r\n if (!config.disableLogs) {\r\n if (config.desiredSampRate) {\r\n console.log('Desired sample-rate: ' + config.desiredSampRate);\r\n }\r\n }\r\n\r\n var isPaused = false;\r\n /**\r\n * This method pauses the recording process.\r\n * @method\r\n * @memberof StereoAudioRecorder\r\n * @example\r\n * recorder.pause();\r\n */\r\n this.pause = function() {\r\n isPaused = true;\r\n };\r\n\r\n /**\r\n * This method resumes the recording process.\r\n * @method\r\n * @memberof StereoAudioRecorder\r\n * @example\r\n * recorder.resume();\r\n */\r\n this.resume = function() {\r\n if (isMediaStreamActive() === false) {\r\n throw 'Please make sure MediaStream is active.';\r\n }\r\n\r\n if (!recording) {\r\n if (!config.disableLogs) {\r\n console.log('Seems recording has been restarted.');\r\n }\r\n this.record();\r\n return;\r\n }\r\n\r\n isPaused = false;\r\n };\r\n\r\n /**\r\n * This method resets currently recorded data.\r\n * @method\r\n * @memberof StereoAudioRecorder\r\n * @example\r\n * recorder.clearRecordedData();\r\n */\r\n this.clearRecordedData = function() {\r\n config.checkForInactiveTracks = false;\r\n\r\n if (recording) {\r\n this.stop(clearRecordedDataCB);\r\n }\r\n\r\n clearRecordedDataCB();\r\n };\r\n\r\n function resetVariables() {\r\n leftchannel = [];\r\n rightchannel = [];\r\n recordingLength = 0;\r\n isAudioProcessStarted = false;\r\n recording = false;\r\n isPaused = false;\r\n context = null;\r\n\r\n self.leftchannel = leftchannel;\r\n self.rightchannel = rightchannel;\r\n self.numberOfAudioChannels = numberOfAudioChannels;\r\n self.desiredSampRate = desiredSampRate;\r\n self.sampleRate = sampleRate;\r\n self.recordingLength = recordingLength;\r\n\r\n intervalsBasedBuffers = {\r\n left: [],\r\n right: [],\r\n recordingLength: 0\r\n };\r\n }\r\n\r\n function clearRecordedDataCB() {\r\n if (jsAudioNode) {\r\n jsAudioNode.onaudioprocess = null;\r\n jsAudioNode.disconnect();\r\n jsAudioNode = null;\r\n }\r\n\r\n if (audioInput) {\r\n audioInput.disconnect();\r\n audioInput = null;\r\n }\r\n\r\n resetVariables();\r\n }\r\n\r\n // for debugging\r\n this.name = 'StereoAudioRecorder';\r\n this.toString = function() {\r\n return this.name;\r\n };\r\n\r\n var isAudioProcessStarted = false;\r\n\r\n function onAudioProcessDataAvailable(e) {\r\n if (isPaused) {\r\n return;\r\n }\r\n\r\n if (isMediaStreamActive() === false) {\r\n if (!config.disableLogs) {\r\n console.log('MediaStream seems stopped.');\r\n }\r\n jsAudioNode.disconnect();\r\n recording = false;\r\n }\r\n\r\n if (!recording) {\r\n if (audioInput) {\r\n audioInput.disconnect();\r\n audioInput = null;\r\n }\r\n return;\r\n }\r\n\r\n /**\r\n * This method is called on \"onaudioprocess\" event's first invocation.\r\n * @method {function} onAudioProcessStarted\r\n * @memberof StereoAudioRecorder\r\n * @example\r\n * recorder.onAudioProcessStarted: function() { };\r\n */\r\n if (!isAudioProcessStarted) {\r\n isAudioProcessStarted = true;\r\n if (config.onAudioProcessStarted) {\r\n config.onAudioProcessStarted();\r\n }\r\n\r\n if (config.initCallback) {\r\n config.initCallback();\r\n }\r\n }\r\n\r\n var left = e.inputBuffer.getChannelData(0);\r\n\r\n // we clone the samples\r\n var chLeft = new Float32Array(left);\r\n leftchannel.push(chLeft);\r\n\r\n if (numberOfAudioChannels === 2) {\r\n var right = e.inputBuffer.getChannelData(1);\r\n var chRight = new Float32Array(right);\r\n rightchannel.push(chRight);\r\n }\r\n\r\n recordingLength += bufferSize;\r\n\r\n // export raw PCM\r\n self.recordingLength = recordingLength;\r\n\r\n if (typeof config.timeSlice !== 'undefined') {\r\n intervalsBasedBuffers.recordingLength += bufferSize;\r\n intervalsBasedBuffers.left.push(chLeft);\r\n\r\n if (numberOfAudioChannels === 2) {\r\n intervalsBasedBuffers.right.push(chRight);\r\n }\r\n }\r\n }\r\n\r\n jsAudioNode.onaudioprocess = onAudioProcessDataAvailable;\r\n\r\n // to prevent self audio to be connected with speakers\r\n if (context.createMediaStreamDestination) {\r\n jsAudioNode.connect(context.createMediaStreamDestination());\r\n } else {\r\n jsAudioNode.connect(context.destination);\r\n }\r\n\r\n // export raw PCM\r\n this.leftchannel = leftchannel;\r\n this.rightchannel = rightchannel;\r\n this.numberOfAudioChannels = numberOfAudioChannels;\r\n this.desiredSampRate = desiredSampRate;\r\n this.sampleRate = sampleRate;\r\n self.recordingLength = recordingLength;\r\n\r\n // helper for intervals based blobs\r\n var intervalsBasedBuffers = {\r\n left: [],\r\n right: [],\r\n recordingLength: 0\r\n };\r\n\r\n // this looper is used to support intervals based blobs (via timeSlice+ondataavailable)\r\n function looper() {\r\n if (!recording || typeof config.ondataavailable !== 'function' || typeof config.timeSlice === 'undefined') {\r\n return;\r\n }\r\n\r\n if (intervalsBasedBuffers.left.length) {\r\n mergeLeftRightBuffers({\r\n desiredSampRate: desiredSampRate,\r\n sampleRate: sampleRate,\r\n numberOfAudioChannels: numberOfAudioChannels,\r\n internalInterleavedLength: intervalsBasedBuffers.recordingLength,\r\n leftBuffers: intervalsBasedBuffers.left,\r\n rightBuffers: numberOfAudioChannels === 1 ? [] : intervalsBasedBuffers.right\r\n }, function(buffer, view) {\r\n var blob = new Blob([view], {\r\n type: 'audio/wav'\r\n });\r\n config.ondataavailable(blob);\r\n\r\n setTimeout(looper, config.timeSlice);\r\n });\r\n\r\n intervalsBasedBuffers = {\r\n left: [],\r\n right: [],\r\n recordingLength: 0\r\n };\r\n } else {\r\n setTimeout(looper, config.timeSlice);\r\n }\r\n }\r\n}\r\n\r\nif (typeof RecordRTC !== 'undefined') {\r\n RecordRTC.StereoAudioRecorder = StereoAudioRecorder;\r\n}\r\n\r\n// _________________\r\n// CanvasRecorder.js\r\n\r\n/**\r\n * CanvasRecorder is a standalone class used by {@link RecordRTC} to bring HTML5-Canvas recording into video WebM. It uses HTML2Canvas library and runs top over {@link Whammy}.\r\n * @summary HTML2Canvas recording into video WebM.\r\n * @license {@link https://github.com/muaz-khan/RecordRTC/blob/master/LICENSE|MIT}\r\n * @author {@link https://MuazKhan.com|Muaz Khan}\r\n * @typedef CanvasRecorder\r\n * @class\r\n * @example\r\n * var recorder = new CanvasRecorder(htmlElement, { disableLogs: true, useWhammyRecorder: true });\r\n * recorder.record();\r\n * recorder.stop(function(blob) {\r\n * video.src = URL.createObjectURL(blob);\r\n * });\r\n * @see {@link https://github.com/muaz-khan/RecordRTC|RecordRTC Source Code}\r\n * @param {HTMLElement} htmlElement - querySelector/getElementById/getElementsByTagName[0]/etc.\r\n * @param {object} config - {disableLogs:true, initCallback: function}\r\n */\r\n\r\nfunction CanvasRecorder(htmlElement, config) {\r\n if (typeof html2canvas === 'undefined') {\r\n throw 'Please link: https://www.webrtc-experiment.com/screenshot.js';\r\n }\r\n\r\n config = config || {};\r\n if (!config.frameInterval) {\r\n config.frameInterval = 10;\r\n }\r\n\r\n // via DetectRTC.js\r\n var isCanvasSupportsStreamCapturing = false;\r\n ['captureStream', 'mozCaptureStream', 'webkitCaptureStream'].forEach(function(item) {\r\n if (item in document.createElement('canvas')) {\r\n isCanvasSupportsStreamCapturing = true;\r\n }\r\n });\r\n\r\n var _isChrome = (!!window.webkitRTCPeerConnection || !!window.webkitGetUserMedia) && !!window.chrome;\r\n\r\n var chromeVersion = 50;\r\n var matchArray = navigator.userAgent.match(/Chrom(e|ium)\\/([0-9]+)\\./);\r\n if (_isChrome && matchArray && matchArray[2]) {\r\n chromeVersion = parseInt(matchArray[2], 10);\r\n }\r\n\r\n if (_isChrome && chromeVersion < 52) {\r\n isCanvasSupportsStreamCapturing = false;\r\n }\r\n\r\n if (config.useWhammyRecorder) {\r\n isCanvasSupportsStreamCapturing = false;\r\n }\r\n\r\n var globalCanvas, mediaStreamRecorder;\r\n\r\n if (isCanvasSupportsStreamCapturing) {\r\n if (!config.disableLogs) {\r\n console.log('Your browser supports both MediRecorder API and canvas.captureStream!');\r\n }\r\n\r\n if (htmlElement instanceof HTMLCanvasElement) {\r\n globalCanvas = htmlElement;\r\n } else if (htmlElement instanceof CanvasRenderingContext2D) {\r\n globalCanvas = htmlElement.canvas;\r\n } else {\r\n throw 'Please pass either HTMLCanvasElement or CanvasRenderingContext2D.';\r\n }\r\n } else if (!!navigator.mozGetUserMedia) {\r\n if (!config.disableLogs) {\r\n console.error('Canvas recording is NOT supported in Firefox.');\r\n }\r\n }\r\n\r\n var isRecording;\r\n\r\n /**\r\n * This method records Canvas.\r\n * @method\r\n * @memberof CanvasRecorder\r\n * @example\r\n * recorder.record();\r\n */\r\n this.record = function() {\r\n isRecording = true;\r\n\r\n if (isCanvasSupportsStreamCapturing && !config.useWhammyRecorder) {\r\n // CanvasCaptureMediaStream\r\n var canvasMediaStream;\r\n if ('captureStream' in globalCanvas) {\r\n canvasMediaStream = globalCanvas.captureStream(25); // 25 FPS\r\n } else if ('mozCaptureStream' in globalCanvas) {\r\n canvasMediaStream = globalCanvas.mozCaptureStream(25);\r\n } else if ('webkitCaptureStream' in globalCanvas) {\r\n canvasMediaStream = globalCanvas.webkitCaptureStream(25);\r\n }\r\n\r\n try {\r\n var mdStream = new MediaStream();\r\n mdStream.addTrack(getTracks(canvasMediaStream, 'video')[0]);\r\n canvasMediaStream = mdStream;\r\n } catch (e) {}\r\n\r\n if (!canvasMediaStream) {\r\n throw 'captureStream API are NOT available.';\r\n }\r\n\r\n // Note: Jan 18, 2016 status is that, \r\n // Firefox MediaRecorder API can't record CanvasCaptureMediaStream object.\r\n mediaStreamRecorder = new MediaStreamRecorder(canvasMediaStream, {\r\n mimeType: config.mimeType || 'video/webm'\r\n });\r\n mediaStreamRecorder.record();\r\n } else {\r\n whammy.frames = [];\r\n lastTime = new Date().getTime();\r\n drawCanvasFrame();\r\n }\r\n\r\n if (config.initCallback) {\r\n config.initCallback();\r\n }\r\n };\r\n\r\n this.getWebPImages = function(callback) {\r\n if (htmlElement.nodeName.toLowerCase() !== 'canvas') {\r\n callback();\r\n return;\r\n }\r\n\r\n var framesLength = whammy.frames.length;\r\n whammy.frames.forEach(function(frame, idx) {\r\n var framesRemaining = framesLength - idx;\r\n if (!config.disableLogs) {\r\n console.log(framesRemaining + '/' + framesLength + ' frames remaining');\r\n }\r\n\r\n if (config.onEncodingCallback) {\r\n config.onEncodingCallback(framesRemaining, framesLength);\r\n }\r\n\r\n var webp = frame.image.toDataURL('image/webp', 1);\r\n whammy.frames[idx].image = webp;\r\n });\r\n\r\n if (!config.disableLogs) {\r\n console.log('Generating WebM');\r\n }\r\n\r\n callback();\r\n };\r\n\r\n /**\r\n * This method stops recording Canvas.\r\n * @param {function} callback - Callback function, that is used to pass recorded blob back to the callee.\r\n * @method\r\n * @memberof CanvasRecorder\r\n * @example\r\n * recorder.stop(function(blob) {\r\n * video.src = URL.createObjectURL(blob);\r\n * });\r\n */\r\n this.stop = function(callback) {\r\n isRecording = false;\r\n\r\n var that = this;\r\n\r\n if (isCanvasSupportsStreamCapturing && mediaStreamRecorder) {\r\n mediaStreamRecorder.stop(callback);\r\n return;\r\n }\r\n\r\n this.getWebPImages(function() {\r\n /**\r\n * @property {Blob} blob - Recorded frames in video/webm blob.\r\n * @memberof CanvasRecorder\r\n * @example\r\n * recorder.stop(function() {\r\n * var blob = recorder.blob;\r\n * });\r\n */\r\n whammy.compile(function(blob) {\r\n if (!config.disableLogs) {\r\n console.log('Recording finished!');\r\n }\r\n\r\n that.blob = blob;\r\n\r\n if (that.blob.forEach) {\r\n that.blob = new Blob([], {\r\n type: 'video/webm'\r\n });\r\n }\r\n\r\n if (callback) {\r\n callback(that.blob);\r\n }\r\n\r\n whammy.frames = [];\r\n });\r\n });\r\n };\r\n\r\n var isPausedRecording = false;\r\n\r\n /**\r\n * This method pauses the recording process.\r\n * @method\r\n * @memberof CanvasRecorder\r\n * @example\r\n * recorder.pause();\r\n */\r\n this.pause = function() {\r\n isPausedRecording = true;\r\n\r\n if (mediaStreamRecorder instanceof MediaStreamRecorder) {\r\n mediaStreamRecorder.pause();\r\n return;\r\n }\r\n };\r\n\r\n /**\r\n * This method resumes the recording process.\r\n * @method\r\n * @memberof CanvasRecorder\r\n * @example\r\n * recorder.resume();\r\n */\r\n this.resume = function() {\r\n isPausedRecording = false;\r\n\r\n if (mediaStreamRecorder instanceof MediaStreamRecorder) {\r\n mediaStreamRecorder.resume();\r\n return;\r\n }\r\n\r\n if (!isRecording) {\r\n this.record();\r\n }\r\n };\r\n\r\n /**\r\n * This method resets currently recorded data.\r\n * @method\r\n * @memberof CanvasRecorder\r\n * @example\r\n * recorder.clearRecordedData();\r\n */\r\n this.clearRecordedData = function() {\r\n if (isRecording) {\r\n this.stop(clearRecordedDataCB);\r\n }\r\n clearRecordedDataCB();\r\n };\r\n\r\n function clearRecordedDataCB() {\r\n whammy.frames = [];\r\n isRecording = false;\r\n isPausedRecording = false;\r\n }\r\n\r\n // for debugging\r\n this.name = 'CanvasRecorder';\r\n this.toString = function() {\r\n return this.name;\r\n };\r\n\r\n function cloneCanvas() {\r\n //create a new canvas\r\n var newCanvas = document.createElement('canvas');\r\n var context = newCanvas.getContext('2d');\r\n\r\n //set dimensions\r\n newCanvas.width = htmlElement.width;\r\n newCanvas.height = htmlElement.height;\r\n\r\n //apply the old canvas to the new one\r\n context.drawImage(htmlElement, 0, 0);\r\n\r\n //return the new canvas\r\n return newCanvas;\r\n }\r\n\r\n function drawCanvasFrame() {\r\n if (isPausedRecording) {\r\n lastTime = new Date().getTime();\r\n return setTimeout(drawCanvasFrame, 500);\r\n }\r\n\r\n if (htmlElement.nodeName.toLowerCase() === 'canvas') {\r\n var duration = new Date().getTime() - lastTime;\r\n // via #206, by Jack i.e. @Seymourr\r\n lastTime = new Date().getTime();\r\n\r\n whammy.frames.push({\r\n image: cloneCanvas(),\r\n duration: duration\r\n });\r\n\r\n if (isRecording) {\r\n setTimeout(drawCanvasFrame, config.frameInterval);\r\n }\r\n return;\r\n }\r\n\r\n html2canvas(htmlElement, {\r\n grabMouse: typeof config.showMousePointer === 'undefined' || config.showMousePointer,\r\n onrendered: function(canvas) {\r\n var duration = new Date().getTime() - lastTime;\r\n if (!duration) {\r\n return setTimeout(drawCanvasFrame, config.frameInterval);\r\n }\r\n\r\n // via #206, by Jack i.e. @Seymourr\r\n lastTime = new Date().getTime();\r\n\r\n whammy.frames.push({\r\n image: canvas.toDataURL('image/webp', 1),\r\n duration: duration\r\n });\r\n\r\n if (isRecording) {\r\n setTimeout(drawCanvasFrame, config.frameInterval);\r\n }\r\n }\r\n });\r\n }\r\n\r\n var lastTime = new Date().getTime();\r\n\r\n var whammy = new Whammy.Video(100);\r\n}\r\n\r\nif (typeof RecordRTC !== 'undefined') {\r\n RecordRTC.CanvasRecorder = CanvasRecorder;\r\n}\n\r\n// _________________\r\n// WhammyRecorder.js\r\n\r\n/**\r\n * WhammyRecorder is a standalone class used by {@link RecordRTC} to bring video recording in Chrome. It runs top over {@link Whammy}.\r\n * @summary Video recording feature in Chrome.\r\n * @license {@link https://github.com/muaz-khan/RecordRTC/blob/master/LICENSE|MIT}\r\n * @author {@link https://MuazKhan.com|Muaz Khan}\r\n * @typedef WhammyRecorder\r\n * @class\r\n * @example\r\n * var recorder = new WhammyRecorder(mediaStream);\r\n * recorder.record();\r\n * recorder.stop(function(blob) {\r\n * video.src = URL.createObjectURL(blob);\r\n * });\r\n * @see {@link https://github.com/muaz-khan/RecordRTC|RecordRTC Source Code}\r\n * @param {MediaStream} mediaStream - MediaStream object fetched using getUserMedia API or generated using captureStreamUntilEnded or WebAudio API.\r\n * @param {object} config - {disableLogs: true, initCallback: function, video: HTMLVideoElement, etc.}\r\n */\r\n\r\nfunction WhammyRecorder(mediaStream, config) {\r\n\r\n config = config || {};\r\n\r\n if (!config.frameInterval) {\r\n config.frameInterval = 10;\r\n }\r\n\r\n if (!config.disableLogs) {\r\n console.log('Using frames-interval:', config.frameInterval);\r\n }\r\n\r\n /**\r\n * This method records video.\r\n * @method\r\n * @memberof WhammyRecorder\r\n * @example\r\n * recorder.record();\r\n */\r\n this.record = function() {\r\n if (!config.width) {\r\n config.width = 320;\r\n }\r\n\r\n if (!config.height) {\r\n config.height = 240;\r\n }\r\n\r\n if (!config.video) {\r\n config.video = {\r\n width: config.width,\r\n height: config.height\r\n };\r\n }\r\n\r\n if (!config.canvas) {\r\n config.canvas = {\r\n width: config.width,\r\n height: config.height\r\n };\r\n }\r\n\r\n canvas.width = config.canvas.width || 320;\r\n canvas.height = config.canvas.height || 240;\r\n\r\n context = canvas.getContext('2d');\r\n\r\n // setting defaults\r\n if (config.video && config.video instanceof HTMLVideoElement) {\r\n video = config.video.cloneNode();\r\n\r\n if (config.initCallback) {\r\n config.initCallback();\r\n }\r\n } else {\r\n video = document.createElement('video');\r\n\r\n setSrcObject(mediaStream, video);\r\n\r\n video.onloadedmetadata = function() { // \"onloadedmetadata\" may NOT work in FF?\r\n if (config.initCallback) {\r\n config.initCallback();\r\n }\r\n };\r\n\r\n video.width = config.video.width;\r\n video.height = config.video.height;\r\n }\r\n\r\n video.muted = true;\r\n video.play();\r\n\r\n lastTime = new Date().getTime();\r\n whammy = new Whammy.Video();\r\n\r\n if (!config.disableLogs) {\r\n console.log('canvas resolutions', canvas.width, '*', canvas.height);\r\n console.log('video width/height', video.width || canvas.width, '*', video.height || canvas.height);\r\n }\r\n\r\n drawFrames(config.frameInterval);\r\n };\r\n\r\n /**\r\n * Draw and push frames to Whammy\r\n * @param {integer} frameInterval - set minimum interval (in milliseconds) between each time we push a frame to Whammy\r\n */\r\n function drawFrames(frameInterval) {\r\n frameInterval = typeof frameInterval !== 'undefined' ? frameInterval : 10;\r\n\r\n var duration = new Date().getTime() - lastTime;\r\n if (!duration) {\r\n return setTimeout(drawFrames, frameInterval, frameInterval);\r\n }\r\n\r\n if (isPausedRecording) {\r\n lastTime = new Date().getTime();\r\n return setTimeout(drawFrames, 100);\r\n }\r\n\r\n // via #206, by Jack i.e. @Seymourr\r\n lastTime = new Date().getTime();\r\n\r\n if (video.paused) {\r\n // via: https://github.com/muaz-khan/WebRTC-Experiment/pull/316\r\n // Tweak for Android Chrome\r\n video.play();\r\n }\r\n\r\n context.drawImage(video, 0, 0, canvas.width, canvas.height);\r\n whammy.frames.push({\r\n duration: duration,\r\n image: canvas.toDataURL('image/webp')\r\n });\r\n\r\n if (!isStopDrawing) {\r\n setTimeout(drawFrames, frameInterval, frameInterval);\r\n }\r\n }\r\n\r\n function asyncLoop(o) {\r\n var i = -1,\r\n length = o.length;\r\n\r\n (function loop() {\r\n i++;\r\n if (i === length) {\r\n o.callback();\r\n return;\r\n }\r\n\r\n // \"setTimeout\" added by Jim McLeod\r\n setTimeout(function() {\r\n o.functionToLoop(loop, i);\r\n }, 1);\r\n })();\r\n }\r\n\r\n\r\n /**\r\n * remove black frames from the beginning to the specified frame\r\n * @param {Array} _frames - array of frames to be checked\r\n * @param {number} _framesToCheck - number of frame until check will be executed (-1 - will drop all frames until frame not matched will be found)\r\n * @param {number} _pixTolerance - 0 - very strict (only black pixel color) ; 1 - all\r\n * @param {number} _frameTolerance - 0 - very strict (only black frame color) ; 1 - all\r\n * @returns {Array} - array of frames\r\n */\r\n // pull#293 by @volodalexey\r\n function dropBlackFrames(_frames, _framesToCheck, _pixTolerance, _frameTolerance, callback) {\r\n var localCanvas = document.createElement('canvas');\r\n localCanvas.width = canvas.width;\r\n localCanvas.height = canvas.height;\r\n var context2d = localCanvas.getContext('2d');\r\n var resultFrames = [];\r\n\r\n var checkUntilNotBlack = _framesToCheck === -1;\r\n var endCheckFrame = (_framesToCheck && _framesToCheck > 0 && _framesToCheck <= _frames.length) ?\r\n _framesToCheck : _frames.length;\r\n var sampleColor = {\r\n r: 0,\r\n g: 0,\r\n b: 0\r\n };\r\n var maxColorDifference = Math.sqrt(\r\n Math.pow(255, 2) +\r\n Math.pow(255, 2) +\r\n Math.pow(255, 2)\r\n );\r\n var pixTolerance = _pixTolerance && _pixTolerance >= 0 && _pixTolerance <= 1 ? _pixTolerance : 0;\r\n var frameTolerance = _frameTolerance && _frameTolerance >= 0 && _frameTolerance <= 1 ? _frameTolerance : 0;\r\n var doNotCheckNext = false;\r\n\r\n asyncLoop({\r\n length: endCheckFrame,\r\n functionToLoop: function(loop, f) {\r\n var matchPixCount, endPixCheck, maxPixCount;\r\n\r\n var finishImage = function() {\r\n if (!doNotCheckNext && maxPixCount - matchPixCount <= maxPixCount * frameTolerance) {\r\n // console.log('removed black frame : ' + f + ' ; frame duration ' + _frames[f].duration);\r\n } else {\r\n // console.log('frame is passed : ' + f);\r\n if (checkUntilNotBlack) {\r\n doNotCheckNext = true;\r\n }\r\n resultFrames.push(_frames[f]);\r\n }\r\n loop();\r\n };\r\n\r\n if (!doNotCheckNext) {\r\n var image = new Image();\r\n image.onload = function() {\r\n context2d.drawImage(image, 0, 0, canvas.width, canvas.height);\r\n var imageData = context2d.getImageData(0, 0, canvas.width, canvas.height);\r\n matchPixCount = 0;\r\n endPixCheck = imageData.data.length;\r\n maxPixCount = imageData.data.length / 4;\r\n\r\n for (var pix = 0; pix < endPixCheck; pix += 4) {\r\n var currentColor = {\r\n r: imageData.data[pix],\r\n g: imageData.data[pix + 1],\r\n b: imageData.data[pix + 2]\r\n };\r\n var colorDifference = Math.sqrt(\r\n Math.pow(currentColor.r - sampleColor.r, 2) +\r\n Math.pow(currentColor.g - sampleColor.g, 2) +\r\n Math.pow(currentColor.b - sampleColor.b, 2)\r\n );\r\n // difference in color it is difference in color vectors (r1,g1,b1) <=> (r2,g2,b2)\r\n if (colorDifference <= maxColorDifference * pixTolerance) {\r\n matchPixCount++;\r\n }\r\n }\r\n finishImage();\r\n };\r\n image.src = _frames[f].image;\r\n } else {\r\n finishImage();\r\n }\r\n },\r\n callback: function() {\r\n resultFrames = resultFrames.concat(_frames.slice(endCheckFrame));\r\n\r\n if (resultFrames.length <= 0) {\r\n // at least one last frame should be available for next manipulation\r\n // if total duration of all frames will be < 1000 than ffmpeg doesn't work well...\r\n resultFrames.push(_frames[_frames.length - 1]);\r\n }\r\n callback(resultFrames);\r\n }\r\n });\r\n }\r\n\r\n var isStopDrawing = false;\r\n\r\n /**\r\n * This method stops recording video.\r\n * @param {function} callback - Callback function, that is used to pass recorded blob back to the callee.\r\n * @method\r\n * @memberof WhammyRecorder\r\n * @example\r\n * recorder.stop(function(blob) {\r\n * video.src = URL.createObjectURL(blob);\r\n * });\r\n */\r\n this.stop = function(callback) {\r\n callback = callback || function() {};\r\n\r\n isStopDrawing = true;\r\n\r\n var _this = this;\r\n // analyse of all frames takes some time!\r\n setTimeout(function() {\r\n // e.g. dropBlackFrames(frames, 10, 1, 1) - will cut all 10 frames\r\n // e.g. dropBlackFrames(frames, 10, 0.5, 0.5) - will analyse 10 frames\r\n // e.g. dropBlackFrames(frames, 10) === dropBlackFrames(frames, 10, 0, 0) - will analyse 10 frames with strict black color\r\n dropBlackFrames(whammy.frames, -1, null, null, function(frames) {\r\n whammy.frames = frames;\r\n\r\n // to display advertisement images!\r\n if (config.advertisement && config.advertisement.length) {\r\n whammy.frames = config.advertisement.concat(whammy.frames);\r\n }\r\n\r\n /**\r\n * @property {Blob} blob - Recorded frames in video/webm blob.\r\n * @memberof WhammyRecorder\r\n * @example\r\n * recorder.stop(function() {\r\n * var blob = recorder.blob;\r\n * });\r\n */\r\n whammy.compile(function(blob) {\r\n _this.blob = blob;\r\n\r\n if (_this.blob.forEach) {\r\n _this.blob = new Blob([], {\r\n type: 'video/webm'\r\n });\r\n }\r\n\r\n if (callback) {\r\n callback(_this.blob);\r\n }\r\n });\r\n });\r\n }, 10);\r\n };\r\n\r\n var isPausedRecording = false;\r\n\r\n /**\r\n * This method pauses the recording process.\r\n * @method\r\n * @memberof WhammyRecorder\r\n * @example\r\n * recorder.pause();\r\n */\r\n this.pause = function() {\r\n isPausedRecording = true;\r\n };\r\n\r\n /**\r\n * This method resumes the recording process.\r\n * @method\r\n * @memberof WhammyRecorder\r\n * @example\r\n * recorder.resume();\r\n */\r\n this.resume = function() {\r\n isPausedRecording = false;\r\n\r\n if (isStopDrawing) {\r\n this.record();\r\n }\r\n };\r\n\r\n /**\r\n * This method resets currently recorded data.\r\n * @method\r\n * @memberof WhammyRecorder\r\n * @example\r\n * recorder.clearRecordedData();\r\n */\r\n this.clearRecordedData = function() {\r\n if (!isStopDrawing) {\r\n this.stop(clearRecordedDataCB);\r\n }\r\n clearRecordedDataCB();\r\n };\r\n\r\n function clearRecordedDataCB() {\r\n whammy.frames = [];\r\n isStopDrawing = true;\r\n isPausedRecording = false;\r\n }\r\n\r\n // for debugging\r\n this.name = 'WhammyRecorder';\r\n this.toString = function() {\r\n return this.name;\r\n };\r\n\r\n var canvas = document.createElement('canvas');\r\n var context = canvas.getContext('2d');\r\n\r\n var video;\r\n var lastTime;\r\n var whammy;\r\n}\r\n\r\nif (typeof RecordRTC !== 'undefined') {\r\n RecordRTC.WhammyRecorder = WhammyRecorder;\r\n}\n\r\n// https://github.com/antimatter15/whammy/blob/master/LICENSE\r\n// _________\r\n// Whammy.js\r\n\r\n// todo: Firefox now supports webp for webm containers!\r\n// their MediaRecorder implementation works well!\r\n// should we provide an option to record via Whammy.js or MediaRecorder API is a better solution?\r\n\r\n/**\r\n * Whammy is a standalone class used by {@link RecordRTC} to bring video recording in Chrome. It is written by {@link https://github.com/antimatter15|antimatter15}\r\n * @summary A real time javascript webm encoder based on a canvas hack.\r\n * @license {@link https://github.com/muaz-khan/RecordRTC/blob/master/LICENSE|MIT}\r\n * @author {@link https://MuazKhan.com|Muaz Khan}\r\n * @typedef Whammy\r\n * @class\r\n * @example\r\n * var recorder = new Whammy().Video(15);\r\n * recorder.add(context || canvas || dataURL);\r\n * var output = recorder.compile();\r\n * @see {@link https://github.com/muaz-khan/RecordRTC|RecordRTC Source Code}\r\n */\r\n\r\nvar Whammy = (function() {\r\n // a more abstract-ish API\r\n\r\n function WhammyVideo(duration) {\r\n this.frames = [];\r\n this.duration = duration || 1;\r\n this.quality = 0.8;\r\n }\r\n\r\n /**\r\n * Pass Canvas or Context or image/webp(string) to {@link Whammy} encoder.\r\n * @method\r\n * @memberof Whammy\r\n * @example\r\n * recorder = new Whammy().Video(0.8, 100);\r\n * recorder.add(canvas || context || 'image/webp');\r\n * @param {string} frame - Canvas || Context || image/webp\r\n * @param {number} duration - Stick a duration (in milliseconds)\r\n */\r\n WhammyVideo.prototype.add = function(frame, duration) {\r\n if ('canvas' in frame) { //CanvasRenderingContext2D\r\n frame = frame.canvas;\r\n }\r\n\r\n if ('toDataURL' in frame) {\r\n frame = frame.toDataURL('image/webp', this.quality);\r\n }\r\n\r\n if (!(/^data:image\\/webp;base64,/ig).test(frame)) {\r\n throw 'Input must be formatted properly as a base64 encoded DataURI of type image/webp';\r\n }\r\n this.frames.push({\r\n image: frame,\r\n duration: duration || this.duration\r\n });\r\n };\r\n\r\n function processInWebWorker(_function) {\r\n var blob = URL.createObjectURL(new Blob([_function.toString(),\r\n 'this.onmessage = function (eee) {' + _function.name + '(eee.data);}'\r\n ], {\r\n type: 'application/javascript'\r\n }));\r\n\r\n var worker = new Worker(blob);\r\n URL.revokeObjectURL(blob);\r\n return worker;\r\n }\r\n\r\n function whammyInWebWorker(frames) {\r\n function ArrayToWebM(frames) {\r\n var info = checkFrames(frames);\r\n if (!info) {\r\n return [];\r\n }\r\n\r\n var clusterMaxDuration = 30000;\r\n\r\n var EBML = [{\r\n 'id': 0x1a45dfa3, // EBML\r\n 'data': [{\r\n 'data': 1,\r\n 'id': 0x4286 // EBMLVersion\r\n }, {\r\n 'data': 1,\r\n 'id': 0x42f7 // EBMLReadVersion\r\n }, {\r\n 'data': 4,\r\n 'id': 0x42f2 // EBMLMaxIDLength\r\n }, {\r\n 'data': 8,\r\n 'id': 0x42f3 // EBMLMaxSizeLength\r\n }, {\r\n 'data': 'webm',\r\n 'id': 0x4282 // DocType\r\n }, {\r\n 'data': 2,\r\n 'id': 0x4287 // DocTypeVersion\r\n }, {\r\n 'data': 2,\r\n 'id': 0x4285 // DocTypeReadVersion\r\n }]\r\n }, {\r\n 'id': 0x18538067, // Segment\r\n 'data': [{\r\n 'id': 0x1549a966, // Info\r\n 'data': [{\r\n 'data': 1e6, //do things in millisecs (num of nanosecs for duration scale)\r\n 'id': 0x2ad7b1 // TimecodeScale\r\n }, {\r\n 'data': 'whammy',\r\n 'id': 0x4d80 // MuxingApp\r\n }, {\r\n 'data': 'whammy',\r\n 'id': 0x5741 // WritingApp\r\n }, {\r\n 'data': doubleToString(info.duration),\r\n 'id': 0x4489 // Duration\r\n }]\r\n }, {\r\n 'id': 0x1654ae6b, // Tracks\r\n 'data': [{\r\n 'id': 0xae, // TrackEntry\r\n 'data': [{\r\n 'data': 1,\r\n 'id': 0xd7 // TrackNumber\r\n }, {\r\n 'data': 1,\r\n 'id': 0x73c5 // TrackUID\r\n }, {\r\n 'data': 0,\r\n 'id': 0x9c // FlagLacing\r\n }, {\r\n 'data': 'und',\r\n 'id': 0x22b59c // Language\r\n }, {\r\n 'data': 'V_VP8',\r\n 'id': 0x86 // CodecID\r\n }, {\r\n 'data': 'VP8',\r\n 'id': 0x258688 // CodecName\r\n }, {\r\n 'data': 1,\r\n 'id': 0x83 // TrackType\r\n }, {\r\n 'id': 0xe0, // Video\r\n 'data': [{\r\n 'data': info.width,\r\n 'id': 0xb0 // PixelWidth\r\n }, {\r\n 'data': info.height,\r\n 'id': 0xba // PixelHeight\r\n }]\r\n }]\r\n }]\r\n }]\r\n }];\r\n\r\n //Generate clusters (max duration)\r\n var frameNumber = 0;\r\n var clusterTimecode = 0;\r\n while (frameNumber < frames.length) {\r\n\r\n var clusterFrames = [];\r\n var clusterDuration = 0;\r\n do {\r\n clusterFrames.push(frames[frameNumber]);\r\n clusterDuration += frames[frameNumber].duration;\r\n frameNumber++;\r\n } while (frameNumber < frames.length && clusterDuration < clusterMaxDuration);\r\n\r\n var clusterCounter = 0;\r\n var cluster = {\r\n 'id': 0x1f43b675, // Cluster\r\n 'data': getClusterData(clusterTimecode, clusterCounter, clusterFrames)\r\n }; //Add cluster to segment\r\n EBML[1].data.push(cluster);\r\n clusterTimecode += clusterDuration;\r\n }\r\n\r\n return generateEBML(EBML);\r\n }\r\n\r\n function getClusterData(clusterTimecode, clusterCounter, clusterFrames) {\r\n return [{\r\n 'data': clusterTimecode,\r\n 'id': 0xe7 // Timecode\r\n }].concat(clusterFrames.map(function(webp) {\r\n var block = makeSimpleBlock({\r\n discardable: 0,\r\n frame: webp.data.slice(4),\r\n invisible: 0,\r\n keyframe: 1,\r\n lacing: 0,\r\n trackNum: 1,\r\n timecode: Math.round(clusterCounter)\r\n });\r\n clusterCounter += webp.duration;\r\n return {\r\n data: block,\r\n id: 0xa3\r\n };\r\n }));\r\n }\r\n\r\n // sums the lengths of all the frames and gets the duration\r\n\r\n function checkFrames(frames) {\r\n if (!frames[0]) {\r\n postMessage({\r\n error: 'Something went wrong. Maybe WebP format is not supported in the current browser.'\r\n });\r\n return;\r\n }\r\n\r\n var width = frames[0].width,\r\n height = frames[0].height,\r\n duration = frames[0].duration;\r\n\r\n for (var i = 1; i < frames.length; i++) {\r\n duration += frames[i].duration;\r\n }\r\n return {\r\n duration: duration,\r\n width: width,\r\n height: height\r\n };\r\n }\r\n\r\n function numToBuffer(num) {\r\n var parts = [];\r\n while (num > 0) {\r\n parts.push(num & 0xff);\r\n num = num >> 8;\r\n }\r\n return new Uint8Array(parts.reverse());\r\n }\r\n\r\n function strToBuffer(str) {\r\n return new Uint8Array(str.split('').map(function(e) {\r\n return e.charCodeAt(0);\r\n }));\r\n }\r\n\r\n function bitsToBuffer(bits) {\r\n var data = [];\r\n var pad = (bits.length % 8) ? (new Array(1 + 8 - (bits.length % 8))).join('0') : '';\r\n bits = pad + bits;\r\n for (var i = 0; i < bits.length; i += 8) {\r\n data.push(parseInt(bits.substr(i, 8), 2));\r\n }\r\n return new Uint8Array(data);\r\n }\r\n\r\n function generateEBML(json) {\r\n var ebml = [];\r\n for (var i = 0; i < json.length; i++) {\r\n var data = json[i].data;\r\n\r\n if (typeof data === 'object') {\r\n data = generateEBML(data);\r\n }\r\n\r\n if (typeof data === 'number') {\r\n data = bitsToBuffer(data.toString(2));\r\n }\r\n\r\n if (typeof data === 'string') {\r\n data = strToBuffer(data);\r\n }\r\n\r\n var len = data.size || data.byteLength || data.length;\r\n var zeroes = Math.ceil(Math.ceil(Math.log(len) / Math.log(2)) / 8);\r\n var sizeToString = len.toString(2);\r\n var padded = (new Array((zeroes * 7 + 7 + 1) - sizeToString.length)).join('0') + sizeToString;\r\n var size = (new Array(zeroes)).join('0') + '1' + padded;\r\n\r\n ebml.push(numToBuffer(json[i].id));\r\n ebml.push(bitsToBuffer(size));\r\n ebml.push(data);\r\n }\r\n\r\n return new Blob(ebml, {\r\n type: 'video/webm'\r\n });\r\n }\r\n\r\n function toBinStrOld(bits) {\r\n var data = '';\r\n var pad = (bits.length % 8) ? (new Array(1 + 8 - (bits.length % 8))).join('0') : '';\r\n bits = pad + bits;\r\n for (var i = 0; i < bits.length; i += 8) {\r\n data += String.fromCharCode(parseInt(bits.substr(i, 8), 2));\r\n }\r\n return data;\r\n }\r\n\r\n function makeSimpleBlock(data) {\r\n var flags = 0;\r\n\r\n if (data.keyframe) {\r\n flags |= 128;\r\n }\r\n\r\n if (data.invisible) {\r\n flags |= 8;\r\n }\r\n\r\n if (data.lacing) {\r\n flags |= (data.lacing << 1);\r\n }\r\n\r\n if (data.discardable) {\r\n flags |= 1;\r\n }\r\n\r\n if (data.trackNum > 127) {\r\n throw 'TrackNumber > 127 not supported';\r\n }\r\n\r\n var out = [data.trackNum | 0x80, data.timecode >> 8, data.timecode & 0xff, flags].map(function(e) {\r\n return String.fromCharCode(e);\r\n }).join('') + data.frame;\r\n\r\n return out;\r\n }\r\n\r\n function parseWebP(riff) {\r\n var VP8 = riff.RIFF[0].WEBP[0];\r\n\r\n var frameStart = VP8.indexOf('\\x9d\\x01\\x2a'); // A VP8 keyframe starts with the 0x9d012a header\r\n for (var i = 0, c = []; i < 4; i++) {\r\n c[i] = VP8.charCodeAt(frameStart + 3 + i);\r\n }\r\n\r\n var width, height, tmp;\r\n\r\n //the code below is literally copied verbatim from the bitstream spec\r\n tmp = (c[1] << 8) | c[0];\r\n width = tmp & 0x3FFF;\r\n tmp = (c[3] << 8) | c[2];\r\n height = tmp & 0x3FFF;\r\n return {\r\n width: width,\r\n height: height,\r\n data: VP8,\r\n riff: riff\r\n };\r\n }\r\n\r\n function getStrLength(string, offset) {\r\n return parseInt(string.substr(offset + 4, 4).split('').map(function(i) {\r\n var unpadded = i.charCodeAt(0).toString(2);\r\n return (new Array(8 - unpadded.length + 1)).join('0') + unpadded;\r\n }).join(''), 2);\r\n }\r\n\r\n function parseRIFF(string) {\r\n var offset = 0;\r\n var chunks = {};\r\n\r\n while (offset < string.length) {\r\n var id = string.substr(offset, 4);\r\n var len = getStrLength(string, offset);\r\n var data = string.substr(offset + 4 + 4, len);\r\n offset += 4 + 4 + len;\r\n chunks[id] = chunks[id] || [];\r\n\r\n if (id === 'RIFF' || id === 'LIST') {\r\n chunks[id].push(parseRIFF(data));\r\n } else {\r\n chunks[id].push(data);\r\n }\r\n }\r\n return chunks;\r\n }\r\n\r\n function doubleToString(num) {\r\n return [].slice.call(\r\n new Uint8Array((new Float64Array([num])).buffer), 0).map(function(e) {\r\n return String.fromCharCode(e);\r\n }).reverse().join('');\r\n }\r\n\r\n var webm = new ArrayToWebM(frames.map(function(frame) {\r\n var webp = parseWebP(parseRIFF(atob(frame.image.slice(23))));\r\n webp.duration = frame.duration;\r\n return webp;\r\n }));\r\n\r\n postMessage(webm);\r\n }\r\n\r\n /**\r\n * Encodes frames in WebM container. It uses WebWorkinvoke to invoke 'ArrayToWebM' method.\r\n * @param {function} callback - Callback function, that is used to pass recorded blob back to the callee.\r\n * @method\r\n * @memberof Whammy\r\n * @example\r\n * recorder = new Whammy().Video(0.8, 100);\r\n * recorder.compile(function(blob) {\r\n * // blob.size - blob.type\r\n * });\r\n */\r\n WhammyVideo.prototype.compile = function(callback) {\r\n var webWorker = processInWebWorker(whammyInWebWorker);\r\n\r\n webWorker.onmessage = function(event) {\r\n if (event.data.error) {\r\n console.error(event.data.error);\r\n return;\r\n }\r\n callback(event.data);\r\n };\r\n\r\n webWorker.postMessage(this.frames);\r\n };\r\n\r\n return {\r\n /**\r\n * A more abstract-ish API.\r\n * @method\r\n * @memberof Whammy\r\n * @example\r\n * recorder = new Whammy().Video(0.8, 100);\r\n * @param {?number} speed - 0.8\r\n * @param {?number} quality - 100\r\n */\r\n Video: WhammyVideo\r\n };\r\n})();\r\n\r\nif (typeof RecordRTC !== 'undefined') {\r\n RecordRTC.Whammy = Whammy;\r\n}\n\r\n// ______________ (indexed-db)\r\n// DiskStorage.js\r\n\r\n/**\r\n * DiskStorage is a standalone object used by {@link RecordRTC} to store recorded blobs in IndexedDB storage.\r\n * @summary Writing blobs into IndexedDB.\r\n * @license {@link https://github.com/muaz-khan/RecordRTC/blob/master/LICENSE|MIT}\r\n * @author {@link https://MuazKhan.com|Muaz Khan}\r\n * @example\r\n * DiskStorage.Store({\r\n * audioBlob: yourAudioBlob,\r\n * videoBlob: yourVideoBlob,\r\n * gifBlob : yourGifBlob\r\n * });\r\n * DiskStorage.Fetch(function(dataURL, type) {\r\n * if(type === 'audioBlob') { }\r\n * if(type === 'videoBlob') { }\r\n * if(type === 'gifBlob') { }\r\n * });\r\n * // DiskStorage.dataStoreName = 'recordRTC';\r\n * // DiskStorage.onError = function(error) { };\r\n * @property {function} init - This method must be called once to initialize IndexedDB ObjectStore. Though, it is auto-used internally.\r\n * @property {function} Fetch - This method fetches stored blobs from IndexedDB.\r\n * @property {function} Store - This method stores blobs in IndexedDB.\r\n * @property {function} onError - This function is invoked for any known/unknown error.\r\n * @property {string} dataStoreName - Name of the ObjectStore created in IndexedDB storage.\r\n * @see {@link https://github.com/muaz-khan/RecordRTC|RecordRTC Source Code}\r\n */\r\n\r\n\r\nvar DiskStorage = {\r\n /**\r\n * This method must be called once to initialize IndexedDB ObjectStore. Though, it is auto-used internally.\r\n * @method\r\n * @memberof DiskStorage\r\n * @internal\r\n * @example\r\n * DiskStorage.init();\r\n */\r\n init: function() {\r\n var self = this;\r\n\r\n if (typeof indexedDB === 'undefined' || typeof indexedDB.open === 'undefined') {\r\n console.error('IndexedDB API are not available in this browser.');\r\n return;\r\n }\r\n\r\n var dbVersion = 1;\r\n var dbName = this.dbName || location.href.replace(/\\/|:|#|%|\\.|\\[|\\]/g, ''),\r\n db;\r\n var request = indexedDB.open(dbName, dbVersion);\r\n\r\n function createObjectStore(dataBase) {\r\n dataBase.createObjectStore(self.dataStoreName);\r\n }\r\n\r\n function putInDB() {\r\n var transaction = db.transaction([self.dataStoreName], 'readwrite');\r\n\r\n if (self.videoBlob) {\r\n transaction.objectStore(self.dataStoreName).put(self.videoBlob, 'videoBlob');\r\n }\r\n\r\n if (self.gifBlob) {\r\n transaction.objectStore(self.dataStoreName).put(self.gifBlob, 'gifBlob');\r\n }\r\n\r\n if (self.audioBlob) {\r\n transaction.objectStore(self.dataStoreName).put(self.audioBlob, 'audioBlob');\r\n }\r\n\r\n function getFromStore(portionName) {\r\n transaction.objectStore(self.dataStoreName).get(portionName).onsuccess = function(event) {\r\n if (self.callback) {\r\n self.callback(event.target.result, portionName);\r\n }\r\n };\r\n }\r\n\r\n getFromStore('audioBlob');\r\n getFromStore('videoBlob');\r\n getFromStore('gifBlob');\r\n }\r\n\r\n request.onerror = self.onError;\r\n\r\n request.onsuccess = function() {\r\n db = request.result;\r\n db.onerror = self.onError;\r\n\r\n if (db.setVersion) {\r\n if (db.version !== dbVersion) {\r\n var setVersion = db.setVersion(dbVersion);\r\n setVersion.onsuccess = function() {\r\n createObjectStore(db);\r\n putInDB();\r\n };\r\n } else {\r\n putInDB();\r\n }\r\n } else {\r\n putInDB();\r\n }\r\n };\r\n request.onupgradeneeded = function(event) {\r\n createObjectStore(event.target.result);\r\n };\r\n },\r\n /**\r\n * This method fetches stored blobs from IndexedDB.\r\n * @method\r\n * @memberof DiskStorage\r\n * @internal\r\n * @example\r\n * DiskStorage.Fetch(function(dataURL, type) {\r\n * if(type === 'audioBlob') { }\r\n * if(type === 'videoBlob') { }\r\n * if(type === 'gifBlob') { }\r\n * });\r\n */\r\n Fetch: function(callback) {\r\n this.callback = callback;\r\n this.init();\r\n\r\n return this;\r\n },\r\n /**\r\n * This method stores blobs in IndexedDB.\r\n * @method\r\n * @memberof DiskStorage\r\n * @internal\r\n * @example\r\n * DiskStorage.Store({\r\n * audioBlob: yourAudioBlob,\r\n * videoBlob: yourVideoBlob,\r\n * gifBlob : yourGifBlob\r\n * });\r\n */\r\n Store: function(config) {\r\n this.audioBlob = config.audioBlob;\r\n this.videoBlob = config.videoBlob;\r\n this.gifBlob = config.gifBlob;\r\n\r\n this.init();\r\n\r\n return this;\r\n },\r\n /**\r\n * This function is invoked for any known/unknown error.\r\n * @method\r\n * @memberof DiskStorage\r\n * @internal\r\n * @example\r\n * DiskStorage.onError = function(error){\r\n * alerot( JSON.stringify(error) );\r\n * };\r\n */\r\n onError: function(error) {\r\n console.error(JSON.stringify(error, null, '\\t'));\r\n },\r\n\r\n /**\r\n * @property {string} dataStoreName - Name of the ObjectStore created in IndexedDB storage.\r\n * @memberof DiskStorage\r\n * @internal\r\n * @example\r\n * DiskStorage.dataStoreName = 'recordRTC';\r\n */\r\n dataStoreName: 'recordRTC',\r\n dbName: null\r\n};\r\n\r\nif (typeof RecordRTC !== 'undefined') {\r\n RecordRTC.DiskStorage = DiskStorage;\r\n}\n\r\n// ______________\r\n// GifRecorder.js\r\n\r\n/**\r\n * GifRecorder is standalone calss used by {@link RecordRTC} to record video or canvas into animated gif.\r\n * @license {@link https://github.com/muaz-khan/RecordRTC/blob/master/LICENSE|MIT}\r\n * @author {@link https://MuazKhan.com|Muaz Khan}\r\n * @typedef GifRecorder\r\n * @class\r\n * @example\r\n * var recorder = new GifRecorder(mediaStream || canvas || context, { onGifPreview: function, onGifRecordingStarted: function, width: 1280, height: 720, frameRate: 200, quality: 10 });\r\n * recorder.record();\r\n * recorder.stop(function(blob) {\r\n * img.src = URL.createObjectURL(blob);\r\n * });\r\n * @see {@link https://github.com/muaz-khan/RecordRTC|RecordRTC Source Code}\r\n * @param {MediaStream} mediaStream - MediaStream object or HTMLCanvasElement or CanvasRenderingContext2D.\r\n * @param {object} config - {disableLogs:true, initCallback: function, width: 320, height: 240, frameRate: 200, quality: 10}\r\n */\r\n\r\nfunction GifRecorder(mediaStream, config) {\r\n if (typeof GIFEncoder === 'undefined') {\r\n var script = document.createElement('script');\r\n script.src = 'https://www.webrtc-experiment.com/gif-recorder.js';\r\n (document.body || document.documentElement).appendChild(script);\r\n }\r\n\r\n config = config || {};\r\n\r\n var isHTMLObject = mediaStream instanceof CanvasRenderingContext2D || mediaStream instanceof HTMLCanvasElement;\r\n\r\n /**\r\n * This method records MediaStream.\r\n * @method\r\n * @memberof GifRecorder\r\n * @example\r\n * recorder.record();\r\n */\r\n this.record = function() {\r\n if (typeof GIFEncoder === 'undefined') {\r\n setTimeout(self.record, 1000);\r\n return;\r\n }\r\n\r\n if (!isLoadedMetaData) {\r\n setTimeout(self.record, 1000);\r\n return;\r\n }\r\n\r\n if (!isHTMLObject) {\r\n if (!config.width) {\r\n config.width = video.offsetWidth || 320;\r\n }\r\n\r\n if (!config.height) {\r\n config.height = video.offsetHeight || 240;\r\n }\r\n\r\n if (!config.video) {\r\n config.video = {\r\n width: config.width,\r\n height: config.height\r\n };\r\n }\r\n\r\n if (!config.canvas) {\r\n config.canvas = {\r\n width: config.width,\r\n height: config.height\r\n };\r\n }\r\n\r\n canvas.width = config.canvas.width || 320;\r\n canvas.height = config.canvas.height || 240;\r\n\r\n video.width = config.video.width || 320;\r\n video.height = config.video.height || 240;\r\n }\r\n\r\n // external library to record as GIF images\r\n gifEncoder = new GIFEncoder();\r\n\r\n // void setRepeat(int iter) \r\n // Sets the number of times the set of GIF frames should be played. \r\n // Default is 1; 0 means play indefinitely.\r\n gifEncoder.setRepeat(0);\r\n\r\n // void setFrameRate(Number fps) \r\n // Sets frame rate in frames per second. \r\n // Equivalent to setDelay(1000/fps).\r\n // Using \"setDelay\" instead of \"setFrameRate\"\r\n gifEncoder.setDelay(config.frameRate || 200);\r\n\r\n // void setQuality(int quality) \r\n // Sets quality of color quantization (conversion of images to the \r\n // maximum 256 colors allowed by the GIF specification). \r\n // Lower values (minimum = 1) produce better colors, \r\n // but slow processing significantly. 10 is the default, \r\n // and produces good color mapping at reasonable speeds. \r\n // Values greater than 20 do not yield significant improvements in speed.\r\n gifEncoder.setQuality(config.quality || 10);\r\n\r\n // Boolean start() \r\n // This writes the GIF Header and returns false if it fails.\r\n gifEncoder.start();\r\n\r\n if (typeof config.onGifRecordingStarted === 'function') {\r\n config.onGifRecordingStarted();\r\n }\r\n\r\n startTime = Date.now();\r\n\r\n function drawVideoFrame(time) {\r\n if (self.clearedRecordedData === true) {\r\n return;\r\n }\r\n\r\n if (isPausedRecording) {\r\n return setTimeout(function() {\r\n drawVideoFrame(time);\r\n }, 100);\r\n }\r\n\r\n lastAnimationFrame = requestAnimationFrame(drawVideoFrame);\r\n\r\n if (typeof lastFrameTime === undefined) {\r\n lastFrameTime = time;\r\n }\r\n\r\n // ~10 fps\r\n if (time - lastFrameTime < 90) {\r\n return;\r\n }\r\n\r\n if (!isHTMLObject && video.paused) {\r\n // via: https://github.com/muaz-khan/WebRTC-Experiment/pull/316\r\n // Tweak for Android Chrome\r\n video.play();\r\n }\r\n\r\n if (!isHTMLObject) {\r\n context.drawImage(video, 0, 0, canvas.width, canvas.height);\r\n }\r\n\r\n if (config.onGifPreview) {\r\n config.onGifPreview(canvas.toDataURL('image/png'));\r\n }\r\n\r\n gifEncoder.addFrame(context);\r\n lastFrameTime = time;\r\n }\r\n\r\n lastAnimationFrame = requestAnimationFrame(drawVideoFrame);\r\n\r\n if (config.initCallback) {\r\n config.initCallback();\r\n }\r\n };\r\n\r\n /**\r\n * This method stops recording MediaStream.\r\n * @param {function} callback - Callback function, that is used to pass recorded blob back to the callee.\r\n * @method\r\n * @memberof GifRecorder\r\n * @example\r\n * recorder.stop(function(blob) {\r\n * img.src = URL.createObjectURL(blob);\r\n * });\r\n */\r\n this.stop = function(callback) {\r\n callback = callback || function() {};\r\n\r\n if (lastAnimationFrame) {\r\n cancelAnimationFrame(lastAnimationFrame);\r\n }\r\n\r\n endTime = Date.now();\r\n\r\n /**\r\n * @property {Blob} blob - The recorded blob object.\r\n * @memberof GifRecorder\r\n * @example\r\n * recorder.stop(function(){\r\n * var blob = recorder.blob;\r\n * });\r\n */\r\n this.blob = new Blob([new Uint8Array(gifEncoder.stream().bin)], {\r\n type: 'image/gif'\r\n });\r\n\r\n callback(this.blob);\r\n\r\n // bug: find a way to clear old recorded blobs\r\n gifEncoder.stream().bin = [];\r\n };\r\n\r\n var isPausedRecording = false;\r\n\r\n /**\r\n * This method pauses the recording process.\r\n * @method\r\n * @memberof GifRecorder\r\n * @example\r\n * recorder.pause();\r\n */\r\n this.pause = function() {\r\n isPausedRecording = true;\r\n };\r\n\r\n /**\r\n * This method resumes the recording process.\r\n * @method\r\n * @memberof GifRecorder\r\n * @example\r\n * recorder.resume();\r\n */\r\n this.resume = function() {\r\n isPausedRecording = false;\r\n };\r\n\r\n /**\r\n * This method resets currently recorded data.\r\n * @method\r\n * @memberof GifRecorder\r\n * @example\r\n * recorder.clearRecordedData();\r\n */\r\n this.clearRecordedData = function() {\r\n self.clearedRecordedData = true;\r\n clearRecordedDataCB();\r\n };\r\n\r\n function clearRecordedDataCB() {\r\n if (gifEncoder) {\r\n gifEncoder.stream().bin = [];\r\n }\r\n }\r\n\r\n // for debugging\r\n this.name = 'GifRecorder';\r\n this.toString = function() {\r\n return this.name;\r\n };\r\n\r\n var canvas = document.createElement('canvas');\r\n var context = canvas.getContext('2d');\r\n\r\n if (isHTMLObject) {\r\n if (mediaStream instanceof CanvasRenderingContext2D) {\r\n context = mediaStream;\r\n canvas = context.canvas;\r\n } else if (mediaStream instanceof HTMLCanvasElement) {\r\n context = mediaStream.getContext('2d');\r\n canvas = mediaStream;\r\n }\r\n }\r\n\r\n var isLoadedMetaData = true;\r\n\r\n if (!isHTMLObject) {\r\n var video = document.createElement('video');\r\n video.muted = true;\r\n video.autoplay = true;\r\n video.playsInline = true;\r\n\r\n isLoadedMetaData = false;\r\n video.onloadedmetadata = function() {\r\n isLoadedMetaData = true;\r\n };\r\n\r\n setSrcObject(mediaStream, video);\r\n\r\n video.play();\r\n }\r\n\r\n var lastAnimationFrame = null;\r\n var startTime, endTime, lastFrameTime;\r\n\r\n var gifEncoder;\r\n\r\n var self = this;\r\n}\r\n\r\nif (typeof RecordRTC !== 'undefined') {\r\n RecordRTC.GifRecorder = GifRecorder;\r\n}\n\r\n// Last time updated: 2019-06-21 4:09:42 AM UTC\r\n\r\n// ________________________\r\n// MultiStreamsMixer v1.2.2\r\n\r\n// Open-Sourced: https://github.com/muaz-khan/MultiStreamsMixer\r\n\r\n// --------------------------------------------------\r\n// Muaz Khan - www.MuazKhan.com\r\n// MIT License - www.WebRTC-Experiment.com/licence\r\n// --------------------------------------------------\r\n\r\nfunction MultiStreamsMixer(arrayOfMediaStreams, elementClass) {\r\n\r\n var browserFakeUserAgent = 'Fake/5.0 (FakeOS) AppleWebKit/123 (KHTML, like Gecko) Fake/12.3.4567.89 Fake/123.45';\r\n\r\n (function(that) {\r\n if (typeof RecordRTC !== 'undefined') {\r\n return;\r\n }\r\n\r\n if (!that) {\r\n return;\r\n }\r\n\r\n if (typeof window !== 'undefined') {\r\n return;\r\n }\r\n\r\n if (typeof global === 'undefined') {\r\n return;\r\n }\r\n\r\n global.navigator = {\r\n userAgent: browserFakeUserAgent,\r\n getUserMedia: function() {}\r\n };\r\n\r\n if (!global.console) {\r\n global.console = {};\r\n }\r\n\r\n if (typeof global.console.log === 'undefined' || typeof global.console.error === 'undefined') {\r\n global.console.error = global.console.log = global.console.log || function() {\r\n console.log(arguments);\r\n };\r\n }\r\n\r\n if (typeof document === 'undefined') {\r\n /*global document:true */\r\n that.document = {\r\n documentElement: {\r\n appendChild: function() {\r\n return '';\r\n }\r\n }\r\n };\r\n\r\n document.createElement = document.captureStream = document.mozCaptureStream = function() {\r\n var obj = {\r\n getContext: function() {\r\n return obj;\r\n },\r\n play: function() {},\r\n pause: function() {},\r\n drawImage: function() {},\r\n toDataURL: function() {\r\n return '';\r\n },\r\n style: {}\r\n };\r\n return obj;\r\n };\r\n\r\n that.HTMLVideoElement = function() {};\r\n }\r\n\r\n if (typeof location === 'undefined') {\r\n /*global location:true */\r\n that.location = {\r\n protocol: 'file:',\r\n href: '',\r\n hash: ''\r\n };\r\n }\r\n\r\n if (typeof screen === 'undefined') {\r\n /*global screen:true */\r\n that.screen = {\r\n width: 0,\r\n height: 0\r\n };\r\n }\r\n\r\n if (typeof URL === 'undefined') {\r\n /*global screen:true */\r\n that.URL = {\r\n createObjectURL: function() {\r\n return '';\r\n },\r\n revokeObjectURL: function() {\r\n return '';\r\n }\r\n };\r\n }\r\n\r\n /*global window:true */\r\n that.window = global;\r\n })(typeof global !== 'undefined' ? global : null);\r\n\r\n // requires: chrome://flags/#enable-experimental-web-platform-features\r\n\r\n elementClass = elementClass || 'multi-streams-mixer';\r\n\r\n var videos = [];\r\n var isStopDrawingFrames = false;\r\n\r\n var canvas = document.createElement('canvas');\r\n var context = canvas.getContext('2d');\r\n canvas.style.opacity = 0;\r\n canvas.style.position = 'absolute';\r\n canvas.style.zIndex = -1;\r\n canvas.style.top = '-1000em';\r\n canvas.style.left = '-1000em';\r\n canvas.className = elementClass;\r\n (document.body || document.documentElement).appendChild(canvas);\r\n\r\n this.disableLogs = false;\r\n this.frameInterval = 10;\r\n\r\n this.width = 360;\r\n this.height = 240;\r\n\r\n // use gain node to prevent echo\r\n this.useGainNode = true;\r\n\r\n var self = this;\r\n\r\n // _____________________________\r\n // Cross-Browser-Declarations.js\r\n\r\n // WebAudio API representer\r\n var AudioContext = window.AudioContext;\r\n\r\n if (typeof AudioContext === 'undefined') {\r\n if (typeof webkitAudioContext !== 'undefined') {\r\n /*global AudioContext:true */\r\n AudioContext = webkitAudioContext;\r\n }\r\n\r\n if (typeof mozAudioContext !== 'undefined') {\r\n /*global AudioContext:true */\r\n AudioContext = mozAudioContext;\r\n }\r\n }\r\n\r\n /*jshint -W079 */\r\n var URL = window.URL;\r\n\r\n if (typeof URL === 'undefined' && typeof webkitURL !== 'undefined') {\r\n /*global URL:true */\r\n URL = webkitURL;\r\n }\r\n\r\n if (typeof navigator !== 'undefined' && typeof navigator.getUserMedia === 'undefined') { // maybe window.navigator?\r\n if (typeof navigator.webkitGetUserMedia !== 'undefined') {\r\n navigator.getUserMedia = navigator.webkitGetUserMedia;\r\n }\r\n\r\n if (typeof navigator.mozGetUserMedia !== 'undefined') {\r\n navigator.getUserMedia = navigator.mozGetUserMedia;\r\n }\r\n }\r\n\r\n var MediaStream = window.MediaStream;\r\n\r\n if (typeof MediaStream === 'undefined' && typeof webkitMediaStream !== 'undefined') {\r\n MediaStream = webkitMediaStream;\r\n }\r\n\r\n /*global MediaStream:true */\r\n if (typeof MediaStream !== 'undefined') {\r\n // override \"stop\" method for all browsers\r\n if (typeof MediaStream.prototype.stop === 'undefined') {\r\n MediaStream.prototype.stop = function() {\r\n this.getTracks().forEach(function(track) {\r\n track.stop();\r\n });\r\n };\r\n }\r\n }\r\n\r\n var Storage = {};\r\n\r\n if (typeof AudioContext !== 'undefined') {\r\n Storage.AudioContext = AudioContext;\r\n } else if (typeof webkitAudioContext !== 'undefined') {\r\n Storage.AudioContext = webkitAudioContext;\r\n }\r\n\r\n function setSrcObject(stream, element) {\r\n if ('srcObject' in element) {\r\n element.srcObject = stream;\r\n } else if ('mozSrcObject' in element) {\r\n element.mozSrcObject = stream;\r\n } else {\r\n element.srcObject = stream;\r\n }\r\n }\r\n\r\n this.startDrawingFrames = function() {\r\n drawVideosToCanvas();\r\n };\r\n\r\n function drawVideosToCanvas() {\r\n if (isStopDrawingFrames) {\r\n return;\r\n }\r\n\r\n var videosLength = videos.length;\r\n\r\n var fullcanvas = false;\r\n var remaining = [];\r\n videos.forEach(function(video) {\r\n if (!video.stream) {\r\n video.stream = {};\r\n }\r\n\r\n if (video.stream.fullcanvas) {\r\n fullcanvas = video;\r\n } else {\r\n // todo: video.stream.active or video.stream.live to fix blank frames issues?\r\n remaining.push(video);\r\n }\r\n });\r\n\r\n if (fullcanvas) {\r\n canvas.width = fullcanvas.stream.width;\r\n canvas.height = fullcanvas.stream.height;\r\n } else if (remaining.length) {\r\n canvas.width = videosLength > 1 ? remaining[0].width * 2 : remaining[0].width;\r\n\r\n var height = 1;\r\n if (videosLength === 3 || videosLength === 4) {\r\n height = 2;\r\n }\r\n if (videosLength === 5 || videosLength === 6) {\r\n height = 3;\r\n }\r\n if (videosLength === 7 || videosLength === 8) {\r\n height = 4;\r\n }\r\n if (videosLength === 9 || videosLength === 10) {\r\n height = 5;\r\n }\r\n canvas.height = remaining[0].height * height;\r\n } else {\r\n canvas.width = self.width || 360;\r\n canvas.height = self.height || 240;\r\n }\r\n\r\n if (fullcanvas && fullcanvas instanceof HTMLVideoElement) {\r\n drawImage(fullcanvas);\r\n }\r\n\r\n remaining.forEach(function(video, idx) {\r\n drawImage(video, idx);\r\n });\r\n\r\n setTimeout(drawVideosToCanvas, self.frameInterval);\r\n }\r\n\r\n function drawImage(video, idx) {\r\n if (isStopDrawingFrames) {\r\n return;\r\n }\r\n\r\n var x = 0;\r\n var y = 0;\r\n var width = video.width;\r\n var height = video.height;\r\n\r\n if (idx === 1) {\r\n x = video.width;\r\n }\r\n\r\n if (idx === 2) {\r\n y = video.height;\r\n }\r\n\r\n if (idx === 3) {\r\n x = video.width;\r\n y = video.height;\r\n }\r\n\r\n if (idx === 4) {\r\n y = video.height * 2;\r\n }\r\n\r\n if (idx === 5) {\r\n x = video.width;\r\n y = video.height * 2;\r\n }\r\n\r\n if (idx === 6) {\r\n y = video.height * 3;\r\n }\r\n\r\n if (idx === 7) {\r\n x = video.width;\r\n y = video.height * 3;\r\n }\r\n\r\n if (typeof video.stream.left !== 'undefined') {\r\n x = video.stream.left;\r\n }\r\n\r\n if (typeof video.stream.top !== 'undefined') {\r\n y = video.stream.top;\r\n }\r\n\r\n if (typeof video.stream.width !== 'undefined') {\r\n width = video.stream.width;\r\n }\r\n\r\n if (typeof video.stream.height !== 'undefined') {\r\n height = video.stream.height;\r\n }\r\n\r\n context.drawImage(video, x, y, width, height);\r\n\r\n if (typeof video.stream.onRender === 'function') {\r\n video.stream.onRender(context, x, y, width, height, idx);\r\n }\r\n }\r\n\r\n function getMixedStream() {\r\n isStopDrawingFrames = false;\r\n var mixedVideoStream = getMixedVideoStream();\r\n\r\n var mixedAudioStream = getMixedAudioStream();\r\n if (mixedAudioStream) {\r\n mixedAudioStream.getTracks().filter(function(t) {\r\n return t.kind === 'audio';\r\n }).forEach(function(track) {\r\n mixedVideoStream.addTrack(track);\r\n });\r\n }\r\n\r\n var fullcanvas;\r\n arrayOfMediaStreams.forEach(function(stream) {\r\n if (stream.fullcanvas) {\r\n fullcanvas = true;\r\n }\r\n });\r\n\r\n // mixedVideoStream.prototype.appendStreams = appendStreams;\r\n // mixedVideoStream.prototype.resetVideoStreams = resetVideoStreams;\r\n // mixedVideoStream.prototype.clearRecordedData = clearRecordedData;\r\n\r\n return mixedVideoStream;\r\n }\r\n\r\n function getMixedVideoStream() {\r\n resetVideoStreams();\r\n\r\n var capturedStream;\r\n\r\n if ('captureStream' in canvas) {\r\n capturedStream = canvas.captureStream();\r\n } else if ('mozCaptureStream' in canvas) {\r\n capturedStream = canvas.mozCaptureStream();\r\n } else if (!self.disableLogs) {\r\n console.error('Upgrade to latest Chrome or otherwise enable this flag: chrome://flags/#enable-experimental-web-platform-features');\r\n }\r\n\r\n var videoStream = new MediaStream();\r\n\r\n capturedStream.getTracks().filter(function(t) {\r\n return t.kind === 'video';\r\n }).forEach(function(track) {\r\n videoStream.addTrack(track);\r\n });\r\n\r\n canvas.stream = videoStream;\r\n\r\n return videoStream;\r\n }\r\n\r\n function getMixedAudioStream() {\r\n // via: @pehrsons\r\n if (!Storage.AudioContextConstructor) {\r\n Storage.AudioContextConstructor = new Storage.AudioContext();\r\n }\r\n\r\n self.audioContext = Storage.AudioContextConstructor;\r\n\r\n self.audioSources = [];\r\n\r\n if (self.useGainNode === true) {\r\n self.gainNode = self.audioContext.createGain();\r\n self.gainNode.connect(self.audioContext.destination);\r\n self.gainNode.gain.value = 0; // don't hear self\r\n }\r\n\r\n var audioTracksLength = 0;\r\n arrayOfMediaStreams.forEach(function(stream) {\r\n if (!stream.getTracks().filter(function(t) {\r\n return t.kind === 'audio';\r\n }).length) {\r\n return;\r\n }\r\n\r\n audioTracksLength++;\r\n\r\n var audioSource = self.audioContext.createMediaStreamSource(stream);\r\n\r\n if (self.useGainNode === true) {\r\n audioSource.connect(self.gainNode);\r\n }\r\n\r\n self.audioSources.push(audioSource);\r\n });\r\n\r\n if (!audioTracksLength) {\r\n // because \"self.audioContext\" is not initialized\r\n // that's why we've to ignore rest of the code\r\n return;\r\n }\r\n\r\n self.audioDestination = self.audioContext.createMediaStreamDestination();\r\n self.audioSources.forEach(function(audioSource) {\r\n audioSource.connect(self.audioDestination);\r\n });\r\n return self.audioDestination.stream;\r\n }\r\n\r\n function getVideo(stream) {\r\n var video = document.createElement('video');\r\n\r\n setSrcObject(stream, video);\r\n\r\n video.className = elementClass;\r\n\r\n video.muted = true;\r\n video.volume = 0;\r\n\r\n video.width = stream.width || self.width || 360;\r\n video.height = stream.height || self.height || 240;\r\n\r\n video.play();\r\n\r\n return video;\r\n }\r\n\r\n this.appendStreams = function(streams) {\r\n if (!streams) {\r\n throw 'First parameter is required.';\r\n }\r\n\r\n if (!(streams instanceof Array)) {\r\n streams = [streams];\r\n }\r\n\r\n streams.forEach(function(stream) {\r\n var newStream = new MediaStream();\r\n\r\n if (stream.getTracks().filter(function(t) {\r\n return t.kind === 'video';\r\n }).length) {\r\n var video = getVideo(stream);\r\n video.stream = stream;\r\n videos.push(video);\r\n\r\n newStream.addTrack(stream.getTracks().filter(function(t) {\r\n return t.kind === 'video';\r\n })[0]);\r\n }\r\n\r\n if (stream.getTracks().filter(function(t) {\r\n return t.kind === 'audio';\r\n }).length) {\r\n var audioSource = self.audioContext.createMediaStreamSource(stream);\r\n self.audioDestination = self.audioContext.createMediaStreamDestination();\r\n audioSource.connect(self.audioDestination);\r\n\r\n newStream.addTrack(self.audioDestination.stream.getTracks().filter(function(t) {\r\n return t.kind === 'audio';\r\n })[0]);\r\n }\r\n\r\n arrayOfMediaStreams.push(newStream);\r\n });\r\n };\r\n\r\n this.releaseStreams = function() {\r\n videos = [];\r\n isStopDrawingFrames = true;\r\n\r\n if (self.gainNode) {\r\n self.gainNode.disconnect();\r\n self.gainNode = null;\r\n }\r\n\r\n if (self.audioSources.length) {\r\n self.audioSources.forEach(function(source) {\r\n source.disconnect();\r\n });\r\n self.audioSources = [];\r\n }\r\n\r\n if (self.audioDestination) {\r\n self.audioDestination.disconnect();\r\n self.audioDestination = null;\r\n }\r\n\r\n if (self.audioContext) {\r\n self.audioContext.close();\r\n }\r\n\r\n self.audioContext = null;\r\n\r\n context.clearRect(0, 0, canvas.width, canvas.height);\r\n\r\n if (canvas.stream) {\r\n canvas.stream.stop();\r\n canvas.stream = null;\r\n }\r\n };\r\n\r\n this.resetVideoStreams = function(streams) {\r\n if (streams && !(streams instanceof Array)) {\r\n streams = [streams];\r\n }\r\n\r\n resetVideoStreams(streams);\r\n };\r\n\r\n function resetVideoStreams(streams) {\r\n videos = [];\r\n streams = streams || arrayOfMediaStreams;\r\n\r\n // via: @adrian-ber\r\n streams.forEach(function(stream) {\r\n if (!stream.getTracks().filter(function(t) {\r\n return t.kind === 'video';\r\n }).length) {\r\n return;\r\n }\r\n\r\n var video = getVideo(stream);\r\n video.stream = stream;\r\n videos.push(video);\r\n });\r\n }\r\n\r\n // for debugging\r\n this.name = 'MultiStreamsMixer';\r\n this.toString = function() {\r\n return this.name;\r\n };\r\n\r\n this.getMixedStream = getMixedStream;\r\n\r\n}\r\n\r\nif (typeof RecordRTC === 'undefined') {\r\n if (typeof module !== 'undefined' /* && !!module.exports*/ ) {\r\n module.exports = MultiStreamsMixer;\r\n }\r\n\r\n if (typeof define === 'function' && define.amd) {\r\n define('MultiStreamsMixer', [], function() {\r\n return MultiStreamsMixer;\r\n });\r\n }\r\n}\n\r\n// ______________________\r\n// MultiStreamRecorder.js\r\n\r\n/*\r\n * Video conference recording, using captureStream API along with WebAudio and Canvas2D API.\r\n */\r\n\r\n/**\r\n * MultiStreamRecorder can record multiple videos in single container.\r\n * @summary Multi-videos recorder.\r\n * @license {@link https://github.com/muaz-khan/RecordRTC/blob/master/LICENSE|MIT}\r\n * @author {@link https://MuazKhan.com|Muaz Khan}\r\n * @typedef MultiStreamRecorder\r\n * @class\r\n * @example\r\n * var options = {\r\n * mimeType: 'video/webm'\r\n * }\r\n * var recorder = new MultiStreamRecorder(ArrayOfMediaStreams, options);\r\n * recorder.record();\r\n * recorder.stop(function(blob) {\r\n * video.src = URL.createObjectURL(blob);\r\n *\r\n * // or\r\n * var blob = recorder.blob;\r\n * });\r\n * @see {@link https://github.com/muaz-khan/RecordRTC|RecordRTC Source Code}\r\n * @param {MediaStreams} mediaStreams - Array of MediaStreams.\r\n * @param {object} config - {disableLogs:true, frameInterval: 1, mimeType: \"video/webm\"}\r\n */\r\n\r\nfunction MultiStreamRecorder(arrayOfMediaStreams, options) {\r\n arrayOfMediaStreams = arrayOfMediaStreams || [];\r\n var self = this;\r\n\r\n var mixer;\r\n var mediaRecorder;\r\n\r\n options = options || {\r\n elementClass: 'multi-streams-mixer',\r\n mimeType: 'video/webm',\r\n video: {\r\n width: 360,\r\n height: 240\r\n }\r\n };\r\n\r\n if (!options.frameInterval) {\r\n options.frameInterval = 10;\r\n }\r\n\r\n if (!options.video) {\r\n options.video = {};\r\n }\r\n\r\n if (!options.video.width) {\r\n options.video.width = 360;\r\n }\r\n\r\n if (!options.video.height) {\r\n options.video.height = 240;\r\n }\r\n\r\n /**\r\n * This method records all MediaStreams.\r\n * @method\r\n * @memberof MultiStreamRecorder\r\n * @example\r\n * recorder.record();\r\n */\r\n this.record = function() {\r\n // github/muaz-khan/MultiStreamsMixer\r\n mixer = new MultiStreamsMixer(arrayOfMediaStreams, options.elementClass || 'multi-streams-mixer');\r\n\r\n if (getAllVideoTracks().length) {\r\n mixer.frameInterval = options.frameInterval || 10;\r\n mixer.width = options.video.width || 360;\r\n mixer.height = options.video.height || 240;\r\n mixer.startDrawingFrames();\r\n }\r\n\r\n if (options.previewStream && typeof options.previewStream === 'function') {\r\n options.previewStream(mixer.getMixedStream());\r\n }\r\n\r\n // record using MediaRecorder API\r\n mediaRecorder = new MediaStreamRecorder(mixer.getMixedStream(), options);\r\n mediaRecorder.record();\r\n };\r\n\r\n function getAllVideoTracks() {\r\n var tracks = [];\r\n arrayOfMediaStreams.forEach(function(stream) {\r\n getTracks(stream, 'video').forEach(function(track) {\r\n tracks.push(track);\r\n });\r\n });\r\n return tracks;\r\n }\r\n\r\n /**\r\n * This method stops recording MediaStream.\r\n * @param {function} callback - Callback function, that is used to pass recorded blob back to the callee.\r\n * @method\r\n * @memberof MultiStreamRecorder\r\n * @example\r\n * recorder.stop(function(blob) {\r\n * video.src = URL.createObjectURL(blob);\r\n * });\r\n */\r\n this.stop = function(callback) {\r\n if (!mediaRecorder) {\r\n return;\r\n }\r\n\r\n mediaRecorder.stop(function(blob) {\r\n self.blob = blob;\r\n\r\n callback(blob);\r\n\r\n self.clearRecordedData();\r\n });\r\n };\r\n\r\n /**\r\n * This method pauses the recording process.\r\n * @method\r\n * @memberof MultiStreamRecorder\r\n * @example\r\n * recorder.pause();\r\n */\r\n this.pause = function() {\r\n if (mediaRecorder) {\r\n mediaRecorder.pause();\r\n }\r\n };\r\n\r\n /**\r\n * This method resumes the recording process.\r\n * @method\r\n * @memberof MultiStreamRecorder\r\n * @example\r\n * recorder.resume();\r\n */\r\n this.resume = function() {\r\n if (mediaRecorder) {\r\n mediaRecorder.resume();\r\n }\r\n };\r\n\r\n /**\r\n * This method resets currently recorded data.\r\n * @method\r\n * @memberof MultiStreamRecorder\r\n * @example\r\n * recorder.clearRecordedData();\r\n */\r\n this.clearRecordedData = function() {\r\n if (mediaRecorder) {\r\n mediaRecorder.clearRecordedData();\r\n mediaRecorder = null;\r\n }\r\n\r\n if (mixer) {\r\n mixer.releaseStreams();\r\n mixer = null;\r\n }\r\n };\r\n\r\n /**\r\n * Add extra media-streams to existing recordings.\r\n * @method\r\n * @memberof MultiStreamRecorder\r\n * @param {MediaStreams} mediaStreams - Array of MediaStreams\r\n * @example\r\n * recorder.addStreams([newAudioStream, newVideoStream]);\r\n */\r\n this.addStreams = function(streams) {\r\n if (!streams) {\r\n throw 'First parameter is required.';\r\n }\r\n\r\n if (!(streams instanceof Array)) {\r\n streams = [streams];\r\n }\r\n\r\n arrayOfMediaStreams.concat(streams);\r\n\r\n if (!mediaRecorder || !mixer) {\r\n return;\r\n }\r\n\r\n mixer.appendStreams(streams);\r\n\r\n if (options.previewStream && typeof options.previewStream === 'function') {\r\n options.previewStream(mixer.getMixedStream());\r\n }\r\n };\r\n\r\n /**\r\n * Reset videos during live recording. Replace old videos e.g. replace cameras with full-screen.\r\n * @method\r\n * @memberof MultiStreamRecorder\r\n * @param {MediaStreams} mediaStreams - Array of MediaStreams\r\n * @example\r\n * recorder.resetVideoStreams([newVideo1, newVideo2]);\r\n */\r\n this.resetVideoStreams = function(streams) {\r\n if (!mixer) {\r\n return;\r\n }\r\n\r\n if (streams && !(streams instanceof Array)) {\r\n streams = [streams];\r\n }\r\n\r\n mixer.resetVideoStreams(streams);\r\n };\r\n\r\n /**\r\n * Returns MultiStreamsMixer\r\n * @method\r\n * @memberof MultiStreamRecorder\r\n * @example\r\n * let mixer = recorder.getMixer();\r\n * mixer.appendStreams([newStream]);\r\n */\r\n this.getMixer = function() {\r\n return mixer;\r\n };\r\n\r\n // for debugging\r\n this.name = 'MultiStreamRecorder';\r\n this.toString = function() {\r\n return this.name;\r\n };\r\n}\r\n\r\nif (typeof RecordRTC !== 'undefined') {\r\n RecordRTC.MultiStreamRecorder = MultiStreamRecorder;\r\n}\n\r\n// _____________________\r\n// RecordRTC.promises.js\r\n\r\n/**\r\n * RecordRTCPromisesHandler adds promises support in {@link RecordRTC}. Try a {@link https://github.com/muaz-khan/RecordRTC/blob/master/simple-demos/RecordRTCPromisesHandler.html|demo here}\r\n * @summary Promises for {@link RecordRTC}\r\n * @license {@link https://github.com/muaz-khan/RecordRTC/blob/master/LICENSE|MIT}\r\n * @author {@link https://MuazKhan.com|Muaz Khan}\r\n * @typedef RecordRTCPromisesHandler\r\n * @class\r\n * @example\r\n * var recorder = new RecordRTCPromisesHandler(mediaStream, options);\r\n * recorder.startRecording()\r\n * .then(successCB)\r\n * .catch(errorCB);\r\n * // Note: You can access all RecordRTC API using \"recorder.recordRTC\" e.g. \r\n * recorder.recordRTC.onStateChanged = function(state) {};\r\n * recorder.recordRTC.setRecordingDuration(5000);\r\n * @see {@link https://github.com/muaz-khan/RecordRTC|RecordRTC Source Code}\r\n * @param {MediaStream} mediaStream - Single media-stream object, array of media-streams, html-canvas-element, etc.\r\n * @param {object} config - {type:\"video\", recorderType: MediaStreamRecorder, disableLogs: true, numberOfAudioChannels: 1, bufferSize: 0, sampleRate: 0, video: HTMLVideoElement, etc.}\r\n * @throws Will throw an error if \"new\" keyword is not used to initiate \"RecordRTCPromisesHandler\". Also throws error if first argument \"MediaStream\" is missing.\r\n * @requires {@link RecordRTC}\r\n */\r\n\r\nfunction RecordRTCPromisesHandler(mediaStream, options) {\r\n if (!this) {\r\n throw 'Use \"new RecordRTCPromisesHandler()\"';\r\n }\r\n\r\n if (typeof mediaStream === 'undefined') {\r\n throw 'First argument \"MediaStream\" is required.';\r\n }\r\n\r\n var self = this;\r\n\r\n /**\r\n * @property {Blob} blob - Access/reach the native {@link RecordRTC} object.\r\n * @memberof RecordRTCPromisesHandler\r\n * @example\r\n * let internal = recorder.recordRTC.getInternalRecorder();\r\n * alert(internal instanceof MediaStreamRecorder);\r\n * recorder.recordRTC.onStateChanged = function(state) {};\r\n */\r\n self.recordRTC = new RecordRTC(mediaStream, options);\r\n\r\n /**\r\n * This method records MediaStream.\r\n * @method\r\n * @memberof RecordRTCPromisesHandler\r\n * @example\r\n * recorder.startRecording()\r\n * .then(successCB)\r\n * .catch(errorCB);\r\n */\r\n this.startRecording = function() {\r\n return new Promise(function(resolve, reject) {\r\n try {\r\n self.recordRTC.startRecording();\r\n resolve();\r\n } catch (e) {\r\n reject(e);\r\n }\r\n });\r\n };\r\n\r\n /**\r\n * This method stops the recording.\r\n * @method\r\n * @memberof RecordRTCPromisesHandler\r\n * @example\r\n * recorder.stopRecording().then(function() {\r\n * var blob = recorder.getBlob();\r\n * }).catch(errorCB);\r\n */\r\n this.stopRecording = function() {\r\n return new Promise(function(resolve, reject) {\r\n try {\r\n self.recordRTC.stopRecording(function(url) {\r\n self.blob = self.recordRTC.getBlob();\r\n\r\n if (!self.blob || !self.blob.size) {\r\n reject('Empty blob.', self.blob);\r\n return;\r\n }\r\n\r\n resolve(url);\r\n });\r\n } catch (e) {\r\n reject(e);\r\n }\r\n });\r\n };\r\n\r\n /**\r\n * This method pauses the recording. You can resume recording using \"resumeRecording\" method.\r\n * @method\r\n * @memberof RecordRTCPromisesHandler\r\n * @example\r\n * recorder.pauseRecording()\r\n * .then(successCB)\r\n * .catch(errorCB);\r\n */\r\n this.pauseRecording = function() {\r\n return new Promise(function(resolve, reject) {\r\n try {\r\n self.recordRTC.pauseRecording();\r\n resolve();\r\n } catch (e) {\r\n reject(e);\r\n }\r\n });\r\n };\r\n\r\n /**\r\n * This method resumes the recording.\r\n * @method\r\n * @memberof RecordRTCPromisesHandler\r\n * @example\r\n * recorder.resumeRecording()\r\n * .then(successCB)\r\n * .catch(errorCB);\r\n */\r\n this.resumeRecording = function() {\r\n return new Promise(function(resolve, reject) {\r\n try {\r\n self.recordRTC.resumeRecording();\r\n resolve();\r\n } catch (e) {\r\n reject(e);\r\n }\r\n });\r\n };\r\n\r\n /**\r\n * This method returns data-url for the recorded blob.\r\n * @method\r\n * @memberof RecordRTCPromisesHandler\r\n * @example\r\n * recorder.stopRecording().then(function() {\r\n * recorder.getDataURL().then(function(dataURL) {\r\n * window.open(dataURL);\r\n * }).catch(errorCB);;\r\n * }).catch(errorCB);\r\n */\r\n this.getDataURL = function(callback) {\r\n return new Promise(function(resolve, reject) {\r\n try {\r\n self.recordRTC.getDataURL(function(dataURL) {\r\n resolve(dataURL);\r\n });\r\n } catch (e) {\r\n reject(e);\r\n }\r\n });\r\n };\r\n\r\n /**\r\n * This method returns the recorded blob.\r\n * @method\r\n * @memberof RecordRTCPromisesHandler\r\n * @example\r\n * recorder.stopRecording().then(function() {\r\n * recorder.getBlob().then(function(blob) {})\r\n * }).catch(errorCB);\r\n */\r\n this.getBlob = function() {\r\n return new Promise(function(resolve, reject) {\r\n try {\r\n resolve(self.recordRTC.getBlob());\r\n } catch (e) {\r\n reject(e);\r\n }\r\n });\r\n };\r\n\r\n /**\r\n * This method returns the internal recording object.\r\n * @method\r\n * @memberof RecordRTCPromisesHandler\r\n * @example\r\n * let internalRecorder = await recorder.getInternalRecorder();\r\n * if(internalRecorder instanceof MultiStreamRecorder) {\r\n * internalRecorder.addStreams([newAudioStream]);\r\n * internalRecorder.resetVideoStreams([screenStream]);\r\n * }\r\n * @returns {Object} \r\n */\r\n this.getInternalRecorder = function() {\r\n return new Promise(function(resolve, reject) {\r\n try {\r\n resolve(self.recordRTC.getInternalRecorder());\r\n } catch (e) {\r\n reject(e);\r\n }\r\n });\r\n };\r\n\r\n /**\r\n * This method resets the recorder. So that you can reuse single recorder instance many times.\r\n * @method\r\n * @memberof RecordRTCPromisesHandler\r\n * @example\r\n * await recorder.reset();\r\n * recorder.startRecording(); // record again\r\n */\r\n this.reset = function() {\r\n return new Promise(function(resolve, reject) {\r\n try {\r\n resolve(self.recordRTC.reset());\r\n } catch (e) {\r\n reject(e);\r\n }\r\n });\r\n };\r\n\r\n /**\r\n * Destroy RecordRTC instance. Clear all recorders and objects.\r\n * @method\r\n * @memberof RecordRTCPromisesHandler\r\n * @example\r\n * recorder.destroy().then(successCB).catch(errorCB);\r\n */\r\n this.destroy = function() {\r\n return new Promise(function(resolve, reject) {\r\n try {\r\n resolve(self.recordRTC.destroy());\r\n } catch (e) {\r\n reject(e);\r\n }\r\n });\r\n };\r\n\r\n /**\r\n * Get recorder's readonly state.\r\n * @method\r\n * @memberof RecordRTCPromisesHandler\r\n * @example\r\n * let state = await recorder.getState();\r\n * // or\r\n * recorder.getState().then(state => { console.log(state); })\r\n * @returns {String} Returns recording state.\r\n */\r\n this.getState = function() {\r\n return new Promise(function(resolve, reject) {\r\n try {\r\n resolve(self.recordRTC.getState());\r\n } catch (e) {\r\n reject(e);\r\n }\r\n });\r\n };\r\n\r\n /**\r\n * @property {Blob} blob - Recorded data as \"Blob\" object.\r\n * @memberof RecordRTCPromisesHandler\r\n * @example\r\n * await recorder.stopRecording();\r\n * let blob = recorder.getBlob(); // or \"recorder.recordRTC.blob\"\r\n * invokeSaveAsDialog(blob);\r\n */\r\n this.blob = null;\r\n\r\n /**\r\n * RecordRTC version number\r\n * @property {String} version - Release version number.\r\n * @memberof RecordRTCPromisesHandler\r\n * @static\r\n * @readonly\r\n * @example\r\n * alert(recorder.version);\r\n */\r\n this.version = '5.6.2';\r\n}\r\n\r\nif (typeof RecordRTC !== 'undefined') {\r\n RecordRTC.RecordRTCPromisesHandler = RecordRTCPromisesHandler;\r\n}\n\r\n// ______________________\r\n// WebAssemblyRecorder.js\r\n\r\n/**\r\n * WebAssemblyRecorder lets you create webm videos in JavaScript via WebAssembly. The library consumes raw RGBA32 buffers (4 bytes per pixel) and turns them into a webm video with the given framerate and quality. This makes it compatible out-of-the-box with ImageData from a CANVAS. With realtime mode you can also use webm-wasm for streaming webm videos.\r\n * @summary Video recording feature in Chrome, Firefox and maybe Edge.\r\n * @license {@link https://github.com/muaz-khan/RecordRTC/blob/master/LICENSE|MIT}\r\n * @author {@link https://MuazKhan.com|Muaz Khan}\r\n * @typedef WebAssemblyRecorder\r\n * @class\r\n * @example\r\n * var recorder = new WebAssemblyRecorder(mediaStream);\r\n * recorder.record();\r\n * recorder.stop(function(blob) {\r\n * video.src = URL.createObjectURL(blob);\r\n * });\r\n * @see {@link https://github.com/muaz-khan/RecordRTC|RecordRTC Source Code}\r\n * @param {MediaStream} mediaStream - MediaStream object fetched using getUserMedia API or generated using captureStreamUntilEnded or WebAudio API.\r\n * @param {object} config - {webAssemblyPath:'webm-wasm.wasm',workerPath: 'webm-worker.js', frameRate: 30, width: 1920, height: 1080, bitrate: 1024, realtime: true}\r\n */\r\nfunction WebAssemblyRecorder(stream, config) {\r\n // based on: github.com/GoogleChromeLabs/webm-wasm\r\n\r\n if (typeof ReadableStream === 'undefined' || typeof WritableStream === 'undefined') {\r\n // because it fixes readable/writable streams issues\r\n console.error('Following polyfill is strongly recommended: https://unpkg.com/@mattiasbuelens/web-streams-polyfill/dist/polyfill.min.js');\r\n }\r\n\r\n config = config || {};\r\n\r\n config.width = config.width || 640;\r\n config.height = config.height || 480;\r\n config.frameRate = config.frameRate || 30;\r\n config.bitrate = config.bitrate || 1200;\r\n config.realtime = config.realtime || true;\r\n\r\n function createBufferURL(buffer, type) {\r\n return URL.createObjectURL(new Blob([buffer], {\r\n type: type || ''\r\n }));\r\n }\r\n\r\n var finished;\r\n\r\n function cameraStream() {\r\n return new ReadableStream({\r\n start: function(controller) {\r\n var cvs = document.createElement('canvas');\r\n var video = document.createElement('video');\r\n var first = true;\r\n video.srcObject = stream;\r\n video.muted = true;\r\n video.height = config.height;\r\n video.width = config.width;\r\n video.volume = 0;\r\n video.onplaying = function() {\r\n cvs.width = config.width;\r\n cvs.height = config.height;\r\n var ctx = cvs.getContext('2d');\r\n var frameTimeout = 1000 / config.frameRate;\r\n var cameraTimer = setInterval(function f() {\r\n if (finished) {\r\n clearInterval(cameraTimer);\r\n controller.close();\r\n }\r\n\r\n if (first) {\r\n first = false;\r\n if (config.onVideoProcessStarted) {\r\n config.onVideoProcessStarted();\r\n }\r\n }\r\n\r\n ctx.drawImage(video, 0, 0);\r\n if (controller._controlledReadableStream.state !== 'closed') {\r\n try {\r\n controller.enqueue(\r\n ctx.getImageData(0, 0, config.width, config.height)\r\n );\r\n } catch (e) {}\r\n }\r\n }, frameTimeout);\r\n };\r\n video.play();\r\n }\r\n });\r\n }\r\n\r\n var worker;\r\n\r\n function startRecording(stream, buffer) {\r\n if (!config.workerPath && !buffer) {\r\n finished = false;\r\n\r\n // is it safe to use @latest ?\r\n\r\n fetch(\r\n 'https://unpkg.com/webm-wasm@latest/dist/webm-worker.js'\r\n ).then(function(r) {\r\n r.arrayBuffer().then(function(buffer) {\r\n startRecording(stream, buffer);\r\n });\r\n });\r\n return;\r\n }\r\n\r\n if (!config.workerPath && buffer instanceof ArrayBuffer) {\r\n var blob = new Blob([buffer], {\r\n type: 'text/javascript'\r\n });\r\n config.workerPath = URL.createObjectURL(blob);\r\n }\r\n\r\n if (!config.workerPath) {\r\n console.error('workerPath parameter is missing.');\r\n }\r\n\r\n worker = new Worker(config.workerPath);\r\n\r\n worker.postMessage(config.webAssemblyPath || 'https://unpkg.com/webm-wasm@latest/dist/webm-wasm.wasm');\r\n worker.addEventListener('message', function(event) {\r\n if (event.data === 'READY') {\r\n worker.postMessage({\r\n width: config.width,\r\n height: config.height,\r\n bitrate: config.bitrate || 1200,\r\n timebaseDen: config.frameRate || 30,\r\n realtime: config.realtime\r\n });\r\n\r\n cameraStream().pipeTo(new WritableStream({\r\n write: function(image) {\r\n if (finished) {\r\n console.error('Got image, but recorder is finished!');\r\n return;\r\n }\r\n\r\n worker.postMessage(image.data.buffer, [image.data.buffer]);\r\n }\r\n }));\r\n } else if (!!event.data) {\r\n if (!isPaused) {\r\n arrayOfBuffers.push(event.data);\r\n }\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * This method records video.\r\n * @method\r\n * @memberof WebAssemblyRecorder\r\n * @example\r\n * recorder.record();\r\n */\r\n this.record = function() {\r\n arrayOfBuffers = [];\r\n isPaused = false;\r\n this.blob = null;\r\n startRecording(stream);\r\n\r\n if (typeof config.initCallback === 'function') {\r\n config.initCallback();\r\n }\r\n };\r\n\r\n var isPaused;\r\n\r\n /**\r\n * This method pauses the recording process.\r\n * @method\r\n * @memberof WebAssemblyRecorder\r\n * @example\r\n * recorder.pause();\r\n */\r\n this.pause = function() {\r\n isPaused = true;\r\n };\r\n\r\n /**\r\n * This method resumes the recording process.\r\n * @method\r\n * @memberof WebAssemblyRecorder\r\n * @example\r\n * recorder.resume();\r\n */\r\n this.resume = function() {\r\n isPaused = false;\r\n };\r\n\r\n function terminate(callback) {\r\n if (!worker) {\r\n if (callback) {\r\n callback();\r\n }\r\n\r\n return;\r\n }\r\n\r\n // Wait for null event data to indicate that the encoding is complete\r\n worker.addEventListener('message', function(event) {\r\n if (event.data === null) {\r\n worker.terminate();\r\n worker = null;\r\n\r\n if (callback) {\r\n callback();\r\n }\r\n }\r\n });\r\n\r\n worker.postMessage(null);\r\n }\r\n\r\n var arrayOfBuffers = [];\r\n\r\n /**\r\n * This method stops recording video.\r\n * @param {function} callback - Callback function, that is used to pass recorded blob back to the callee.\r\n * @method\r\n * @memberof WebAssemblyRecorder\r\n * @example\r\n * recorder.stop(function(blob) {\r\n * video.src = URL.createObjectURL(blob);\r\n * });\r\n */\r\n this.stop = function(callback) {\r\n finished = true;\r\n\r\n var recorder = this;\r\n\r\n terminate(function() {\r\n recorder.blob = new Blob(arrayOfBuffers, {\r\n type: 'video/webm'\r\n });\r\n\r\n callback(recorder.blob);\r\n });\r\n };\r\n\r\n // for debugging\r\n this.name = 'WebAssemblyRecorder';\r\n this.toString = function() {\r\n return this.name;\r\n };\r\n\r\n /**\r\n * This method resets currently recorded data.\r\n * @method\r\n * @memberof WebAssemblyRecorder\r\n * @example\r\n * recorder.clearRecordedData();\r\n */\r\n this.clearRecordedData = function() {\r\n arrayOfBuffers = [];\r\n isPaused = false;\r\n this.blob = null;\r\n\r\n // todo: if recording-ON then STOP it first\r\n };\r\n\r\n /**\r\n * @property {Blob} blob - The recorded blob object.\r\n * @memberof WebAssemblyRecorder\r\n * @example\r\n * recorder.stop(function(){\r\n * var blob = recorder.blob;\r\n * });\r\n */\r\n this.blob = null;\r\n}\r\n\r\nif (typeof RecordRTC !== 'undefined') {\r\n RecordRTC.WebAssemblyRecorder = WebAssemblyRecorder;\r\n}\n","module.exports = \"\"","module.exports = \"\"","module.exports = \"\"","module.exports = \"\"","module.exports = \"\"","module.exports = \"\"","module.exports = \"\"","var Slider = require(\"bootstrap-slider\");\n\nconst componentName = \"bootstrapslider\";\n\nfunction init(Survey) {\n var widget = {\n name: componentName,\n title: \"Bootstrap Slider\",\n iconName: \"icon-bootstrap-slider\",\n widgetIsLoaded: function () {\n return typeof Slider !== \"undefined\";\n },\n isFit: function (question) {\n return question.getType() === componentName;\n },\n htmlTemplate: \"
\",\n activatedByChanged: function (activatedBy) {\n Survey.Serializer.addClass(componentName, [], null, \"empty\");\n let registerQuestion = Survey.ElementFactory.Instance.registerCustomQuestion;\n if(!!registerQuestion) registerQuestion(componentName);\n Survey.Serializer.addProperties(componentName, [\n {\n name: \"step:number\",\n default: 1,\n category: \"general\",\n },\n {\n name: \"rangeMin:number\",\n default: 0,\n category: \"general\",\n },\n {\n name: \"rangeMax:number\",\n default: 100,\n category: \"general\",\n },\n {\n name: \"orientation\",\n default: \"horizontal\",\n choices: [\"horizontal\", \"vertical\"],\n category: \"general\"\n },\n ]);\n Survey.Serializer.addProperty(componentName, {\n name: \"config\",\n default: null,\n category: \"general\",\n });\n },\n afterRender: function (question, el) {\n el.style.paddingTop = \"20px\";\n el.style.paddingBottom = \"17px\";\n el.style.paddingLeft = \"10px\";\n var inputEl = document.createElement(\"input\");\n inputEl.id = question.id;\n inputEl.type = \"text\";\n inputEl.setAttribute(\"data-slider-id\", question.name + \"_\" + question.id);\n inputEl.setAttribute(\"data-slider-min\", question.rangeMin);\n inputEl.setAttribute(\"data-slider-max\", question.rangeMax);\n inputEl.setAttribute(\"data-slider-step\", question.step);\n if(question.orientation == \"vertical\") {\n inputEl.setAttribute(\"data-slider-orientation\", \"vertical\");\n }\n inputEl.setAttribute(\"data-slider-step\", question.step);\n inputEl.setAttribute(\n \"data-slider-value\",\n question.value || question.rangeMin\n );\n el.appendChild(inputEl);\n\n var config = question.config || {};\n\n if (config.id === undefined) {\n config.id = question.name + \"_\" + question.id;\n }\n\n if (config.min === undefined) {\n config.min = question.rangeMin;\n }\n\n if (config.max === undefined) {\n config.max = question.rangeMax;\n }\n\n if (config.step === undefined) {\n config.step = question.step;\n }\n\n if (config.enabled === undefined) {\n config.enabled = !question.isReadOnly;\n }\n\n if (config.value === undefined) {\n config.value = question.value || question.rangeMin;\n }\n\n var slider = new Slider(inputEl, config);\n\n slider.on(\"change\", function (valueObj) {\n question.value = slider.getValue();\n });\n var updateValueHandler = function () {\n slider.setValue(question.value || question.rangeMin);\n };\n question.readOnlyChangedCallback = function () {\n if (question.isReadOnly) {\n slider.disable();\n } else {\n slider.enable();\n }\n };\n question.bootstrapSlider = slider;\n question.valueChangedCallback = updateValueHandler;\n },\n willUnmount: function (question, el) {\n question.bootstrapSlider && question.bootstrapSlider.destroy();\n question.bootstrapSlider = null;\n question.readOnlyChangedCallback = null;\n },\n pdfRender: function (_, options) {\n if (options.question.getType() === componentName) {\n var point = options.module.SurveyHelper.createPoint(\n options.module.SurveyHelper.mergeRects.apply(null, options.bricks)\n );\n point.xLeft += options.controller.unitWidth;\n point.yTop +=\n options.controller.unitHeight *\n options.module.FlatQuestion.CONTENT_GAP_VERT_SCALE;\n var rect = options.module.SurveyHelper.createTextFieldRect(\n point,\n options.controller\n );\n var textboxBrick = new options.module.TextFieldBrick(\n options.question,\n options.controller,\n rect,\n true,\n options.question.id,\n (\n options.question.value ||\n options.question.defaultValue ||\n \"\"\n ).toString(),\n \"\",\n options.question.isReadOnly,\n false,\n \"text\"\n );\n options.bricks.push(textboxBrick);\n }\n },\n };\n\n Survey.CustomWidgetCollection.Instance.addCustomWidget(widget, \"customtype\");\n}\n\nif (typeof Survey !== \"undefined\") {\n init(Survey);\n}\n\nexport default init;\n","function init(Survey) {\n const iconId = \"icon-editor\";\n const componentName = \"editor\";\n Survey.SvgRegistry && Survey.SvgRegistry.registerIconFromSvg(iconId, require('svg-inline-loader!./images/editor.svg'), \"\");\n var widget = {\n name: componentName,\n title: \"Editor\",\n iconName: iconId,\n widgetIsLoaded: function () {\n return typeof CKEDITOR != \"undefined\";\n },\n isFit: function (question) {\n return question.getType() === componentName;\n },\n htmlTemplate:\n \"\",\n activatedByChanged: function (activatedBy) {\n Survey.Serializer.addClass(componentName, [], null, \"empty\");\n let registerQuestion = Survey.ElementFactory.Instance.registerCustomQuestion;\n if(!!registerQuestion) registerQuestion(componentName);\n Survey.Serializer.addProperty(componentName, {\n name: \"height\",\n default: 300,\n category: \"general\",\n });\n },\n afterRender: function (question, el) {\n var name = question.inputId;\n CKEDITOR.editorConfig = function (config) {\n config.language = \"es\";\n config.height = question.height;\n config.toolbarCanCollapse = true;\n };\n el.name = name;\n\n if (CKEDITOR.instances[name]) {\n CKEDITOR.instances[name].removeAllListeners();\n CKEDITOR.remove(CKEDITOR.instances[name]);\n }\n\n var editor = CKEDITOR.replace(el);\n CKEDITOR.instances[name].config.readOnly = question.isReadOnly;\n\n var isValueChanging = false;\n var updateValueHandler = function () {\n if (isValueChanging || typeof question.value === \"undefined\") return;\n editor.setData(question.value);\n };\n editor.on(\"change\", function () {\n isValueChanging = true;\n question.value = editor.getData();\n isValueChanging = false;\n });\n\n question.valueChangedCallback = updateValueHandler;\n question.readOnlyChangedCallback = function () {\n if (question.isReadOnly) {\n editor.setReadOnly(true);\n } else {\n editor.setReadOnly(false);\n }\n };\n updateValueHandler();\n },\n willUnmount: function (question, el) {\n question.readOnlyChangedCallback = null;\n CKEDITOR.instances[question.inputId].destroy(false);\n },\n pdfRender: function (survey, options) {\n if (options.question.getType() === componentName) {\n const loc = new Survey.LocalizableString(survey, true);\n loc.text = options.question.value || options.question.defaultValue;\n options.question[\"locHtml\"] = loc;\n if (\n options.question.renderAs === \"standard\" ||\n options.question.renderAs === \"image\"\n ) {\n options.question[\"renderAs\"] = options.question.renderAs;\n } else options.question[\"renderAs\"] = \"auto\";\n const flatHtml = options.repository.create(\n survey,\n options.question,\n options.controller,\n \"html\"\n );\n return new Promise(function (resolve) {\n flatHtml.generateFlats(options.point).then(function (htmlBricks) {\n options.bricks = htmlBricks;\n resolve();\n });\n });\n }\n },\n };\n\n Survey.CustomWidgetCollection.Instance.addCustomWidget(widget, \"customtype\");\n}\n\nif (typeof Survey !== \"undefined\") {\n init(Survey);\n}\n\nexport default init;\n","function init(Survey, $) {\n $ = $ || window.$;\n var widget = {\n name: \"autocomplete\",\n widgetIsLoaded: function () {\n return typeof $ == \"function\" && !!$.fn.easyAutocomplete;\n },\n isFit: function (question) {\n return question.getType() === \"text\";\n },\n isDefaultRender: true,\n activatedByChanged: function (activatedBy) {\n if (!!Survey.Serializer.findProperty(\"text\", \"choices\") || !!Survey.Serializer.findProperty(\"text\", \"choicesByUrl\")) return;\n Survey.Serializer.addProperty(\"text\", {\n name: \"choices:itemvalues\",\n category: \"choices\",\n categoryIndex: 1,\n });\n Survey.Serializer.addProperty(\"text\", {\n name: \"choicesByUrl:restfull\",\n className: \"ChoicesRestfull\",\n category: \"choicesByUrl\",\n visible: false,\n categoryIndex: 2,\n });\n Survey.Serializer.addProperty(\"text\", {\n name: \"config\",\n category: \"general\",\n visible: false,\n });\n },\n afterRender: function (question, el) {\n var $el = $(el).is(\"input\") ? $(el) : $(el).find(\"input\");\n\n var getCssSelectorFromClassesString = function (classesString) {\n if (!classesString) return \"\";\n var cssSelector = classesString.replace(/(^\\s*)|(\\s+)/g, \".\"); // replace whitespaces with '.'\n return cssSelector;\n };\n\n var questionRootClasses = getCssSelectorFromClassesString(\n question.cssRoot\n );\n\n var questionRoot = $el.parents(questionRootClasses)[0];\n if (!!questionRootClasses && !!questionRoot) {\n questionRoot.style.overflow = \"visible\";\n }\n\n var config = question.config;\n var options =\n config && typeof config == \"string\" ? JSON.parse(config) : config;\n if (!options) options = {};\n\n options.data = (question.choices || []).map(function (item) {\n return item.text;\n });\n if (options.adjustWidth === undefined) {\n options.adjustWidth = false;\n }\n if (!options.list) {\n options.list = {\n sort: {\n enabled: true,\n method: (aStr, bStr) => {\n const inputStr = $el.val().toLowerCase();\n const aIndex = aStr.toLowerCase().indexOf(inputStr);\n const bIndex = bStr.toLowerCase().indexOf(inputStr);\n return aIndex - bIndex;\n }\n },\n match: {\n enabled: true,\n },\n onChooseEvent: function () {\n var selectedData = $el.getSelectedItemData();\n if(!!selectedData && typeof selectedData === \"object\" \n && !!question.choicesByUrl && !!question.choicesByUrl.valueName) {\n selectedData = selectedData[question.choicesByUrl.valueName];\n }\n question.value = selectedData;\n },\n };\n }\n if (!options.placeholder) {\n options.placeholder = question.placeholder;\n }\n\n if (!!question.choicesByUrl) {\n options.url = function (phrase) {\n return question.choicesByUrl.url;\n };\n options.getValue = question.choicesByUrl.valueName;\n // options.ajaxSettings = {\n // dataType: \"jsonp\"\n // };\n }\n $el.easyAutocomplete(options);\n\n $el[0].oninput = function () {\n question.customWidgetData.isNeedRender = true;\n };\n var updateHandler = function () {\n $el[0].value =\n typeof question.value === \"undefined\" ? \"\" : question.value;\n };\n question.valueChangedCallback = updateHandler;\n updateHandler();\n },\n willUnmount: function (question, el) {\n // var $el = $(el).find(\"input\");\n // $el.autocomplete(\"destroy\");\n },\n };\n\n Survey.CustomWidgetCollection.Instance.addCustomWidget(widget);\n}\n\nif (typeof Survey !== \"undefined\") {\n init(Survey, window.jQuery);\n}\n\nexport default init;\n","function init(Survey, $) {\n $ = $ || window.$;\n const componentName = \"emotionsratings\";\n var widget = {\n name: componentName,\n title: \"Emotions Ratings\",\n iconName: \"icon-emotionsratings\",\n widgetIsLoaded: function () {\n return typeof $ == \"function\" && !!$.fn.emotionsRating;\n },\n defaultJSON: {\n choices: [1, 2, 3, 4, 5],\n },\n isFit: function (question) {\n return question.getType() === componentName;\n },\n isDefaultRender: false,\n htmlTemplate: \"
\",\n activatedByChanged: function (activatedBy) {\n Survey.Serializer.addClass(\n componentName,\n [\n {\n name: \"hasOther\",\n visible: false,\n },\n {\n name: \"otherText\",\n visible: false,\n },\n {\n name: \"optionsCaption\",\n visible: false,\n },\n {\n name: \"otherErrorText\",\n visible: false,\n },\n {\n name: \"storeOthersAsComment\",\n visible: false,\n },\n {\n name: \"renderAs\",\n visible: false,\n },\n ],\n null,\n \"dropdown\"\n );\n let registerQuestion = Survey.ElementFactory.Instance.registerCustomQuestion;\n if(!!registerQuestion) registerQuestion(componentName);\n Survey.Serializer.addProperties(componentName, [\n {\n name: \"emotions:itemvalues\",\n category: \"emotions\",\n categoryIndex: 1,\n default: [\"angry\", \"disappointed\", \"meh\", \"happy\", \"inLove\"],\n },\n {\n name: \"emotionSize:number\",\n category: \"emotions\",\n default: 30,\n },\n {\n name: \"emotionsCount:number\",\n category: \"emotions\",\n default: 5,\n },\n {\n name: \"bgEmotion\",\n category: \"emotions\",\n default: \"happy\",\n },\n {\n name: \"emotionColor\",\n category: \"emotions\",\n default: \"#FF0066\",\n },\n ]);\n },\n afterRender: function (question, el) {\n var emotions = (question.emotions || []).map(function (item) {\n return item.value;\n });\n if (emotions.length === 0) {\n emotions = [\"angry\", \"disappointed\", \"meh\", \"happy\", \"inLove\"];\n }\n var options = {\n emotionSize: question.emotionSize,\n bgEmotion: question.bgEmotion,\n emotions: emotions,\n initialRating: question.value,\n color: question.emotionColor,\n count: question.emotionsCount,\n onUpdate: function (value) {\n question.value = value;\n },\n };\n initWidget();\n\n question.valueChangedCallback = initWidget;\n question.readOnlyChangedCallback = initWidget;\n\n function initWidget() {\n el.innerHTML = \"
\";\n $(el).off();\n options.initialRating = question.value || 0;\n options.disabled = question.isReadOnly;\n $(el).find(\"div\").emotionsRating(options);\n }\n },\n willUnmount: function (question, el) {\n el.innerHTML = null;\n $(el).off();\n question.readOnlyChangedCallback = null;\n question.valueChangedCallback = null;\n },\n pdfQuestionType: \"dropdown\",\n };\n\n Survey.CustomWidgetCollection.Instance.addCustomWidget(widget, \"customtype\");\n}\n\nif (typeof Survey !== \"undefined\") {\n init(Survey, window.jQuery);\n}\n\nexport default init;\n","function escValue(val) {\n if (typeof val === \"string\") {\n return (val || \"\").replace(/(['])/g, \"\\\\$1\");\n }\n return val;\n}\n\nfunction init(Survey, $) {\n $ = $ || window.$;\n var widget = {\n className: \"iradio_square-blue\",\n checkboxClass: \"iradio_square-blue\",\n radioClass: \"iradio_square-blue\",\n name: \"icheck\",\n widgetIsLoaded: function () {\n return typeof $ == \"function\" && !!$.fn.iCheck;\n },\n isFit: function (question) {\n var t = question.getType();\n return t === \"radiogroup\" || t === \"checkbox\" || t === \"matrix\";\n },\n isDefaultRender: true,\n afterRender: function (question, el) {\n var rootWidget = this;\n var $el = $(el);\n\n $el.find(\".sv-item__decorator\").hide();\n\n $el.find(\"input\").data({\n iCheck: undefined,\n });\n function getIndexByValue(arr, value) {\n if (!Array.isArray(arr)) return -1;\n for (var i = 0; i < arr.length; i++) {\n if (arr[i] == value) return i;\n if (!!arr[i] && arr[i].toString().toLowerCase() == value) return i;\n }\n return -1;\n }\n var frozeUpdating = false;\n var makeChoicesICheck = function () {\n var inputs = $el.find(\"input\");\n inputs.iCheck({\n checkboxClass:\n question.checkboxClass ||\n rootWidget.checkboxClass ||\n rootWidget.className,\n radioClass:\n question.radioClass ||\n rootWidget.radioClass ||\n rootWidget.className,\n });\n inputs.on(\"ifChecked\", function (event) {\n if (frozeUpdating) return;\n if (question.getType() === \"matrix\") {\n question.generatedVisibleRows.forEach(function (row, index, rows) {\n if (row.fullName === event.target.name) {\n row.value = event.target.value;\n }\n });\n } else if (question.getType() === \"checkbox\") {\n var oldValue = question.value || [];\n var index = getIndexByValue(oldValue, event.target.value);\n if (index === -1) {\n question.value = oldValue.concat([event.target.value]);\n }\n } else {\n question.value = event.target.value;\n }\n });\n\n inputs.on(\"ifUnchecked\", function (event) {\n if (frozeUpdating) return;\n if (question.getType() === \"checkbox\") {\n var oldValue = (question.value || []).slice();\n var index = getIndexByValue(oldValue, event.target.value);\n if (index >= 0) {\n oldValue.splice(index, 1);\n question.value = oldValue;\n }\n }\n });\n };\n function uncheckIcheck(cEl) {\n cEl.iCheck(\"uncheck\");\n cEl[0].parentElement.classList.remove(\"checked\");\n }\n var select = function () {\n frozeUpdating = true;\n if (question.getType() !== \"matrix\") {\n var values = question.value;\n if (!Array.isArray(values)) {\n values = [values];\n }\n if (question.getType() == \"checkbox\") {\n var qValue = question.value;\n question.visibleChoices.forEach(function (item) {\n var inEl = $el.find(\n \"input[value='\" + escValue(item.value) + \"']\"\n );\n if (!inEl) return;\n var isChecked = getIndexByValue(qValue, item.value) > -1;\n if (isChecked) {\n inEl.iCheck(\"check\");\n } else {\n var cEl = inEl[0];\n var wasChecked = !!cEl[\"checked\"];\n if (wasChecked) {\n inEl.removeAttr(\"checked\");\n if (!inEl.parent().hasClass(\"checked\"))\n setTimeout(function () {\n uncheckIcheck(inEl);\n });\n else uncheckIcheck(inEl);\n }\n }\n });\n } else {\n values.forEach(function (value) {\n $el\n .find(\"input[value='\" + escValue(value) + \"']\")\n .iCheck(\"check\");\n });\n }\n } else {\n question.generatedVisibleRows.forEach(function (row, index, rows) {\n if (row.value) {\n $(el)\n .find(\n \"input[name='\" +\n row.fullName +\n \"'][value='\" +\n escValue(row.value) +\n \"']\"\n )\n .iCheck(\"check\");\n }\n });\n }\n frozeUpdating = false;\n };\n makeChoicesICheck();\n\n question.visibleChoicesChangedCallback = function () {\n makeChoicesICheck();\n $el.find(\".sv-item__decorator\").hide();\n };\n question.valueChangedCallback = select;\n select();\n },\n willUnmount: function (question, el) {\n var $el = $(el);\n $el.find(\"input\").iCheck(\"destroy\");\n question.visibleChoicesChangedCallback = null;\n },\n };\n\n Survey.Serializer.addProperty(\"radiogroup\", {\n name: \"radioClass\",\n category: \"general\",\n });\n Survey.Serializer.addProperty(\"checkbox\", {\n name: \"checkboxClass\",\n category: \"general\",\n });\n Survey.CustomWidgetCollection.Instance.addCustomWidget(widget, \"type\");\n}\n\nif (typeof Survey !== \"undefined\") {\n init(Survey, window.jQuery);\n}\n\nexport default init;\n","import Inputmask from \"inputmask\";\n\nfunction init(Survey) {\n const updateTextItemPropInfo = function (propJSON) {\n const name = propJSON.name;\n propJSON.onGetValue = (obj) => {\n return obj.editor[name];\n };\n propJSON.onSetValue = (obj, val) => {\n obj.editor[name] = val;\n } \n }\n const updateColumnPropInfo = function (propJSON) {\n const name = propJSON.name;\n propJSON.visibleIf = (obj) => {\n return obj.cellType === \"text\";\n };\n propJSON.onGetValue = (obj) => {\n return obj.templateQuestion[name];\n };\n propJSON.onSetValue = (obj, val) => {\n obj.templateQuestion[name] = val;\n } \n }\n var widget = {\n name: \"maskedit\",\n numericGroupSeparator: \",\",\n numericRadixPoint: undefined,\n numericAutoGroup: true,\n numericDigits: 2,\n numericDigitsOptional: false,\n numericPlaceholder: \"0\",\n autoUnmask: true,\n clearIncomplete: true,\n showMaskOnHover: true,\n unmaskAsNumber: false, \n widgetIsLoaded: function () {\n return typeof Inputmask != \"undefined\";\n },\n isFit: function (question) {\n if (question.getType() == \"multipletext\") return true;\n return (\n question.getType() == \"text\" &&\n (question.inputMask != \"none\" || question.inputFormat)\n );\n },\n isDefaultRender: true,\n activatedByChanged: function (activatedBy) {\n if (Survey.Serializer.findProperty(\"text\", \"inputMask\")) return;\n var properties = [\n {\n name: \"autoUnmask\",\n type: \"boolean\",\n category: \"general\",\n showMode: \"form\",\n default: true,\n },\n {\n name: \"clearIncomplete\",\n type: \"boolean\",\n category: \"general\",\n showMode: \"form\",\n default: true,\n },\n {\n name: \"showMaskOnHover\",\n type: \"boolean\",\n category: \"general\",\n showMode: \"form\",\n default: true,\n },\n { \n name: \"inputFormat\", \n showMode: \"form\",\n category: \"general\" },\n {\n name: \"inputMask\",\n showMode: \"form\",\n category: \"general\",\n default: \"none\",\n choices: [\n \"none\",\n \"datetime\",\n \"currency\",\n \"decimal\",\n \"email\",\n \"phone\",\n \"ip\",\n ],\n },\n {\n name: \"numericDigits\",\n category: \"general\",\n visible: false,\n },\n {\n name: \"numericGroupSeparator\",\n category: \"general\",\n default: \",\",\n visible: false,\n },\n {\n name: \"options\",\n category: \"general\",\n visible: false,\n },\n {\n name: \"unmaskAsNumber:boolean\",\n category: \"general\",\n visible: false,\n },\n {\n name: \"prefix\",\n category: \"general\",\n visible: false,\n },\n {\n name: \"suffix\",\n category: \"general\",\n visible: false,\n },\n ];\n Survey.Serializer.addProperties(\"text\", properties);\n properties.forEach(prop => {\n if(prop.visible !== false) {\n updateTextItemPropInfo(prop);\n }\n });\n Survey.Serializer.addProperties(\"multipletextitem\", properties);\n properties.forEach(prop => {\n if(prop.visible !== false) {\n updateColumnPropInfo(prop);\n }\n });\n },\n applyInputMask: function (surveyElement, el) {\n var rootWidget = this;\n var mask =\n surveyElement.inputMask !== \"none\"\n ? surveyElement.inputMask\n : surveyElement.inputFormat;\n var options = {};\n if (typeof surveyElement.options === \"object\") {\n for (var option in surveyElement.options) {\n options[option] = surveyElement.options[option];\n }\n }\n options.autoUnmask = typeof surveyElement.autoUnmask !== \"undefined\"\n ? surveyElement.autoUnmask\n : rootWidget.autoUnmask;\n options.clearIncomplete = typeof surveyElement.clearIncomplete !== \"undefined\"\n ? surveyElement.clearIncomplete\n : rootWidget.clearIncomplete;\n options.showMaskOnHover = typeof surveyElement.showMaskOnHover !== \"undefined\"\n ? surveyElement.showMaskOnHover\n : rootWidget.showMaskOnHover;\n options.unmaskAsNumber = typeof surveyElement.unmaskAsNumber !== \"undefined\"\n ? surveyElement.unmaskAsNumber\n : rootWidget.unmaskAsNumber;\n if (surveyElement.inputMask !== \"none\") {\n options.inputFormat = surveyElement.inputFormat;\n }\n if (\n surveyElement.inputMask === \"currency\" ||\n surveyElement.inputMask === \"decimal\"\n ) {\n options.groupSeparator = surveyElement.numericGroupSeparator || rootWidget.numericGroupSeparator;\n options.radixPoint = rootWidget.numericRadixPoint;\n options.autoGroup = rootWidget.numericAutoGroup;\n options.placeholder = rootWidget.numericPlaceholder; \n }\n if (surveyElement.inputMask === \"currency\") {\n options.digits = surveyElement.numericDigits || rootWidget.numericDigits;\n options.digitsOptional = rootWidget.numericDigitsOptional;\n options.prefix = surveyElement.prefix || \"\";\n options.suffix = surveyElement.suffix || \"\";\n options.placeholder = rootWidget.numericPlaceholder; \n }\n // if (surveyElement.inputMask == \"datetime\") {\n // mask = surveyElement.inputFormat;\n // }\n if (surveyElement.inputMask === \"phone\" && !!surveyElement.inputFormat) {\n mask = surveyElement.inputFormat;\n }\n Inputmask(mask, options).mask(el);\n\n el.onblur = function () {\n if (!el.inputmask) return;\n if (surveyElement.value === el.inputmask.getemptymask()) {\n surveyElement.value = \"\";\n }\n };\n\n var customWidgetData =\n surveyElement.getType() === \"multipletextitem\"\n ? surveyElement.editorValue.customWidgetData\n : surveyElement.customWidgetData;\n el.oninput = function () {\n customWidgetData.isNeedRender = true;\n };\n\n var pushValueHandler = function () { \n if (!el.inputmask) return;\n if (el.inputmask.isComplete()) {\n surveyElement.value = options.autoUnmask\n ? el.inputmask.unmaskedvalue()\n : el.value;\n } else {\n surveyElement.value = null;\n }\n };\n el.onfocusout = el.onchange = pushValueHandler;\n\n var updateHandler = function () {\n el.value =\n surveyElement.value === undefined || surveyElement.value === null\n ? \"\"\n : surveyElement.value;\n };\n surveyElement.valueChangedCallback = updateHandler;\n updateHandler();\n },\n afterRender: function (question, el) { \n if (question.getType() != \"multipletext\") {\n var input = el.querySelector(\"input\") || el;\n this.applyInputMask(question, input);\n } else {\n for (var i = 0; i < question.items.length; i++) {\n var item = question.items[i];\n if (item.inputMask != \"none\" || item.inputFormat) {\n var input = el.querySelector(\"#\" + item.editor.inputId);\n if (input) {\n this.applyInputMask(item, input);\n }\n }\n }\n }\n },\n willUnmount: function (question, el) {\n var input = el.querySelector(\"input\") || el;\n if (!!input && !!input.inputmask) {\n input.inputmask.remove();\n }\n },\n };\n\n Survey.CustomWidgetCollection.Instance.addCustomWidget(widget);\n}\n\nif (typeof Survey !== \"undefined\") {\n init(Survey);\n}\n\nexport default init;\n","function init(Survey, $) {\n const iconId = \"icon-barrating\";\n const componentName = \"barrating\";\n Survey.SvgRegistry && Survey.SvgRegistry.registerIconFromSvg(iconId, require('svg-inline-loader?classPrefix!./images/barrating.svg'), \"\");\n $ = $ || window.$;\n var widget = {\n name: componentName,\n title: \"Bar rating\",\n iconName: iconId,\n widgetIsLoaded: function () {\n return typeof $ == \"function\" && !!$.fn.barrating;\n },\n defaultJSON: { choices: [1, 2, 3, 4, 5] },\n isFit: function (question) {\n return question.getType() === componentName;\n },\n isDefaultRender: true,\n activatedByChanged: function (activatedBy) {\n Survey.Serializer.addClass(\n componentName,\n [\n { name: \"hasOther\", visible: false },\n { name: \"otherText\", visible: false },\n { name: \"optionsCaption\", visible: false },\n { name: \"otherErrorText\", visible: false },\n { name: \"storeOthersAsComment\", visible: false },\n { name: \"renderAs\", visible: false },\n { name: \"select2Config\", visible: false },\n ],\n null,\n \"dropdown\"\n );\n let registerQuestion = Survey.ElementFactory.Instance.registerCustomQuestion;\n if(!!registerQuestion) registerQuestion(componentName);\n Survey.Serializer.addProperty(componentName, {\n name: \"showValues:boolean\",\n default: false,\n category: \"general\",\n });\n Survey.Serializer.addProperty(componentName, {\n name: \"ratingTheme\",\n category: \"general\",\n default: \"css-stars\",\n choices: [\n \"fontawesome-stars\",\n \"css-stars\",\n \"bars-pill\",\n \"bars-1to10\",\n \"bars-movie\",\n \"bars-reversed\",\n \"bars-horizontal\",\n \"fontawesome-stars-o\",\n ],\n });\n },\n afterRender: function (question, el) {\n var $customSelect;\n var $questionInput;\n var contentContainer = $(el).is(\"select\")\n ? $(el).parent().parent()[0]\n : $(el).parent()[0];\n var renderCustomSelect = function () {\n $customSelect = $(\"\");\n question.visibleChoices.forEach(function (choice) {\n $customSelect.append(\n ''.format(choice.value, choice.text)\n );\n });\n $questionInput = $(contentContainer).find(\n '[id=\"{0}\"]'.format(question.inputId)\n );\n\n $questionInput.css(\"display\", \"none\");\n $questionInput.after($customSelect);\n $customSelect[0].selectedIndex = -1;\n };\n var removeCustomSelect = function () {\n $questionInput.css(\"display\", \"\");\n $customSelect.barrating(\"destroy\");\n $customSelect.remove();\n };\n var renderBarrating = function () {\n $customSelect.barrating(\"show\", {\n theme: question.ratingTheme,\n initialRating: question.value,\n showValues: question.showValues,\n showSelectedRating: false,\n readonly: question.isReadOnly,\n onSelect: function (value, text) {\n valueChangingByWidget = true;\n question.value = value;\n valueChangingByWidget = false;\n },\n });\n };\n renderCustomSelect();\n renderBarrating();\n if (!!$customSelect.parents()[0])\n $customSelect.parents()[0].style.marginBottom = \"3px\";\n var valueChangingByWidget = false;\n\n question.valueChangedCallback = function () {\n if (\n !valueChangingByWidget &&\n $(contentContainer).find(\"select.sv-widget-select\")[0].value !==\n question.value\n ) {\n $(contentContainer)\n .find(\"select.sv-widget-select\")\n .barrating(\"set\", question.value);\n }\n };\n question.__barratingOnPropertyChangedCallback = function (\n sender,\n options\n ) {\n if (options.name === \"ratingTheme\" || options.name === \"showValues\") {\n $customSelect.barrating(\"destroy\");\n renderBarrating();\n }\n };\n question.onPropertyChanged.add(\n question.__barratingOnPropertyChangedCallback\n );\n question.readOnlyChangedCallback = function () {\n removeCustomSelect();\n renderCustomSelect();\n renderBarrating();\n };\n question.visibleChoicesChangedCallback = function () {\n renderBarrating();\n };\n },\n willUnmount: function (question, el) {\n var $contentContainer = $(el).is(\"select\")\n ? $(el).parent().parent()\n : $(el).parent();\n var $el = $contentContainer.find(\"select.sv-widget-select\");\n $el.barrating(\"destroy\");\n $el.remove();\n question.valueChangedCallback = undefined;\n question.onPropertyChanged.remove(\n question.__barratingOnPropertyChangedCallback\n );\n question.__barratingOnPropertyChangedCallback = undefined;\n },\n pdfQuestionType: \"dropdown\",\n };\n\n Survey.CustomWidgetCollection.Instance.addCustomWidget(widget, \"customtype\");\n}\n\nif (typeof Survey !== \"undefined\") {\n init(Survey, window.$);\n}\n\nexport default init;\n","function init(Survey, $) {\n const iconId = \"icon-datepicker\";\n const componentName = \"datepicker\";\n Survey.SvgRegistry && Survey.SvgRegistry.registerIconFromSvg(iconId, require('svg-inline-loader?classPrefix!./images/datepicker.svg'), \"\");\n $ = $ || window.$;\n if (\n !!$ &&\n !$.fn.bootstrapDP &&\n !!$.fn.datepicker &&\n !!$.fn.datepicker.noConflict\n ) {\n $.fn.bootstrapDP = $.fn.datepicker.noConflict();\n if (!$.fn.datepicker) {\n $.fn.datepicker = $.fn.bootstrapDP;\n }\n }\n var widget = {\n name: componentName,\n title: \"Date picker\",\n iconName: iconId,\n widgetIsLoaded: function () {\n return !!$ && !!$.fn.datepicker && !$.fn.datepicker.noConflict;\n },\n isFit: function (question) {\n return question.getType() === componentName;\n },\n htmlTemplate: \"\",\n activatedByChanged: function (activatedBy) {\n Survey.Serializer.addClass(\n componentName,\n [\n { name: \"inputType\", visible: false },\n { name: \"inputFormat\", visible: false },\n { name: \"inputMask\", visible: false },\n ],\n null,\n \"text\"\n );\n let registerQuestion = Survey.ElementFactory.Instance.registerCustomQuestion;\n if(!!registerQuestion) registerQuestion(componentName);\n Survey.Serializer.addProperty(componentName, {\n name: \"dateFormat\",\n category: \"general\",\n });\n Survey.Serializer.addProperty(componentName, {\n name: \"config\",\n category: \"general\",\n visible: false,\n default: null,\n });\n Survey.Serializer.addProperty(componentName, {\n name: \"maxDate\",\n category: \"general\",\n });\n Survey.Serializer.addProperty(componentName, {\n name: \"minDate\",\n category: \"general\",\n });\n Survey.Serializer.addProperty(componentName, {\n name: \"disableInput:boolean\",\n category: \"general\",\n });\n },\n afterRender: function (question, el) {\n var $el = $(el).is(\".widget-datepicker\")\n ? $(el)\n : $(el).find(\".widget-datepicker\");\n $el.addClass(question.css.text.root);\n var isSelecting = false;\n var config = $.extend(true, {}, question.config || {});\n if (!!question.placeHolder) {\n $el.attr(\"placeholder\", question.placeHolder);\n }\n if (config.dateFormat === undefined) {\n config.dateFormat = !!question.dateFormat\n ? question.dateFormat\n : undefined;\n }\n if (config.option === undefined) {\n config.option = {\n minDate: null,\n maxDate: null,\n };\n }\n if (!!question.minDate) {\n config.minDate = question.minDate;\n }\n if (!!question.maxDate) {\n config.maxDate = question.maxDate;\n }\n if (!!question.renderedMin) {\n config.minDate = new Date(question.renderedMin);\n }\n if (!!question.renderedMax) {\n config.maxDate = new Date(question.renderedMax);\n }\n config.disabled = question.isReadOnly;\n if (config.onSelect === undefined) {\n config.onSelect = function (dateText) {\n isSelecting = true;\n setDateIntoQuestion();\n isSelecting = false;\n this.fixFocusIE = true;\n };\n }\n config.fixFocusIE = false;\n config.onClose = function (dateText, inst) {\n this.fixFocusIE = true;\n };\n config.beforeShow = function (input, inst) {\n var result = !!navigator.userAgent.match(/Trident\\/7\\./)\n ? !this.fixFocusIE\n : true;\n this.fixFocusIE = false;\n return result;\n };\n function setDateIntoQuestion() {\n var val = $el.datepicker('getDate');\n var d = new Date();\n val.setHours(d.getHours());\n val.setMinutes(d.getMinutes());\n val.setSeconds(d.getSeconds());\n question.value = val;\n }\n var pickerWidget = $el.datepicker(config).on(\"change\", function (e) {\n setDateIntoQuestion();\n });\n\n $el.keyup(function (e) {\n if (e.keyCode == 8 || e.keyCode == 46) {\n $.datepicker._clearDate(this);\n }\n });\n if(question.disableInput) {\n $el.attr(\"readOnly\", \"true\");\n }\n\n question.readOnlyChangedCallback = function () {\n $el.datepicker(\"option\", \"disabled\", question.isReadOnly);\n };\n function updateDate() {\n if (!question.isEmpty()) {\n var val = question.value;\n if(typeof val === \"string\") {\n val = new Date(val);\n }\n pickerWidget.datepicker(\"setDate\", val);\n } else {\n pickerWidget.datepicker(\"setDate\", null);\n }\n }\n question.registerFunctionOnPropertyValueChanged(\n \"dateFormat\",\n function () {\n question.dateFormat &&\n pickerWidget.datepicker(\n \"option\",\n \"dateFormat\",\n question.dateFormat\n );\n updateDate();\n }\n );\n question.valueChangedCallback = function () {\n if (!isSelecting) {\n updateDate();\n $el.blur();\n }\n };\n question.valueChangedCallback();\n },\n willUnmount: function (question, el) {\n var $el = $(el).is(\".widget-datepicker\")\n ? $(el)\n : $(el).find(\".widget-datepicker\");\n $el.datepicker(\"destroy\");\n },\n pdfQuestionType: \"text\",\n };\n\n Survey.CustomWidgetCollection.Instance.addCustomWidget(widget, \"customtype\");\n}\n\nif (typeof Survey !== \"undefined\") {\n init(Survey, window.jQuery);\n}\n\nexport default init;\n","import RecordRTC from \"recordrtc\";\n\nfunction init(Survey) {\n const iconId = \"icon-microphone\";\n const componentName = \"microphone\";\n Survey.SvgRegistry && Survey.SvgRegistry.registerIconFromSvg(iconId, require('svg-inline-loader?classPrefix!./images/microphone.svg'), \"\");\n var widget = {\n name: componentName,\n title: \"Microphone\",\n iconName: iconId,\n widgetIsLoaded: function() {\n return typeof RecordRTC != \"undefined\";\n },\n isFit: function(question) {\n return question.getType() === componentName;\n },\n htmlTemplate:\n \"
\" +\n \"\" +\n \" \" +\n \" \" +\n \"
\",\n activatedByChanged: function(activatedBy) {\n Survey.Serializer.addClass(componentName, [], null, \"empty\");\n let registerQuestion = Survey.ElementFactory.Instance.registerCustomQuestion;\n if(!!registerQuestion) registerQuestion(componentName);\n },\n afterRender: function(question, el) {\n var rootWidget = this;\n var buttonStartEl = el.getElementsByTagName(\"button\")[0];\n var buttonStopEl = el.getElementsByTagName(\"button\")[1];\n var audioEl = el.getElementsByTagName(\"audio\")[0];\n var log = function(msg) {\n //console.log(msg);\n };\n \n ////////// RecordRTC logic\n\n var successCallback = function(stream) {\n var options = {\n type: \"audio\",\n mimeType: \"audio/webm\",\n audioBitsPerSecond: 44100,\n sampleRate: 44100,\n bufferSize: 16384,\n numberOfAudioChannels: 1\n };\n log(\"successCallback\");\n question.survey.mystream = stream;\n question.survey.recordRTC = RecordRTC(\n question.survey.mystream,\n options\n );\n if (typeof question.survey.recordRTC != \"undefined\") {\n log(\"startRecording\");\n question.recordingStartedAt = new Date();\n question.survey.recordRTC.startRecording();\n }\n };\n\n var errorCallback = function() {\n alert(\"No microphone\");\n question.survey.recordRTC = undefined;\n question.survey.mystream = undefined;\n };\n\n var processAudio = function(audioVideoWebMURL) {\n log(\"processAudio\");\n var recordedBlob = question.survey.recordRTC.getBlob();\n\n var fileReader = new FileReader();\n fileReader.onload = function(event) {\n var dataUri = event.target.result;\n log(\"dataUri: \" + dataUri);\n question.value = dataUri;\n audioEl.src = dataUri;\n\n log(\"cleaning\");\n question.survey.recordRTC = undefined;\n question.survey.mystream = undefined;\n };\n fileReader.readAsDataURL(recordedBlob);\n };\n\n var startRecording = function() {\n question.recordingStartedAt = undefined;\n question.recordingEndedAt = undefined;\n question.recordingDuration = undefined;\n // erase previous data\n question.value = undefined;\n\n // if recorder open on another question\t- try to stop recording\n if (typeof question.survey.recordRTC != \"undefined\") {\n question.survey.recordRTC.stopRecording(doNothingHandler);\n if (typeof question.survey.mystream != \"undefined\") {\n question.survey.mystream.getAudioTracks().forEach(function(track) {\n track.stop();\n });\n }\n }\n\n var mediaConstraints = {\n video: false,\n audio: true\n };\n\n navigator.mediaDevices\n .getUserMedia(mediaConstraints)\n .then(successCallback.bind(this), errorCallback.bind(this));\n };\n\n var stopRecording = function() {\n log(\"stopRecording\");\n var eD = new Date();\n question.recordingEndedAt = eD;\n question.recordingDuration = eD - question.recordingStartedAt;\n if (typeof question.survey.recordRTC != \"undefined\") {\n question.survey.recordRTC.stopRecording(processAudio.bind(this));\n if (typeof question.survey.mystream != \"undefined\") {\n question.survey.mystream.getAudioTracks().forEach(function(track) {\n track.stop();\n });\n }\n }\n };\n\n ////////////// end RTC logic //////////////////\n\n if (!question.isReadOnly) {\n buttonStartEl.onclick = startRecording;\n } else {\n buttonStartEl.parentNode.removeChild(buttonStartEl);\n }\n\n if (!question.isReadOnly) {\n buttonStopEl.onclick = stopRecording;\n } else {\n buttonStopEl.parentNode.removeChild(buttonStopEl);\n }\n\n audioEl.src = question.value;\n\n var updateValueHandler = function() {};\n\n var doNothingHandler = function() {};\n\n question.valueChangedCallback = updateValueHandler;\n updateValueHandler();\n },\n willUnmount: function(question, el) {\n if (typeof question.survey.recordRTC != \"undefined\") {\n question.survey.recordRTC.stopRecording(doNothingHandler);\n if (typeof question.survey.mystream != \"undefined\") {\n question.survey.mystream.getAudioTracks().forEach(function(track) {\n track.stop();\n });\n }\n question.value = undefined;\n question.survey.recordRTC = undefined;\n question.survey.mystream = undefined;\n }\n }\n };\n\n Survey.CustomWidgetCollection.Instance.addCustomWidget(widget, \"customtype\");\n}\n\nif (typeof Survey !== \"undefined\") {\n init(Survey);\n}\n\nexport default init;\n","import noUiSlider from \"nouislider\";\n\nfunction init(Survey) {\n const iconId = \"icon-nouislider\";\n const componentName = \"nouislider\";\n Survey.SvgRegistry && Survey.SvgRegistry.registerIconFromSvg(iconId, require('svg-inline-loader?classPrefix!./images/nouislider.svg'), \"\");\n var widget = {\n name: componentName,\n title: \"noUiSlider\",\n iconName: iconId,\n widgetIsLoaded: function () {\n return typeof noUiSlider != \"undefined\";\n },\n isFit: function (question) {\n return question.getType() === componentName;\n },\n htmlTemplate:\n \"
\",\n activatedByChanged: function (activatedBy) {\n Survey.Serializer.addClass(componentName, [], null, \"empty\");\n let registerQuestion = Survey.ElementFactory.Instance.registerCustomQuestion;\n if (!!registerQuestion) registerQuestion(componentName);\n Survey.Serializer.addProperties(componentName, [\n {\n name: \"step:number\",\n category: \"slider\",\n categoryIndex: 1,\n default: 1,\n },\n {\n name: \"rangeMin:number\",\n category: \"slider\",\n default: 0,\n },\n {\n name: \"rangeMax:number\",\n category: \"slider\",\n default: 100,\n },\n {\n name: \"pipsMode\",\n category: \"slider\",\n default: \"positions\",\n },\n {\n name: \"pipsValues:itemvalues\",\n category: \"slider\",\n default: [0, 25, 50, 75, 100],\n },\n {\n name: \"pipsText:itemvalues\",\n category: \"slider\",\n default: [0, 25, 50, 75, 100],\n },\n {\n name: \"pipsDensity:number\",\n category: \"slider\",\n default: 5,\n },\n {\n name: \"orientation\",\n category: \"slider\",\n default: \"horizontal\",\n choices: [\"horizontal\", \"vertical\"]\n },\n {\n name: \"direction:string\",\n category: \"slider\",\n default: \"ltr\",\n },\n {\n name: \"tooltips:boolean\",\n category: \"slider\",\n default: true,\n },\n ]);\n },\n afterRender: function (question, el) {\n el.style.paddingBottom = \"19px\";\n el.style.paddingLeft = \"20px\";\n el.style.paddingRight = \"20px\";\n el.style.paddingTop = \"44px\";\n el = el.children[0];\n el.style.marginBottom = \"60px\";\n if (question.orientation === \"vertical\") {\n el.style.height = \"250px\";\n el.style.marginLeft = \"60px\";\n }\n var slider = noUiSlider.create(el, {\n start: question.rangeMin <= question.value && question.value <= question.rangeMax ?\n question.value : (question.rangeMin + question.rangeMax) / 2,\n connect: [true, false],\n step: question.step,\n tooltips: question.tooltips,\n pips: {\n mode: question.pipsMode || \"positions\",\n values: question.pipsValues.map(function (pVal) {\n var pipValue = pVal;\n if (pVal.value !== undefined) {\n pipValue = pVal.value;\n }\n return parseInt(pipValue);\n }),\n density: question.pipsDensity || 5,\n format: {\n to: function (pVal) {\n var pipText = pVal;\n question.pipsText.map(function (el) {\n if (el.text !== undefined && pVal === el.value) {\n pipText = el.text;\n }\n });\n return pipText;\n },\n },\n },\n range: {\n min: question.rangeMin,\n max: question.rangeMax,\n },\n orientation: question.orientation,\n direction: question.direction,\n });\n slider.on(\"change\", function () {\n question.value = Number(slider.get());\n });\n question.updateSliderProperties = function () {\n const elems = document.getElementsByClassName(\"noUi-pips\");\n if (elems.length > 0) elems[elems.length - 1].style.display = \"none\";\n if (elems.length > 1) elems[elems.length - 2].style.display = \"none\";\n var getStart = function (currentStart) {\n return question.rangeMin + Math.round((currentStart - question.rangeMin) / question.step) * question.step;\n }\n slider.updateOptions(\n {\n step: question.step,\n start: question.rangeMin <= question.value && question.value <= question.rangeMax ?\n getStart(question.value) : getStart((question.rangeMin + question.rangeMax) / 2),\n range: {\n min: question.rangeMin,\n max: question.rangeMax\n }\n }, true);\n slider.pips(\n {\n mode: question.pipsMode || \"positions\",\n values: question.pipsValues.map(function (pVal) {\n var pipValue = pVal;\n if (pVal.value !== undefined) {\n pipValue = pVal.value;\n }\n return parseInt(pipValue);\n }),\n density: question.pipsDensity || 5,\n format: {\n to: function (pVal) {\n var pipText = pVal;\n question.pipsText.map(function (el) {\n if (el.text !== undefined && pVal === el.value) {\n pipText = el.text;\n }\n });\n return pipText;\n },\n },\n });\n };\n var updateValueHandler = function () {\n slider.set(question.value);\n };\n if (question.isReadOnly) {\n el.setAttribute(\"disabled\", true);\n }\n updateValueHandler();\n question.noUiSlider = slider;\n question.registerFunctionOnPropertiesValueChanged(\n [\"pipsValues\", \"step\", \"rangeMin\", \"rangeMax\", \"pipsMode\", \"pipsDensity\"],\n question.updateSliderProperties\n );\n question.valueChangedCallback = updateValueHandler;\n question.readOnlyChangedCallback = function () {\n if (question.isReadOnly) {\n el.setAttribute(\"disabled\", true);\n } else {\n el.removeAttribute(\"disabled\");\n }\n };\n },\n willUnmount: function (question, el) {\n if (!!question.noUiSlider) {\n question.noUiSlider.destroy();\n question.noUiSlider = null;\n }\n question.readOnlyChangedCallback = null;\n question.valueChangedCallback = null;\n\n if (!question.updateSliderProperties) return;\n question.unRegisterFunctionOnPropertiesValueChanged(\n [\"pipsValues\", \"step\", \"rangeMin\", \"rangeMax\", \"pipsMode\", \"pipsDensity\"],\n question.updateSliderProperties\n );\n question.updateSliderProperties = undefined\n },\n pdfRender: function (_, options) {\n if (options.question.getType() === componentName) {\n var point = options.module.SurveyHelper.createPoint(\n options.module.SurveyHelper.mergeRects.apply(null, options.bricks)\n );\n point.xLeft += options.controller.unitWidth;\n point.yTop +=\n options.controller.unitHeight *\n options.module.FlatQuestion.CONTENT_GAP_VERT_SCALE;\n var rect = options.module.SurveyHelper.createTextFieldRect(\n point,\n options.controller\n );\n if (options.module.SurveyHelper.shouldRenderReadOnly(this.question, this.controller)) {\n options.bricks.push(new options.module.TextFieldBrick(\n options.question,\n options.controller,\n rect,\n true,\n options.question.id,\n options.question.value || options.question.defaultValue || \"\",\n \"\",\n options.question.isReadOnly,\n false,\n \"text\"\n ));\n } else {\n return new Promise(resolve => {\n options.module.SurveyHelper.createCommentFlat(point, options.question,\n options.controller, true, { rows: options.module.FlatTextbox.MULTILINE_TEXT_ROWS_COUNT }).then((brick) => {\n options.bricks.push(brick);\n resolve();\n })\n })\n }\n }\n },\n };\n Survey.CustomWidgetCollection.Instance.addCustomWidget(widget, \"customtype\");\n}\n\nif (typeof Survey !== \"undefined\") {\n init(Survey);\n}\n\nexport default init;\n","function init(Survey) {\n var widget = {\n settings: {\n supportedTypes: [\"radiogroup\", \"checkbox\", \"boolean\"],\n radiogroup: {\n rootClass: \"pretty p-default p-round\",\n inputType: \"radio\",\n states: [{ stateClass: \"state p-success\", addOn: \"\" }],\n },\n checkbox: {\n rootClass: \"pretty p-default\",\n inputType: \"checkbox\",\n states: [{ stateClass: \"state p-success\", addOn: \"\" }],\n },\n boolean: {\n rootClass: \"pretty p-icon p-default p-has-indeterminate\",\n inputType: \"checkbox\",\n states: [\n { stateClass: \"state p-success\", addOn: \"\" },\n {\n stateClass: \"state p-success p-is-indeterminate\",\n iconClass: \"icon mdi mdi-minus\",\n addOn: \"\",\n },\n ],\n },\n },\n name: \"pretty-checkbox\",\n activatedBy: \"property\",\n widgetIsLoaded: function () {\n return true;\n },\n htmlTemplate: \"
\",\n isFit: function (question) {\n var isFitByType =\n widget.settings.supportedTypes.indexOf(question.getType()) !== -1;\n\n if (widget.activatedBy === \"property\") {\n return question[\"renderAs\"] === \"prettycheckbox\" && isFitByType;\n } else if (widget.activatedBy === \"type\") {\n return isFitByType;\n }\n\n return false;\n },\n activatedByChanged: function (value) {\n if (this.widgetIsLoaded()) {\n widget.activatedBy = value;\n }\n },\n isDefaultRender: false,\n afterRender: function (question, element) {\n var itemInputs = {};\n var questionType = question.getType();\n var options = this.settings[questionType];\n var checkboxType = questionType === \"checkbox\";\n var radiogroupType = questionType === \"radiogroup\";\n var booleanType = questionType === \"boolean\";\n\n var inChangeHandler = false;\n var changeHandler = function (event) {\n inChangeHandler = true;\n try {\n var target = arguments[0].target;\n var targetValue = target.value;\n var targetChecked = target.checked;\n\n if (checkboxType) {\n var questionValue = question.createValueCopy() || [];\n var valueIndex = questionValue.indexOf(targetValue);\n if (targetChecked) {\n if (valueIndex === -1) {\n questionValue.push(targetValue);\n }\n } else {\n if (valueIndex !== -1) {\n questionValue.splice(valueIndex, 1);\n }\n }\n\n question.value = questionValue;\n } else if (radiogroupType) {\n question.value = targetValue;\n } else {\n question.value = targetChecked;\n }\n } finally {\n inChangeHandler = false;\n }\n };\n\n var itemWidth =\n question.colCount > 0 ? 100 / question.colCount + \"%\" : \"\";\n\n var choices = booleanType\n ? [{ locText: question.locTitle, value: !!question.value }]\n : question.visibleChoices;\n choices.forEach(function (choiceItem, index) {\n var input = document.createElement(\"input\");\n input.type = options.inputType;\n input.name = question.name + (checkboxType ? \"\" + index : \"\");\n input.onchange = changeHandler;\n input.value = choiceItem.value;\n\n if (booleanType && question.value === null) {\n input.indeterminate = question.defaultValue === \"indeterminate\";\n }\n\n var controlRoot = document.createElement(\"div\");\n controlRoot.className = options.rootClass;\n controlRoot.appendChild(input);\n\n options.states.forEach(function (state) {\n var stateRoot = document.createElement(\"div\");\n stateRoot.className = state.stateClass;\n if (!!state.iconClass) {\n var icon = document.createElement(\"i\");\n icon.className = state.iconClass;\n stateRoot.appendChild(icon);\n }\n\n var label = document.createElement(\"label\");\n if (choiceItem.locText.hasHtml) {\n label.innerHTML = choiceItem.locText.html;\n } else {\n label.textContent = choiceItem.locText.renderedText;\n }\n stateRoot.appendChild(label);\n\n controlRoot.appendChild(stateRoot);\n if (!!state.addOn) {\n stateRoot.insertAdjacentHTML(\"afterbegin\", state.addOn);\n }\n });\n\n var itemRoot = document.createElement(\"div\");\n itemRoot.className = \"sv_cw_pretty_checkbox_\" + questionType;\n itemRoot.style.display = \"inline-block\";\n itemRoot.style.width = itemWidth;\n itemRoot.appendChild(controlRoot);\n\n element.appendChild(itemRoot);\n\n itemInputs[choiceItem.value] = input;\n });\n\n var updateValueHandler = function (newValue) {\n if (!inChangeHandler) {\n var checkedItems = newValue || [];\n if (radiogroupType || booleanType) {\n checkedItems = [newValue && newValue.toString()];\n }\n\n Object.values(itemInputs).forEach(function (inputItem) {\n if (checkedItems.indexOf(inputItem.value) !== -1) {\n inputItem.setAttribute(\"checked\", undefined);\n } else {\n inputItem.removeAttribute(\"checked\");\n }\n });\n }\n };\n var readOnlyHandler = function () {\n Object.values(itemInputs).forEach(function (inputItem) {\n if (question.isReadOnly) {\n inputItem.setAttribute(\"disabled\", true);\n } else {\n inputItem.removeAttribute(\"disabled\");\n }\n });\n };\n\n question.valueChangedCallback = updateValueHandler;\n question.readOnlyChangedCallback = readOnlyHandler;\n updateValueHandler(question.value);\n readOnlyHandler();\n },\n willUnmount: function (question, el) {\n question.valueChangedCallback = undefined;\n question.readOnlyChangedCallback = undefined;\n },\n };\n\n Survey.CustomWidgetCollection.Instance.addCustomWidget(widget, \"property\");\n}\n\nif (typeof Survey !== \"undefined\") {\n init(Survey);\n}\n\nexport default init;\n","function init(Survey, $) {\n const iconId = \"icon-tagbox\";\n const componentName = \"tagbox\";\n Survey.SvgRegistry && Survey.SvgRegistry.registerIconFromSvg(iconId, require('svg-inline-loader?classPrefix!./images/tagbox.svg'), \"\");\n $ = $ || window.$;\n var widget = {\n name: componentName,\n title: \"Tag box\",\n iconName: iconId,\n widgetIsLoaded: function () {\n return typeof $ == \"function\" && !!$.fn.select2;\n },\n defaultJSON: {\n choices: [\"Item 1\", \"Item 2\", \"Item 3\"],\n },\n htmlTemplate:\n \"
\",\n isFit: function (question) {\n return question.getType() === componentName;\n },\n activatedByChanged: function (activatedBy) {\n if(Survey.Serializer.findClass(componentName)) return;\n Survey.Serializer.addClass(\n componentName,\n [\n { name: \"hasOther:boolean\", visible: false },\n { name: \"hasSelectAll:boolean\", visible: false },\n { name: \"hasNone:boolean\", visible: false },\n { name: \"otherText\", visible: false },\n { name: \"selectAllText\", visible: false },\n { name: \"noneText\", visible: false },\n ],\n null,\n \"checkbox\"\n );\n let registerQuestion = Survey.ElementFactory.Instance.registerCustomQuestion;\n if(!!registerQuestion) registerQuestion(componentName);\n Survey.Serializer.addProperty(componentName, {\n name: \"select2Config\",\n category: \"general\",\n default: null,\n });\n Survey.Serializer.addProperty(componentName, {\n name: \"placeholder\",\n category: \"general\",\n default: \"\",\n });\n Survey.Serializer.addProperty(componentName, {\n name: \"allowAddNewTag:boolean\",\n category: \"general\",\n default: false,\n });\n },\n fixStyles: function (el) {\n el.parentElement.querySelector(\".select2-search__field\").style.border =\n \"none\";\n },\n afterRender: function (question, el) {\n var self = this;\n var select2Config = question.select2Config;\n var settings =\n select2Config && typeof select2Config == \"string\"\n ? JSON.parse(select2Config)\n : select2Config;\n var $el = $(el).is(\"select\") ? $(el) : $(el).find(\"select\");\n\n self.willUnmount(question, el);\n\n if (!settings) settings = {};\n settings.placeholder = question.placeholder;\n settings.tags = question.allowAddNewTag;\n if (question.allowAddNewTag) {\n question.keepIncorrectValues = true;\n }\n settings.disabled = question.isReadOnly;\n settings.theme = \"classic\";\n if (!!question.maxSelectedChoices) {\n settings.maximumSelectionLength = question.maxSelectedChoices;\n }\n\n $el.select2(settings);\n\n var $otherElement = $(el).find(\"textarea\");\n if (\n !!question.survey &&\n !!question.survey.css &&\n !!question.survey.css.checkbox\n ) {\n $otherElement.addClass(question.survey.css.checkbox.other);\n }\n $otherElement.placeholder = question.otherPlaceHolder;\n $otherElement.bind(\"input propertychange\", function () {\n question.comment = $otherElement.val();\n });\n var updateComment = function () {\n $otherElement.val(question.comment);\n if (question.isOtherSelected) {\n $otherElement.show();\n } else {\n $otherElement.hide();\n }\n };\n\n self.fixStyles(el);\n var question;\n var updateValueHandler = function () {\n if (question.hasSelectAll && question.isAllSelected) {\n $el\n .val([question.selectAllItemValue.value].concat(question.value))\n .trigger(\"change\");\n } else {\n $el.val(question.value).trigger(\"change\");\n }\n self.fixStyles(el);\n updateComment();\n };\n var updateChoices = function () {\n $el.select2().empty();\n if (settings.ajax) {\n $el.select2(settings);\n } else {\n settings.data = question.visibleChoices.map(function (choice) {\n return {\n id: choice.value,\n text: choice.text,\n };\n });\n $el.select2(settings);\n }\n updateValueHandler();\n };\n var isAllItemSelected = function (value) {\n return (\n question.hasSelectAll && value === question.selectAllItemValue.value\n );\n };\n question._propertyValueChangedFnSelect2 = function () {\n updateChoices();\n };\n\n $otherElement.prop(\"disabled\", question.isReadOnly);\n question.readOnlyChangedCallback = function () {\n $el.prop(\"disabled\", question.isReadOnly);\n $otherElement.prop(\"disabled\", question.isReadOnly);\n };\n question.registerFunctionOnPropertyValueChanged(\n \"visibleChoices\",\n question._propertyValueChangedFnSelect2\n );\n question.valueChangedCallback = updateValueHandler;\n $el.on(\"select2:select\", function (e) {\n if (isAllItemSelected(e.params.data.id)) {\n question.selectAll();\n } else {\n question.value = (question.value || []).concat(e.params.data.id);\n }\n updateComment();\n });\n $el.on(\"select2:unselect\", function (e) {\n const select2Val = e.params.data.id;\n if (isAllItemSelected(select2Val)) {\n question.clearValue();\n } else {\n const val = [].concat(question.renderedValue);\n if (Array.isArray(val)) {\n for (var i = 0; i < val.length; i++) {\n if (val[i] == select2Val || (!!val[i] && val[i].toString() == select2Val)) {\n val.splice(i, 1);\n question.renderedValue = val;\n break;\n }\n }\n }\n }\n updateComment();\n });\n updateChoices();\n },\n willUnmount: function (question, el) {\n if (!question._propertyValueChangedFnSelect2) return;\n\n var $select2 = $(el).find(\"select\");\n if (!!$select2.data(\"select2\")) {\n $select2.off(\"select2:select\").select2(\"destroy\");\n }\n question.readOnlyChangedCallback = null;\n question.valueChangedCallback = null;\n question.unRegisterFunctionOnPropertyValueChanged(\n \"visibleChoices\",\n question._propertyValueChangedFnSelect2\n );\n question._propertyValueChangedFnSelect2 = undefined;\n },\n pdfQuestionType: \"checkbox\",\n };\n\n Survey.CustomWidgetCollection.Instance.addCustomWidget(widget, \"customtype\");\n}\n\nif (typeof Survey !== \"undefined\") {\n init(Survey, window.jQuery);\n}\n\nexport default init;\n","function init(Survey, $) {\n $ = $ || window.$;\n const componentName = \"select2\";\n var widget = {\n activatedBy: \"property\",\n name: componentName,\n widgetIsLoaded: function () {\n return typeof $ == \"function\" && !!$.fn.select2;\n },\n isFit: function (question) {\n if (widget.activatedBy == \"property\")\n return (\n question[\"renderAs\"] === componentName &&\n question.getType() === \"dropdown\"\n );\n if (widget.activatedBy == \"type\")\n return question.getType() === \"dropdown\";\n if (widget.activatedBy == \"customtype\")\n return question.getType() === componentName;\n return false;\n },\n activatedByChanged: function (activatedBy) {\n if (!this.widgetIsLoaded()) return;\n widget.activatedBy = activatedBy;\n Survey.Serializer.removeProperty(\"dropdown\", \"renderAs\");\n if (activatedBy == \"property\") {\n Survey.Serializer.addProperty(\"dropdown\", {\n name: \"renderAs\",\n category: \"general\",\n default: \"default\",\n choices: [componentName, \"default\"],\n });\n Survey.Serializer.addProperty(\"dropdown\", {\n dependsOn: \"renderAs\",\n category: \"general\",\n name: \"select2Config\",\n visibleIf: function (obj) {\n return obj.renderAs == componentName;\n },\n });\n }\n if (activatedBy == \"customtype\") {\n if(Survey.Serializer.findClass(componentName)) return;\n Survey.Serializer.addClass(componentName, [], null, \"dropdown\");\n let registerQuestion = Survey.ElementFactory.Instance.registerCustomQuestion;\n if(!!registerQuestion) registerQuestion(componentName);\n Survey.Serializer.addProperty(componentName, {\n name: \"select2Config\",\n category: \"general\",\n default: null,\n });\n }\n },\n htmlTemplate:\n \"
\",\n afterRender: function (question, el) {\n var select2Config = question.select2Config;\n var settings =\n select2Config && typeof select2Config == \"string\"\n ? JSON.parse(select2Config)\n : select2Config;\n if (!settings) settings = {};\n var $el = $(el).is(\"select\") ? $(el) : $(el).find(\"select\");\n var $otherElement = $(el).find(\"textarea\");\n $otherElement.addClass(question.cssClasses.other);\n $otherElement.bind(\"input propertychange\", function () {\n if (isSettingValue) return;\n question.comment = $otherElement.val();\n });\n\n var updateComment = function () {\n $otherElement.val(question.comment);\n if (question.isOtherSelected) {\n $otherElement.show();\n } else {\n $otherElement.hide();\n }\n };\n var isSettingValue = false;\n var updateValueHandler = function () {\n if (isSettingValue) return;\n isSettingValue = true;\n if ($el.find('option[value=\"' + (question.value || \"\") + '\"]').length) {\n $el.val(question.value).trigger(\"change\");\n } else {\n if (\n question.value !== null &&\n question.value !== undefined &&\n !question.isOtherSelected\n ) {\n var newOption = new Option(\n question.value, //TODO if question value is object then need to improve\n question.value,\n true,\n true\n );\n $el.append(newOption).trigger(\"change\");\n }\n }\n updateComment();\n isSettingValue = false;\n };\n var updateChoices = function () {\n $el.select2().empty();\n if (!settings.placeholder && question.showOptionsCaption) {\n settings.placeholder = question.optionsCaption;\n settings.allowClear = true;\n }\n if (!settings.theme) {\n settings.theme = \"classic\";\n }\n settings.disabled = question.isReadOnly;\n if (settings.ajax) {\n $el.select2(settings);\n question.keepIncorrectValues = true;\n } else {\n var data = [];\n if (!!settings.placeholder || question.showOptionsCaption) {\n data.push({ id: \"\", text: \"\" });\n }\n settings.data = data.concat(\n question.visibleChoices.map(function (choice) {\n return {\n id: choice.value,\n text: choice.text,\n };\n })\n );\n question.clearIncorrectValues();\n $el.select2(settings);\n }\n // fixed width accrording to https://stackoverflow.com/questions/45276778/select2-not-responsive-width-larger-than-container\n if (!!el.querySelector(\".select2\")) {\n el.querySelector(\".select2\").style.width = \"100%\";\n }\n if (!!el.nextElementSibling) {\n el.nextElementSibling.style.marginBottom = \"1px\";\n }\n updateValueHandler();\n };\n\n $otherElement.prop(\"disabled\", question.isReadOnly);\n question.readOnlyChangedCallback = function () {\n $el.prop(\"disabled\", question.isReadOnly);\n $otherElement.prop(\"disabled\", question.isReadOnly);\n };\n\n question.registerFunctionOnPropertyValueChanged(\n \"visibleChoices\",\n function () {\n updateChoices();\n }\n );\n updateChoices();\n $el.on(\"change\", function (e) {\n setTimeout(function () {\n question.renderedValue = e.target.value;\n updateComment();\n }, 1);\n });\n $el.on(\"select2:select\", function (e) {\n setTimeout(function () {\n question.renderedValue = e.target.value;\n updateComment();\n }, 1);\n });\n $el.on(\"select2:opening\", function (e) {\n if ($(this).data(\"unselecting\")) {\n $(this).removeData(\"unselecting\");\n e.preventDefault();\n }\n });\n $el.on(\"select2:unselecting\", function (e) {\n $(this).data(\"unselecting\", true);\n setTimeout(function () {\n question.renderedValue = null;\n updateComment();\n }, 1);\n });\n question.valueChangedCallback = updateValueHandler;\n updateValueHandler();\n },\n willUnmount: function (question, el) {\n question.readOnlyChangedCallback = null;\n question.valueChangedCallback = null;\n var $select2 = $(el).find(\"select\");\n if (!!$select2.data(componentName)) {\n $select2\n .off(\"select2:select\")\n .off(\"select2:unselecting\")\n .off(\"select2:opening\")\n .select2(\"destroy\");\n }\n },\n };\n\n Survey.CustomWidgetCollection.Instance.addCustomWidget(widget);\n}\n\nif (typeof Survey !== \"undefined\") {\n init(Survey, window.jQuery);\n}\n\nexport default init;\n","import Sortable from \"sortablejs\";\n\nfunction init(Survey) {\n const iconId = \"icon-sortablejs\";\n const componentName = \"sortablelist\";\n Survey.SvgRegistry && Survey.SvgRegistry.registerIconFromSvg(iconId, require('svg-inline-loader?classPrefix!./images/sortablejs.svg'), \"\");\n var widget = {\n name: componentName,\n title: \"Sortable list\",\n iconName: iconId,\n widgetIsLoaded: function () {\n return typeof Sortable != \"undefined\";\n },\n defaultJSON: { choices: [\"Item 1\", \"Item 2\", \"Item 3\"] },\n rootStyle: \"width:100%:\",\n areaStyle:\n \"border: 1px solid #1ab394; width:100%; min-height:50px; margin-top:10px;\",\n itemStyle: \"background-color:#1ab394;color:#fff;margin:5px;padding:10px;\",\n isFit: function (question) {\n return question.getType() === componentName;\n },\n htmlTemplate: \"
\",\n activatedByChanged: function (activatedBy) {\n Survey.Serializer.addClass(\n componentName,\n [\n { name: \"hasOther\", visible: false },\n { name: \"storeOthersAsComment\", visible: false },\n { name: \"hasNone\", visible: false },\n { name: \"renderAs\", visible: false },\n { name: \"checkboxClass\", visible: false },\n { name: \"hasSelectAll\", visible: false },\n { name: \"noneText\", visible: false },\n { name: \"selectAllText\", visible: false },\n ],\n null,\n \"checkbox\"\n );\n let registerQuestion = Survey.ElementFactory.Instance.registerCustomQuestion;\n if(!!registerQuestion) registerQuestion(componentName);\n Survey.Serializer.addProperty(componentName, {\n name: \"emptyText\",\n default: \"Move items here.\",\n category: \"general\",\n });\n Survey.Serializer.addProperty(componentName, {\n name: \"useDefaultTheme:switch\",\n default: true,\n category: \"general\",\n });\n Survey.Serializer.addProperty(componentName, {\n name: \"maxAnswersCount:number\",\n default: -1,\n category: \"general\",\n });\n },\n afterRender: function (question, el) {\n var self = this;\n\n if (!question.useDefaultTheme) {\n self.rootStyle = \"\";\n self.itemStyle = \"\";\n self.areaStyle = \"\";\n }\n el.style.cssText = self.rootStyle;\n el.className = \"sjs-sortablejs-root\";\n var source, result;\n var resultEl = document.createElement(\"div\");\n var emptyEl = document.createElement(\"span\");\n var sourceEl = document.createElement(\"div\");\n\n resultEl.style.cssText = self.areaStyle;\n resultEl.style.boxSizing = \"border-box\";\n resultEl.className = \"sjs-sortablejs-result\";\n\n emptyEl.innerHTML = question.emptyText;\n resultEl.appendChild(emptyEl);\n\n sourceEl.style.cssText = self.areaStyle;\n sourceEl.style.boxSizing = \"border-box\";\n sourceEl.className = \"sjs-sortablejs-source\";\n el.appendChild(resultEl);\n el.appendChild(sourceEl);\n var hasValueInResults = function (val) {\n var res = question.value;\n if (!Array.isArray(res)) return false;\n for (var i = 0; i < res.length; i++) {\n if (res[i] == val) return true;\n }\n return false;\n };\n var addChoiceToWidget = function (choice, inResults) {\n var srcEl = inResults ? resultEl : sourceEl;\n var newEl = document.createElement(\"div\");\n newEl.className = \"sjs-sortablejs-item\";\n newEl.style.cssText = self.itemStyle;\n newEl.innerText = choice.text;\n newEl.dataset[\"value\"] = choice.value;\n srcEl.appendChild(newEl);\n choice.onPropertyChanged.add(function (sender, options) {\n newEl.innerText = sender.text;\n });\n };\n var getChoicesNotInResults = function () {\n var res = [];\n question.visibleChoices.forEach(function (choice) {\n if (!hasValueInResults(choice.value)) {\n res.push(choice);\n }\n });\n return res;\n };\n var getChoicesInResults = function () {\n var res = [];\n var val = question.value;\n if (!Array.isArray(val)) return res;\n for (var i = 0; i < val.length; i++) {\n var item = Survey.ItemValue.getItemByValue(\n question.visibleChoices,\n val[i]\n );\n if (!!item) {\n res.push(item);\n }\n }\n return res;\n };\n var isUpdatingQuestionValue = false;\n var updateValueHandler = function () {\n if (isUpdatingQuestionValue) return;\n resultEl.innerHTML = \"\";\n resultEl.appendChild(emptyEl);\n sourceEl.innerHTML = \"\";\n var notInResults = getChoicesNotInResults();\n var inResults = getChoicesInResults();\n emptyEl.style.display = inResults.length > 0 ? \"none\" : \"\";\n inResults.forEach(function (choice) {\n addChoiceToWidget(choice, true);\n });\n notInResults.forEach(function (choice) {\n addChoiceToWidget(choice, false);\n });\n };\n result = question.resultEl = Sortable.create(resultEl, {\n animation: 150,\n disabled: question.isReadOnly,\n group: {\n name: question.name,\n put: function (to, from) {\n return (\n to.options.group && from.options.group && to.options.group.name === from.options.group.name &&\n (question.maxAnswersCount < 0 ||\n to.el.children.length <= question.maxAnswersCount)\n );\n },\n },\n onSort: function (evt) {\n var result = [];\n if (resultEl.children.length === 1) {\n emptyEl.style.display = \"\";\n } else {\n emptyEl.style.display = \"none\";\n for (var i = 0; i < resultEl.children.length; i++) {\n if (typeof resultEl.children[i].dataset.value === \"undefined\")\n continue;\n result.push(resultEl.children[i].dataset.value);\n }\n }\n isUpdatingQuestionValue = true;\n question.value = result;\n isUpdatingQuestionValue = false;\n },\n });\n source = question.sourceEl = Sortable.create(sourceEl, {\n animation: 150,\n disabled: question.isReadOnly,\n group: question.name,\n });\n question.valueChangedCallback = updateValueHandler;\n question.onPropertyChanged.add(function (sender, options) {\n if (options.name == \"emptyText\") {\n emptyEl.innerHTML = question.emptyText;\n }\n });\n question.readOnlyChangedCallback = function () {\n if (question.isReadOnly) {\n result.options.disabled = true;\n source.options.disabled = true;\n } else {\n result.options.disabled = false;\n source.options.disabled = false;\n }\n };\n question.registerFunctionOnPropertyValueChanged(\n \"visibleChoices\",\n updateValueHandler\n );\n updateValueHandler();\n },\n willUnmount: function (question, el) {\n question.resultEl.destroy();\n question.sourceEl.destroy();\n question.readOnlyChangedCallback = null;\n },\n pdfQuestionType: \"checkbox\",\n };\n\n Survey.CustomWidgetCollection.Instance.addCustomWidget(widget, \"customtype\");\n}\n\nif (typeof Survey !== \"undefined\") {\n init(Survey);\n}\n\nexport default init;\n","module.exports = __WEBPACK_EXTERNAL_MODULE__801__;","module.exports = __WEBPACK_EXTERNAL_MODULE__851__;","module.exports = __WEBPACK_EXTERNAL_MODULE__976__;","module.exports = __WEBPACK_EXTERNAL_MODULE__658__;","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","function init(Survey, $) {\n const iconId = \"icon-datepicker\";\n const componentName = \"bootstrapdatepicker\";\n Survey.SvgRegistry && Survey.SvgRegistry.registerIconFromSvg(iconId, require('svg-inline-loader?classPrefix!./images/datepicker.svg'), \"\");\n $ = $ || window.$;\n\n if (\n !!$ &&\n !$.fn.bootstrapDP &&\n !!$.fn.datepicker &&\n !!$.fn.datepicker.noConflict\n ) {\n $.fn.bootstrapDP = $.fn.datepicker.noConflict();\n if (!$.fn.datepicker) {\n $.fn.datepicker = $.fn.bootstrapDP;\n }\n }\n var widget = {\n name: componentName,\n title: \"Date picker\",\n iconName: iconId,\n widgetIsLoaded: function () {\n return !!$ && !!$.fn.bootstrapDP;\n },\n isFit: function (question) {\n return question.getType() === componentName;\n },\n htmlTemplate:\n \"\",\n activatedByChanged: function (activatedBy) {\n Survey.Serializer.addClass(\n componentName,\n [\n { name: \"inputType\", visible: false },\n { name: \"inputFormat\", visible: false },\n { name: \"inputMask\", visible: false },\n ],\n null,\n \"text\"\n );\n let registerQuestion = Survey.ElementFactory.Instance.registerCustomQuestion;\n if(!!registerQuestion) registerQuestion(componentName);\n Survey.Serializer.addProperties(componentName, [\n {\n // Can take a string or an Object.\n // https://bootstrap-datepicker.readthedocs.io/en/latest/options.html#format\n name: \"dateFormat\",\n category: \"general\",\n default: \"mm/dd/yyyy\",\n },\n {\n // Can take a Date or a string\n // https://bootstrap-datepicker.readthedocs.io/en/latest/options.html#options\n name: \"startDate\",\n category: \"general\",\n default: \"\",\n },\n {\n // Can take a Date or a string\n // https://bootstrap-datepicker.readthedocs.io/en/latest/options.html#options\n name: \"endDate\",\n category: \"general\",\n default: \"\",\n },\n {\n name: \"todayHighlight:boolean\",\n category: \"general\",\n default: true,\n },\n {\n name: \"weekStart:number\",\n category: \"general\",\n default: 0,\n },\n {\n name: \"clearBtn:boolean\",\n category: \"general\",\n default: false,\n },\n {\n name: \"autoClose:boolean\",\n category: \"general\",\n default: true,\n },\n {\n name: \"daysOfWeekDisabled:string\",\n category: \"general\",\n default: \"\",\n },\n {\n name: \"daysOfWeekHighlighted:string\",\n category: \"general\",\n default: \"\",\n },\n {\n name: \"disableTouchKeyboard:boolean\",\n category: \"general\",\n default: true,\n },\n ]);\n },\n afterRender: function (question, el) {\n var $el = $(el).is(\".widget-datepicker\")\n ? $(el)\n : $(el).find(\".widget-datepicker\");\n const options = {\n enableOnReadonly: false,\n format: question.dateFormat,\n todayHighlight: question.todayHighlight,\n weekStart: question.weekStart,\n clearBtn: question.clearBtn,\n autoclose: question.autoClose,\n zIndexOffset: 20,\n daysOfWeekDisabled: question.daysOfWeekDisabled,\n daysOfWeekHighlighted: question.daysOfWeekHighlighted,\n disableTouchKeyboard: question.disableTouchKeyboard,\n };\n if (!!question.startDate || !!question.renderedMin) {\n options.startDate = !!question.startDate\n ? question.startDate\n : question.renderedMin;\n }\n var renderedMax = question.renderedMax;\n if (!!renderedMax && new Date(renderedMax).getFullYear() >= 2999) {\n renderedMax = undefined;\n }\n if (!!question.endDate || !!renderedMax) {\n options.endDate = !!question.endDate ? question.endDate : renderedMax;\n }\n const pickerWidget = $el.bootstrapDP(options).on(\"change\", function (e) {\n var newDate = pickerWidget.bootstrapDP(\"getUTCDate\");\n var newValue = newDate && newDate.toUTCString();\n if (question.value != newValue) {\n question.value = newValue;\n }\n })\n\n question.valueChangedCallback = function () {\n pickerWidget.bootstrapDP(\n \"setUTCDate\",\n !!question.value ? new Date(question.value) : \"\"\n );\n };\n question.valueChangedCallback();\n question.readOnlyChangedCallback = function () {\n if (question.isReadOnly) {\n $el.prop(\"readonly\", true);\n } else {\n $el.removeAttr(\"readonly\");\n }\n };\n question.readOnlyChangedCallback();\n },\n willUnmount: function (question, el) {\n var $el = $(el).is(\".widget-datepicker\")\n ? $(el)\n : $(el).find(\".widget-datepicker\");\n $el.bootstrapDP(\"destroy\");\n question.readOnlyChangedCallback = undefined;\n question.valueChangedCallback = undefined;\n },\n pdfQuestionType: \"text\",\n };\n\n Survey.CustomWidgetCollection.Instance.addCustomWidget(widget, \"customtype\");\n}\n\nif (typeof Survey !== \"undefined\") {\n init(Survey, window.$);\n}\n\nexport default init;\n"],"names":["root","factory","exports","module","require","define","amd","self","__WEBPACK_EXTERNAL_MODULE__801__","__WEBPACK_EXTERNAL_MODULE__658__","__WEBPACK_EXTERNAL_MODULE__976__","__WEBPACK_EXTERNAL_MODULE__851__","that","RecordRTC","mediaStream","config","RecordRTCConfiguration","type","this","initRecorder","initCallback","Recorder","GetRecorderType","mediaRecorder","record","setState","disableLogs","console","log","constructor","name","stopRecording","callback","state","resumeRecording","setTimeout","warn","stop","_callback","warningLog","__blob","Object","keys","forEach","key","blob","bytesToSize","size","url","URL","createObjectURL","e","call","autoWriteToDisk","getDataURL","dataURL","parameter","DiskStorage","Store","readFile","_blob","postMessage","FileReaderSync","readAsDataURL","_mediaRecorder","Worker","navigator","mozGetUserMedia","reader","FileReader","onload","event","target","result","webWorker","_function","Blob","toString","worker","revokeObjectURL","processInWebWorker","onmessage","data","handleRecordingDuration","counter","recordingDuration","onRecordingStopped","onStateChanged","WARNING","returnObject","startRecording","config2","version","clearRecordedData","pauseRecording","pause","resume","setRecordingDuration","getBlob","toURL","getInternalRecorder","save","fileName","invokeSaveAsDialog","getFromDisk","setAdvertisementArray","arrayOfWebPImages","advertisement","length","i","push","duration","image","bufferSize","sampleRate","buffer","reset","getState","destroy","disableLogsCache","Storage","AudioContextConstructor","close","prop","recorderType","audio","video","WhammyRecorder","CanvasRecorder","WebAssemblyRecorder","GifRecorder","StereoAudioRecorder","MediaStreamRecorder","getTracks","MediaRecorder","prototype","mimeType","split","bitsPerSecond","recorder","isChrome","isEdge","isOpera","ReadableStream","isMediaRecorderCompatible","isTypeSupported","Array","MultiStreamRecorder","isSafari","MRecordRTC","addStream","_mediaStream","mediaType","gif","audioRecorder","numberOfAudioChannels","timeSlice","onTimeStamp","newStream","videoTrack","isFirefox","MediaStream","addTrack","videoRecorder","canvas","frameInterval","workerPath","webAssemblyPath","frameRate","bitrate","isSingleRecorder","gifRecorder","quality","blobURL","output","callback00","webkitURL","_audioDataURL","_videoDataURL","writeToDisk","args","Fetch","_type","replace","options","audioDataURL","videoDataURL","gifDataURL","audioBlob","videoBlob","gifBlob","g","window","userAgent","getUserMedia","error","arguments","document","documentElement","appendChild","createElement","captureStream","mozCaptureStream","obj","getContext","play","drawImage","toDataURL","style","HTMLVideoElement","location","protocol","href","hash","screen","width","height","requestAnimationFrame","webkitRequestAnimationFrame","mozRequestAnimationFrame","msRequestAnimationFrame","lastTime","element","currTime","Date","getTime","timeToCall","Math","max","id","cancelAnimationFrame","webkitCancelAnimationFrame","mozCancelAnimationFrame","msCancelAnimationFrame","clearTimeout","AudioContext","webkitAudioContext","mozAudioContext","webkitGetUserMedia","indexOf","msSaveBlob","msSaveOrOpenBlob","opera","toLowerCase","test","isElectron","bytes","parseInt","floor","pow","toPrecision","file","fileExtension","splitted","fileFullName","round","random","hyperlink","download","body","click","dispatchEvent","MouseEvent","view","bubbles","cancelable","process","versions","electron","stream","kind","filter","t","setSrcObject","srcObject","mozSrcObject","webkitMediaStream","track","getSeekableBlob","inputBlob","EBML","Error","Reader","decoder","Decoder","tools","fileReader","decode","read","refinedMetadataBuf","makeMetadataSeekable","metadatas","cues","slice","metadataSize","newBlob","readAsArrayBuffer","appVersion","verOffset","ix","nAgt","fullVersion","parseFloat","majorVersion","substring","isNaN","arrayOfBlobs","updateTimeStamp","timestamps","getMimeType","secondObject","clearRecordedDataCB","getArrayOfBlobs","allStates","recorderHints","canRecordMimeType","ondataavailable","recordingCallback","getNativeBlob","onstart","onpause","onresume","onstop","onerror","looper","manuallyStopped","timeslice","start","getAllStates","checkForInactiveTracks","active","ended","isMediaStreamActive","jsAudioNode","leftchannel","rightchannel","recording","recordingLength","desiredSampRate","mergeLeftRightBuffers","mergeAudioBuffers","cb","interleaved","leftBuffers","rightBuffers","internalInterleavedLength","interpolateArray","newSampleRate","oldSampleRate","fitCount","newData","springFactor","Number","tmp","before","toFixed","after","ceil","atPoint","linearInterpolate","mergeBuffers","channelBuffer","rLength","Float64Array","offset","lng","set","writeUTFBytes","string","setUint8","charCodeAt","leftChannel","rightChannel","inputIndex","index","interleave","interleavedLength","ArrayBuffer","DataView","setUint32","setUint16","setInt16","noWorker","workerURL","terminate","resetVariables","isAudioProcessStarted","isPaused","byteLength","context","audioInput","createMediaStreamSource","legalBufferValues","JSON","stringify","createJavaScriptNode","createScriptProcessor","connect","intervalsBasedBuffers","left","right","onaudioprocess","disconnect","onAudioProcessStarted","inputBuffer","getChannelData","chLeft","Float32Array","chRight","createMediaStreamDestination","destination","htmlElement","html2canvas","isCanvasSupportsStreamCapturing","item","globalCanvas","mediaStreamRecorder","isRecording","_isChrome","webkitRTCPeerConnection","chrome","chromeVersion","matchArray","match","useWhammyRecorder","HTMLCanvasElement","CanvasRenderingContext2D","canvasMediaStream","webkitCaptureStream","mdStream","whammy","frames","drawCanvasFrame","getWebPImages","nodeName","framesLength","frame","idx","framesRemaining","onEncodingCallback","webp","compile","isPausedRecording","newCanvas","grabMouse","showMousePointer","onrendered","Whammy","Video","drawFrames","paused","isStopDrawing","cloneNode","onloadedmetadata","muted","_this","_frames","_framesToCheck","_pixTolerance","_frameTolerance","localCanvas","o","context2d","resultFrames","checkUntilNotBlack","endCheckFrame","maxColorDifference","sqrt","pixTolerance","frameTolerance","doNotCheckNext","functionToLoop","loop","f","matchPixCount","endPixCheck","maxPixCount","finishImage","Image","imageData","getImageData","pix","currentColor","r","b","src","concat","dropBlackFrames","WhammyVideo","whammyInWebWorker","getClusterData","clusterTimecode","clusterCounter","clusterFrames","map","block","flags","keyframe","invisible","lacing","discardable","trackNum","timecode","String","fromCharCode","join","makeSimpleBlock","numToBuffer","num","parts","Uint8Array","reverse","bitsToBuffer","bits","substr","generateEBML","json","ebml","len","zeroes","sizeToString","padded","getStrLength","unpadded","parseRIFF","chunks","webm","info","checkFrames","frameNumber","clusterDuration","cluster","riff","VP8","RIFF","WEBP","frameStart","c","parseWebP","atob","add","init","indexedDB","open","db","dbName","request","onError","onsuccess","setVersion","createObjectStore","putInDB","onupgradeneeded","dataBase","dataStoreName","transaction","getFromStore","portionName","objectStore","get","put","GIFEncoder","script","isHTMLObject","isLoadedMetaData","offsetWidth","offsetHeight","gifEncoder","setRepeat","setDelay","setQuality","onGifRecordingStarted","now","lastAnimationFrame","drawVideoFrame","time","clearedRecordedData","undefined","lastFrameTime","onGifPreview","addFrame","bin","autoplay","playsInline","MultiStreamsMixer","arrayOfMediaStreams","elementClass","videos","isStopDrawingFrames","opacity","position","zIndex","top","className","useGainNode","drawVideosToCanvas","videosLength","fullcanvas","remaining","x","y","onRender","getVideo","volume","resetVideoStreams","streams","startDrawingFrames","appendStreams","audioSource","audioContext","audioDestination","releaseStreams","gainNode","audioSources","source","clearRect","getMixedStream","mixedVideoStream","capturedStream","videoStream","getMixedVideoStream","mixedAudioStream","createGain","gain","value","audioTracksLength","getMixedAudioStream","mixer","tracks","previewStream","addStreams","getMixer","finished","cameraStream","controller","cvs","first","onplaying","ctx","frameTimeout","cameraTimer","setInterval","clearInterval","onVideoProcessStarted","_controlledReadableStream","enqueue","fetch","then","arrayBuffer","addEventListener","timebaseDen","realtime","pipeTo","WritableStream","write","arrayOfBuffers","RecordRTCPromisesHandler","recordRTC","Promise","resolve","reject","Slider","componentName","Survey","widget","title","iconName","widgetIsLoaded","isFit","question","getType","htmlTemplate","activatedByChanged","activatedBy","Serializer","addClass","registerQuestion","ElementFactory","Instance","registerCustomQuestion","addProperties","default","category","choices","addProperty","afterRender","el","paddingTop","paddingBottom","paddingLeft","inputEl","setAttribute","rangeMin","rangeMax","step","orientation","min","enabled","isReadOnly","slider","on","valueObj","getValue","readOnlyChangedCallback","disable","enable","bootstrapSlider","valueChangedCallback","setValue","willUnmount","pdfRender","_","point","SurveyHelper","createPoint","mergeRects","apply","bricks","xLeft","unitWidth","yTop","unitHeight","FlatQuestion","CONTENT_GAP_VERT_SCALE","rect","createTextFieldRect","textboxBrick","TextFieldBrick","defaultValue","CustomWidgetCollection","addCustomWidget","iconId","SvgRegistry","registerIconFromSvg","CKEDITOR","inputId","editorConfig","language","toolbarCanCollapse","instances","removeAllListeners","remove","editor","readOnly","isValueChanging","updateValueHandler","setData","getData","setReadOnly","survey","loc","LocalizableString","text","renderAs","flatHtml","repository","create","generateFlats","htmlBricks","$","fn","easyAutocomplete","isDefaultRender","findProperty","categoryIndex","visible","classesString","$el","is","find","questionRootClasses","cssRoot","questionRoot","parents","overflow","parse","adjustWidth","list","sort","method","aStr","bStr","inputStr","val","onChooseEvent","selectedData","getSelectedItemData","choicesByUrl","valueName","placeholder","phrase","oninput","customWidgetData","isNeedRender","updateHandler","jQuery","emotionsRating","defaultJSON","emotions","emotionSize","bgEmotion","initialRating","color","emotionColor","count","emotionsCount","onUpdate","initWidget","innerHTML","off","disabled","pdfQuestionType","escValue","checkboxClass","radioClass","iCheck","rootWidget","getIndexByValue","arr","isArray","hide","frozeUpdating","makeChoicesICheck","inputs","generatedVisibleRows","row","rows","fullName","oldValue","splice","uncheckIcheck","cEl","parentElement","classList","select","values","qValue","visibleChoices","inEl","removeAttr","parent","hasClass","visibleChoicesChangedCallback","numericGroupSeparator","numericRadixPoint","numericAutoGroup","numericDigits","numericDigitsOptional","numericPlaceholder","autoUnmask","clearIncomplete","showMaskOnHover","unmaskAsNumber","inputMask","inputFormat","properties","showMode","propJSON","onGetValue","onSetValue","updateTextItemPropInfo","visibleIf","cellType","templateQuestion","updateColumnPropInfo","applyInputMask","surveyElement","mask","option","groupSeparator","radixPoint","autoGroup","digits","digitsOptional","prefix","suffix","onblur","inputmask","getemptymask","editorValue","onfocusout","onchange","isComplete","unmaskedvalue","input","querySelector","items","barrating","$customSelect","$questionInput","contentContainer","renderCustomSelect","choice","append","format","css","selectedIndex","renderBarrating","theme","ratingTheme","showValues","showSelectedRating","readonly","onSelect","valueChangingByWidget","marginBottom","__barratingOnPropertyChangedCallback","sender","onPropertyChanged","bootstrapDP","datepicker","noConflict","isSelecting","extend","setDateIntoQuestion","d","setHours","getHours","setMinutes","getMinutes","setSeconds","getSeconds","placeHolder","attr","dateFormat","minDate","maxDate","renderedMin","renderedMax","dateText","fixFocusIE","onClose","inst","beforeShow","pickerWidget","updateDate","isEmpty","keyup","keyCode","_clearDate","disableInput","registerFunctionOnPropertyValueChanged","blur","buttonStartEl","getElementsByTagName","buttonStopEl","audioEl","successCallback","mystream","audioBitsPerSecond","recordingStartedAt","errorCallback","alert","processAudio","audioVideoWebMURL","recordedBlob","dataUri","parentNode","removeChild","onclick","recordingEndedAt","doNothingHandler","getAudioTracks","mediaDevices","bind","eD","paddingRight","children","marginLeft","tooltips","pips","mode","pipsMode","pipsValues","pVal","pipValue","density","pipsDensity","to","pipText","pipsText","range","direction","updateSliderProperties","elems","getElementsByClassName","display","getStart","currentStart","updateOptions","noUiSlider","registerFunctionOnPropertiesValueChanged","removeAttribute","unRegisterFunctionOnPropertiesValueChanged","shouldRenderReadOnly","createCommentFlat","FlatTextbox","MULTILINE_TEXT_ROWS_COUNT","brick","settings","supportedTypes","radiogroup","rootClass","inputType","states","stateClass","addOn","checkbox","boolean","iconClass","isFitByType","itemInputs","questionType","checkboxType","radiogroupType","booleanType","inChangeHandler","changeHandler","targetValue","targetChecked","checked","questionValue","createValueCopy","valueIndex","itemWidth","colCount","locText","locTitle","choiceItem","indeterminate","controlRoot","stateRoot","icon","label","hasHtml","html","textContent","renderedText","insertAdjacentHTML","itemRoot","newValue","checkedItems","inputItem","readOnlyHandler","select2","findClass","fixStyles","border","select2Config","tags","allowAddNewTag","keepIncorrectValues","maxSelectedChoices","maximumSelectionLength","$otherElement","other","otherPlaceHolder","comment","updateComment","isOtherSelected","show","hasSelectAll","isAllSelected","selectAllItemValue","trigger","updateChoices","empty","ajax","isAllItemSelected","_propertyValueChangedFnSelect2","params","selectAll","select2Val","clearValue","renderedValue","$select2","unRegisterFunctionOnPropertyValueChanged","removeProperty","dependsOn","cssClasses","isSettingValue","newOption","Option","showOptionsCaption","optionsCaption","allowClear","clearIncorrectValues","nextElementSibling","removeData","preventDefault","rootStyle","areaStyle","itemStyle","useDefaultTheme","cssText","resultEl","emptyEl","sourceEl","boxSizing","emptyText","addChoiceToWidget","inResults","srcEl","newEl","innerText","dataset","isUpdatingQuestionValue","notInResults","res","hasValueInResults","ItemValue","getItemByValue","getChoicesInResults","animation","group","from","maxAnswersCount","onSort","evt","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","__webpack_modules__","n","getter","__esModule","a","definition","defineProperty","enumerable","globalThis","Function","hasOwnProperty","Symbol","toStringTag","enableOnReadonly","todayHighlight","weekStart","clearBtn","autoclose","autoClose","zIndexOffset","daysOfWeekDisabled","daysOfWeekHighlighted","disableTouchKeyboard","startDate","getFullYear","endDate","newDate","toUTCString"],"sourceRoot":""}