From d8213d8f77a59b3879da14013a6c1a8f176e38b0 Mon Sep 17 00:00:00 2001 From: Leandro Moreira Date: Mon, 1 Feb 2016 22:12:01 -0200 Subject: [PATCH] bump to 0.2.34 --- bower.json | 2 +- dist/clappr.js | 1245 ++++++++++++++++++++++++++++++---------- dist/clappr.min.js | 24 +- dist/clappr.min.js.map | 2 +- npm-shrinkwrap.json | 2 +- package.json | 2 +- yuidoc.json | 2 +- 7 files changed, 956 insertions(+), 323 deletions(-) diff --git a/bower.json b/bower.json index 55ef4e70f..75e3d3439 100644 --- a/bower.json +++ b/bower.json @@ -16,7 +16,7 @@ "dependencies": { "clappr-zepto": "0.0.4", "compass-mixins": "^0.12.7", - "hls.js": "github:dailymotion/hls.js#v0.4.7", + "hls.js": "github:dailymotion/hls.js#v0.4.8", "lodash.find": "^3.2.1", "lodash.once": "^3.0.1", "lodash.result": "^3.1.2", diff --git a/dist/clappr.js b/dist/clappr.js index db27ceedb..0a00fe2e6 100644 --- a/dist/clappr.js +++ b/dist/clappr.js @@ -82,19 +82,19 @@ return /******/ (function(modules) { // webpackBootstrap var _basePlayback2 = _interopRequireDefault(_basePlayback); - var _baseContainer_plugin = __webpack_require__(128); + var _baseContainer_plugin = __webpack_require__(130); var _baseContainer_plugin2 = _interopRequireDefault(_baseContainer_plugin); - var _baseCore_plugin = __webpack_require__(149); + var _baseCore_plugin = __webpack_require__(151); var _baseCore_plugin2 = _interopRequireDefault(_baseCore_plugin); - var _baseUi_core_plugin = __webpack_require__(143); + var _baseUi_core_plugin = __webpack_require__(145); var _baseUi_core_plugin2 = _interopRequireDefault(_baseUi_core_plugin); - var _baseUi_container_plugin = __webpack_require__(123); + var _baseUi_container_plugin = __webpack_require__(125); var _baseUi_container_plugin2 = _interopRequireDefault(_baseUi_container_plugin); @@ -158,15 +158,15 @@ return /******/ (function(modules) { // webpackBootstrap var _playbacksHtml5_video2 = _interopRequireDefault(_playbacksHtml5_video); - var _playbacksHtml_img = __webpack_require__(114); + var _playbacksHtml_img = __webpack_require__(116); var _playbacksHtml_img2 = _interopRequireDefault(_playbacksHtml_img); - var _playbacksNo_op = __webpack_require__(117); + var _playbacksNo_op = __webpack_require__(119); var _playbacksNo_op2 = _interopRequireDefault(_playbacksNo_op); - var _pluginsPoster = __webpack_require__(133); + var _pluginsPoster = __webpack_require__(135); var _pluginsPoster2 = _interopRequireDefault(_pluginsPoster); @@ -186,7 +186,7 @@ return /******/ (function(modules) { // webpackBootstrap var _clapprZepto2 = _interopRequireDefault(_clapprZepto); - var version = ("0.2.33"); + var version = ("0.2.34"); exports['default'] = { Player: _componentsPlayer2['default'], @@ -4002,136 +4002,126 @@ return /******/ (function(modules) { // webpackBootstrap /***/ }, /* 17 */ -/***/ function(module, exports, __webpack_require__) { +/***/ function(module, exports) { - var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;// Simple JavaScript Templating + // Simple JavaScript Templating // Paul Miller (http://paulmillr.com) // http://underscorejs.org - "use strict"; + // (c) 2009-2013 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors - (function (globals) { - // By default, Underscore uses ERB-style template delimiters, change the - // following template settings to use alternative delimiters. - var settings = { - evaluate: /<%([\s\S]+?)%>/g, - interpolate: /<%=([\s\S]+?)%>/g, - escape: /<%-([\s\S]+?)%>/g - }; + // By default, Underscore uses ERB-style template delimiters, change the + // following template settings to use alternative delimiters. + "use strict"; - // When customizing `templateSettings`, if you don't want to define an - // interpolation, evaluation or escaping regex, we need one that is - // guaranteed not to match. - var noMatch = /(.)^/; - - // Certain characters need to be escaped so that they can be put into a - // string literal. - var escapes = { - "'": "'", - '\\': '\\', - '\r': 'r', - '\n': 'n', - '\t': 't', - "\u2028": 'u2028', - "\u2029": 'u2029' - }; + var settings = { + evaluate: /<%([\s\S]+?)%>/g, + interpolate: /<%=([\s\S]+?)%>/g, + escape: /<%-([\s\S]+?)%>/g + }; - var escaper = /\\|'|\r|\n|\t|\u2028|\u2029/g; + // When customizing `templateSettings`, if you don't want to define an + // interpolation, evaluation or escaping regex, we need one that is + // guaranteed not to match. + var noMatch = /(.)^/; + + // Certain characters need to be escaped so that they can be put into a + // string literal. + var escapes = { + "'": "'", + '\\': '\\', + '\r': 'r', + '\n': 'n', + '\t': 't', + "\u2028": 'u2028', + "\u2029": 'u2029' + }; - // List of HTML entities for escaping. - var htmlEntities = { - '&': '&', - '<': '<', - '>': '>', - '"': '"', - "'": ''' - }; + var escaper = /\\|'|\r|\n|\t|\u2028|\u2029/g; - var entityRe = new RegExp('[&<>"\']', 'g'); + // List of HTML entities for escaping. + var htmlEntities = { + '&': '&', + '<': '<', + '>': '>', + '"': '"', + "'": ''' + }; - var escapeExpr = function escapeExpr(string) { - if (string === null) { - return ''; - } - return ('' + string).replace(entityRe, function (match) { - return htmlEntities[match]; - }); - }; + var entityRe = new RegExp('[&<>"\']', 'g'); - var counter = 0; + var escapeExpr = function escapeExpr(string) { + if (string === null) { + return ''; + } + return ('' + string).replace(entityRe, function (match) { + return htmlEntities[match]; + }); + }; - // JavaScript micro-templating, similar to John Resig's implementation. - // Underscore templating handles arbitrary delimiters, preserves whitespace, - // and correctly escapes quotes within interpolated code. - var tmpl = function tmpl(text, data) { - var render; + var counter = 0; - // Combine delimiters into one regular expression via alternation. - var matcher = new RegExp([(settings.escape || noMatch).source, (settings.interpolate || noMatch).source, (settings.evaluate || noMatch).source].join('|') + '|$', 'g'); + // JavaScript micro-templating, similar to John Resig's implementation. + // Underscore templating handles arbitrary delimiters, preserves whitespace, + // and correctly escapes quotes within interpolated code. + var tmpl = function tmpl(text, data) { + var render; - // Compile the template source, escaping string literals appropriately. - var index = 0; - var source = "__p+='"; - text.replace(matcher, function (match, escape, interpolate, evaluate, offset) { - source += text.slice(index, offset).replace(escaper, function (match) { - return '\\' + escapes[match]; - }); + // Combine delimiters into one regular expression via alternation. + var matcher = new RegExp([(settings.escape || noMatch).source, (settings.interpolate || noMatch).source, (settings.evaluate || noMatch).source].join('|') + '|$', 'g'); - if (escape) { - source += "'+\n((__t=(" + escape + "))==null?'':escapeExpr(__t))+\n'"; - } - if (interpolate) { - source += "'+\n((__t=(" + interpolate + "))==null?'':__t)+\n'"; - } - if (evaluate) { - source += "';\n" + evaluate + "\n__p+='"; - } - index = offset + match.length; - return match; + // Compile the template source, escaping string literals appropriately. + var index = 0; + var source = "__p+='"; + text.replace(matcher, function (match, escape, interpolate, evaluate, offset) { + source += text.slice(index, offset).replace(escaper, function (match) { + return '\\' + escapes[match]; }); - source += "';\n"; - // If a variable is not specified, place data values in local scope. - if (!settings.variable) { - source = 'with(obj||{}){\n' + source + '}\n'; + if (escape) { + source += "'+\n((__t=(" + escape + "))==null?'':escapeExpr(__t))+\n'"; } - - source = "var __t,__p='',__j=Array.prototype.join," + "print=function(){__p+=__j.call(arguments,'');};\n" + source + "return __p;\n//# sourceURL=/microtemplates/source[" + counter++ + "]"; - - try { - /*jshint -W054 */ - // TODO: find a way to avoid eval - render = new Function(settings.variable || 'obj', 'escapeExpr', source); - } catch (e) { - e.source = source; - throw e; + if (interpolate) { + source += "'+\n((__t=(" + interpolate + "))==null?'':__t)+\n'"; } - - if (data) { - return render(data, escapeExpr); + if (evaluate) { + source += "';\n" + evaluate + "\n__p+='"; } - var template = function template(data) { - return render.call(this, data, escapeExpr); - }; + index = offset + match.length; + return match; + }); + source += "';\n"; + + // If a variable is not specified, place data values in local scope. + if (!settings.variable) { + source = 'with(obj||{}){\n' + source + '}\n'; + } + + source = "var __t,__p='',__j=Array.prototype.join," + "print=function(){__p+=__j.call(arguments,'');};\n" + source + "return __p;\n//# sourceURL=/microtemplates/source[" + counter++ + "]"; - // Provide the compiled function source as a convenience for precompilation. - template.source = 'function(' + (settings.variable || 'obj') + '){\n' + source + '}'; + try { + /*jshint -W054 */ + // TODO: find a way to avoid eval + render = new Function(settings.variable || 'obj', 'escapeExpr', source); + } catch (e) { + e.source = source; + throw e; + } - return template; + if (data) { + return render(data, escapeExpr); + } + var template = function template(data) { + return render.call(this, data, escapeExpr); }; - tmpl.settings = settings; - - /*global define */ // define is for RequireJS - if (true) { - !(__WEBPACK_AMD_DEFINE_ARRAY__ = [], __WEBPACK_AMD_DEFINE_RESULT__ = function () { - return tmpl; - }.apply(exports, __WEBPACK_AMD_DEFINE_ARRAY__), __WEBPACK_AMD_DEFINE_RESULT__ !== undefined && (module.exports = __WEBPACK_AMD_DEFINE_RESULT__)); // RequireJS - } else if (typeof module !== 'undefined' && module.exports) { - module.exports = tmpl; // CommonJS - } else { - globals.microtemplate = tmpl; // \n\t * \n\t * ```\n\t * Now, create the player:\n\t * ```html\n\t * \n\t *
\n\t * \n\t * \n\t * ```\n\t */\n\t\n\tvar Player = (function (_BaseObject) {\n\t _inherits(Player, _BaseObject);\n\t\n\t _createClass(Player, [{\n\t key: 'loader',\n\t set: function set(loader) {\n\t this._loader = loader;\n\t },\n\t get: function get() {\n\t return this._loader = this._loader || new _componentsLoader2['default'](this.options.plugins || {}, this.options.playerId);\n\t }\n\t\n\t /**\n\t * Determine if the playback has ended.\n\t * @property ended\n\t * @type Boolean\n\t */\n\t }, {\n\t key: 'ended',\n\t get: function get() {\n\t return this.core.mediaControl.container.ended;\n\t }\n\t\n\t /**\n\t * Determine if the playback is having to buffer in order for\n\t * playback to be smooth.\n\t * (i.e if a live stream is playing smoothly, this will be false)\n\t * @property buffering\n\t * @type Boolean\n\t */\n\t }, {\n\t key: 'buffering',\n\t get: function get() {\n\t return this.core.mediaControl.container.buffering;\n\t }\n\t\n\t /*\n\t * determine if the player is ready.\n\t * @property isReady\n\t * @type {Boolean} `true` if the player is ready. ie PLAYER_READY event has fired\n\t */\n\t }, {\n\t key: 'isReady',\n\t get: function get() {\n\t return !!this.ready;\n\t }\n\t\n\t /**\n\t * ## Player's constructor\n\t *\n\t * You might pass the options object to build the player.\n\t * ```javascript\n\t * var options = {source: \"http://example.com/video.mp4\", param1: \"val1\"};\n\t * var player = new Clappr.Player(options);\n\t * ```\n\t *\n\t * @method constructor\n\t * @param {Object} options Data\n\t * options to build a player instance\n\t * @param {Number} [options.width]\n\t * player's width **default**: `640`\n\t * @param {Number} [options.height]\n\t * player's height **default**: `360`\n\t * @param {String} [options.parentId]\n\t * the id of the element on the page that the player should be inserted into\n\t * @param {Object} [options.parent]\n\t * a reference to a dom element that the player should be inserted into\n\t * @param {String} [options.source]\n\t * The media source URL, or {source: <>, mimeType: <>}\n\t * @param {Object} [options.sources]\n\t * An array of media source URL's, or an array of {source: <>, mimeType: <>}\n\t * @param {Boolean} [options.autoPlay]\n\t * automatically play after page load **default**: `false`\n\t * @param {Boolean} [options.loop]\n\t * automatically replay after it ends **default**: `false`\n\t * @param {Boolean} [options.chromeless]\n\t * player acts in chromeless mode **default**: `false`\n\t * @param {Boolean} [options.muted]\n\t * start the video muted **default**: `false`\n\t * @param {String} [options.mimeType]\n\t * add `mimeType: \"application/vnd.apple.mpegurl\"` if you need to use a url without extension.\n\t * @param {String} [options.actualLiveTime]\n\t * show duration and seek time relative to actual time.\n\t * @param {String} [options.actualLiveServerTime]\n\t * specify server time as a string, format: \"2015/11/26 06:01:03\". This option is meant to be used with actualLiveTime.\n\t * @param {Boolean} [options.persistConfig]\n\t * persist player's settings (volume) through the same domain **default**: `true`\n\t * @param {String} [options.preload]\n\t * video will be preloaded according to `preload` attribute options **default**: `'metadata'`\n\t * @param {Number} [options.maxBufferLength]\n\t * the default behavior for the **HLS playback** is to keep buffering indefinitely, even on VoD. This replicates the behavior for progressive download, which continues buffering when pausing the video, thus making the video available for playback even on slow networks. To change this behavior use `maxBufferLength` where **value is in seconds**.\n\t * @param {String} [options.gaAccount]\n\t * enable Google Analytics events dispatch **(play/pause/stop/buffering/etc)** by adding your `gaAccount`\n\t * @param {String} [options.gaTrackerName]\n\t * besides `gaAccount` you can optionally, pass your favorite trackerName as `gaTrackerName`\n\t * @param {Object} [options.mediacontrol]\n\t * customize control bar colors, example: `mediacontrol: {seekbar: \"#E113D3\", buttons: \"#66B2FF\"}`\n\t * @param {Boolean} [options.hideMediaControl]\n\t * control media control auto hide **default**: `true`\n\t * @param {Boolean} [options.hideVolumeBar]\n\t * when embedded with width less than 320, volume bar will hide. You can force this behavior for all sizes by adding `true` **default**: `false`\n\t * @param {String} [options.watermark]\n\t * put `watermark: 'http://url/img.png'` on your embed parameters to automatically add watermark on your video. You can customize corner position by defining position parameter. Positions can be `bottom-left`, `bottom-right`, `top-left` and `top-right`.\n\t * @param {String} [options.watermarkLink]\n\t * `watermarkLink: 'http://example.net/'` - define URL to open when the watermark is clicked. If not provided watermark will not be clickable. \n\t * @param {Boolean} [options.disableVideoTagContextMenu]\n\t * disables the context menu (right click) on the video element if a HTML5Video playback is used.\n\t * @param {Boolean} [options.autoSeekFromUrl]\n\t * Automatically seek to the seconds provided in the url (e.g example.com?t=100) **default**: `true`\n\t * @param {String} [options.poster]\n\t * define a poster by adding its address `poster: 'http://url/img.png'`. It will appear after video embed, disappear on play and go back when user stops the video.\n\t * @param {String} [options.playbackNotSupportedMessage]\n\t * define a custom message to be displayed when a playback is not supported.\n\t * @param {Object} [options.events]\n\t * Specify listeners which will be registered with their corresponding player events.\n\t * E.g. onReady -> \"PLAYER_READY\", onTimeUpdate -> \"PLAYER_TIMEUPDATE\"\n\t */\n\t }]);\n\t\n\t function Player(options) {\n\t _classCallCheck(this, Player);\n\t\n\t _get(Object.getPrototypeOf(Player.prototype), 'constructor', this).call(this, options);\n\t var defaultOptions = { playerId: (0, _baseUtils.uniqueId)(\"\"), persistConfig: true, width: 640, height: 360, baseUrl: baseUrl };\n\t this.options = _clapprZepto2['default'].extend(defaultOptions, options);\n\t this.options.sources = this.normalizeSources(options);\n\t this.registerOptionEventListeners();\n\t this.coreFactory = new _componentsCore_factory2['default'](this);\n\t this.playerInfo = _componentsPlayer_info2['default'].getInstance(this.options.playerId);\n\t this.playerInfo.currentSize = { width: options.width, height: options.height };\n\t this.playerInfo.options = this.options;\n\t if (this.options.parentId) {\n\t this.setParentId(this.options.parentId);\n\t } else if (this.options.parent) {\n\t this.attachTo(this.options.parent);\n\t }\n\t }\n\t\n\t /**\n\t * Specify a `parentId` to the player.\n\t * @method setParentId\n\t * @param {String} parentId the element parent id.\n\t */\n\t\n\t _createClass(Player, [{\n\t key: 'setParentId',\n\t value: function setParentId(parentId) {\n\t var el = document.querySelector(parentId);\n\t if (el) {\n\t this.attachTo(el);\n\t }\n\t }\n\t\n\t /**\n\t * You can use this method to attach the player to a given element. You don't need to do this when you specify it during the player instantiation passing the `parentId` param.\n\t * @method attachTo\n\t * @param {Object} element a given element.\n\t */\n\t }, {\n\t key: 'attachTo',\n\t value: function attachTo(element) {\n\t this.options.parentElement = element;\n\t this.core = this.coreFactory.create();\n\t this.addEventListeners();\n\t }\n\t }, {\n\t key: 'addEventListeners',\n\t value: function addEventListeners() {\n\t if (!this.core.isReady) {\n\t this.listenToOnce(this.core, _baseEvents2['default'].CORE_READY, this.onReady);\n\t } else {\n\t this.onReady();\n\t }\n\t this.listenTo(this.core.mediaControl, _baseEvents2['default'].MEDIACONTROL_CONTAINERCHANGED, this.containerChanged);\n\t }\n\t }, {\n\t key: 'addContainerEventListeners',\n\t value: function addContainerEventListeners() {\n\t var container = this.core.mediaControl.container;\n\t if (!!container) {\n\t this.listenTo(container, _baseEvents2['default'].CONTAINER_PLAY, this.onPlay);\n\t this.listenTo(container, _baseEvents2['default'].CONTAINER_PAUSE, this.onPause);\n\t this.listenTo(container, _baseEvents2['default'].CONTAINER_STOP, this.onStop);\n\t this.listenTo(container, _baseEvents2['default'].CONTAINER_ENDED, this.onEnded);\n\t this.listenTo(container, _baseEvents2['default'].CONTAINER_SEEK, this.onSeek);\n\t this.listenTo(container, _baseEvents2['default'].CONTAINER_ERROR, this.onError);\n\t this.listenTo(container, _baseEvents2['default'].CONTAINER_TIMEUPDATE, this.onTimeUpdate);\n\t this.listenTo(container, _baseEvents2['default'].CONTAINER_VOLUME, this.onVolumeUpdate);\n\t }\n\t }\n\t }, {\n\t key: 'registerOptionEventListeners',\n\t value: function registerOptionEventListeners() {\n\t var _this = this;\n\t\n\t var eventsMapping = {\n\t \"onReady\": _baseEvents2['default'].PLAYER_READY,\n\t \"onResize\": _baseEvents2['default'].PLAYER_RESIZE,\n\t \"onPlay\": _baseEvents2['default'].PLAYER_PLAY,\n\t \"onPause\": _baseEvents2['default'].PLAYER_PAUSE,\n\t \"onStop\": _baseEvents2['default'].PLAYER_STOP,\n\t \"onEnded\": _baseEvents2['default'].PLAYER_ENDED,\n\t \"onSeek\": _baseEvents2['default'].PLAYER_SEEK,\n\t \"onError\": _baseEvents2['default'].PLAYER_ERROR,\n\t \"onTimeUpdate\": _baseEvents2['default'].PLAYER_TIMEUPDATE,\n\t \"onVolumeUpdate\": _baseEvents2['default'].PLAYER_VOLUMEUPDATE\n\t };\n\t var userEvents = this.options.events || {};\n\t\n\t Object.keys(userEvents).forEach(function (userEvent) {\n\t var eventType = eventsMapping[userEvent];\n\t if (eventType) {\n\t var eventFunction = userEvents[userEvent];\n\t eventFunction = typeof eventFunction === \"function\" && eventFunction;\n\t eventFunction && _this.listenTo(_this, eventType, eventFunction);\n\t }\n\t });\n\t }\n\t }, {\n\t key: 'containerChanged',\n\t value: function containerChanged() {\n\t this.stopListening();\n\t this.addEventListeners();\n\t }\n\t }, {\n\t key: 'onReady',\n\t value: function onReady() {\n\t this.ready = true;\n\t this.addContainerEventListeners();\n\t this.trigger(_baseEvents2['default'].PLAYER_READY);\n\t }\n\t }, {\n\t key: 'onVolumeUpdate',\n\t value: function onVolumeUpdate(volume) {\n\t this.trigger(_baseEvents2['default'].PLAYER_VOLUMEUPDATE, volume);\n\t }\n\t }, {\n\t key: 'onPlay',\n\t value: function onPlay() {\n\t this.trigger(_baseEvents2['default'].PLAYER_PLAY);\n\t }\n\t }, {\n\t key: 'onPause',\n\t value: function onPause() {\n\t this.trigger(_baseEvents2['default'].PLAYER_PAUSE);\n\t }\n\t }, {\n\t key: 'onStop',\n\t value: function onStop() {\n\t this.trigger(_baseEvents2['default'].PLAYER_STOP, this.getCurrentTime());\n\t }\n\t }, {\n\t key: 'onEnded',\n\t value: function onEnded() {\n\t this.trigger(_baseEvents2['default'].PLAYER_ENDED);\n\t }\n\t }, {\n\t key: 'onSeek',\n\t value: function onSeek(time) {\n\t this.trigger(_baseEvents2['default'].PLAYER_SEEK, time);\n\t }\n\t }, {\n\t key: 'onTimeUpdate',\n\t value: function onTimeUpdate(timeProgress) {\n\t this.trigger(_baseEvents2['default'].PLAYER_TIMEUPDATE, timeProgress);\n\t }\n\t }, {\n\t key: 'onError',\n\t value: function onError(error) {\n\t this.trigger(_baseEvents2['default'].PLAYER_ERROR, error);\n\t }\n\t }, {\n\t key: 'is',\n\t value: function is(value, type) {\n\t return value.constructor === type;\n\t }\n\t }, {\n\t key: 'normalizeSources',\n\t value: function normalizeSources(options) {\n\t var sources = options.sources || (options.source !== undefined ? [options.source] : []);\n\t return sources.length === 0 ? [{ source: \"\", mimeType: \"\" }] : sources;\n\t }\n\t\n\t /**\n\t * resizes the current player canvas.\n\t * @method resize\n\t * @param {Object} size should be a literal object with `height` and `width`.\n\t * @example\n\t * ```javascript\n\t * player.resize({height: 360, width: 640})\n\t * ```\n\t */\n\t }, {\n\t key: 'resize',\n\t value: function resize(size) {\n\t this.core.resize(size);\n\t }\n\t\n\t /**\n\t * loads a new source.\n\t * @method load\n\t * @param {Object} sources source or sources of video.\n\t * sources can be a string or {source: <>, mimeType: <>}\n\t * @param {Object} mimeType a mime type, example: `'application/vnd.apple.mpegurl'`\n\t *\n\t */\n\t }, {\n\t key: 'load',\n\t value: function load(sources, mimeType) {\n\t this.core.load(sources, mimeType);\n\t }\n\t\n\t /**\n\t * destroys the current player and removes it from the DOM.\n\t * @method destroy\n\t */\n\t }, {\n\t key: 'destroy',\n\t value: function destroy() {\n\t this.core.destroy();\n\t }\n\t\n\t /**\n\t * plays the current video (`source`).\n\t * @method play\n\t */\n\t }, {\n\t key: 'play',\n\t value: function play() {\n\t this.core.mediaControl.container.play();\n\t }\n\t\n\t /**\n\t * pauses the current video (`source`).\n\t * @method pause\n\t */\n\t }, {\n\t key: 'pause',\n\t value: function pause() {\n\t this.core.mediaControl.container.pause();\n\t }\n\t\n\t /**\n\t * stops the current video (`source`).\n\t * @method stop\n\t */\n\t }, {\n\t key: 'stop',\n\t value: function stop() {\n\t this.core.mediaControl.container.stop();\n\t }\n\t\n\t /**\n\t * seeks the current video (`source`). For example, `player.seek(120)` will seek to second 120 (2minutes) of the current video.\n\t * @method seek\n\t * @param {Number} time should be a number between 0 and the video duration.\n\t */\n\t }, {\n\t key: 'seek',\n\t value: function seek(time) {\n\t this.core.mediaControl.container.seek(time);\n\t }\n\t\n\t /**\n\t * seeks the current video (`source`). For example, `player.seek(50)` will seek to the middle of the current video.\n\t * @method seekPercentage\n\t * @param {Number} time should be a number between 0 and 100.\n\t */\n\t }, {\n\t key: 'seekPercentage',\n\t value: function seekPercentage(percentage) {\n\t this.core.mediaControl.container.seekPercentage(percentage);\n\t }\n\t\n\t /**\n\t * Set the volume for the current video (`source`).\n\t * @method setVolume\n\t * @param {Number} volume should be a number between 0 and 100, 0 being mute and 100 the max volume.\n\t */\n\t }, {\n\t key: 'setVolume',\n\t value: function setVolume(volume) {\n\t this.core.mediaControl.container.setVolume(volume);\n\t }\n\t\n\t /**\n\t * Get the volume for the current video\n\t * @method getVolume\n\t * @return {Number} volume should be a number between 0 and 100, 0 being mute and 100 the max volume.\n\t */\n\t }, {\n\t key: 'getVolume',\n\t value: function getVolume() {\n\t return this.core.mediaControl.container.volume;\n\t }\n\t\n\t /**\n\t * mutes the current video (`source`).\n\t * @method mute\n\t */\n\t }, {\n\t key: 'mute',\n\t value: function mute() {\n\t this.core.mediaControl.container.setVolume(0);\n\t }\n\t\n\t /**\n\t * unmutes the current video (`source`).\n\t * @method unmute\n\t */\n\t }, {\n\t key: 'unmute',\n\t value: function unmute() {\n\t this.core.mediaControl.container.setVolume(100);\n\t }\n\t\n\t /**\n\t * checks if the player is playing.\n\t * @method isPlaying\n\t * @return {Boolean} `true` if the current source is playing, otherwise `false`\n\t */\n\t }, {\n\t key: 'isPlaying',\n\t value: function isPlaying() {\n\t return this.core.mediaControl.container.isPlaying();\n\t }\n\t\n\t /**\n\t * enables to configure a player after its creation\n\t * @method configure\n\t * @param {Object} options all the options to change in form of a javascript object\n\t */\n\t }, {\n\t key: 'configure',\n\t value: function configure(options) {\n\t this.core.configure(options);\n\t }\n\t\n\t /**\n\t * get a plugin by its name.\n\t * @method getPlugin\n\t * @param {String} name of the plugin.\n\t * @return {Object} the plugin instance\n\t * @example\n\t * ```javascript\n\t * var poster = player.getPlugin('poster');\n\t * poster.hidePlayButton();\n\t * ```\n\t */\n\t }, {\n\t key: 'getPlugin',\n\t value: function getPlugin(name) {\n\t var plugins = this.core.plugins.concat(this.core.mediaControl.container.plugins);\n\t return (0, _lodashFind2['default'])(plugins, function (plugin) {\n\t return plugin.name === name;\n\t });\n\t }\n\t\n\t /**\n\t * the current time in seconds.\n\t * @method getCurrentTime\n\t * @return {Number} current time (in seconds) of the current source\n\t */\n\t }, {\n\t key: 'getCurrentTime',\n\t value: function getCurrentTime() {\n\t return this.core.mediaControl.container.getCurrentTime();\n\t }\n\t\n\t /**\n\t * the duration time in seconds.\n\t * @method getDuration\n\t * @return {Number} duration time (in seconds) of the current source\n\t */\n\t }, {\n\t key: 'getDuration',\n\t value: function getDuration() {\n\t return this.core.mediaControl.container.getDuration();\n\t }\n\t }]);\n\t\n\t return Player;\n\t})(_baseBase_object2['default']);\n\t\n\texports['default'] = Player;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 103 */\n/*!******************************************************************!*\\\n !*** ./src/playbacks/base_flash_playback/base_flash_playback.js ***!\n \\******************************************************************/\n/***/ function(module, exports, __webpack_require__) {\n\n\t// Copyright 2015 Globo.com Player authors. All rights reserved.\n\t// Use of this source code is governed by a BSD-style\n\t// license that can be found in the LICENSE file.\n\t\n\t'use strict';\n\t\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\t\n\tvar _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();\n\t\n\tvar _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } };\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\t\n\tfunction _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\t\n\tvar _basePlayback = __webpack_require__(/*! base/playback */ 5);\n\t\n\tvar _basePlayback2 = _interopRequireDefault(_basePlayback);\n\t\n\tvar _baseStyler = __webpack_require__(/*! base/styler */ 6);\n\t\n\tvar _baseStyler2 = _interopRequireDefault(_baseStyler);\n\t\n\tvar _baseTemplate = __webpack_require__(/*! base/template */ 7);\n\t\n\tvar _baseTemplate2 = _interopRequireDefault(_baseTemplate);\n\t\n\tvar _componentsBrowser = __webpack_require__(/*! components/browser */ 11);\n\t\n\tvar _componentsBrowser2 = _interopRequireDefault(_componentsBrowser);\n\t\n\tvar _clapprZepto = __webpack_require__(/*! clappr-zepto */ 3);\n\t\n\tvar _clapprZepto2 = _interopRequireDefault(_clapprZepto);\n\t\n\tvar _publicFlashHtml = __webpack_require__(/*! ./public/flash.html */ 145);\n\t\n\tvar _publicFlashHtml2 = _interopRequireDefault(_publicFlashHtml);\n\t\n\tvar _publicFlashScss = __webpack_require__(/*! ./public/flash.scss */ 135);\n\t\n\tvar _publicFlashScss2 = _interopRequireDefault(_publicFlashScss);\n\t\n\tvar IE_CLASSID = \"clsid:d27cdb6e-ae6d-11cf-96b8-444553540000\";\n\t\n\tvar objectIE = '\" classid=\"clsid:d27cdb6e-ae6d-11cf-96b8-444553540000\" data-hls=\"\" width=\"100%\" height=\"100%\">\"> &callback=<%= callbackName %>\" /> ';\n\t\n\tvar BaseFlashPlayback = (function (_Playback) {\n\t _inherits(BaseFlashPlayback, _Playback);\n\t\n\t function BaseFlashPlayback() {\n\t _classCallCheck(this, BaseFlashPlayback);\n\t\n\t _get(Object.getPrototypeOf(BaseFlashPlayback.prototype), 'constructor', this).apply(this, arguments);\n\t }\n\t\n\t _createClass(BaseFlashPlayback, [{\n\t key: 'setElement',\n\t value: function setElement(element) {\n\t this.$el = element;\n\t this.el = element[0];\n\t }\n\t }, {\n\t key: 'setupFirefox',\n\t value: function setupFirefox() {\n\t var $el = this.$('embed');\n\t $el.attr('data-flash-playback', this.name);\n\t $el.addClass(this.attributes['class']);\n\t this.setElement($el);\n\t }\n\t }, {\n\t key: 'render',\n\t value: function render() {\n\t this.$el.html(this.template({\n\t cid: this.cid,\n\t swfPath: this.swfPath,\n\t baseUrl: this.baseUrl,\n\t playbackId: this.uniqueId,\n\t wmode: this.wmode,\n\t callbackName: 'window.Clappr.flashlsCallbacks.' + this.cid }));\n\t if (_componentsBrowser2['default'].isIE) {\n\t this.$('embed').remove();\n\t if (_componentsBrowser2['default'].isLegacyIE) {\n\t this.$el.attr('classid', IE_CLASSID);\n\t }\n\t } else if (_componentsBrowser2['default'].isFirefox) {\n\t this.setupFirefox();\n\t }\n\t this.el.id = this.cid;\n\t var style = _baseStyler2['default'].getStyleFor(_publicFlashScss2['default']);\n\t this.$el.append(style);\n\t return this;\n\t }\n\t }, {\n\t key: 'tagName',\n\t get: function get() {\n\t return 'object';\n\t }\n\t }, {\n\t key: 'swfPath',\n\t get: function get() {\n\t return '';\n\t }\n\t }, {\n\t key: 'wmode',\n\t get: function get() {\n\t return 'transparent';\n\t }\n\t }, {\n\t key: 'template',\n\t get: function get() {\n\t return (0, _baseTemplate2['default'])(_publicFlashHtml2['default']);\n\t }\n\t }, {\n\t key: 'attributes',\n\t get: function get() {\n\t return {\n\t 'class': 'clappr-flash-playback',\n\t type: 'application/x-shockwave-flash',\n\t width: '100%',\n\t height: '100%',\n\t 'data-flash-playback': this.name\n\t };\n\t }\n\t }]);\n\t\n\t return BaseFlashPlayback;\n\t})(_basePlayback2['default']);\n\t\n\texports['default'] = BaseFlashPlayback;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 104 */\n/*!**************************************!*\\\n !*** ./src/playbacks/flash/flash.js ***!\n \\**************************************/\n/***/ function(module, exports, __webpack_require__) {\n\n\t// Copyright 2014 Globo.com Player authors. All rights reserved.\n\t// Use of this source code is governed by a BSD-style\n\t// license that can be found in the LICENSE file.\n\t\n\t'use strict';\n\t\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\t\n\tvar _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();\n\t\n\tvar _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } };\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\t\n\tfunction _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\t\n\tvar _baseUtils = __webpack_require__(/*! base/utils */ 2);\n\t\n\tvar _playbacksBase_flash_playback = __webpack_require__(/*! playbacks/base_flash_playback */ 27);\n\t\n\tvar _playbacksBase_flash_playback2 = _interopRequireDefault(_playbacksBase_flash_playback);\n\t\n\tvar _componentsBrowser = __webpack_require__(/*! components/browser */ 11);\n\t\n\tvar _componentsBrowser2 = _interopRequireDefault(_componentsBrowser);\n\t\n\tvar _componentsMediator = __webpack_require__(/*! components/mediator */ 14);\n\t\n\tvar _componentsMediator2 = _interopRequireDefault(_componentsMediator);\n\t\n\tvar _baseTemplate = __webpack_require__(/*! base/template */ 7);\n\t\n\tvar _baseTemplate2 = _interopRequireDefault(_baseTemplate);\n\t\n\tvar _clapprZepto = __webpack_require__(/*! clappr-zepto */ 3);\n\t\n\tvar _clapprZepto2 = _interopRequireDefault(_clapprZepto);\n\t\n\tvar _baseEvents = __webpack_require__(/*! base/events */ 1);\n\t\n\tvar _baseEvents2 = _interopRequireDefault(_baseEvents);\n\t\n\tvar _basePlayback = __webpack_require__(/*! base/playback */ 5);\n\t\n\tvar _basePlayback2 = _interopRequireDefault(_basePlayback);\n\t\n\tvar _publicPlayerSwf = __webpack_require__(/*! ./public/Player.swf */ 153);\n\t\n\tvar _publicPlayerSwf2 = _interopRequireDefault(_publicPlayerSwf);\n\t\n\tvar MAX_ATTEMPTS = 60;\n\t\n\tvar Flash = (function (_BaseFlashPlayback) {\n\t _inherits(Flash, _BaseFlashPlayback);\n\t\n\t _createClass(Flash, [{\n\t key: 'name',\n\t get: function get() {\n\t return 'flash';\n\t }\n\t }, {\n\t key: 'swfPath',\n\t get: function get() {\n\t return (0, _baseTemplate2['default'])(_publicPlayerSwf2['default'])({ baseUrl: this.baseUrl });\n\t }\n\t\n\t /**\n\t * Determine if the playback has ended.\n\t * @property ended\n\t * @type Boolean\n\t */\n\t }, {\n\t key: 'ended',\n\t get: function get() {\n\t return this.currentState === \"ENDED\";\n\t }\n\t\n\t /**\n\t * Determine if the playback is buffering.\n\t * This is related to the PLAYBACK_BUFFERING and PLAYBACK_BUFFERFULL events\n\t * @property buffering\n\t * @type Boolean\n\t */\n\t }, {\n\t key: 'buffering',\n\t get: function get() {\n\t return !!this.bufferingState && this.currentState !== \"ENDED\";\n\t }\n\t }]);\n\t\n\t function Flash(options) {\n\t _classCallCheck(this, Flash);\n\t\n\t _get(Object.getPrototypeOf(Flash.prototype), 'constructor', this).call(this, options);\n\t this.src = options.src;\n\t this.baseUrl = options.baseUrl;\n\t this.autoPlay = options.autoPlay;\n\t this.settings = { 'default': ['seekbar'] };\n\t this.settings.left = [\"playpause\", \"position\", \"duration\"];\n\t this.settings.right = [\"fullscreen\", \"volume\"];\n\t this.settings.seekEnabled = true;\n\t this.isReadyState = false;\n\t this.addListeners();\n\t }\n\t\n\t _createClass(Flash, [{\n\t key: 'bootstrap',\n\t value: function bootstrap() {\n\t var _this = this;\n\t\n\t if (this.el.playerPlay) {\n\t this.el.width = \"100%\";\n\t this.el.height = \"100%\";\n\t if (this.currentState === 'PLAYING') {\n\t this.firstPlay();\n\t } else {\n\t this.currentState = \"IDLE\";\n\t this.autoPlay && this.play();\n\t }\n\t (0, _clapprZepto2['default'])('
').insertAfter(this.$el);\n\t if (this.getDuration() > 0) {\n\t this.metadataLoaded();\n\t } else {\n\t _componentsMediator2['default'].once(this.uniqueId + ':timeupdate', this.metadataLoaded, this);\n\t }\n\t } else {\n\t this._attempts = this._attempts || 0;\n\t if (++this._attempts <= MAX_ATTEMPTS) {\n\t setTimeout(function () {\n\t return _this.bootstrap();\n\t }, 50);\n\t } else {\n\t this.trigger(_baseEvents2['default'].PLAYBACK_ERROR, { message: \"Max number of attempts reached\" }, this.name);\n\t }\n\t }\n\t }\n\t }, {\n\t key: 'metadataLoaded',\n\t value: function metadataLoaded() {\n\t this.isReadyState = true;\n\t this.trigger(_baseEvents2['default'].PLAYBACK_READY, this.name);\n\t this.trigger(_baseEvents2['default'].PLAYBACK_SETTINGSUPDATE, this.name);\n\t }\n\t }, {\n\t key: 'getPlaybackType',\n\t value: function getPlaybackType() {\n\t return _basePlayback2['default'].VOD;\n\t }\n\t }, {\n\t key: 'isHighDefinitionInUse',\n\t value: function isHighDefinitionInUse() {\n\t return false;\n\t }\n\t }, {\n\t key: 'updateTime',\n\t value: function updateTime() {\n\t this.trigger(_baseEvents2['default'].PLAYBACK_TIMEUPDATE, { current: this.el.getPosition(), total: this.el.getDuration() }, this.name);\n\t }\n\t }, {\n\t key: 'addListeners',\n\t value: function addListeners() {\n\t _componentsMediator2['default'].on(this.uniqueId + ':progress', this.progress, this);\n\t _componentsMediator2['default'].on(this.uniqueId + ':timeupdate', this.updateTime, this);\n\t _componentsMediator2['default'].on(this.uniqueId + ':statechanged', this.checkState, this);\n\t _componentsMediator2['default'].on(this.uniqueId + ':flashready', this.bootstrap, this);\n\t }\n\t }, {\n\t key: 'stopListening',\n\t value: function stopListening() {\n\t _get(Object.getPrototypeOf(Flash.prototype), 'stopListening', this).call(this);\n\t _componentsMediator2['default'].off(this.uniqueId + ':progress');\n\t _componentsMediator2['default'].off(this.uniqueId + ':timeupdate');\n\t _componentsMediator2['default'].off(this.uniqueId + ':statechanged');\n\t _componentsMediator2['default'].off(this.uniqueId + ':flashready');\n\t }\n\t }, {\n\t key: 'checkState',\n\t value: function checkState() {\n\t if (this.isIdle || this.currentState === \"PAUSED\") {\n\t return;\n\t } else if (this.currentState !== \"PLAYING_BUFFERING\" && this.el.getState() === \"PLAYING_BUFFERING\") {\n\t this.bufferingState = true;\n\t this.trigger(_baseEvents2['default'].PLAYBACK_BUFFERING, this.name);\n\t this.currentState = \"PLAYING_BUFFERING\";\n\t } else if (this.el.getState() === \"PLAYING\") {\n\t this.bufferingState = false;\n\t this.trigger(_baseEvents2['default'].PLAYBACK_BUFFERFULL, this.name);\n\t this.currentState = \"PLAYING\";\n\t } else if (this.el.getState() === \"IDLE\") {\n\t this.currentState = \"IDLE\";\n\t } else if (this.el.getState() === \"ENDED\") {\n\t this.trigger(_baseEvents2['default'].PLAYBACK_ENDED, this.name);\n\t this.trigger(_baseEvents2['default'].PLAYBACK_TIMEUPDATE, { current: 0, total: this.el.getDuration() }, this.name);\n\t this.currentState = \"ENDED\";\n\t this.isIdle = true;\n\t }\n\t }\n\t }, {\n\t key: 'progress',\n\t value: function progress() {\n\t if (this.currentState !== \"IDLE\" && this.currentState !== \"ENDED\") {\n\t this.trigger(_baseEvents2['default'].PLAYBACK_PROGRESS, {\n\t start: 0,\n\t current: this.el.getBytesLoaded(),\n\t total: this.el.getBytesTotal()\n\t });\n\t }\n\t }\n\t }, {\n\t key: 'firstPlay',\n\t value: function firstPlay() {\n\t var _this2 = this;\n\t\n\t if (this.el.playerPlay) {\n\t this.isIdle = false;\n\t this.el.playerPlay(this.src);\n\t this.listenToOnce(this, _baseEvents2['default'].PLAYBACK_BUFFERFULL, function () {\n\t return _this2.checkInitialSeek();\n\t });\n\t this.currentState = \"PLAYING\";\n\t } else {\n\t this.listenToOnce(this, _baseEvents2['default'].PLAYBACK_READY, this.firstPlay);\n\t }\n\t }\n\t }, {\n\t key: 'checkInitialSeek',\n\t value: function checkInitialSeek() {\n\t var seekTime = (0, _baseUtils.seekStringToSeconds)(window.location.href);\n\t if (seekTime !== 0) {\n\t this.seekSeconds(seekTime);\n\t }\n\t }\n\t }, {\n\t key: 'play',\n\t value: function play() {\n\t if (this.currentState === 'PAUSED' || this.currentState === 'PLAYING_BUFFERING') {\n\t this.currentState = \"PLAYING\";\n\t this.el.playerResume();\n\t this.trigger(_baseEvents2['default'].PLAYBACK_PLAY, this.name);\n\t } else if (this.currentState !== 'PLAYING') {\n\t this.firstPlay();\n\t this.trigger(_baseEvents2['default'].PLAYBACK_PLAY, this.name);\n\t }\n\t }\n\t }, {\n\t key: 'volume',\n\t value: function volume(value) {\n\t var _this3 = this;\n\t\n\t if (this.isReady) {\n\t this.el.playerVolume(value);\n\t } else {\n\t this.listenToOnce(this, _baseEvents2['default'].PLAYBACK_BUFFERFULL, function () {\n\t return _this3.volume(value);\n\t });\n\t }\n\t }\n\t }, {\n\t key: 'pause',\n\t value: function pause() {\n\t this.currentState = \"PAUSED\";\n\t this.el.playerPause();\n\t this.trigger(_baseEvents2['default'].PLAYBACK_PAUSE, this.name);\n\t }\n\t }, {\n\t key: 'stop',\n\t value: function stop() {\n\t this.el.playerStop();\n\t this.trigger(_baseEvents2['default'].PLAYBACK_STOP);\n\t this.trigger(_baseEvents2['default'].PLAYBACK_TIMEUPDATE, { current: 0, total: 0 }, this.name);\n\t }\n\t }, {\n\t key: 'isPlaying',\n\t value: function isPlaying() {\n\t return !!(this.isReady && this.currentState.indexOf(\"PLAYING\") > -1);\n\t }\n\t }, {\n\t key: 'getDuration',\n\t value: function getDuration() {\n\t return this.el.getDuration();\n\t }\n\t }, {\n\t key: 'seekPercentage',\n\t value: function seekPercentage(percentage) {\n\t var _this4 = this;\n\t\n\t if (this.el.getDuration() > 0) {\n\t var seekSeconds = this.el.getDuration() * (percentage / 100);\n\t this.seek(seekSeconds);\n\t } else {\n\t this.listenToOnce(this, _baseEvents2['default'].PLAYBACK_BUFFERFULL, function () {\n\t return _this4.seekPercentage(percentage);\n\t });\n\t }\n\t }\n\t }, {\n\t key: 'seek',\n\t value: function seek(time) {\n\t var _this5 = this;\n\t\n\t if (this.isReady && this.el.playerSeek) {\n\t this.el.playerSeek(time);\n\t this.trigger(_baseEvents2['default'].PLAYBACK_TIMEUPDATE, { current: time, total: this.el.getDuration() }, this.name);\n\t if (this.currentState === \"PAUSED\") {\n\t this.el.playerPause();\n\t }\n\t } else {\n\t this.listenToOnce(this, _baseEvents2['default'].PLAYBACK_BUFFERFULL, function () {\n\t return _this5.seek(time);\n\t });\n\t }\n\t }\n\t }, {\n\t key: 'destroy',\n\t value: function destroy() {\n\t clearInterval(this.bootstrapId);\n\t _get(Object.getPrototypeOf(Flash.prototype), 'stopListening', this).call(this);\n\t this.$el.remove();\n\t }\n\t }, {\n\t key: 'isReady',\n\t get: function get() {\n\t return this.isReadyState;\n\t }\n\t }]);\n\t\n\t return Flash;\n\t})(_playbacksBase_flash_playback2['default']);\n\t\n\texports['default'] = Flash;\n\t\n\tFlash.canPlay = function (resource) {\n\t if (!_componentsBrowser2['default'].hasFlash || !resource || resource.constructor !== String) {\n\t return false;\n\t } else {\n\t var resourceParts = resource.split('?')[0].match(/.*\\.(.*)$/) || [];\n\t return resourceParts.length > 1 && !_componentsBrowser2['default'].isMobile && resourceParts[1].match(/^(mp4|mov|f4v|3gpp|3gp)$/);\n\t }\n\t};\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 105 */\n/*!******************************************!*\\\n !*** ./src/playbacks/flashls/flashls.js ***!\n \\******************************************/\n/***/ function(module, exports, __webpack_require__) {\n\n\t// Copyright 2014 Globo.com Player authors. All rights reserved.\n\t// Use of this source code is governed by a BSD-style\n\t// license that can be found in the LICENSE file.\n\t\n\t'use strict';\n\t\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\t\n\tvar _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();\n\t\n\tvar _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } };\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\t\n\tfunction _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\t\n\tvar _playbacksBase_flash_playback = __webpack_require__(/*! playbacks/base_flash_playback */ 27);\n\t\n\tvar _playbacksBase_flash_playback2 = _interopRequireDefault(_playbacksBase_flash_playback);\n\t\n\tvar _baseEvents = __webpack_require__(/*! base/events */ 1);\n\t\n\tvar _baseEvents2 = _interopRequireDefault(_baseEvents);\n\t\n\tvar _baseTemplate = __webpack_require__(/*! base/template */ 7);\n\t\n\tvar _baseTemplate2 = _interopRequireDefault(_baseTemplate);\n\t\n\tvar _basePlayback = __webpack_require__(/*! base/playback */ 5);\n\t\n\tvar _basePlayback2 = _interopRequireDefault(_basePlayback);\n\t\n\tvar _componentsMediator = __webpack_require__(/*! components/mediator */ 14);\n\t\n\tvar _componentsMediator2 = _interopRequireDefault(_componentsMediator);\n\t\n\tvar _componentsBrowser = __webpack_require__(/*! components/browser */ 11);\n\t\n\tvar _componentsBrowser2 = _interopRequireDefault(_componentsBrowser);\n\t\n\tvar _flashls_events = __webpack_require__(/*! ./flashls_events */ 106);\n\t\n\tvar _flashls_events2 = _interopRequireDefault(_flashls_events);\n\t\n\tvar _publicHLSPlayerSwf = __webpack_require__(/*! ./public/HLSPlayer.swf */ 154);\n\t\n\tvar _publicHLSPlayerSwf2 = _interopRequireDefault(_publicHLSPlayerSwf);\n\t\n\tvar _clapprZepto = __webpack_require__(/*! clappr-zepto */ 3);\n\t\n\tvar _clapprZepto2 = _interopRequireDefault(_clapprZepto);\n\t\n\tvar MAX_ATTEMPTS = 60;\n\tvar AUTO = -1;\n\t\n\tvar FlasHLS = (function (_BaseFlashPlayback) {\n\t _inherits(FlasHLS, _BaseFlashPlayback);\n\t\n\t _createClass(FlasHLS, [{\n\t key: 'name',\n\t get: function get() {\n\t return 'flashls';\n\t }\n\t }, {\n\t key: 'swfPath',\n\t get: function get() {\n\t return (0, _baseTemplate2['default'])(_publicHLSPlayerSwf2['default'])({ baseUrl: this.baseUrl });\n\t }\n\t }, {\n\t key: 'levels',\n\t get: function get() {\n\t return this._levels || [];\n\t }\n\t }, {\n\t key: 'currentLevel',\n\t get: function get() {\n\t return this._currentLevel || AUTO;\n\t },\n\t set: function set(id) {\n\t this._currentLevel = id;\n\t this.trigger(_baseEvents2['default'].PLAYBACK_LEVEL_SWITCH_START);\n\t this.el.playerSetCurrentLevel(id);\n\t }\n\t\n\t /**\n\t * Determine if the playback has ended.\n\t * @property ended\n\t * @type Boolean\n\t */\n\t }, {\n\t key: 'ended',\n\t get: function get() {\n\t return this.hasEnded;\n\t }\n\t\n\t /**\n\t * Determine if the playback is buffering.\n\t * This is related to the PLAYBACK_BUFFERING and PLAYBACK_BUFFERFULL events\n\t * @property buffering\n\t * @type Boolean\n\t */\n\t }, {\n\t key: 'buffering',\n\t get: function get() {\n\t return !!this.bufferingState && !this.hasEnded;\n\t }\n\t }]);\n\t\n\t function FlasHLS(options) {\n\t _classCallCheck(this, FlasHLS);\n\t\n\t _get(Object.getPrototypeOf(FlasHLS.prototype), 'constructor', this).call(this, options);\n\t this.src = options.src;\n\t this.baseUrl = options.baseUrl;\n\t this.initHlsParameters(options);\n\t this.highDefinition = false;\n\t this.autoPlay = options.autoPlay;\n\t this.loop = options.loop;\n\t this.defaultSettings = {\n\t left: [\"playstop\"],\n\t 'default': ['seekbar'],\n\t right: [\"fullscreen\", \"volume\", \"hd-indicator\"],\n\t seekEnabled: false\n\t };\n\t this.settings = _clapprZepto2['default'].extend({}, this.defaultSettings);\n\t this.playbackType = _basePlayback2['default'].LIVE;\n\t this.hasEnded = false;\n\t this.addListeners();\n\t }\n\t\n\t _createClass(FlasHLS, [{\n\t key: 'initHlsParameters',\n\t value: function initHlsParameters(options) {\n\t this.autoStartLoad = options.autoStartLoad === undefined ? true : options.autoStartLoad;\n\t this.capLevelToStage = options.capLevelToStage === undefined ? false : options.capLevelToStage;\n\t this.maxLevelCappingMode = options.maxLevelCappingMode === undefined ? \"downscale\" : options.maxLevelCappingMode;\n\t this.minBufferLength = options.minBufferLength === undefined ? -1 : options.minBufferLength;\n\t this.minBufferLengthCapping = options.minBufferLengthCapping === undefined ? -1 : options.minBufferLengthCapping;\n\t this.maxBufferLength = options.maxBufferLength === undefined ? 120 : options.maxBufferLength;\n\t this.maxBackBufferLength = options.maxBackBufferLength === undefined ? 30 : options.maxBackBufferLength;\n\t this.lowBufferLength = options.lowBufferLength === undefined ? 3 : options.lowBufferLength;\n\t this.mediaTimePeriod = options.mediaTimePeriod === undefined ? 100 : options.mediaTimePeriod;\n\t this.fpsDroppedMonitoringPeriod = options.fpsDroppedMonitoringPeriod === undefined ? 5000 : options.fpsDroppedMonitoringPeriod;\n\t this.fpsDroppedMonitoringThreshold = options.fpsDroppedMonitoringThreshold === undefined ? 0.2 : options.fpsDroppedMonitoringThreshold;\n\t this.capLevelonFPSDrop = options.capLevelonFPSDrop === undefined ? false : options.capLevelonFPSDrop;\n\t this.smoothAutoSwitchonFPSDrop = options.smoothAutoSwitchonFPSDrop === undefined ? this.capLevelonFPSDrop : options.smoothAutoSwitchonFPSDrop;\n\t this.switchDownOnLevelError = options.switchDownOnLevelError === undefined ? true : options.switchDownOnLevelError;\n\t this.seekMode = options.seekMode === undefined ? \"ACCURATE\" : options.seekMode;\n\t this.keyLoadMaxRetry = options.keyLoadMaxRetry === undefined ? 3 : options.keyLoadMaxRetry;\n\t this.keyLoadMaxRetryTimeout = options.keyLoadMaxRetryTimeout === undefined ? 64000 : options.keyLoadMaxRetryTimeout;\n\t this.fragmentLoadMaxRetry = options.fragmentLoadMaxRetry === undefined ? 3 : options.fragmentLoadMaxRetry;\n\t this.fragmentLoadMaxRetryTimeout = options.fragmentLoadMaxRetryTimeout === undefined ? 4000 : options.fragmentLoadMaxRetryTimeout;\n\t this.fragmentLoadSkipAfterMaxRetry = options.fragmentLoadSkipAfterMaxRetry === undefined ? true : options.fragmentLoadSkipAfterMaxRetry;\n\t this.maxSkippedFragments = options.maxSkippedFragments === undefined ? 5 : options.maxSkippedFragments;\n\t this.flushLiveURLCache = options.flushLiveURLCache === undefined ? false : options.flushLiveURLCache;\n\t this.initialLiveManifestSize = options.initialLiveManifestSize === undefined ? 1 : options.initialLiveManifestSize;\n\t this.manifestLoadMaxRetry = options.manifestLoadMaxRetry === undefined ? 3 : options.manifestLoadMaxRetry;\n\t this.manifestLoadMaxRetryTimeout = options.manifestLoadMaxRetryTimeout === undefined ? 64000 : options.manifestLoadMaxRetryTimeout;\n\t this.manifestRedundantLoadmaxRetry = options.manifestRedundantLoadmaxRetry === undefined ? 3 : options.manifestRedundantLoadmaxRetry;\n\t this.startFromBitrate = options.startFromBitrate === undefined ? -1 : options.startFromBitrate;\n\t this.startFromLevel = options.startFromLevel === undefined ? -1 : options.startFromLevel;\n\t this.autoStartMaxDuration = options.autoStartMaxDuration === undefined ? -1 : options.autoStartMaxDuration;\n\t this.seekFromLevel = options.seekFromLevel === undefined ? -1 : options.seekFromLevel;\n\t this.useHardwareVideoDecoder = options.useHardwareVideoDecoder === undefined ? false : options.useHardwareVideoDecoder;\n\t this.hlsLogEnabled = options.hlsLogEnabled === undefined ? true : options.hlsLogEnabled;\n\t this.logDebug = options.logDebug === undefined ? false : options.logDebug;\n\t this.logDebug2 = options.logDebug2 === undefined ? false : options.logDebug2;\n\t this.logWarn = options.logWarn === undefined ? true : options.logWarn;\n\t this.logError = options.logError === undefined ? true : options.logError;\n\t this.hlsMinimumDvrSize = options.hlsMinimumDvrSize === undefined ? 60 : options.hlsMinimumDvrSize;\n\t }\n\t }, {\n\t key: 'addListeners',\n\t value: function addListeners() {\n\t var _this = this;\n\t\n\t _componentsMediator2['default'].on(this.cid + ':flashready', function () {\n\t return _this.bootstrap();\n\t });\n\t _componentsMediator2['default'].on(this.cid + ':timeupdate', function (timeMetrics) {\n\t return _this.updateTime(timeMetrics);\n\t });\n\t _componentsMediator2['default'].on(this.cid + ':playbackstate', function (state) {\n\t return _this.setPlaybackState(state);\n\t });\n\t _componentsMediator2['default'].on(this.cid + ':levelchanged', function (level) {\n\t return _this.levelChanged(level);\n\t });\n\t _componentsMediator2['default'].on(this.cid + ':error', function (code, url, message) {\n\t return _this.flashPlaybackError(code, url, message);\n\t });\n\t _componentsMediator2['default'].on(this.cid + ':fragmentloaded', function (loadmetrics) {\n\t return _this.onFragmentLoaded(loadmetrics);\n\t });\n\t _componentsMediator2['default'].once(this.cid + ':manifestloaded', function (duration, loadmetrics) {\n\t return _this.manifestLoaded(duration, loadmetrics);\n\t });\n\t }\n\t }, {\n\t key: 'stopListening',\n\t value: function stopListening() {\n\t _get(Object.getPrototypeOf(FlasHLS.prototype), 'stopListening', this).call(this);\n\t _componentsMediator2['default'].off(this.cid + ':flashready');\n\t _componentsMediator2['default'].off(this.cid + ':timeupdate');\n\t _componentsMediator2['default'].off(this.cid + ':playbackstate');\n\t _componentsMediator2['default'].off(this.cid + ':levelchanged');\n\t _componentsMediator2['default'].off(this.cid + ':playbackerror');\n\t _componentsMediator2['default'].off(this.cid + ':fragmentloaded');\n\t _componentsMediator2['default'].off(this.cid + ':manifestloaded');\n\t }\n\t }, {\n\t key: 'bootstrap',\n\t value: function bootstrap() {\n\t var _this2 = this;\n\t\n\t if (this.el.playerLoad) {\n\t this.el.width = \"100%\";\n\t this.el.height = \"100%\";\n\t this.isReadyState = true;\n\t this.srcLoaded = false;\n\t this.currentState = \"IDLE\";\n\t this.setFlashSettings();\n\t this.updatePlaybackType();\n\t if (this.autoPlay || this._shouldPlayOnBootstrap) {\n\t this.play();\n\t }\n\t this.trigger(_baseEvents2['default'].PLAYBACK_READY, this.name);\n\t } else {\n\t this._bootstrapAttempts = this._bootstrapAttempts || 0;\n\t if (++this._bootstrapAttempts <= MAX_ATTEMPTS) {\n\t setTimeout(function () {\n\t return _this2.bootstrap();\n\t }, 50);\n\t } else {\n\t this.trigger(_baseEvents2['default'].PLAYBACK_ERROR, { message: \"Max number of attempts reached\" }, this.name);\n\t }\n\t }\n\t }\n\t }, {\n\t key: 'setFlashSettings',\n\t value: function setFlashSettings() {\n\t this.el.playerSetAutoStartLoad(this.autoStartLoad);\n\t this.el.playerSetCapLevelToStage(this.capLevelToStage);\n\t this.el.playerSetMaxLevelCappingMode(this.maxLevelCappingMode);\n\t this.el.playerSetMinBufferLength(this.minBufferLength);\n\t this.el.playerSetMinBufferLengthCapping(this.minBufferLengthCapping);\n\t this.el.playerSetMaxBufferLength(this.maxBufferLength);\n\t this.el.playerSetMaxBackBufferLength(this.maxBackBufferLength);\n\t this.el.playerSetLowBufferLength(this.lowBufferLength);\n\t this.el.playerSetMediaTimePeriod(this.mediaTimePeriod);\n\t this.el.playerSetFpsDroppedMonitoringPeriod(this.fpsDroppedMonitoringPeriod);\n\t this.el.playerSetFpsDroppedMonitoringThreshold(this.fpsDroppedMonitoringThreshold);\n\t this.el.playerSetCapLevelonFPSDrop(this.capLevelonFPSDrop);\n\t this.el.playerSetSmoothAutoSwitchonFPSDrop(this.smoothAutoSwitchonFPSDrop);\n\t this.el.playerSetSwitchDownOnLevelError(this.switchDownOnLevelError);\n\t this.el.playerSetSeekMode(this.seekMode);\n\t this.el.playerSetKeyLoadMaxRetry(this.keyLoadMaxRetry);\n\t this.el.playerSetKeyLoadMaxRetryTimeout(this.keyLoadMaxRetryTimeout);\n\t this.el.playerSetFragmentLoadMaxRetry(this.fragmentLoadMaxRetry);\n\t this.el.playerSetFragmentLoadMaxRetryTimeout(this.fragmentLoadMaxRetryTimeout);\n\t this.el.playerSetFragmentLoadSkipAfterMaxRetry(this.fragmentLoadSkipAfterMaxRetry);\n\t this.el.playerSetMaxSkippedFragments(this.maxSkippedFragments);\n\t this.el.playerSetFlushLiveURLCache(this.flushLiveURLCache);\n\t this.el.playerSetInitialLiveManifestSize(this.initialLiveManifestSize);\n\t this.el.playerSetManifestLoadMaxRetry(this.manifestLoadMaxRetry);\n\t this.el.playerSetManifestLoadMaxRetryTimeout(this.manifestLoadMaxRetryTimeout);\n\t this.el.playerSetManifestRedundantLoadmaxRetry(this.manifestRedundantLoadmaxRetry);\n\t this.el.playerSetStartFromBitrate(this.startFromBitrate);\n\t this.el.playerSetStartFromLevel(this.startFromLevel);\n\t this.el.playerSetAutoStartMaxDuration(this.autoStartMaxDuration);\n\t this.el.playerSetSeekFromLevel(this.seekFromLevel);\n\t this.el.playerSetUseHardwareVideoDecoder(this.useHardwareVideoDecoder);\n\t this.el.playerSetLogInfo(this.hlsLogEnabled);\n\t this.el.playerSetLogDebug(this.logDebug);\n\t this.el.playerSetLogDebug2(this.logDebug2);\n\t this.el.playerSetLogWarn(this.logWarn);\n\t this.el.playerSetLogError(this.logError);\n\t }\n\t }, {\n\t key: 'setAutoStartLoad',\n\t value: function setAutoStartLoad(autoStartLoad) {\n\t this.autoStartLoad = autoStartLoad;\n\t this.el.playerSetAutoStartLoad(this.autoStartLoad);\n\t }\n\t }, {\n\t key: 'setCapLevelToStage',\n\t value: function setCapLevelToStage(capLevelToStage) {\n\t this.capLevelToStage = capLevelToStage;\n\t this.el.playerSetCapLevelToStage(this.capLevelToStage);\n\t }\n\t }, {\n\t key: 'setMaxLevelCappingMode',\n\t value: function setMaxLevelCappingMode(maxLevelCappingMode) {\n\t this.maxLevelCappingMode = maxLevelCappingMode;\n\t this.el.playerSetMaxLevelCappingMode(this.maxLevelCappingMode);\n\t }\n\t }, {\n\t key: 'setSetMinBufferLength',\n\t value: function setSetMinBufferLength(minBufferLength) {\n\t this.minBufferLength = minBufferLength;\n\t this.el.playerSetMinBufferLength(this.minBufferLength);\n\t }\n\t }, {\n\t key: 'setMinBufferLengthCapping',\n\t value: function setMinBufferLengthCapping(minBufferLengthCapping) {\n\t this.minBufferLengthCapping = minBufferLengthCapping;\n\t this.el.playerSetMinBufferLengthCapping(this.minBufferLengthCapping);\n\t }\n\t }, {\n\t key: 'setMaxBufferLength',\n\t value: function setMaxBufferLength(maxBufferLength) {\n\t this.maxBufferLength = maxBufferLength;\n\t this.el.playerSetMaxBufferLength(this.maxBufferLength);\n\t }\n\t }, {\n\t key: 'setMaxBackBufferLength',\n\t value: function setMaxBackBufferLength(maxBackBufferLength) {\n\t this.maxBackBufferLength = maxBackBufferLength;\n\t this.el.playerSetMaxBackBufferLength(this.maxBackBufferLength);\n\t }\n\t }, {\n\t key: 'setLowBufferLength',\n\t value: function setLowBufferLength(lowBufferLength) {\n\t this.lowBufferLength = lowBufferLength;\n\t this.el.playerSetLowBufferLength(this.lowBufferLength);\n\t }\n\t }, {\n\t key: 'setMediaTimePeriod',\n\t value: function setMediaTimePeriod(mediaTimePeriod) {\n\t this.mediaTimePeriod = mediaTimePeriod;\n\t this.el.playerSetMediaTimePeriod(this.mediaTimePeriod);\n\t }\n\t }, {\n\t key: 'setFpsDroppedMonitoringPeriod',\n\t value: function setFpsDroppedMonitoringPeriod(fpsDroppedMonitoringPeriod) {\n\t this.fpsDroppedMonitoringPeriod = fpsDroppedMonitoringPeriod;\n\t this.el.playerSetFpsDroppedMonitoringPeriod(this.fpsDroppedMonitoringPeriod);\n\t }\n\t }, {\n\t key: 'setFpsDroppedMonitoringThreshold',\n\t value: function setFpsDroppedMonitoringThreshold(fpsDroppedMonitoringThreshold) {\n\t this.fpsDroppedMonitoringThreshold = fpsDroppedMonitoringThreshold;\n\t this.el.playerSetFpsDroppedMonitoringThreshold(this.fpsDroppedMonitoringThreshold);\n\t }\n\t }, {\n\t key: 'setCapLevelonFPSDrop',\n\t value: function setCapLevelonFPSDrop(capLevelonFPSDrop) {\n\t this.capLevelonFPSDrop = capLevelonFPSDrop;\n\t this.el.playerSetCapLevelonFPSDrop(this.capLevelonFPSDrop);\n\t }\n\t }, {\n\t key: 'setSmoothAutoSwitchonFPSDrop',\n\t value: function setSmoothAutoSwitchonFPSDrop(smoothAutoSwitchonFPSDrop) {\n\t this.smoothAutoSwitchonFPSDrop = smoothAutoSwitchonFPSDrop;\n\t this.el.playerSetSmoothAutoSwitchonFPSDrop(this.smoothAutoSwitchonFPSDrop);\n\t }\n\t }, {\n\t key: 'setSwitchDownOnLevelError',\n\t value: function setSwitchDownOnLevelError(switchDownOnLevelError) {\n\t this.switchDownOnLevelError = switchDownOnLevelError;\n\t this.el.playerSetSwitchDownOnLevelError(this.switchDownOnLevelError);\n\t }\n\t }, {\n\t key: 'setSeekMode',\n\t value: function setSeekMode(seekMode) {\n\t this.seekMode = seekMode;\n\t this.el.playerSetSeekMode(this.seekMode);\n\t }\n\t }, {\n\t key: 'setKeyLoadMaxRetry',\n\t value: function setKeyLoadMaxRetry(keyLoadMaxRetry) {\n\t this.keyLoadMaxRetry = keyLoadMaxRetry;\n\t this.el.playerSetKeyLoadMaxRetry(this.keyLoadMaxRetry);\n\t }\n\t }, {\n\t key: 'setKeyLoadMaxRetryTimeout',\n\t value: function setKeyLoadMaxRetryTimeout(keyLoadMaxRetryTimeout) {\n\t this.keyLoadMaxRetryTimeout = keyLoadMaxRetryTimeout;\n\t this.el.playerSetKeyLoadMaxRetryTimeout(this.keyLoadMaxRetryTimeout);\n\t }\n\t }, {\n\t key: 'setFragmentLoadMaxRetry',\n\t value: function setFragmentLoadMaxRetry(fragmentLoadMaxRetry) {\n\t this.fragmentLoadMaxRetry = fragmentLoadMaxRetry;\n\t this.el.playerSetFragmentLoadMaxRetry(this.fragmentLoadMaxRetry);\n\t }\n\t }, {\n\t key: 'setFragmentLoadMaxRetryTimeout',\n\t value: function setFragmentLoadMaxRetryTimeout(fragmentLoadMaxRetryTimeout) {\n\t this.fragmentLoadMaxRetryTimeout = fragmentLoadMaxRetryTimeout;\n\t this.el.playerSetFragmentLoadMaxRetryTimeout(this.fragmentLoadMaxRetryTimeout);\n\t }\n\t }, {\n\t key: 'setFragmentLoadSkipAfterMaxRetry',\n\t value: function setFragmentLoadSkipAfterMaxRetry(fragmentLoadSkipAfterMaxRetry) {\n\t this.fragmentLoadSkipAfterMaxRetry = fragmentLoadSkipAfterMaxRetry;\n\t this.el.playerSetFragmentLoadSkipAfterMaxRetry(this.fragmentLoadSkipAfterMaxRetry);\n\t }\n\t }, {\n\t key: 'setMaxSkippedFragments',\n\t value: function setMaxSkippedFragments(maxSkippedFragments) {\n\t this.maxSkippedFragments = maxSkippedFragments;\n\t this.el.playerSetMaxSkippedFragments(this.maxSkippedFragments);\n\t }\n\t }, {\n\t key: 'setFlushLiveURLCache',\n\t value: function setFlushLiveURLCache(flushLiveURLCache) {\n\t this.flushLiveURLCache = flushLiveURLCache;\n\t this.el.playerSetFlushLiveURLCache(this.flushLiveURLCache);\n\t }\n\t }, {\n\t key: 'setInitialLiveManifestSize',\n\t value: function setInitialLiveManifestSize(initialLiveManifestSize) {\n\t this.initialLiveManifestSize = initialLiveManifestSize;\n\t this.el.playerSetInitialLiveManifestSize(this.initialLiveManifestSize);\n\t }\n\t }, {\n\t key: 'setManifestLoadMaxRetry',\n\t value: function setManifestLoadMaxRetry(manifestLoadMaxRetry) {\n\t this.manifestLoadMaxRetry = manifestLoadMaxRetry;\n\t this.el.playerSetManifestLoadMaxRetry(this.manifestLoadMaxRetry);\n\t }\n\t }, {\n\t key: 'setManifestLoadMaxRetryTimeout',\n\t value: function setManifestLoadMaxRetryTimeout(manifestLoadMaxRetryTimeout) {\n\t this.manifestLoadMaxRetryTimeout = manifestLoadMaxRetryTimeout;\n\t this.el.playerSetManifestLoadMaxRetryTimeout(this.manifestLoadMaxRetryTimeout);\n\t }\n\t }, {\n\t key: 'setManifestRedundantLoadmaxRetry',\n\t value: function setManifestRedundantLoadmaxRetry(manifestRedundantLoadmaxRetry) {\n\t this.manifestRedundantLoadmaxRetry = manifestRedundantLoadmaxRetry;\n\t this.el.playerSetManifestRedundantLoadmaxRetry(this.manifestRedundantLoadmaxRetry);\n\t }\n\t }, {\n\t key: 'setStartFromBitrate',\n\t value: function setStartFromBitrate(startFromBitrate) {\n\t this.startFromBitrate = startFromBitrate;\n\t this.el.playerSetStartFromBitrate(this.startFromBitrate);\n\t }\n\t }, {\n\t key: 'setStartFromLevel',\n\t value: function setStartFromLevel(startFromLevel) {\n\t this.startFromLevel = startFromLevel;\n\t this.el.playerSetStartFromLevel(this.startFromLevel);\n\t }\n\t }, {\n\t key: 'setAutoStartMaxDuration',\n\t value: function setAutoStartMaxDuration(autoStartMaxDuration) {\n\t this.autoStartMaxDuration = autoStartMaxDuration;\n\t this.el.playerSetAutoStartMaxDuration(this.autoStartMaxDuration);\n\t }\n\t }, {\n\t key: 'setSeekFromLevel',\n\t value: function setSeekFromLevel(seekFromLevel) {\n\t this.seekFromLevel = seekFromLevel;\n\t this.el.playerSetSeekFromLevel(this.seekFromLevel);\n\t }\n\t }, {\n\t key: 'setUseHardwareVideoDecoder',\n\t value: function setUseHardwareVideoDecoder(useHardwareVideoDecoder) {\n\t this.useHardwareVideoDecoder = useHardwareVideoDecoder;\n\t this.el.playerSetUseHardwareVideoDecoder(this.useHardwareVideoDecoder);\n\t }\n\t }, {\n\t key: 'setSetLogInfo',\n\t value: function setSetLogInfo(hlsLogEnabled) {\n\t this.hlsLogEnabled = hlsLogEnabled;\n\t this.el.playerSetLogInfo(this.hlsLogEnabled);\n\t }\n\t }, {\n\t key: 'setLogDebug',\n\t value: function setLogDebug(logDebug) {\n\t this.logDebug = logDebug;\n\t this.el.playerSetLogDebug(this.logDebug);\n\t }\n\t }, {\n\t key: 'setLogDebug2',\n\t value: function setLogDebug2(logDebug2) {\n\t this.logDebug2 = logDebug2;\n\t this.el.playerSetLogDebug2(this.logDebug2);\n\t }\n\t }, {\n\t key: 'setLogWarn',\n\t value: function setLogWarn(logWarn) {\n\t this.logWarn = logWarn;\n\t this.el.playerSetLogWarn(this.logWarn);\n\t }\n\t }, {\n\t key: 'setLogError',\n\t value: function setLogError(logError) {\n\t this.logError = logError;\n\t this.el.playerSetLogError(this.logError);\n\t }\n\t }, {\n\t key: 'levelChanged',\n\t value: function levelChanged(level) {\n\t var currentLevel = this.el.getLevels()[level];\n\t if (currentLevel) {\n\t this.highDefinition = currentLevel.height >= 720 || currentLevel.bitrate / 1000 >= 2000;\n\t this.trigger(_baseEvents2['default'].PLAYBACK_HIGHDEFINITIONUPDATE, this.highDefinition);\n\t this.trigger(_baseEvents2['default'].PLAYBACK_BITRATE, {\n\t height: currentLevel.height,\n\t width: currentLevel.width,\n\t bandwidth: currentLevel.bandwidth,\n\t bitrate: currentLevel.bitrate,\n\t level: level\n\t });\n\t this.trigger(_baseEvents2['default'].PLAYBACK_LEVEL_SWITCH_END);\n\t }\n\t }\n\t }, {\n\t key: 'updateTime',\n\t value: function updateTime(timeMetrics) {\n\t if (this.currentState === 'IDLE') {\n\t return;\n\t }\n\t\n\t var duration = this.normalizeDuration(timeMetrics.duration);\n\t var position = Math.min(Math.max(timeMetrics.position, 0), duration);\n\t var previousDVRStatus = this.dvrEnabled;\n\t var livePlayback = this.playbackType === _basePlayback2['default'].LIVE;\n\t this.dvrEnabled = livePlayback && duration > this.hlsMinimumDvrSize;\n\t\n\t if (duration === 100 || livePlayback === undefined) {\n\t return;\n\t }\n\t\n\t if (this.dvrEnabled !== previousDVRStatus) {\n\t this.updateSettings();\n\t this.trigger(_baseEvents2['default'].PLAYBACK_SETTINGSUPDATE, this.name);\n\t }\n\t\n\t if (livePlayback && (!this.dvrEnabled || !this.dvrInUse)) {\n\t position = duration;\n\t }\n\t\n\t this.trigger(_baseEvents2['default'].PLAYBACK_TIMEUPDATE, { current: position, total: duration }, this.name);\n\t }\n\t }, {\n\t key: 'play',\n\t value: function play() {\n\t if (this.currentState === 'PAUSED') {\n\t this.el.playerResume();\n\t } else if (!this.srcLoaded && this.currentState !== \"PLAYING\") {\n\t this.firstPlay();\n\t } else {\n\t this.el.playerPlay();\n\t }\n\t }\n\t }, {\n\t key: 'getPlaybackType',\n\t value: function getPlaybackType() {\n\t return this.playbackType ? this.playbackType : null;\n\t }\n\t }, {\n\t key: 'getCurrentLevelIndex',\n\t value: function getCurrentLevelIndex() {\n\t return this.currentLevel;\n\t }\n\t }, {\n\t key: 'getCurrentLevel',\n\t value: function getCurrentLevel() {\n\t return this.levels[this.currentLevel];\n\t }\n\t }, {\n\t key: 'getCurrentBitrate',\n\t value: function getCurrentBitrate() {\n\t return this.levels[this.currentLevel].bitrate;\n\t }\n\t }, {\n\t key: 'setCurrentLevel',\n\t value: function setCurrentLevel(level) {\n\t this.currentLevel = level;\n\t }\n\t }, {\n\t key: 'isHighDefinitionInUse',\n\t value: function isHighDefinitionInUse() {\n\t return this.highDefinition;\n\t }\n\t }, {\n\t key: 'getLevels',\n\t value: function getLevels() {\n\t return this.levels;\n\t }\n\t }, {\n\t key: 'setPlaybackState',\n\t value: function setPlaybackState(state) {\n\t if ([\"PLAYING_BUFFERING\", \"PAUSED_BUFFERING\"].indexOf(state) >= 0) {\n\t this.bufferingState = true;\n\t this.trigger(_baseEvents2['default'].PLAYBACK_BUFFERING, this.name);\n\t this.updateCurrentState(state);\n\t } else if ([\"PLAYING\", \"PAUSED\"].indexOf(state) >= 0) {\n\t if ([\"PLAYING_BUFFERING\", \"PAUSED_BUFFERING\", \"IDLE\"].indexOf(this.currentState) >= 0) {\n\t this.bufferingState = false;\n\t this.trigger(_baseEvents2['default'].PLAYBACK_BUFFERFULL, this.name);\n\t }\n\t this.updateCurrentState(state);\n\t } else if (state === \"IDLE\") {\n\t this.srcLoaded = false;\n\t if (this.loop && [\"PLAYING_BUFFERING\", \"PLAYING\"].indexOf(this.currentState) >= 0) {\n\t this.play();\n\t this.seek(0);\n\t } else {\n\t this.updateCurrentState(state);\n\t this.hasEnded = true;\n\t this.trigger(_baseEvents2['default'].PLAYBACK_TIMEUPDATE, { current: 0, total: this.el.getDuration() }, this.name);\n\t this.trigger(_baseEvents2['default'].PLAYBACK_ENDED, this.name);\n\t }\n\t }\n\t }\n\t }, {\n\t key: 'updateCurrentState',\n\t value: function updateCurrentState(state) {\n\t this.currentState = state;\n\t if (state !== \"IDLE\") {\n\t this.hasEnded = false;\n\t }\n\t this.updatePlaybackType();\n\t if (state === \"PLAYING\") {\n\t this.trigger(_baseEvents2['default'].PLAYBACK_PLAY, this.name);\n\t } else if (state === \"PAUSED\") {\n\t this.trigger(_baseEvents2['default'].PLAYBACK_PAUSE, this.name);\n\t }\n\t }\n\t }, {\n\t key: 'updatePlaybackType',\n\t value: function updatePlaybackType() {\n\t this.playbackType = this.el.getType();\n\t if (this.playbackType) {\n\t this.playbackType = this.playbackType.toLowerCase();\n\t if (this.playbackType === _basePlayback2['default'].VOD) {\n\t this.startReportingProgress();\n\t } else {\n\t this.stopReportingProgress();\n\t }\n\t }\n\t this.trigger(_baseEvents2['default'].PLAYBACK_PLAYBACKSTATE, { type: this.playbackType });\n\t }\n\t }, {\n\t key: 'startReportingProgress',\n\t value: function startReportingProgress() {\n\t if (!this.reportingProgress) {\n\t this.reportingProgress = true;\n\t }\n\t }\n\t }, {\n\t key: 'stopReportingProgress',\n\t value: function stopReportingProgress() {\n\t this.reportingProgress = false;\n\t }\n\t }, {\n\t key: 'onFragmentLoaded',\n\t value: function onFragmentLoaded(loadmetrics) {\n\t this.trigger(_baseEvents2['default'].PLAYBACK_FRAGMENT_LOADED, loadmetrics);\n\t if (this.reportingProgress && this.el.getPosition) {\n\t var buffered = this.el.getPosition() + this.el.getbufferLength();\n\t this.trigger(_baseEvents2['default'].PLAYBACK_PROGRESS, {\n\t start: this.el.getPosition(),\n\t current: buffered,\n\t total: this.el.getDuration()\n\t });\n\t }\n\t }\n\t }, {\n\t key: 'firstPlay',\n\t value: function firstPlay() {\n\t var _this3 = this;\n\t\n\t if (this.el.playerLoad) {\n\t this.setFlashSettings(); //ensure flushLiveURLCache will work (#327)\n\t this.el.playerLoad(this.src);\n\t _componentsMediator2['default'].once(this.cid + ':manifestloaded', function () {\n\t return _this3.el.playerPlay();\n\t });\n\t this.srcLoaded = true;\n\t } else {\n\t this._shouldPlayOnBootstrap = true;\n\t }\n\t }\n\t }, {\n\t key: 'volume',\n\t value: function volume(value) {\n\t var _this4 = this;\n\t\n\t if (this.isReady) {\n\t this.el.playerVolume(value);\n\t } else {\n\t this.listenToOnce(this, _baseEvents2['default'].PLAYBACK_BUFFERFULL, function () {\n\t return _this4.volume(value);\n\t });\n\t }\n\t }\n\t }, {\n\t key: 'pause',\n\t value: function pause() {\n\t if (this.playbackType !== _basePlayback2['default'].LIVE || this.dvrEnabled) {\n\t this.el.playerPause();\n\t if (this.playbackType === _basePlayback2['default'].LIVE && this.dvrEnabled) {\n\t this.updateDvr(true);\n\t }\n\t }\n\t }\n\t }, {\n\t key: 'stop',\n\t value: function stop() {\n\t this.srcLoaded = false;\n\t this.el.playerStop();\n\t this.trigger(_baseEvents2['default'].PLAYBACK_STOP);\n\t this.trigger(_baseEvents2['default'].PLAYBACK_TIMEUPDATE, { current: 0, total: 0 }, this.name);\n\t }\n\t }, {\n\t key: 'isPlaying',\n\t value: function isPlaying() {\n\t if (this.currentState) {\n\t return !!this.currentState.match(/playing/i);\n\t }\n\t return false;\n\t }\n\t }, {\n\t key: 'getDuration',\n\t value: function getDuration() {\n\t return this.normalizeDuration(this.el.getDuration());\n\t }\n\t }, {\n\t key: 'normalizeDuration',\n\t value: function normalizeDuration(duration) {\n\t if (this.playbackType === _basePlayback2['default'].LIVE) {\n\t // estimate 10 seconds of buffer time for live streams for seek positions\n\t duration = duration - 10;\n\t }\n\t return duration;\n\t }\n\t }, {\n\t key: 'seekPercentage',\n\t value: function seekPercentage(percentage) {\n\t var duration = this.el.getDuration();\n\t var time = 0;\n\t if (percentage > 0) {\n\t time = duration * percentage / 100;\n\t }\n\t this.seek(time);\n\t }\n\t }, {\n\t key: 'seek',\n\t value: function seek(time) {\n\t var duration = this.el.getDuration();\n\t if (this.playbackType === _basePlayback2['default'].LIVE) {\n\t // seek operations to a time within 5 seconds from live stream will position playhead back to live\n\t var dvrInUse = time >= 0 && duration - time > 5;\n\t if (!dvrInUse) {\n\t time = -1;\n\t }\n\t this.updateDvr(dvrInUse);\n\t }\n\t this.el.playerSeek(time);\n\t this.trigger(_baseEvents2['default'].PLAYBACK_TIMEUPDATE, { current: time, total: duration }, this.name);\n\t }\n\t }, {\n\t key: 'updateDvr',\n\t value: function updateDvr(dvrInUse) {\n\t var previousDvrInUse = !!this.dvrInUse;\n\t this.dvrInUse = dvrInUse;\n\t if (this.dvrInUse !== previousDvrInUse) {\n\t this.updateSettings();\n\t this.trigger(_baseEvents2['default'].PLAYBACK_DVR, this.dvrInUse);\n\t this.trigger(_baseEvents2['default'].PLAYBACK_STATS_ADD, { 'dvr': this.dvrInUse });\n\t }\n\t }\n\t }, {\n\t key: 'flashPlaybackError',\n\t value: function flashPlaybackError(code, url, message) {\n\t this.trigger(_baseEvents2['default'].PLAYBACK_ERROR, { code: code, url: url, message: message });\n\t this.trigger(_baseEvents2['default'].PLAYBACK_STOP);\n\t }\n\t }, {\n\t key: 'manifestLoaded',\n\t value: function manifestLoaded(duration, loadmetrics) {\n\t var levels = this.el.getLevels();\n\t var levelsLength = levels.length;\n\t this._levels = [];\n\t\n\t for (var index = 0; index < levelsLength; index++) {\n\t this._levels.push({ id: index, label: levels[index].height + 'p' });\n\t }\n\t this.trigger(_baseEvents2['default'].PLAYBACK_LEVELS_AVAILABLE, this._levels);\n\t this.trigger(_baseEvents2['default'].PLAYBACK_LOADEDMETADATA, { duration: duration, data: loadmetrics });\n\t }\n\t }, {\n\t key: 'timeUpdate',\n\t value: function timeUpdate(time, duration) {\n\t this.trigger(_baseEvents2['default'].PLAYBACK_TIMEUPDATE, { current: time, total: duration }, this.name);\n\t }\n\t }, {\n\t key: 'destroy',\n\t value: function destroy() {\n\t this.stopListening();\n\t this.$el.remove();\n\t }\n\t }, {\n\t key: 'updateSettings',\n\t value: function updateSettings() {\n\t this.settings = _clapprZepto2['default'].extend({}, this.defaultSettings);\n\t if (this.playbackType === _basePlayback2['default'].VOD || this.dvrInUse) {\n\t this.settings.left = [\"playpause\", \"position\", \"duration\"];\n\t this.settings.seekEnabled = true;\n\t } else if (this.dvrEnabled) {\n\t this.settings.left = [\"playpause\"];\n\t this.settings.seekEnabled = true;\n\t } else {\n\t this.settings.seekEnabled = false;\n\t }\n\t }\n\t }, {\n\t key: 'createCallbacks',\n\t value: function createCallbacks() {\n\t var _this5 = this;\n\t\n\t if (!window.Clappr) {\n\t window.Clappr = {};\n\t }\n\t if (!window.Clappr.flashlsCallbacks) {\n\t window.Clappr.flashlsCallbacks = {};\n\t }\n\t this.flashlsEvents = new _flashls_events2['default'](this.cid);\n\t window.Clappr.flashlsCallbacks[this.cid] = function (eventName, args) {\n\t _this5.flashlsEvents[eventName].apply(_this5.flashlsEvents, args);\n\t };\n\t }\n\t }, {\n\t key: 'render',\n\t value: function render() {\n\t _get(Object.getPrototypeOf(FlasHLS.prototype), 'render', this).call(this);\n\t this.createCallbacks();\n\t return this;\n\t }\n\t }, {\n\t key: 'isReady',\n\t get: function get() {\n\t return this.isReadyState;\n\t }\n\t }]);\n\t\n\t return FlasHLS;\n\t})(_playbacksBase_flash_playback2['default']);\n\t\n\texports['default'] = FlasHLS;\n\t\n\tFlasHLS.canPlay = function (resource, mimeType) {\n\t var resourceParts = resource.split('?')[0].match(/.*\\.(.*)$/) || [];\n\t return _componentsBrowser2['default'].hasFlash && (resourceParts.length > 1 && resourceParts[1] === \"m3u8\" || mimeType === 'application/x-mpegURL' || mimeType === 'application/vnd.apple.mpegurl');\n\t};\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 106 */\n/*!*************************************************!*\\\n !*** ./src/playbacks/flashls/flashls_events.js ***!\n \\*************************************************/\n/***/ function(module, exports, __webpack_require__) {\n\n\t'use strict';\n\t\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\t\n\tvar _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\t\n\tvar _componentsMediator = __webpack_require__(/*! ../../components/mediator */ 14);\n\t\n\tvar _componentsMediator2 = _interopRequireDefault(_componentsMediator);\n\t\n\tvar HLSEvents = (function () {\n\t function HLSEvents(instanceId) {\n\t _classCallCheck(this, HLSEvents);\n\t\n\t this.instanceId = instanceId;\n\t }\n\t\n\t _createClass(HLSEvents, [{\n\t key: 'ready',\n\t value: function ready() {\n\t _componentsMediator2['default'].trigger(this.instanceId + ':flashready');\n\t }\n\t }, {\n\t key: 'videoSize',\n\t value: function videoSize(width, height) {\n\t _componentsMediator2['default'].trigger(this.instanceId + ':videosizechanged', width, height);\n\t }\n\t }, {\n\t key: 'complete',\n\t value: function complete() {\n\t _componentsMediator2['default'].trigger(this.instanceId + ':complete');\n\t }\n\t }, {\n\t key: 'error',\n\t value: function error(code, url, message) {\n\t _componentsMediator2['default'].trigger(this.instanceId + ':error', code, url, message);\n\t }\n\t }, {\n\t key: 'manifest',\n\t value: function manifest(duration, loadmetrics) {\n\t _componentsMediator2['default'].trigger(this.instanceId + ':manifestloaded', duration, loadmetrics);\n\t }\n\t }, {\n\t key: 'audioLevelLoaded',\n\t value: function audioLevelLoaded(loadmetrics) {\n\t _componentsMediator2['default'].trigger(this.instanceId + ':audiolevelloaded', loadmetrics);\n\t }\n\t }, {\n\t key: 'levelLoaded',\n\t value: function levelLoaded(loadmetrics) {\n\t _componentsMediator2['default'].trigger(this.instanceId + ':levelloaded', loadmetrics);\n\t }\n\t }, {\n\t key: 'fragmentLoaded',\n\t value: function fragmentLoaded(loadmetrics) {\n\t _componentsMediator2['default'].trigger(this.instanceId + ':fragmentloaded', loadmetrics);\n\t }\n\t }, {\n\t key: 'fragmentPlaying',\n\t value: function fragmentPlaying(playmetrics) {\n\t _componentsMediator2['default'].trigger(this.instanceId + ':fragmentplaying', playmetrics);\n\t }\n\t }, {\n\t key: 'position',\n\t value: function position(timemetrics) {\n\t _componentsMediator2['default'].trigger(this.instanceId + ':timeupdate', timemetrics);\n\t }\n\t }, {\n\t key: 'state',\n\t value: function state(newState) {\n\t _componentsMediator2['default'].trigger(this.instanceId + ':playbackstate', newState);\n\t }\n\t }, {\n\t key: 'seekState',\n\t value: function seekState(newState) {\n\t _componentsMediator2['default'].trigger(this.instanceId + ':seekstate', newState);\n\t }\n\t }, {\n\t key: 'switch',\n\t value: function _switch(newLevel) {\n\t _componentsMediator2['default'].trigger(this.instanceId + ':levelchanged', newLevel);\n\t }\n\t }, {\n\t key: 'audioTracksListChange',\n\t value: function audioTracksListChange(trackList) {\n\t _componentsMediator2['default'].trigger(this.instanceId + ':audiotracklistchanged', trackList);\n\t }\n\t }, {\n\t key: 'audioTrackChange',\n\t value: function audioTrackChange(trackId) {\n\t _componentsMediator2['default'].trigger(this.instanceId + ':audiotrackchanged', trackId);\n\t }\n\t }]);\n\t\n\t return HLSEvents;\n\t})();\n\t\n\texports['default'] = HLSEvents;\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 107 */\n/*!**********************************!*\\\n !*** ./src/playbacks/hls/hls.js ***!\n \\**********************************/\n/***/ function(module, exports, __webpack_require__) {\n\n\t// Copyright 2014 Globo.com Player authors. All rights reserved.\n\t// Use of this source code is governed by a BSD-style\n\t// license that can be found in the LICENSE file.\n\t\n\t'use strict';\n\t\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\t\n\tvar _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();\n\t\n\tvar _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } };\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\t\n\tfunction _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\t\n\tvar _playbacksHtml5_video = __webpack_require__(/*! playbacks/html5_video */ 22);\n\t\n\tvar _playbacksHtml5_video2 = _interopRequireDefault(_playbacksHtml5_video);\n\t\n\tvar _hlsJs = __webpack_require__(/*! hls.js */ 63);\n\t\n\tvar _hlsJs2 = _interopRequireDefault(_hlsJs);\n\t\n\tvar _baseEvents = __webpack_require__(/*! base/events */ 1);\n\t\n\tvar _baseEvents2 = _interopRequireDefault(_baseEvents);\n\t\n\tvar _basePlayback = __webpack_require__(/*! base/playback */ 5);\n\t\n\tvar _basePlayback2 = _interopRequireDefault(_basePlayback);\n\t\n\tvar _componentsBrowser = __webpack_require__(/*! components/browser */ 11);\n\t\n\tvar _componentsBrowser2 = _interopRequireDefault(_componentsBrowser);\n\t\n\tvar AUTO = -1;\n\t\n\tvar HLS = (function (_HTML5VideoPlayback) {\n\t _inherits(HLS, _HTML5VideoPlayback);\n\t\n\t _createClass(HLS, [{\n\t key: 'name',\n\t get: function get() {\n\t return 'hls';\n\t }\n\t }, {\n\t key: 'levels',\n\t get: function get() {\n\t return this._levels || [];\n\t }\n\t }, {\n\t key: 'currentLevel',\n\t get: function get() {\n\t return this._currentLevel || AUTO;\n\t },\n\t set: function set(id) {\n\t this._currentLevel = id;\n\t this.trigger(_baseEvents2['default'].PLAYBACK_LEVEL_SWITCH_START);\n\t this.hls.currentLevel = this._currentLevel;\n\t }\n\t }]);\n\t\n\t function HLS(options) {\n\t _classCallCheck(this, HLS);\n\t\n\t _get(Object.getPrototypeOf(HLS.prototype), 'constructor', this).call(this, options);\n\t this.minDvrSize = options.hlsMinimumDvrSize ? options.hlsMinimumDvrSize : 60;\n\t this.playbackType = _basePlayback2['default'].VOD;\n\t // for hls streams which have dvr with a sliding window,\n\t // the content at the start of the playlist is removed as new\n\t // content is appended at the end.\n\t // this means the actual playable start time will increase as the\n\t // start content is deleted\n\t // For streams with dvr where the entire recording is kept from the\n\t // beginning this should stay as 0\n\t this.playableRegionStartTime = 0;\n\t // if content is removed from the beginning then this empty area should\n\t // be ignored. \"playableRegionDuration\" does not consider this\n\t this.playableRegionDuration = 0;\n\t options.autoPlay && this.setupHls();\n\t }\n\t\n\t _createClass(HLS, [{\n\t key: 'setupHls',\n\t value: function setupHls() {\n\t var _this = this;\n\t\n\t this.hls = new _hlsJs2['default'](this.options.hlsjsConfig || {});\n\t this.hls.on(_hlsJs2['default'].Events.MEDIA_ATTACHED, function () {\n\t return _this.hls.loadSource(_this.options.src);\n\t });\n\t this.hls.on(_hlsJs2['default'].Events.LEVEL_LOADED, function (evt, data) {\n\t return _this.updatePlaybackType(evt, data);\n\t });\n\t this.hls.on(_hlsJs2['default'].Events.LEVEL_UPDATED, function (evt, data) {\n\t return _this.updateDuration(evt, data);\n\t });\n\t this.hls.on(_hlsJs2['default'].Events.LEVEL_SWITCH, function (evt, data) {\n\t return _this.onLevelSwitch(evt, data);\n\t });\n\t this.hls.on(_hlsJs2['default'].Events.FRAG_LOADED, function (evt, data) {\n\t return _this.onFragmentLoaded(evt, data);\n\t });\n\t this.hls.attachMedia(this.el);\n\t }\n\t\n\t // override\n\t }, {\n\t key: 'setupSrc',\n\t value: function setupSrc(srcUrl) {}\n\t // this playback manages the src on the video element itself\n\t\n\t // the duration on the video element itself should not be used\n\t // as this does not necesarily represent the duration of the stream\n\t // https://github.com/clappr/clappr/issues/668#issuecomment-157036678\n\t\n\t }, {\n\t key: 'getDuration',\n\t value: function getDuration() {\n\t return this.playableRegionDuration;\n\t }\n\t }, {\n\t key: 'getCurrentTime',\n\t value: function getCurrentTime() {\n\t return this.el.currentTime - this.playableRegionStartTime;\n\t }\n\t }, {\n\t key: 'seek',\n\t value: function seek(time) {\n\t var onDvr = this.dvrEnabled && time > 0 && time <= this.playableRegionDuration;\n\t time += this.playableRegionStartTime;\n\t _get(Object.getPrototypeOf(HLS.prototype), 'seek', this).call(this, time);\n\t this.updateDvr(onDvr);\n\t }\n\t }, {\n\t key: 'seekPercentage',\n\t value: function seekPercentage(percentage) {\n\t var seekTo = this.playableRegionDuration;\n\t if (percentage > 0) {\n\t seekTo = this.playableRegionDuration * (percentage / 100);\n\t }\n\t this.seek(seekTo);\n\t }\n\t }, {\n\t key: 'updateDvr',\n\t value: function updateDvr(status) {\n\t this.trigger(_baseEvents2['default'].PLAYBACK_DVR, status);\n\t this.trigger(_baseEvents2['default'].PLAYBACK_STATS_ADD, { 'dvr': status });\n\t }\n\t }, {\n\t key: 'updateSettings',\n\t value: function updateSettings() {\n\t if (this.playbackType === _basePlayback2['default'].VOD) {\n\t this.settings.left = [\"playpause\", \"position\", \"duration\"];\n\t } else if (this.dvrEnabled) {\n\t this.settings.left = [\"playpause\"];\n\t } else {\n\t this.settings.left = [\"playstop\"];\n\t }\n\t this.settings.seekEnabled = this.isSeekEnabled();\n\t this.trigger(_baseEvents2['default'].PLAYBACK_SETTINGSUPDATE);\n\t }\n\t }, {\n\t key: 'onTimeUpdate',\n\t value: function onTimeUpdate() {\n\t this.trigger(_baseEvents2['default'].PLAYBACK_TIMEUPDATE, { current: this.getCurrentTime(), total: this.getDuration() }, this.name);\n\t }\n\t }, {\n\t key: 'play',\n\t value: function play() {\n\t if (!this.hls) {\n\t this.setupHls();\n\t }\n\t _get(Object.getPrototypeOf(HLS.prototype), 'play', this).call(this);\n\t }\n\t }, {\n\t key: 'pause',\n\t value: function pause() {\n\t _get(Object.getPrototypeOf(HLS.prototype), 'pause', this).call(this);\n\t if (this.dvrEnabled) {\n\t this.updateDvr(true);\n\t }\n\t }\n\t }, {\n\t key: 'stop',\n\t value: function stop() {\n\t _get(Object.getPrototypeOf(HLS.prototype), 'stop', this).call(this);\n\t if (this.hls) {\n\t this.hls.destroy();\n\t delete this.hls;\n\t }\n\t }\n\t }, {\n\t key: 'updatePlaybackType',\n\t value: function updatePlaybackType(evt, data) {\n\t this.playbackType = data.details.live ? _basePlayback2['default'].LIVE : _basePlayback2['default'].VOD;\n\t this.fillLevels();\n\t }\n\t }, {\n\t key: 'fillLevels',\n\t value: function fillLevels() {\n\t this._levels = this.hls.levels.map(function (level, index) {\n\t return { id: index, label: level.height + 'p' };\n\t });\n\t this.trigger(_baseEvents2['default'].PLAYBACK_LEVELS_AVAILABLE, this._levels);\n\t }\n\t }, {\n\t key: 'updateDuration',\n\t value: function updateDuration(evt, data) {\n\t var fragments = data.details.fragments;\n\t if (fragments.length > 0) {\n\t this.playableRegionStartTime = fragments[0].start;\n\t }\n\t this.playableRegionDuration = data.details.totalduration;\n\t this.onDurationChange();\n\t }\n\t }, {\n\t key: 'onFragmentLoaded',\n\t value: function onFragmentLoaded(evt, data) {\n\t this.trigger(_baseEvents2['default'].PLAYBACK_FRAGMENT_LOADED, data);\n\t }\n\t }, {\n\t key: 'onLevelSwitch',\n\t value: function onLevelSwitch(evt, data) {\n\t this.trigger(_baseEvents2['default'].PLAYBACK_LEVEL_SWITCH_END);\n\t this.trigger(_baseEvents2['default'].PLAYBACK_LEVEL_SWITCH, data);\n\t var currentLevel = this.hls.levels[data.level];\n\t if (currentLevel) {\n\t this.highDefinition = currentLevel.height >= 720 || currentLevel.bitrate / 1000 >= 2000;\n\t this.trigger(_baseEvents2['default'].PLAYBACK_HIGHDEFINITIONUPDATE, this.highDefinition);\n\t this.trigger(_baseEvents2['default'].PLAYBACK_BITRATE, {\n\t height: currentLevel.height,\n\t width: currentLevel.width,\n\t bandwidth: currentLevel.bandwidth,\n\t bitrate: currentLevel.bitrate,\n\t level: data.level\n\t });\n\t }\n\t }\n\t }, {\n\t key: 'getPlaybackType',\n\t value: function getPlaybackType() {\n\t return this.playbackType;\n\t }\n\t }, {\n\t key: 'isSeekEnabled',\n\t value: function isSeekEnabled() {\n\t return this.playbackType === _basePlayback2['default'].VOD || this.dvrEnabled;\n\t }\n\t }, {\n\t key: 'dvrEnabled',\n\t get: function get() {\n\t return this.playableRegionDuration >= this.minDvrSize && this.getPlaybackType() === _basePlayback2['default'].LIVE;\n\t }\n\t }]);\n\t\n\t return HLS;\n\t})(_playbacksHtml5_video2['default']);\n\t\n\texports['default'] = HLS;\n\t\n\tHLS.canPlay = function (resource, mimeType) {\n\t var resourceParts = resource.split('?')[0].match(/.*\\.(.*)$/) || [];\n\t var isHls = resourceParts.length > 1 && resourceParts[1] === \"m3u8\" || mimeType === 'application/x-mpegURL' || mimeType === 'application/vnd.apple.mpegurl';\n\t\n\t return !!(_hlsJs2['default'].isSupported() && isHls && !_componentsBrowser2['default'].isSafari);\n\t};\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 108 */\n/*!**************************************************!*\\\n !*** ./src/playbacks/html5_audio/html5_audio.js ***!\n \\**************************************************/\n/***/ function(module, exports, __webpack_require__) {\n\n\t// Copyright 2014 Globo.com Player authors. All rights reserved.\n\t// Use of this source code is governed by a BSD-style\n\t// license that can be found in the LICENSE file.\n\t\n\t'use strict';\n\t\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\t\n\tvar _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();\n\t\n\tvar _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } };\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\t\n\tfunction _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\t\n\tvar _baseEvents = __webpack_require__(/*! base/events */ 1);\n\t\n\tvar _baseEvents2 = _interopRequireDefault(_baseEvents);\n\t\n\tvar _basePlayback = __webpack_require__(/*! base/playback */ 5);\n\t\n\tvar _basePlayback2 = _interopRequireDefault(_basePlayback);\n\t\n\tvar _playbacksHtml5_video = __webpack_require__(/*! playbacks/html5_video */ 22);\n\t\n\tvar _playbacksHtml5_video2 = _interopRequireDefault(_playbacksHtml5_video);\n\t\n\tvar _lodashFind = __webpack_require__(/*! lodash.find */ 16);\n\t\n\tvar _lodashFind2 = _interopRequireDefault(_lodashFind);\n\t\n\tvar HTML5Audio = (function (_HTML5Video) {\n\t _inherits(HTML5Audio, _HTML5Video);\n\t\n\t function HTML5Audio() {\n\t _classCallCheck(this, HTML5Audio);\n\t\n\t _get(Object.getPrototypeOf(HTML5Audio.prototype), 'constructor', this).apply(this, arguments);\n\t }\n\t\n\t _createClass(HTML5Audio, [{\n\t key: 'updateSettings',\n\t value: function updateSettings() {\n\t this.settings.left = [\"playpause\", \"position\", \"duration\"];\n\t this.settings.seekEnabled = this.isSeekEnabled();\n\t this.trigger(_baseEvents2['default'].PLAYBACK_SETTINGSUPDATE);\n\t }\n\t }, {\n\t key: 'getPlaybackType',\n\t value: function getPlaybackType() {\n\t return _basePlayback2['default'].AOD;\n\t }\n\t }, {\n\t key: 'name',\n\t get: function get() {\n\t return 'html5_audio';\n\t }\n\t }, {\n\t key: 'tagName',\n\t get: function get() {\n\t return 'audio';\n\t }\n\t }]);\n\t\n\t return HTML5Audio;\n\t})(_playbacksHtml5_video2['default']);\n\t\n\texports['default'] = HTML5Audio;\n\t\n\tHTML5Audio.canPlay = function (resourceUrl, mimeType) {\n\t var mimetypes = {\n\t 'wav': ['audio/wav'],\n\t 'mp3': ['audio/mp3', 'audio/mpeg;codecs=\"mp3\"'],\n\t 'aac': ['audio/mp4;codecs=\"mp4a.40.5\"'],\n\t 'oga': ['audio/ogg']\n\t };\n\t return _playbacksHtml5_video2['default']._canPlay('audio', mimetypes, resourceUrl, mimeType);\n\t};\n\tmodule.exports = exports['default'];\n\n/***/ },\n/* 109 */\n/*!**************************************************!*\\\n !*** ./src/playbacks/html5_video/html5_video.js ***!\n \\**************************************************/\n/***/ function(module, exports, __webpack_require__) {\n\n\t// Copyright 2014 Globo.com Player authors. All rights reserved.\n\t// Use of this source code is governed by a BSD-style\n\t// license that can be found in the LICENSE file.\n\t\n\t'use strict';\n\t\n\tObject.defineProperty(exports, '__esModule', {\n\t value: true\n\t});\n\t\n\tvar _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();\n\t\n\tvar _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } };\n\t\n\tfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }\n\t\n\tfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }\n\t\n\tfunction _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\t\n\tvar _baseUtils = __webpack_require__(/*! base/utils */ 2);\n\t\n\tvar _basePlayback = __webpack_require__(/*! base/playback */ 5);\n\t\n\tvar _basePlayback2 = _interopRequireDefault(_basePlayback);\n\t\n\tvar _baseTemplate = __webpack_require__(/*! base/template */ 7);\n\t\n\tvar _baseTemplate2 = _interopRequireDefault(_baseTemplate);\n\t\n\tvar _baseStyler = __webpack_require__(/*! base/styler */ 6);\n\t\n\tvar _baseStyler2 = _interopRequireDefault(_baseStyler);\n\t\n\tvar _componentsBrowser = __webpack_require__(/*! components/browser */ 11);\n\t\n\tvar _componentsBrowser2 = _interopRequireDefault(_componentsBrowser);\n\t\n\tvar _baseEvents = __webpack_require__(/*! base/events */ 1);\n\t\n\tvar _baseEvents2 = _interopRequireDefault(_baseEvents);\n\t\n\tvar _publicStyleScss = __webpack_require__(/*! ./public/style.scss */ 136);\n\t\n\tvar _publicStyleScss2 = _interopRequireDefault(_publicStyleScss);\n\t\n\tvar _publicIndexHtml = __webpack_require__(/*! ./public/index.html */ 146);\n\t\n\tvar _publicIndexHtml2 = _interopRequireDefault(_publicIndexHtml);\n\t\n\tvar _lodashFind = __webpack_require__(/*! lodash.find */ 16);\n\t\n\tvar _lodashFind2 = _interopRequireDefault(_lodashFind);\n\t\n\tvar MIMETYPES = {\n\t 'mp4': [\"avc1.42E01E\", \"avc1.58A01E\", \"avc1.4D401E\", \"avc1.64001E\", \"mp4v.20.8\", \"mp4v.20.240\", \"mp4a.40.2\"].map(function (codec) {\n\t return 'video/mp4; codecs=\"' + codec + ', mp4a.40.2\"';\n\t }),\n\t 'ogg': ['video/ogg; codecs=\"theora, vorbis\"', 'video/ogg; codecs=\"dirac\"', 'video/ogg; codecs=\"theora, speex\"'],\n\t '3gpp': ['video/3gpp; codecs=\"mp4v.20.8, samr\"'],\n\t 'webm': ['video/webm; codecs=\"vp8, vorbis\"'],\n\t 'mkv': ['video/x-matroska; codecs=\"theora, vorbis\"'],\n\t 'm3u8': ['application/x-mpegurl']\n\t};\n\tMIMETYPES['ogv'] = MIMETYPES['ogg'];\n\tMIMETYPES['3gp'] = MIMETYPES['3gpp'];\n\t\n\tvar HTML5Video = (function (_Playback) {\n\t _inherits(HTML5Video, _Playback);\n\t\n\t _createClass(HTML5Video, [{\n\t key: 'name',\n\t get: function get() {\n\t return 'html5_video';\n\t }\n\t }, {\n\t key: 'tagName',\n\t get: function get() {\n\t return 'video';\n\t }\n\t }, {\n\t key: 'template',\n\t get: function get() {\n\t return (0, _baseTemplate2['default'])(_publicIndexHtml2['default']);\n\t }\n\t }, {\n\t key: 'attributes',\n\t get: function get() {\n\t return {\n\t 'data-html5-video': ''\n\t };\n\t }\n\t }, {\n\t key: 'events',\n\t get: function get() {\n\t return {\n\t 'canplay': 'handleBufferingEvents',\n\t 'canplaythrough': 'handleBufferingEvents',\n\t 'durationchange': 'onDurationChange',\n\t 'ended': 'onEnded',\n\t 'error': 'onError',\n\t 'loadedmetadata': 'onLoadedMetadata',\n\t 'loadstart': 'onLoadStart',\n\t 'pause': 'onPause',\n\t 'playing': 'onPlaying',\n\t 'progress': 'onProgress',\n\t 'seeked': 'handleBufferingEvents',\n\t 'seeking': 'handleBufferingEvents',\n\t 'stalled': 'handleBufferingEvents',\n\t 'timeupdate': 'onTimeUpdate',\n\t 'waiting': 'handleBufferingEvents'\n\t };\n\t }\n\t\n\t /**\n\t * Determine if the playback has ended.\n\t * @property ended\n\t * @type Boolean\n\t */\n\t }, {\n\t key: 'ended',\n\t get: function get() {\n\t return this.el.ended;\n\t }\n\t\n\t /**\n\t * Determine if the playback is having to buffer in order for\n\t * playback to be smooth.\n\t * This is related to the PLAYBACK_BUFFERING and PLAYBACK_BUFFERFULL events\n\t * @property buffering\n\t * @type Boolean\n\t */\n\t }, {\n\t key: 'buffering',\n\t get: function get() {\n\t return this.bufferingState;\n\t }\n\t }]);\n\t\n\t function HTML5Video(options) {\n\t _classCallCheck(this, HTML5Video);\n\t\n\t _get(Object.getPrototypeOf(HTML5Video.prototype), 'constructor', this).call(this, options);\n\t this.loadStarted = false;\n\t this.playheadMoving = false;\n\t this.playheadMovingTimer = null;\n\t this.options = options;\n\t this.setupSrc(options.src);\n\t this.el.loop = options.loop;\n\t if (options.poster) {\n\t this.$el.attr(\"poster\", options.poster);\n\t }\n\t this.el.autoplay = options.autoPlay;\n\t if (_componentsBrowser2['default'].isSafari) {\n\t this.setupSafari();\n\t } else {\n\t this.el.preload = options.preload ? options.preload : 'metadata';\n\t this.settings.seekEnabled = true;\n\t }\n\t this.settings = { 'default': ['seekbar'] };\n\t this.settings.left = [\"playpause\", \"position\", \"duration\"];\n\t this.settings.right = [\"fullscreen\", \"volume\", \"hd-indicator\"];\n\t }\n\t\n\t /**\n\t * Sets the source url on the